Conversione nei vari sistemi di numerazione

di Anonimizzato24820 il
41 risposte
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

  • 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!
  • 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).
  • Primo anno di cosa?
  • @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!
  • 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
  • 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?
  • 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.
  • 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".
  • 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?
  • 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
  • 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
  • Va bene. Lasciami pensare un attimo.
  • AldoBaldo ha scritto:


    Va bene. Lasciami pensare un attimo.

    ok
  • 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