Przeliczanie na binarny Niespodziewany Crash

0

Witam mój problem wygląda następująco: Staram się coś pisać w c ale za bardzo mi to nie wychodzi. Oto moje całodniowe wypociny.

#include <stdio.h>
#include <stdlib.h>

int main ()
{
  FILE *fp;
  int a,b;
  int i=0;
  int tab1[9];
  char d;
  
  if ((fp=fopen("binarka.txt", "w"))==NULL) {
    printf ("Nie mogę otworzyć pliku binarka.txt do zapisu!\n");
    exit(1);
  }
  printf("Podaj Liczbe która chcesz przeliczyc z dziesietnego na binarke:\n");
  scanf("%d",a);
  while(a!=1)
{
           i++;
           b=a%2;
           tab1[i]=b;
}
  while(i==0)
{
  tab1[i]=d;             
  fprintf (fp, "%d", d);
  --i;
}
  
  fclose (fp);
  return 0;
}

Chodzi mi o przeliczanie z dziesietnego na binarny. Miało przeliczać na binarny wrzucic do tablicym odczytać z niej od tyłu i wywalić do pliku. Program sie kompiluje ale po podaniu liczby do przeliczenia wywala bład.

0
  while(a!=1)
{
           i++;
           b=a%2;
           tab1[i]=b;
}

Ten fragment kodu zawodzi. Zauważ, że warunek wyjścia z pętli jest uzależniony od wartości zmiennej a, która w pętli się nie zmienia. Dodatkowo używasz zmiennej b, która nie jest potrzebna (tabl[i]=a%2).
Musisz jeszcze dodać a=a/2 (a/=2) (nie wiem jak jest w czystym C, ale to powinno być dzielenie całkowite, tj. div w pascalu). Jako, że a jest typu int powinno to chyba działać dobrze.

EDIT: Warunek nie jest też dobry - przy takim warunku stracimy bit danych. Dobrą manierą jest też nie liczyć używając samego a, tylko podstawić tą wartość pod zmienną pomocniczą i liczyć na niej. Umożliwi Ci to np. wypisanie w pliku wartości dziesiętnej liczby.

while(a>0)
{
           tab1[++i]=a%2;
           a=a/2;
}

Coś mi się wydaje, że to odwracanie jest niepotrzebne, poza tym musisz zweryfikować to co napisałem, w końcu testowanie algorytmów też trzeba umieć :P Niestety nie mam czasu rozwikłać tego do końca. W internecie na pewno coś znajdziesz na temat takiego algorytmu.

P.S. Zauważ że możesz zamiast 2 wstawić zmienną, która będzie podstawą nowego systemu... może to być od 2 do 9 (dla większych od 10 trzeba pobawić się np. z symbolami A=10, B=11 itd.)

1 użytkowników online, w tym zalogowanych: 0, gości: 1