Konwerter z binarnej na szesnastkowy

0

Witam. Pisałem ten kod na zajęciach. Czy poprawnie go zapisałem? Jeśli tak, to mógłby ktoś pomóc ten kod przerobić, żeby była użyta funkcja int getchar(). Mam z tym problemy :/

#include <stdio.h>

void BinToHex(int bin){
    int hex = 0, i = 1, reszta;
     while (bin != 0)
    {
        reszta = bin % 10;
        hex = hex + reszta * i;
        i = i * 2;
        bin = bin / 10;
    }
     printf("Szesnastkowo: %lX",hex);

}

int main()
{
    int bin;

    printf("Podaj liczbe binarna: ");
    scanf("%ld", &bin);
    BinToHex(bin);
    return 0;
}

0

Używasz złych formatów:
%lX wymaga long unsigned int a w parametrze przekazujesz int
%ld wymaga long int a Ty masz int.
Użyj %d.

Największym problemem jest to że program wypisuje w systemie dziesiętnym, nie szesnastkowym.

0

Wpisuje binarnie i dobrze mi konwertuje na szesnastkowy.
Wiesz jak przerobić ten kod, zeby była uzyta funkcja int getchar()?

0

Na pewno? Bo gdy wpisuję 1010 dostaję 10 a powinno być A.

0

Dostaję A jak wpisuję 1010

0

Dobra, wiem już o co chodzi.

Ten kawałek kodu:

int hex = 0, i = 1, reszta;
while (bin != 0)
{
	reszta = bin % 10;
	hex = hex + reszta * i;
	i = i * 2;
	bin = bin / 10;
}

konwertuje bin na system dziesiętny, nie heksadecymalny.

Poprawny wynik bierze się natomiast z formatu jakiego używasz do wyświetlenia liczby, dla int byłoby do %X (nie %lX).
Ciężko powiedzieć czy jest to poprawne rozwiązanie zadania.

0

A miałbyś pomysł, jak przerobić ten kod, zeby uzyc funkcji int getchar()?

0

Najlepiej jest napisać własną funkcję get_int() która zwróci odczytaną liczbę a w niej umieścić getchar().
Najprościej można zrobić to tak:

int get_int(void) 
{
	int result = 0; // Wynik czytania
	char c; // Odczytany znak
	while ((c = getchar()) != '\n') // Dopóki odczytany znak to nie nowa linia
	{
		result *=  10; // "Przesuń" cyfry od 1 miejsce w lewo
		result += c - '0'; // Dodaj cyfrę do wyniku.
		/* Jeżeli odczytany znak to '0' (ASCII 48) i odejmiemy od niego '0' otrzymamy 0
		 * Jeśli znak to '1' wtedy '1' - '0' = 1 itd.
		 */
	}
	return result;
}

Zwracana wartość to odczytana liczba z konsoli.

Możesz zabezpieczyć tą funkcję np. pomijając znaki niedozwolone (litery, znaki specjalne itd.), albo możesz przerobić ją tak aby po odczytaniu cyfry niebinarnej wyświetlała błąd. Możliwości jest wiele :D

0

Mógłbyś mi wytłumaczyć na czym polega ten getchar? Z językiem C, mam styczność od kilku dni i nie za bardzo wiem o co w tym chodzi.

1

getchar() odczytuje pojedynczy znak ze standardowego wejścia (w tym przypadku konsoli) i zwraca go (dlatego przypisujemy go do zmiennej c.

Czyli jak wpisujesz 123 i wciskasz Enter getchar() zwraca kolejno:

  • 1
  • 2
  • 3
  • \n (Na platformach Windows jest jeszcze \r przed \n)
0

Dziękuję za wytłumaczenie. Chociaż dalej mam problem jak zastosować to do mojego kodu

#include <stdio.h>
 
void BinToHex(int bin){
    int hex = 0, i = 1, reszta;
     while (bin != 0)
    {
        reszta = bin % 10;
        hex = hex + reszta * i;
        i = i * 2;
        bin = bin / 10;
    }
     printf("Szesnastkowo: %lX",hex);
 
}
 
int main()
{
    int bin;
 
    printf("Podaj liczbe binarna: ");
    scanf("%ld", &bin);
    BinToHex(bin);
    return 0;
}
1

Wrzucasz tą funkcję nad main() i następnie zastępujesz scanf w ten sposób:

bin = get_int();

Całość:

#include <stdio.h>

int get_int() 
{
	int result = 0; // Wynik czytania
	char c; // Odczytany znak
	while ((c = getchar()) != '\n') // Dopóki odczytany znak to nie nowa linia
	{
		result *=  10; // Pomnóz wynik razy 10
		result += c - '0'; // Dodaj cyfrę do wyniku.
		/* Jeżeli odczytany znak to '0' (ASCII 48) i odejmiemy od niego '0' otrzymamy 0
		 * Jeśli znak to '1' wtedy '1' - '0' = 1 itd.
		 */
	}
	return result;
}

void BinToHex(int bin)
{
	int hex = 0, i = 1, reszta;
	while (bin != 0)
	{
		reszta = bin % 10;
		hex = hex + reszta * i;
		i = i * 2;
		bin = bin / 10;
	}
	printf("Szesnastkowo: %X", hex);
}

int main()
{
	printf("Podaj liczbe binarna: ");
	int bin = get_int(); // Deklaracja nie musi być na samym początku funkcji
	BinToHex(bin);
	return 0;
}

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