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

C - kalkulator liczb szesnastkowych

Aruba Cloud - Virtual Private Server VPS
0 głosów
741 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 3,236 wizyt
pytanie zadane 28 maja 2022 w Egzaminy zawodowe przez Mrigor78 Początkujący (300 p.)
0 głosów
1 odpowiedź 548 wizyt
pytanie zadane 26 września 2018 w C i C++ przez jjanickij Użytkownik (510 p.)
0 głosów
0 odpowiedzi 544 wizyt
pytanie zadane 23 listopada 2019 w C i C++ przez Ola Piątek Nowicjusz (240 p.)

93,327 zapytań

142,323 odpowiedzi

322,397 komentarzy

62,658 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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...