Zamiana liczby dziesiętnej na szesnastkową

0

Witajcie,
mam do napisania program w jezyku c++, ktory bedzie wyswietlal liczbe dziesietna w systemie szesnastkowym. Nie jestem biegla w pisaniu takich programow wiec zwracam sie do Was, jezeli znajdzie sie jakis mily kolega i pomoze mi w napisaniu programu bede bardzo wdzieczna. Dodam program, ktory zamienia liczbe dziesietna na system binarny, z tego co sie dowiedzialam wystarczy go zedytowac i dodac kilka wierszy. Dziekuje za pomoc :)

// zamiana liczby dziesietnej na binarna

#include <stdio.h>
#include <stdlib.h>

main()
{
    int liczba,reszta;
    system("clear");
    printf("\n podaj liczbe calkowita : ");
    scanf("%i",&liczba);
    printf("\n liczba=%i",liczba);
    while(liczba!=0)
    {
        reszta=liczba%2;
        printf("\n%i",reszta);
        liczba=liczba/2;
    }
    puts("\n");
    return 0;
}
0

Zamiana liczb dziesiętnych na szesnastkowe

Tak jak w systemie dwójkowym, zamiana z dziesiętnego na szesnastkowy jest realizowana za pomocą nazywaną metoda reszty. W tej metodzie powtarzamy dzielenie liczby dziesiętnej przez liczbę podstawy (w tym przypadku 16). Wtedy zamienimy resztę za każdym razem na liczbę szesnastkową

Przykład:

Zamienić liczbę dziesiętną 24032 na liczbę szesnastkową.

24032 / 16 = 1502 ; reszta = 0

1502 / 16 = 93; reszta = 14 lub E

93 / 16 = 5; reszta = 13 lub D

5 / 16 = 0; reszta = 5

Odczytując reszty od tyłu otrzymujemy liczbę szesnastkową: 5DE0

0

na papierze nie mam problemow z przeliczaniem, nie mam pojecia o pisaniu w jezyku "c", sadze, ze przy moich dzisiejszych wiadomosciach nie wyskrobie tego sama, jesli kolega bylby tak mily i zechcial mi pomoc w bardziej dostepny sposob bylo super :)

0

// zamiana liczby dziesietnej na szesnastkowa

#include <stdio.h>
#include <stdlib.h>

main()
{int liczba,reszta;
system("clear");
printf("\n podaj liczbe calkowita : ");
scanf("%i",&liczba);
printf("\n liczba=%i",liczba);
while(liczba!=0)
{reszta=liczba%16;
printf("\n%i",reszta);
liczba=liczba/16;
}
puts("\n");
return 0;
}

a jednak cos wyskrobalam, program dziala jak powinien, poprawnie konwertuje liczy, natomiast zalezaloby mi jeszcze na dopisaniu komendy, ktora po wykryciu reszty zdzielenia np. 10 wyswietli"A" i tak odpowiednio do 15. czy bedzie to:

if(reszta=10)
printf("\nA)

sadze, ze nie, aczkolwiek warto zapytac, jesli tak to umiescic to za petla czy po petli while? :)

0

Nie działa jak powinien, wyświetla odwrotnie...

0

// zamiana liczby dziesietnej na szesnastkowa

#include <stdio.h>
#include <stdlib.h>

main()
{int liczba,reszta;
system("clear");
printf("\n podaj liczbe calkowita : ");
scanf("%i",&liczba);
printf("\n liczba=%i",liczba);
while(liczba!=0)
{reszta=liczba%16;
printf("\n%i",reszta);
liczba=liczba/16;
}
puts("\n");
return 0;
}

a jednak cos wyskrobalam, program dziala jak powinien, poprawnie konwertuje liczy, natomiast zalezaloby mi jeszcze na dopisaniu komendy, ktora po wykryciu reszty zdzielenia np. 10 wyswietli"A" i tak odpowiednio do 15. czy bedzie to:

if(reszta=10)
printf("\nA)

sadze, ze nie, aczkolwiek warto zapytac, jesli tak to umiescic to za petla czy po petli while? :)

0
sadfg napisał(a)

Nie działa jak powinien, wyświetla odwrotnie...

Dla mnie dziala poprawnie czytajac od z dolu do gory, przykladowo liczba 2009 to 7"13"9

0

Zawsze myślałem, że to od najbardziej znaczącej cyfry się zaczyna... Poza tym takich wątków były dziesiątki.

0

Tu jest przykład w C#, a w C++ będzie bardzo podobnie.

W zależności, czy liczba ma być 4-bitowa, 8-bitowa, czy 16-bitowa, wywołujemy odpowiednio IntToHex4, IntToHex8, IntToHex16. Analogicznie można zbudować IntToHex32 i IntToHex64, o ile kompilator obsługuje liczby naturalne (unsigned) 32-bitowe i 64-bitowe.

Są to funkcje zwracające napis string zawierający zapis szesnastkowy danej liczby.

        // Cyfry systemu szestnastkowego
        string HexDigits = "0123456789ABCDEF";

        // Zamiana liczby na HEX 4bit
        private string IntToHex4(int Data)
        {
            string H = "";
            H = HexDigits[Data].ToString();
            return H;
        }

        // Zamiana liczby na HEX 8bit
        private string IntToHex8(int Data)
        {
            int D1 = Data >> 4;
            int D2 = Data & 15;
            string H1 = IntToHex4(D1);
            string H2 = IntToHex4(D2);
            string H = H1 + H2;
            return H;
        }

        // Zamiana liczby na HEX 16bit
        private string IntToHex16(int Data)
        {
            int D1 = Data >> 8;
            int D2 = Data & 255;
            string H1 = IntToHex8(D1);
            string H2 = IntToHex8(D2);
            string H = H1 + H2;
            return H;
        }
0

wiesz, równie dobrze mógłbyś jej powiedzieć, zeby użyła;
int main()
{
.....
printf("%X", liczba);
}
ale chyba nie o to chodzi? wątpię żeby Twoja metoda była dla autorki bardziej zrozumiała niż ta, z którą zaczęła.

0
Aniusia:) napisał(a)

a jednak cos wyskrobalam, program dziala jak powinien, poprawnie konwertuje liczy, natomiast zalezaloby mi jeszcze na dopisaniu komendy, ktora po wykryciu reszty zdzielenia np. 10 wyswietli"A" i tak odpowiednio do 15.

Konwersji nie sprawdzałem, jeśli masz dobrze można wszystkie pół bajty (0-15) zamieniać na chary. Zamiast kolumny ifów zrób sobie tablicę charów i w pętelce porównuj ze sobą odpowiednie zmienne. Pętla wyglądałaby mniej więcej tak:

char znak[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char final_hex;
for(int j=0; j<16;j++)
	{
		znak[j];
		if(pre_final==j)//pre_final to nasz pół bajt 0-15
		{
			final_hex=znak[j];
		}
        }

Z tymże musiałabyś dopisać rozpoznawanie ilości pół bajtów w przekonwertowanej wartości i odpowiednio zmodyfikować powyższą pętle. Tak, specjalnie zostawiłem to Tobie ;-P

EDIT: Spojrzałem na konwersję, ja zawsze konwertowałem sobie najpierw na binarkę a potem dopiero na hex, no ale ile głów tyle pomysłów ;-)

0

Dla zainteresowanych gotowy kod :-)

#include <cstdlib>
#include <iostream>
#include <conio.h>
#include <sstream>
#include <fstream>

using namespace std;

int main()
{
   int wej, reszta;
   string wynik="";
   
   cout << "Program do obliczania liczby w systemie szesnastkowym z liczby w systemie dziesietnym\n\n";
   cout << "Podaj liczbe dziesietna: ";
   cin >> wej;
    
   cout << "\n\nLiczba szesnastkowa: ";
   do
   {
      reszta = wej%16;
      stringstream tmp;
      string znak;
       if (reszta>=10 && reszta<16)
       {if (reszta==10)
       printf("A");
       if (reszta==11)
       printf("B");
       if (reszta==12)
       printf("C");
       if (reszta==13)
       printf("D");
       if (reszta==14)
       printf("E");
       if (reszta==15)
       printf("F");}
       else
      tmp << reszta;
      tmp >> znak;
      wej = wej/16 ;
      wynik = znak + wynik;
   } while (wej!=0);

 

   cout << wynik <<" (16)";
   
   fstream plik;
   plik.open("D:\\Informatyka Szkoła\\C++\\Zadanie Domowe\\10na16.txt", ios::out);
   if(plik.good())
   plik<<"Po zamianie na system szesnastkowy wpisana liczba wynosi: "<<wynik;
   plik.close();  
    
 getch();
 return 0;  
}
0
 std::cout << std::hex << num;
0
#include <stdio.h>

int printHEX(unsigned int v){
	!(v && putchar((v >> (sizeof(v)*8-4))["0123456789ABCDEF"] ) && printHEX(v << 4)) && putchar('\n');
}

int main(){
	printHEX(57005);
	return 0;
}
0
Pawel TS napisał(a):
#include <stdio.h>

int printHEX(unsigned int v){
	!(v && putchar((v >> (sizeof(v)*8-4))["0123456789ABCDEF"] ) && printHEX(v << 4)) && putchar('\n');
}

int main(){
	printHEX(57005);
	return 0;
}

;d

0

Witam.
To jest kod źródłowy dla laików jak ja, zrobiłem go dla potrzeby pewnego zadania.
Ilość znaków systemu szesnastkowego ustaliłem z góry >>>> reszta[5] <<<<<
Nie wiem jak zrobić to tak, żeby w tablicy było tyle elementów ile trzeba.

 #include <iostream>
#include <cmath>

using namespace std;

void IntoHex(int liczba)
{
    if(liczba==10)
        cout<<"A";
    else if(liczba==11)
    {
        cout<<"B";
    }
    else if(liczba==12)
    {
        cout<<"C";
    }
    else if(liczba==13)
    {
        cout<<"D";
    }
    else if(liczba==14)
    {
        cout<<"E";
    }
    else if(liczba==15)
    {
        cout<<"F";
    }
    else
        cout<<liczba;
}

int main()
{
    int liczba;
    cout <<"Podaj liczbe ktora mam zamienic: ";
    cin>>liczba;
    int reszta[5];
    int i=0;
    int wynik;


    for(;;)
    {
        if(liczba/16>0)
        {
            wynik=liczba/16;
            reszta[i]=liczba%16;
        }
        else if(liczba/16==0)
        {
            reszta[i]=liczba;
            break;
        }
        liczba=wynik;

        i++;
    }

    for(int j=i; j>=0; j--)
    {
        IntoHex(reszta[j]);
    }

    return 0;
} 
1
  1. Zapoznaj się z inkrementacją bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  2. Oto twoja cała IntoHex po małej optymalizacji: void IntoHex(int digit) { cout<<digit["0123456789ABCDEF"]; }
  3. Jeżeli do zmiennej nie powinna trafić wartość ujemna to używaj unsigned
  4. Używaj angielskiego nazewnictwa bo: http://4programmers.net/Forum/1208091
  5. Zapoznaj się z operacjami bitowymi
  6. Leć dopóki liczba nie jest zerem, jeżeli skończyłeś konwersje zaś nie ma ani jednego znaku w wyniku to wyświetl 0
0

Dzięki, zapoznam się z tym :)

0

Czyli program działa "dobrze" tylko za wolno ?

0

Program nie działa poprawnie.

0

Jest jakaś gotowa funkcja na taką zamianę ? Czytając poprzednie posty niewiele zrozumiałem z ich kodów źródłowych.

0

Oczywiście że jest:

#include <iomanip>
cout<<hex<<255<<endl;

Jak nie zrozumiałeś to pytaj.

0

Wszystko jest zrozumiałe, a mam rozumieć, że z pozostałymi systemami (jedynastkowy,ósemkowy, dwójkowy) jest tak samo ?
I ta sama biblioteka ją obsługuje ?

0

ósemkowy - cout<<oct<<255<<endl;
Reszty nie ma, ale można zrobić to np tak: http://4programmers.net/Forum/1005274 z dowolnego na dowolny, nawet liczby nie mieszczące się w int

0

A powiedz mi, czy używanie cout, cin jest gorszą opcją niż używanie printf, scanf ?

0

Jedno jest z C++ drugie z C.
To z C może być użyte również w C++, na odwrót - nigdy.
scanf pozwala na pewne "cuda" na które nie stać cin ale generalnie cin prostszy, bardziej intuicyjny i mniej blędogienny.
Gdyby istniało coś jednoznacznie lepszego to gorsze by nie istniało, no bo po co.

0

Rozumiem, dzięki ! :)

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