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

C - kalkulator liczb szesnastkowych

Object Storage Arubacloud
0 głosów
659 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,033 wizyt
pytanie zadane 28 maja 2022 w Egzaminy zawodowe przez Mrigor78 Początkujący (300 p.)
0 głosów
1 odpowiedź 381 wizyt
pytanie zadane 26 września 2018 w C i C++ przez jjanickij Użytkownik (510 p.)
0 głosów
0 odpowiedzi 364 wizyt
pytanie zadane 23 listopada 2019 w C i C++ przez Ola Piątek Nowicjusz (240 p.)

92,540 zapytań

141,382 odpowiedzi

319,481 komentarzy

61,928 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

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

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!

...