• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C - kalkulator liczb szesnastkowych

VPS Starter Arubacloud
0 głosów
697 wizyt
pytanie zadane 27 maja 2017 w C i C++ przez Deloryn Bywalec (2,060 p.)
#include <stdio.h>

int konwersja_do_10(char string[])
{
	int cyfra;
	int potega = 1;
	int liczba=0;
	
	for(int i=14; i>=0; i--)
	{
		if(string[i]!='\0')
		{
			if(string[i]>=65 && string[i]<=70)
				cyfra = string[i] - 55;
			else if(string[i]>=48 && string[i]<=57)
				cyfra = string[i] - '0';
			liczba=liczba + cyfra * potega;
			potega*=16;
		}
	}
	return liczba;
}

char * konwersja_do_16(int liczba)
{
	char string[15];
	int reszta;
	for(int i = 14; i>=0; i--)
	{
		reszta = liczba % 16;
		if(reszta == 15) string[i]='F';
		else if(reszta==14) string[i]='E';
		else if(reszta==13) string[i]='D';
		else if(reszta==12) string[i]='C';
		else if(reszta==11) string[i]='B';
		else if(reszta==10) string[i]='A';
		else string[i] = (char) (reszta + 48);
		
		liczba/=16;
		if(liczba==0) break;
	}
	return string;
}

int main()
{
	int wybor;
	char string1[15];
	char string2[15];
	
	printf("Podaj liczbe szesnastkowa (podajemy tylko cyfry i wielkie litery A-F) nr 1: ");
	scanf("%s",&string1);
	printf("Podaj liczbe szesnastkowa (podajemy tylko cyfry i wielkie litery A-F) nr 2: ");
	scanf("%s",&string2);
	
	int liczba1, liczba2;
	liczba1 = konwersja_do_10(string1);
	liczba2 = konwersja_do_10(string2);
	
	printf("Kalkulator szesnastkowy\n1. Dodawanie\n2. Odejmowanie\n3. Mnozenie\n\n");
	scanf("%d",&wybor);
	switch(wybor)
	{
		default:
			printf("Nie ma takiej opcji. Koniec");
			break;
		case 1:
			printf("Wynik: %s",konwersja_do_16(liczba1+liczba2));
			break;
		case 2:
			printf("Wynik: %s",konwersja_do_16(liczba1-liczba2));
			break;
		case 3:
			printf("Wynik: %s",konwersja_do_16(liczba1*liczba2));
			break;
	}
	return 0;
}

Dlaczego program w outpucie generuje mi jakieś śmieszne znaczki, np:

Jak mogę naprawić ten błąd?

1 odpowiedź

+2 głosów
odpowiedź 27 maja 2017 przez criss Mędrzec (172,590 p.)
edycja 27 maja 2017 przez criss

Testowałeś w ogóle te funkcje?

konwersja_do_10: skąd założenie, że wejściowa tablica ma 14 znaków? Nie sądzisz, ze bardziej adekwatna byłaby odpowiednia pętla while?

konwersja_do_16:
Przede wszystkim: zwracasz lokalną tablice. Nie możesz tak robić. Tablica zostanie zniszczona po wyjściu z funkcji a zwrócony wskaźnik będzie wskazywał na nieprawidłowe dane.
Po drugie - znowu nie wiadomo skąd ta 14. Tutaj jednak już to nie jest aż tak szkodliwe - po prostu niepotrzebne. Widze, że kończysz pętle kiedy któreś z kolei dzielenie przez 16 da 0. Ok, tylko zauważ, że pozostałe komórki tablicy (zakładam przypadek kiedy nie wykonało się wszystkich 15 iteracji) pozostają z nieokreśloną wartością (śmieci). Dodatkowo nie stawiasz na końcu tablicy zera (wymóg prawidłowego printowania c-stringów).

Kolejna sprawa to scanf-y. Wyrzuć ampersandy (&). Nazwa tablicy już jest wskaźnikiem dokładnie na tą pamięć do której scanf ma wpisywać. Ampersandem pobierasz wskaźnik do pamięci w której przetrzymywany jest ten wskaźnik (na twoją tablice) - nie powinno cie to obchodzić :P Cud, że się nie wykrzacza.

To chyba tyle, co byłem w stanie zauważyć. 

komentarz 27 maja 2017 przez Deloryn Bywalec (2,060 p.)
Dzięki za pomoc :)

Podobne pytania

+1 głos
2 odpowiedzi 2,433 wizyt
pytanie zadane 28 maja 2022 w Egzaminy zawodowe przez Mrigor78 Początkujący (300 p.)
0 głosów
1 odpowiedź 437 wizyt
pytanie zadane 26 września 2018 w C i C++ przez jjanickij Użytkownik (510 p.)
0 głosów
0 odpowiedzi 440 wizyt
pytanie zadane 23 listopada 2019 w C i C++ przez Ola Piątek Nowicjusz (240 p.)

92,834 zapytań

141,778 odpowiedzi

320,827 komentarzy

62,164 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...