Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Mi aiutate non capisco dov'è l'errore
Forum - C/C++ - Mi aiutate non capisco dov'è l'errore

Avatar
Stefano2867 (Normal User)
Newbie


Messaggi: 3
Iscritto: 15/01/2022

Segnala al moderatore
Postato alle 19:25
Venerdì, 21/01/2022
Codice sorgente - presumibilmente C#

  1. #include<iostream>
  2. #include<math.h>
  3. #include<stdio.h>
  4. #include<conio.h>
  5. #include<fstream>
  6. #include<string>
  7.  
  8.  
  9. using namespace std;
  10.  
  11. int main()
  12. {
  13.     int numero, resti[10], dividendo, i, n, base_a;
  14.     cout<<"Questo programma acquisisce un numero  decimale "<<endl;
  15.     cout<<"e lo converte in una base qualsiasi ";
  16.     cout<<"\n\n\ninserire il numero da convertire: ";
  17.     cin>>numero;
  18.     cout<<"\ninserire la base: ";
  19.     cin>> base_a;
  20.     dividendo=numero;
  21.     i=0;
  22.     while(dividendo>0)
  23.     {
  24.         resti[i]=dividendo%base_a;
  25.         //cout<<resti[i]<<endl;
  26.         dividendo=dividendo/base_a;
  27.        //cout<<dividendo<<endl;
  28.         i++;
  29.     }
  30.     for(n=i-1;n>=0;n--)
  31.                                           {
  32.      
  33.     //cout<<resti[n];
  34.    
  35.       if ( resti[ n ] == 10  ) ;
  36.       {
  37.                    cout << 'A';
  38.       }
  39.     else
  40. {
  41.          if ( resti[ n ] == 11 )
  42.          {     
  43.                   cout << 'B';
  44.      }
  45.      else
  46.  {
  47.                  if ( resti[ n ] == 12 )
  48.                  {
  49.                           cout << 'D';
  50.          }
  51.          else
  52.   {
  53.                          if ( resti[ n ] == 13 )
  54.                          {
  55.                                   cout << 'D';
  56.                      }
  57.                      else
  58.     {
  59.                                  if ( resti[ n ] == 14 )
  60.                      {
  61.                                           cout << 'E';
  62.                   }
  63.                   else
  64.       {
  65.                                           if ( resti[ n ]  == 15 )
  66.                                           {
  67.                                                     cout << 'F';
  68.                                        }
  69.                                        else
  70.                                        {
  71.                                            cout << resti[ n ];
  72.                                        }
  73.  
  74.  
  75.      }                    
  76.    }
  77.   }      
  78.  }    
  79. }
  80.  
  81.                                                                                                                    }
  82.  while(!getch());
  83.  return 0;
  84. }


Ultima modifica effettuata da Thejuster il 23/01/2022 alle 8:58
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 10:21
Sabato, 22/01/2022
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#

  1. #include<iostream>
  2. //#include<math.h>   // non serve in questo contesto
  3. //#include<stdio.h>  // non serve in questo contesto
  4. //#include<conio.h>  // non serve in questo contesto
  5. #include<fstream>
  6. //#include<string>   // non serve in questo contesto
  7.  
  8. using namespace std;
  9.  
  10. int main()
  11. {
  12.     int numero, resti[10], dividendo, i, n, base_a;
  13.  
  14.     cout<<&quot;Questo programma acquisisce un numero  decimale &quot;<<endl;
  15.     cout<<&quot;e lo converte in una base qualsiasi &quot;;
  16.     cout<<&quot;\n\n\ninserire il numero da convertire: &quot;;
  17.     cin>>numero;
  18.     cout<<&quot;\ninserire la base: &quot;;
  19.     cin>>base_a;
  20.  
  21.     dividendo=numero;
  22.     i=0;
  23.  
  24.     while(dividendo>0)
  25.     {
  26.         resti[i]=dividendo%base_a;
  27.         //cout<<resti<<endl;
  28.         dividendo=dividendo/base_a;
  29.         //cout<<dividendo<<endl;
  30.         i++;
  31.     }
  32.  
  33.     for(n=i-1;n>=0;n--)
  34.     {
  35.         //cout<<resti[n];
  36.  
  37.         if ( resti[ n ] == 10 ) // QUI C'ERA UN PUNTO E VIRGOLA DI TROPPO
  38.         {
  39.             cout << 'A';
  40.         }
  41.         else
  42.         {
  43.             if ( resti[ n ] == 11 )
  44.             {
  45.                 cout << 'B';
  46.             }
  47.             else
  48.             {
  49.                 if ( resti[ n ] == 12 )
  50.                 {
  51.                     cout << 'D';
  52.                 }
  53.                 else
  54.                 {
  55.                     if ( resti[ n ] == 13 )
  56.                     {
  57.                         cout << 'D';
  58.                     }
  59.                     else
  60.                     {
  61.                         if ( resti[ n ] == 14 )
  62.                         {
  63.                             cout << 'E';
  64.                         }
  65.                         else
  66.                         {
  67.                             if ( resti[ n ]  == 15 )
  68.                             {
  69.                                 cout << 'F';
  70.                             }
  71.                             else
  72.                             {
  73.                                 cout << resti[ n ];
  74.                             }
  75.                         }
  76.                     }
  77.                 }
  78.             }
  79.         }
  80.     }
  81.  
  82.     return 0;
  83. }


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.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6378
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 13:31
Sabato, 22/01/2022
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à.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 17:13
Sabato, 22/01/2022
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#

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5.     const int  kMinBase           = 2;
  6.     const int  kMaxBase           = 36;
  7.     const int  kMaxCifreEsito     = 255; // meglio abbondare...
  8.     const char kCifre[kMaxBase+1] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  9.  
  10.     cout<<endl<<" Questo programma acquisisce un numero decimale "<<endl;
  11.     cout<<" e lo converte in una base compresa tra "<<kMinBase<<" e "<<kMaxBase;
  12.     cout<<endl<<endl;
  13.  
  14.     int numero; // numero da convertire
  15.  
  16.     do {
  17.         cout<<" Inserisci un numero intero positivo in base 10 da convertire: ";
  18.         cin>>numero; // nota: se NON riceve un int attiva un ciclo infinito
  19.     } while( numero<1 );
  20.  
  21.     int base; // base di numerazione per il valore convertito
  22.  
  23.     do {
  24.         cout<<" Inserisci la nuova base di numerazione, compresa tra ";
  25.         cout<<kMinBase<<" e "<<kMaxBase<<": ";
  26.         cin>>base; // nota: se NON riceve un int attiva un ciclo infinito
  27.     } while( base<kMinBase||base>kMaxBase );
  28.  
  29.     int i, n_aux;
  30.     char ec[kMaxCifreEsito+1]; // ec: esito conversione
  31.  
  32.     for( n_aux=numero, i=0; n_aux>0; i++, n_aux/=base )
  33.         ec[i] = kCifre[n_aux%base];
  34.  
  35.     cout<<endl<<"   "<<numero<<" \t(base 10)"<<endl<<"   ";
  36.     for( i--; i>=0; i-- ) cout<<ec[i];
  37.     cout<<" \t(base "<<base<<")"<<endl<<endl;
  38.  
  39.     cout<<" Premi \"invio\" per lasciare il programma... ";
  40.     cin.get(); cin.get();
  41.     return 0;
  42. }



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.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 17:33
Sabato, 22/01/2022
Un'ulteriore alternativa è ricorrere a uno switch (dalla riga 24).

Codice sorgente - presumibilmente C#

  1. #include<iostream>
  2. using namespace std;
  3.  
  4. int main() {
  5.         int numero, resti[10], dividendo, i, n, base_a;
  6.  
  7.         cout<<"Questo programma acquisisce un numero  decimale "<<endl;
  8.         cout<<"e lo converte in una base qualsiasi ";
  9.         cout<<"\n\n\ninserire il numero da convertire: ";
  10.         cin>>numero;
  11.         cout<<"\ninserire la base: ";
  12.         cin>>base_a;
  13.  
  14.         dividendo=numero;
  15.         i=0;
  16.  
  17.         while(dividendo>0) {
  18.             resti[i]=dividendo%base_a;
  19.             dividendo=dividendo/base_a;
  20.             i++;
  21.         }
  22.  
  23.         for(n=i-1;n>=0;n--) {
  24.             switch( resti[n] ) {
  25.                 case 10: cout << 'A'; break;
  26.                 case 11: cout << 'B'; break;
  27.                 case 12: cout << 'C'; break;
  28.                 case 13: cout << 'D'; break;
  29.                 case 14: cout << 'E'; break;
  30.                 case 15: cout << 'F'; break;
  31.                 default: cout << resti[n];
  32.             }
  33.         }
  34.  
  35.         return 0;
  36.     }



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.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6378
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 16:43
Domenica, 23/01/2022
Tutti quei case sono inutili ...

Codice sorgente - presumibilmente C++

  1. char resti[10];
  2.  
  3.     dividendo = numero;
  4.     i = 0;
  5.  
  6.     while (dividendo > 0) {
  7.         int r = dividendo % base_a;
  8.         resti[i] = (char)(r + (r>9 ? '7' : '0'));
  9.         dividendo = dividendo / base_a;
  10.         i++;
  11.     }
  12.  
  13.     for (n = i - 1; n >= 0; n--)
  14.         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à.
PM Quote
Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 21:56
Domenica, 23/01/2022
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.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6378
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 22:07
Domenica, 23/01/2022
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à.
PM Quote