Conversione nei vari sistemi di numerazione

di il
41 risposte

Conversione nei vari sistemi di numerazione

Salve,ho ricevuto un compito in cui bisogna fare una conversione nei vari sistemi di numerazione.
Mi spiego meglio: ad inizio programma si apre il seguente menù
1 Da binario a decimale
2 da decimale a binario
3 da decimale ad esadecimale
4 da esadecimale a decimale
5 da binario ad esadecimale
6 da esadecimale a binario.
E l'utente deve scegliere attraverso il numero che conversione vorrà eseguire.
Poi si chiede di inserire la stringa (se esadecimale di massimo 4 caratteri,se binario di massimo 16,se è binario da 0 a 32767).
Ed infine di far visualizzare a video il numero trovato.

Ho fatto il flow-chart e l'inizio del codice fino al menu,poi mi sono bloccato,non so più come continuare e convertire i numeri.
Ho visto da altre parti ma c'erano programmi difficili per noi.

Non chiedo di farmi tutto il programma poi se c'è qualcuno di buona volontà,lo accetto volentieri.Dico fin da ora che non lo copierò ma cercherò di capire,ma almeno qualcuno che mi illumini e mi dia la strada per continuare perchè sono bloccato e la consegna è a breve.

Aggiungo inoltre che essendo una classe al primo anno,siamo alle basi di c e quindi abbiamo fatto solo le variabili int e float,le costanti,i vettori,i contatori e i vari cicli. Non abbiamo fatto void e cose strane che ho visto in altri programmi.

Grazie mille e buona serata. Riccardo.

41 Risposte

  • Re: Conversione nei vari sistemi di numerazione

    E' un problema che risolvi con le SOLE 4 operazioni piu' l'operazione modulo/resto della divisione. Anzi, la sottrazione non la usi mai!

    QUALUNQUE numero lo puoi scrivere in QUALUNQUE base, se usi l'espressione:

    c0*b^0 + c1*b^1 + c2*b^2 +...

    Ad esempio

    10#123 = 3*10^0 + 2*10^1 + 1*10^2

    2#1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2

    16#af = f*16^0 + a*16^1 = 15*16^0 + 10*16^1


    Ti basta ragionare e usare le proprieta' della divisione.

    Ricorda solo che NON TI INTERESSA COME il computer rappresenta il numero, ma SOLO i resti delle divisione o i risultati delle moltiplicazioni!
  • Re: Conversione nei vari sistemi di numerazione

    Fossi in te, riceverei in ingresso un valore sotto forma di stringa, quindi lo convertirei in long "leggendo" la stringa con la base di numerazione più appropriata con strtol(). A quel punto, potresti riconvertire il long in una stringa espressa nella base di numerazione di destinazione (penso che di esempi di funzioni per la conversione della base di numerazione se ne trovino un bel po', in giro per il web). Mostrare la stringa ottenuta è solo questione di usare printf() con un bel %s.

    Ovviamente dovresti anche fare i controlli previsti dall'esercizio per limitare l'input secondo le caratteristiche richieste (ad esempio, parli di un limite ai valori compresi tra 0 e 32767 e di limitazioni nella quantità delle cifre impiegabili).
  • Re: Conversione nei vari sistemi di numerazione

    Primo anno di cosa?
  • Re: Conversione nei vari sistemi di numerazione

    @migliorabile
    Complimenti, hai portato il concetto di poliziotto-buono/poliziotto-cattivo ad un livello superiore!

    Se cambiare idea è sintomo di intelligenza, mi sa che qui siamo di fronte ad un genio... o più semplicemente ad un utente un po' lunatico!
  • Re: Conversione nei vari sistemi di numerazione

    migliorabile ha scritto:


    E' un problema che risolvi con le SOLE 4 operazioni piu' l'operazione modulo/resto della divisione. Anzi, la sottrazione non la usi mai!

    QUALUNQUE numero lo puoi scrivere in QUALUNQUE base, se usi l'espressione:

    c0*b^0 + c1*b^1 + c2*b^2 +...

    Ad esempio

    10#123 = 3*10^0 + 2*10^1 + 1*10^2

    2#1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2

    16#af = f*16^0 + a*16^1 = 15*16^0 + 10*16^1


    Ti basta ragionare e usare le proprieta' della divisione.

    Ricorda solo che NON TI INTERESSA COME il computer rappresenta il numero, ma SOLO i resti delle divisione o i risultati delle moltiplicazioni!


    Salve,può spiegarmi meglio l'espressione e l'uso di #? Grazie
  • Re: Conversione nei vari sistemi di numerazione

    Non c'è molto da spiegare ... ha usato # per indicare la base del valore ma non ha importanza.

    L'espressione è semplice e si basa sulle singole cifre e le posizioni. Cerca sistema di numerazione posizionale

    Ma non hai risposto alla mia domanda... primo anno di cosa?
  • Re: Conversione nei vari sistemi di numerazione

    oregon ha scritto:


    Non c'è molto da spiegare ... ha usato # per indicare la base del valore ma non ha importanza.

    L'espressione è semplice e si basa sulle singole cifre e le posizioni. Cerca sistema di numerazione posizionale

    Ma non hai risposto alla mia domanda... primo anno di cosa?
    Non capisco ancora l'uso di #.
    Comunque industriale.
  • Re: Conversione nei vari sistemi di numerazione

    10#123 = 3*10^0 + 2*10^1 + 1*10^2
    2#1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2
    16#af = f*16^0 + a*16^1 = 15*16^0 + 10*16^1
    Questa credo proprio si riferisca al procedimento di calcolo, non all'implementazione in qualsivoglia linguaggio. Io la leggo così:

    Prima riga: 10#123 = 3*10^0 + 2*10^1 + 1*10^2
    esprime un valore con le cifre "123" in base 10, valore che può essere ricavato sommando l'ultima cifra moltiplicata per la base elevata a zero, con la penultima cifra moltiplicata per la base elevata a uno, con la prima cifra moltiplicata per la base elevata a due.

    Seconda riga: 2#1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 (manca un pezzo?)
    esprime un valore con le cifre "1011" in base 2, valore che può essere ricavato sommando l'ultima cifra moltiplicata per la base elevata a zero, con la penultima cifra moltiplicata per la base elevata a uno, con la seconda cifra moltiplicata per la base elevata a due, con la prima cifra moltiplicata per la base elevata a tre.

    Terza riga: 16#af = f*16^0 + a*16^1 = 15*16^0 + 10*16^1
    esprime un valore con le cifre "af" in base 16, valore che può essere ricavato sommando l'ultima cifra moltiplicata per la base elevata a zero, con la prima cifra moltiplicata per la base elevata a uno (la seconda parte "esplicita" f ed a in base 10, cioè 15 e 10).

    Un tempo me la cavavo piuttosto bene con la "Settimana Enigmistica".
  • Re: Conversione nei vari sistemi di numerazione

    AldoBaldo ha scritto:


    10#123 = 3*10^0 + 2*10^1 + 1*10^2
    2#1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2
    16#af = f*16^0 + a*16^1 = 15*16^0 + 10*16^1
    Questa credo proprio si riferisca al procedimento di calcolo, non all'implementazione in qualsivoglia linguaggio. Io la leggo così:

    Prima riga: 10#123 = 3*10^0 + 2*10^1 + 1*10^2
    esprime un valore con le cifre "123" in base 10, valore che può essere ricavato sommando l'ultima cifra moltiplicata per la base elevata a zero, con la penultima cifra moltiplicata per la base elevata a uno, con la prima cifra moltiplicata per la base elevata a due.

    Seconda riga: 2#1011 = 1*2^0 + 1*2^1 + 0*2^2 + 1*2^3 (manca un pezzo?)
    esprime un valore con le cifre "1011" in base 2, valore che può essere ricavato sommando l'ultima cifra moltiplicata per la base elevata a zero, con la penultima cifra moltiplicata per la base elevata a uno, con la seconda cifra moltiplicata per la base elevata a due, con la prima cifra moltiplicata per la base elevata a tre.

    Terza riga: 16#af = f*16^0 + a*16^1 = 15*16^0 + 10*16^1
    esprime un valore con le cifre "af" in base 16, valore che può essere ricavato sommando l'ultima cifra moltiplicata per la base elevata a zero, con la prima cifra moltiplicata per la base elevata a uno (la seconda parte "esplicita" f ed a in base 10, cioè 15 e 10).

    Un tempo me la cavavo piuttosto bene con la "Settimana Enigmistica".


    Grazie,ora ci ho capito qualcosa. ma in c come andrebbe fatto?
  • Re: Conversione nei vari sistemi di numerazione

    Sei capace a "isolare" i procedimenti in funzioni? Perché renderebbe tutto più lineare. Diversamente occorrerebbe far stare tutto nel main(), che non è la soluzione più comoda.

    Ps: qui qualche informazione in più su strtol()
    https://www.tutorialspoint.com/c_standard_library/c_function_strtol.htm
  • Re: Conversione nei vari sistemi di numerazione

    AldoBaldo ha scritto:


    Sei capace a "isolare" i procedimenti in funzioni? Perché renderebbe tutto più lineare. Diversamente occorrerebbe far stare tutto nel main(), che non è la soluzione più comoda.

    Ps: qui qualche informazione in più su strtol()
    https://www.tutorialspoint.com/c_standard_library/c_function_strtol.htm
    no purtoppo,non ci siamo ancora arrivati
  • Re: Conversione nei vari sistemi di numerazione

    Va bene. Lasciami pensare un attimo.
  • Re: Conversione nei vari sistemi di numerazione

    AldoBaldo ha scritto:


    Va bene. Lasciami pensare un attimo.

    ok
  • Re: Conversione nei vari sistemi di numerazione

    Dimentica quel # non serve a nulla

    Se sei al primo superiore secondo me non stai cominciando bene cercando soluzioni nei forum.

    Dovresti metterci un po' di passione o l'informatica non fa per te.

    Non ho ancora visto neanche una riga di codice tuo su cui discutere.

    Fino al menu e l'input dei dati dovresti saperla scrivere da solo.
Devi accedere o registrarti per scrivere nel forum
41 risposte