Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Liczby w kodzie binarnym na dziesiętny

Ostatnio zmodyfikowano 2013-12-01 14:38
Autor Wiadomość
Atexor
Temat założony przez niniejszego użytkownika
Liczby w kodzie binarnym na dziesiętny
» 2013-12-01 13:11:28
Witajcie,
mam takie zadanie, aby liczby w kodzie binarnym zapisane w pewnym pliku zamieniło na kod dziesiętny (język C, nie C++). Miałem z tym problem więc zobaczyłem jak to powinno wyglądać i nie rozumiem kilku rzeczy tam, czy moglibyście mi je wyjaśnić? Przedstawię je jako komentarze:

C/C++
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main()
{
    char liczba[ 256 ];
    int tab[ 2000 ];
    int suma, i, n;
    FILE * plik;
    FILE * zapis;
   
    plik = fopen( "binarne.txt", "rt" );
    zapis = fopen( "dziesietne.txt", "wt" );
   
    while( fscanf( plik, "%s", & liczba ) == 1 )
    {
        suma = 0;
        printf( "liczba = %s \n", liczba );
        n = strlen( liczba );
        for( i = 0; i < n; i++ )
        {
            if( liczba[ i ] == '1' )
            //1. O co chodzi z ta jedynka w apostrofach? Szukalem w googlach i jest tu niby jakis literal znakowy i jedynce przypisuje liczbe wg. ASCII, tylko dlaczego?
            //2. W ogóle o co chodzi w tej pętli?
            //3. Wytlumaczylby mi ktos ogolnie o co chodzi z tymi apostrofami, bo ostatnio na wejsciowce pojawilo mi sie takie cos w tym stylu int x='a' i nie wiem czym to sie je i jakie to ma zastosowania (przynajmniej na poczatku programowania, bo dalej na pewno jakies ma).
                 tab[ i ] = 1;
            else
                 tab[ i ] = 0;
           
        }
        tab[ i + 1 ] = 2; //4. Po co to?
        for( i = 0; n != 0; i++ )
        {
            suma = suma +( tab[ n - 1 ] * pow( 2, i ) );
            n--;
        }
        fprintf( zapis, "%d\n", suma );
    }
   
    close( plik ); //Tutaj 3 rzeczy:
    //5. Dlaczego close, a nie fclose skoro perujemy na plikach?
    //6. Po co zamyka (a co za tym idzie zapisuje) binarne.txt o wskazniku FILE *plik, a nie plik dziesietne.txt o wsk. FILE*zapis skoro pierwszy jest otwarty tylko do odczytu?
    //7. Jak dane do pliku dziesietne.txt sa zapisywane bez fclose/close? Myslalem, ze fprintf niby drukuje do pliku ale dopoki nie uzyjemy wlasnie fclose/fclose to jest to gdzies w pamieci
    system( "pause" );
    return 0;
}

Z góry dziękuję, pozdrawiam :)
P-98009
pekfos
» 2013-12-01 13:38:34
1. To podstawy języka..
2. Sprawdza każdy znak
3. To samo co w 1.
4. A jak działa bez tego?
5. Powinno być fclose().
6. Pytaj autora programu.
7. Wyjście z programu przez wyjście z main(), lub wywołanie exit() zamyka wszystkie pliki.
P-98012
Atexor
Temat założony przez niniejszego użytkownika
» 2013-12-01 14:13:12
1. 2. 3. A, już rozumiem. Nie skojarzyłem, że odczytując dane z pliku traktuje je jako tekst, nie liczby i źle spojrzałem na deklarację tablicy (myślałem że także int).
4. Niby działa, ale wolę się spytać bo już kilka razy zdarzyło mi się, że jakiś program działał mimo że czegoś teoretycznie brakowało i w "szczególnych przypadkach przy konkretnych wartościach" bugował się.
5-7. Wnioskując, to operując na plikach w funkcji main() nie muszę zamykać plików, tylko kończąc ją exitem/getchar'em/system("pause")? Czyli nawet fclose w tym przypadku jest zbędne?
P-98018
pekfos
» 2013-12-01 14:16:27
Niby działa
Te 2 mogło by służyć jako znak kończący. Nie ma tu jednak żadnego sprawdzania, za to jest używany rozmiar tablicy. Zresztą, cały ten program nie jest najlepiej napisany.

tylko kończąc ją exitem/getchar'em/system("pause")?
getchar() i system() nie mają tu nic do rzeczy.

Czyli nawet fclose w tym przypadku jest zbędne?
Pliki powinno się zamykać, gdy nie są już potrzebne.
P-98019
Atexor
Temat założony przez niniejszego użytkownika
» 2013-12-01 14:38:01
Domyślam się, że na pewno da się to krócej i lepiej napisać przy użyciu bardziej zaawansowanych funkcji, jednak z racji iż dopiero zaczynam naukę w C to tego typu programy ćwiczeniowe powinny być zrobione bez użyciu bardziej zaawansowanych rzeczy.

Gdy zaczynałem pisać ten program to myślałem nad czymś w tym stylu (pętle i strlen). A da się to jakoś zoptymalizować i zrobić czytelniejsze używając właśnie podstaw (pętle/tablice/struktury itp.)?

Odnośnie kończenia funkcji, to chodzi o return(liczba)? Myślałem że on tylko "zwraca" liczbę, np. 0 systemowi gdy program wykonał się poprawnie. Poczytam może więcej o tym.

Zamykanie plików - dzięki, zapamiętam ;)
P-98021
« 1 »
  Strona 1 z 1