Advertisement
Jordimario

Converititore ed addizione numeri primari

Apr 25th, 2019
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.33 KB | None | 0 0
  1. #include <cstdlib>
  2. #include <iostream>
  3. #include <cmath>
  4. using namespace std;
  5. ///codice che crea un contatore di base "base" e lunghezza "CLen" entrambe inserite da input
  6. ///il contatore sommera i numeri inseriti nella base indicata finche esse non potra' piu gestire i riporti
  7.  
  8. int main()
  9. {
  10. int base=5;     ///base del contatore
  11. int NDieci=0;   ///variabile per i numeri immessi
  12. int NConv[100]; ///array per il numero convertito
  13. int somma[100]; ///contatore
  14. int i=0;        ///indice
  15. int CLen=0;     ///lunghezza del Contatore
  16. bool riporto=0; ///inidica se esiste un riporto o meno
  17.  
  18. for(i=0;i<=100;i++){NConv[i]=0;somma[i]=0;}  ///Dichiarazione vettori di zeri
  19.         ///ciclo per immettere la base senza errori (Disabilitato)
  20.     do{
  21.     cout<<"Inserisci la Base in cui vuoi immettere i numeri"<<endl; ///Messaggio utente
  22.     cin>>base;                                                      ///Immessione di base 'base'
  23.  
  24.         if(base<2 || base>10)cout<<"La base e' compresa solo fra 2 e 10"<<endl; ///controllo per inserzione di base (2<base<10)
  25. }while(base<2 || base>10);
  26.  
  27.  
  28.         ///immette la lunghezza del contatore
  29. do{
  30.     cout<<"Immetti la lunghezza del contatore"<<endl;  ///messaggio utente
  31.     cin>>CLen;                                       ///immessione di lunghezza 'CLen'
  32.  
  33.         if(CLen<0)cout<<"Deve essere un numero positivo"<<endl; ///controllo per inserzione della lunghezza del contatore la cui deve essere positiva
  34. }while(CLen<0);
  35.  
  36. CLen--;                                                                                                   ///aggiusta la lunghezza inserita
  37. cout<<"inserisci un numero in base 10"<<endl<<"ogni numero inserito sara convertito in base ("<<base<<") ";   ///messaggio utente
  38.  
  39. do{
  40.     do{
  41.         cin>>NDieci;                                                                                                                                      ///immessione numero in base 10
  42.         if(NDieci>=pow(base,CLen+1))cout<<endl<<"Errore: utilizzando questo numero il contatore andra' automaticamente in overflow"<<endl<<"Massimo numero utilizzabile: ("<<pow(base,CLen+1)-1<<")"<<endl; ///se il numero in base convertita sfora il numero di cifre del contatrore il programma chiedera' una ri-inserzione
  43.     }while(NDieci>=pow(base,CLen+1));
  44.  
  45.     ///convertire la base 10 in base '5'
  46.  i=CLen;    ///l'array partira' dalla cifra piu significativa
  47.  
  48. while(NDieci>0){          ///il ciclo andra' avanti finche il resto dell'operazione non sara' 0
  49.     NConv[i]=NDieci%base;  ///mette nel vettore di cifre il risultato del resto della divisione del numero inserito in base selezionata.
  50.     i--;                  ///diminuisce l'indice per passere alla cifre seguente
  51.     NDieci=NDieci/base;   ///il numero iniziale verra diviso per la base per far andare avanti l'operazione
  52. }
  53.  
  54. cout<<"la somma fra il numero inserito e il contatore sara' fatta interamente in base ("<<base<<"):"<<endl<<" [";       ///Messaggio utente
  55. for(i=0;i<=CLen;i++)cout<<NConv[i];             ///Mostra il numero in base 10 convertito
  56. cout<<"]+[";
  57. for(i=0;i<=CLen;i++)cout<<somma[i];             ///mostra la somma corrente
  58. cout<<"]=";
  59.  
  60. while(i>=0){    ///ciclo per sommare i due numeri
  61.  
  62.     if(NConv[i]+somma[i]+riporto>=base){                ///se il numero prevede un riporto esegue certe istruzioni
  63.         somma[i]=(NConv[i]+somma[i]+riporto)%base;  ///mette in "somma" solo il restante della divisione
  64.         riporto =  1;                               ///porta il numero riportato in questa variabile
  65.     }
  66.  
  67.     else{                                           ///se il numero NON prevede un riporto esegue certe istruzioni
  68.         somma[i] = NConv[i]+somma[i]+riporto;       ///somma il numero inserito la somma stessa e il riporto nella somma
  69.         riporto = 0;                                ///non c'e nessun riporto e se c'era e' stato messo nel numero precedente
  70.     }
  71.  
  72. i--;            ///decremento indice per passare ad altri numeri piu alti
  73. }
  74.  
  75. if(!riporto){
  76.     cout<<"[[";
  77.  
  78.         for(i=0;i<=CLen;i++){cout<<somma[i];}                    ///mostra la somma dei numeri inseriti
  79.  
  80.     cout<<"]]"<<endl<<endl<<"Somma un'altro numero al contatore ";///messaggio utente
  81.  
  82.         for(i=0;i<=CLen;i++)NConv[i]=0;                           ///pulisco il vettore per il prossimo numero che verra' inserito
  83.  
  84.     i=0;   ///riporto a 0 l'indice
  85. }
  86. }while(!riporto);///il programma continuerà finche non c'è un riporto finale, in caso di riporto finale significa che il contatore non potrà piu gestire un riporto il che significa che il contatore sara' andato in overflow
  87.  
  88. cout<<"(il contatore e' andato in overflow, programma finito)";///se c'e' un riporto il programma finisce
  89. return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement