dziesietne na binarne/heksa. Korekta programu

0

Witam serdecznie. Na jutro musze oddać program na zaliczenie, który miał zmieniać liczby dziesietne na heksadecymalne/binarne. Na końcu doczytałem że wprowadzone do programu liczby będą ujemne. Pierwszy raz spotkałem się z konwersją liczb ujemnych i kompletnie nie wiem z czym to sie je. Oto kod mojego programu, i tutaj pytanie. Czy jest możliwość jedynie modyfikacji tego, co do tej pory wyskrobałem czy program jest do kosza?

 #include<stdio.h>
void dziesietneNaHeksa(long int dzies){
    long int liczba;
    int  i=1,j,wynik;
    char heksadecymalna[100];
    liczba = dzies;
    
    while(liczba!=0){
         wynik = liczba % 16;

      //Zamieniamy integer na character. Korzystając z tabeli ASCII
      if( wynik < 10)
           wynik =wynik + 48; // 48 - w ASCII liczba "0"
      else
         wynik = wynik + 55; // 55 + min.10 = 65 - w ASCII litera 'A'

      heksadecymalna[i++]= wynik;
     liczba = liczba / 16;
  }

    printf("Po zamianie %ld  na system heksadecymalny : ",dzies );
    printf("\n");
    for(j = i -1 ;j> 0;j--)
      printf("%c",heksadecymalna[j]);
}
void dziesietneNaBinarne(long int dzies){
	 long int liczba;

    int binarna[100],i=1,j;
    liczba = dzies;

    while(liczba!=0){

        binarna[i++]= liczba % 2;
         liczba = liczba / 2;
    }

    printf("Po zamianie %ld na system binarny:\n ",dzies);

    for(j = i -1 ;j> 0;j--)

         printf("%d",binarna[j]);

	
}
int main(){
	long int dziesietna;
    printf("Wprowadź liczbę dziesiętną : ");
    scanf("%ld",&dziesietna);

    dziesietneNaHeksa(dziesietna);
    printf("\n");
    dziesietneNaBinarne(dziesietna);
    printf("\n");

    return 0;
}
0

A wystarczy tyle:

    scanf("%ld",&dziesietna);
    printf("%lX",dziesietna);
0

Problem w tym że nie możemy tego używać ..

1
  1. Nie rozumiesz inkrementacji: http://4programmers.net/Forum/1101404
  2. Weź to wywal i napisz po ludzku, zobacz konwersja z dowolnego na dowolny nawet nie mieszczącego się w int zajmuje mniej wierszy niż to co zrobiłeś:
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char *sysconv(unsigned sysin,unsigned sysout,const char *in,char *out)
  {
   static char digits[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
   unsigned p,m;
   char *end,*pos,tmp;
   for(*out='0',end=out+1;*in;++in)
     {
      p=strchr(digits,toupper(*in))-digits;
      for(pos=out;pos<end;*(pos++)=digits[m-(p=m/sysout)*sysout]) m=(strchr(digits,toupper(*pos))-digits)*sysin+p;
      while(p) *(end++)=digits[m-(p=(m=p)/sysout)*sysout];
     }
   for(*end=0,pos=out;pos<end;tmp=*(--end),*end=*pos,*(pos++)=tmp) {}
   return out;
  }

int main()
  {
   unsigned sysin,sysout;
   static char in[1024],out[36*1024];
   for(;;)
     {
      printf("\rsystem wejsciowy: ");
      scanf("%u",&sysin);
      printf("\rsystem wyjsciowy: ");
      scanf("%u",&sysout);
      printf("\rliczba wejsciowa: ");
      scanf(" %1023s",in); // wypada jeszcze sprawdzić czy to poprawna liczba w systemie sysin ale to banał
      if(2>sysin||sysin>36||2>sysout||sysout>36) return 0;
      printf("\rliczba wyjsciowa: %s\n\n",sysconv(sysin,sysout,in,out));
     }
  }

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