Nie konwertuje jak trzeba - jezyk c

0

Program ma zamienić liczbę również tą po przecinku na binarną. Do rzeczy:

  • działa ale wykonuje tylko jedną pętle i się wyłącza,
  • zapis liczby po przecinku jest na odwrót
  • jestem świeży w programowaniu,

Oto program:

#include <stdio.h>
#include <math.h>
float l;
int lc, i=0,j,tablc[100],tablu[100],k=0,h;
float lu;

int main()
{
	printf("liczba do konwersji: ");
 	scanf("%f", &l);
 	lc=(int)l;
	while(lc>0)
 	{
		tablc[i++]=lc%2;
		lc=lc/2;
	}
	for(j=i-1; j>=0; j--)
	{
		printf("%d",tablc[j]);
	}
	lu=l-lc;
	while((int)lu!=1)
	{
		tablu[k++]=lu*2;
		lu=lu*2;
	}
	for(h=k-1; h>=0; h--)
	{
		printf("%d",tablu[h]);
	}
}
0

Ta pętla:

while ((int)lu != 1)
{
	tablu[k++] = lu * 2;
	lu = lu * 2;
}

nigdy się nie kończy, w rezultacie naruszasz pamięć bo k wychodzi poza zakres tablicy tablu.

0

Tylko, że po podaniu np. 13.13 program wykonuje tylko pierwszą pętle, a drugą olewa całkowicie i program się wyłącza.

0

Masz na myśli tą pętlę?

for (j = i - 1; j >= 0; j--)
{
	printf("%d", tablc[j]);
}

Bo ona mi się wykonuje.

0
 lu=l-lc;
    while((int)lu!=1)
    {
        tablu[k++]=lu*2;
        lu=lu*2;
    }
    for(h=k-1; h>=0; h--)
    {
        printf("%d",tablu[h]);
    }

ten fragment odpowiada za liczbę po przecinku. Lecz jednak gdy się wpiszę liczbę po przecinku program jedynie wykonuje obliczenia dla całkowitej czyli

lc=(int)l;
    while(lc>0)
    {
        tablc[i++]=lc%2;
        lc=lc/2;
    }
    for(j=i-1; j>=0; j--)
    {
        printf("%d",tablc[j]);
    }

pytanie brzmi co trzeba zrobić żeby obie działały jednocześnie?

1

Pierwsza pętla:

while ((int)lu != 1)
{
	tablu[k++] = lu * 2;
	lu = lu * 2;
}

wykonuje się, ale nigdy się nie kończy.

Jeżeli wpisesz 13.13 to (int)lu będzie miało wartość 13 - warunek w while jest spełniony. Następnie cały czas lu mnożone jest przez 2 i cały czas spełnia warunek lu != 1, później, tak jak napisałem, k wychodzi poza tablicę tablu i program wywala się bo dochodzi do naruszenia pamięci.

Dodając parę printf:

lu = l - lc;
printf("\nTEST: %d\n", (int)lu);
while ((int)lu != 1)
{
	tablu[k++] = lu * 2;
	lu = lu * 2;
}
printf("KONIEC\n");

będzie widać że jest tak jak mówię. Wynik programu:

liczba do konwersji: 13.13
1101
TEST: 13
Naruszenie ochrony pamięci
0
#include <stdio.h>
#include <math.h>
float l;
int lc, i=0,j,tablc[100],tablu[100],k=0,h;
float lu;

int main()
{
	printf("liczba do konwersji: ");
 	scanf("%f", &l);
 	lc=(int)l;
 		lu=l-lc;
	while(lc>=1)
 	{
		tablc[i++]=lc%2;
		lc=lc/2;
	}
	for(j=i-1; j>=0; j--)
	{
		printf("%d",tablc[j]);
	}
	printf("\n");
	while((int)lu==0)
	{
		tablu[k++]=lu*2;
		lu=lu*2;
	}
	for(h=k-1; h>=0; h--)
	{
		printf("%d",tablu[h]);
	}

}

wystarczyło dać w pętli dla po przecinku warunek ==0 zamiast ==1
a jak zrobić żeby wypisało mi wartość od tyłu dla po przecinku? zamiast 100 chce uzyskać 001?

1

Odwróć ostatni for. Czyli zamiast:

for(h = k - 1; h >= 0; h--)
{
	printf("%d",tablu[h]);
}

robisz

for(h = 0; h < k; h++)
{
	printf("%d",tablu[h]);
}
0

Problem rozwiązany. Dziekuję!

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