Stefano2867 (Normal User)
Newbie
Messaggi: 3
Iscritto: 15/01/2022
|
Codice sorgente - presumibilmente C# |
#include<iostream> #include<math.h> #include<stdio.h> #include<conio.h> #include<fstream> #include<string> using namespace std; int main() { int numero, resti[10], dividendo, i, n, base_a; cout<<"Questo programma acquisisce un numero decimale "<<endl; cout<<"e lo converte in una base qualsiasi "; cout<<"\n\n\ninserire il numero da convertire: "; cin>>numero; cout<<"\ninserire la base: "; cin>> base_a; dividendo=numero; i=0; while(dividendo>0) { resti[i]=dividendo%base_a; //cout<<resti[i]<<endl; dividendo=dividendo/base_a; //cout<<dividendo<<endl; i++; } for(n=i-1;n>=0;n--) { //cout<<resti[n]; if ( resti[ n ] == 10 ) ; { cout << 'A'; } else { if ( resti[ n ] == 11 ) { cout << 'B'; } else { if ( resti[ n ] == 12 ) { cout << 'D'; } else { if ( resti[ n ] == 13 ) { cout << 'D'; } else { if ( resti[ n ] == 14 ) { cout << 'E'; } else { if ( resti[ n ] == 15 ) { cout << 'F'; } else { cout << resti[ n ]; } } } } } } } while(!getch()); return 0; }
|
Ultima modifica effettuata da Thejuster il 23/01/2022 alle 8:58 |
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Ho faticato un po' a capire il codice per via dei "rientri" sballati (la prossima volta inserisci il tutto entro i delimitatori "code" , così viene usato un carattere monospaziato e non vengono male interpretate alcune combinazioni di caratteri).
Dopo avere riordinato un po' le cose, l'errore lampante era la presenza di un punto e virgola di troppo. Fossi in te darei più importanza all'ordine nella gestione dei rientri. È proprio una questione "ottica": se i rientri sono disordinati si perde traccia degli annidamenti e inevitabilmente "scappa" qualcosa.
Codice sorgente - presumibilmente C# |
#include<iostream> //#include<math.h> // non serve in questo contesto //#include<stdio.h> // non serve in questo contesto //#include<conio.h> // non serve in questo contesto #include<fstream> //#include<string> // non serve in questo contesto using namespace std; int main() { int numero, resti[10], dividendo, i, n, base_a; cout<<"Questo programma acquisisce un numero decimale "<<endl; cout<<"e lo converte in una base qualsiasi "; cout<<"\n\n\ninserire il numero da convertire: "; cin>>numero; cout<<"\ninserire la base: "; cin>>base_a; dividendo=numero; i=0; while(dividendo>0) { resti[i]=dividendo%base_a; //cout<<resti<<endl; dividendo=dividendo/base_a; //cout<<dividendo<<endl; i++; } for(n=i-1;n>=0;n--) { //cout<<resti[n]; if ( resti[ n ] == 10 ) // QUI C'ERA UN PUNTO E VIRGOLA DI TROPPO { cout << 'A'; } else { if ( resti[ n ] == 11 ) { cout << 'B'; } else { if ( resti[ n ] == 12 ) { cout << 'D'; } else { if ( resti[ n ] == 13 ) { cout << 'D'; } else { if ( resti[ n ] == 14 ) { cout << 'E'; } else { if ( resti[ n ] == 15 ) { cout << 'F'; } else { cout << resti[ n ]; } } } } } } } return 0; }
|
Ultima modifica effettuata da AldoBaldo il 22/01/2022 alle 13:32
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6378
Iscritto: 03/01/2010
|
Anche la prima riga
cout << 'D';
è sbagliato dovrebbe essere
cout << 'C';
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Come alternativa alla catena di "if" avresti potuto impostare in un array di char la serie delle cifre (riga 8) e scegliere quelle più opportune usando come indice direttamente il resto appena calcolato (riga 33).
Codice sorgente - presumibilmente C# |
#include<iostream> using namespace std; int main() { const int kMinBase = 2; const int kMaxBase = 36; const int kMaxCifreEsito = 255; // meglio abbondare... const char kCifre[kMaxBase+1] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; cout<<endl<<" Questo programma acquisisce un numero decimale "<<endl; cout<<" e lo converte in una base compresa tra "<<kMinBase<<" e "<<kMaxBase; cout<<endl<<endl; int numero; // numero da convertire do { cout<<" Inserisci un numero intero positivo in base 10 da convertire: "; cin>>numero; // nota: se NON riceve un int attiva un ciclo infinito } while( numero<1 ); int base; // base di numerazione per il valore convertito do { cout<<" Inserisci la nuova base di numerazione, compresa tra "; cout<<kMinBase<<" e "<<kMaxBase<<": "; cin>>base; // nota: se NON riceve un int attiva un ciclo infinito } while( base<kMinBase||base>kMaxBase ); int i, n_aux; char ec[kMaxCifreEsito+1]; // ec: esito conversione for( n_aux=numero, i=0; n_aux>0; i++, n_aux/=base ) ec[i] = kCifre[n_aux%base]; cout<<endl<<" "<<numero<<" \t(base 10)"<<endl<<" "; for( i--; i>=0; i-- ) cout<<ec[i]; cout<<" \t(base "<<base<<")"<<endl<<endl; cout<<" Premi \"invio\" per lasciare il programma... "; cin.get(); cin.get(); return 0; }
|
E' giusto un altro modo di vedere le cose.
Ultima modifica effettuata da AldoBaldo il 22/01/2022 alle 17:16
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Un'ulteriore alternativa è ricorrere a uno switch (dalla riga 24).
Codice sorgente - presumibilmente C# |
#include<iostream> using namespace std; int main() { int numero, resti[10], dividendo, i, n, base_a; cout<<"Questo programma acquisisce un numero decimale "<<endl; cout<<"e lo converte in una base qualsiasi "; cout<<"\n\n\ninserire il numero da convertire: "; cin>>numero; cout<<"\ninserire la base: "; cin>>base_a; dividendo=numero; i=0; while(dividendo>0) { resti[i]=dividendo%base_a; dividendo=dividendo/base_a; i++; } for(n=i-1;n>=0;n--) { switch( resti[n] ) { case 10: cout << 'A'; break; case 11: cout << 'B'; break; case 12: cout << 'C'; break; case 13: cout << 'D'; break; case 14: cout << 'E'; break; case 15: cout << 'F'; break; default: cout << resti[n]; } } return 0; }
|
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6378
Iscritto: 03/01/2010
|
Tutti quei case sono inutili ...
Codice sorgente - presumibilmente C++ |
char resti[10]; dividendo = numero; i = 0; while (dividendo > 0) { int r = dividendo % base_a; resti[i] = (char)(r + (r>9 ? '7' : '0')); dividendo = dividendo / base_a; i++; } for (n = i - 1; n >= 0; n--) cout << resti[n];
|
Ultima modifica effettuata da nessuno il 23/01/2022 alle 17:05
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
AldoBaldo (Member)
Guru
Messaggi: 699
Iscritto: 08/01/2015
|
Il ricorso allo switch è uno dei modi coi quali si può affrontare l'esercizio. Secondo me il più esplicito e controllabile rimane quello dell'array di cifre, ma questo non ne fa necessariamente "il migliore". La tua proposta la trovo intrigantemente originale, non ci avrei mai pensato.
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti. |
|
nessuno (Normal User)
Guru^2
Messaggi: 6378
Iscritto: 03/01/2010
|
La questione è anche relativa al fatto che inserire la base può essere un problema se usi lo switch. Se scegli una base 18 devi modificare il codice no?
P.S. il metodo che ho usato, anche se scritto in C, si usava qualche decennio fa con l'assembler 6502... (per intenderci con il VIC20 e il C64...)
Ultima modifica effettuata da nessuno il 23/01/2022 alle 22:10
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti (uno dei padri fondatori del moderno Calcolo delle probabilità) chiamava il gioco del Lotto Tassa sulla stupidità. |
|