[c++]aiuto per diminuire il codice

di il
27 risposte

[c++]aiuto per diminuire il codice

Ciao a tutti ho creato un programma in c++ sono ancora alle prime armi e avrei bisogno di una mano(come compilatore uso devc++)

la parte di codice che mi da problemi è questa
if (a==2)
 { 
cout<<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<<endl;   
}
fin qui nessun problema ma quando (a==20)
if (a==20)
 {cout<<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<< " "  <<(int)parola[2]+c<<" "<<c<<" "<<(int)parola[3]+v<<" "<<v<<" "<<(int)parola[4]+b<<" "<<b<<" "<<(int)parola[5]+n<<" "<<n<<" "<<(int)parola[6]+z<<" "<<z<<" "<<(int)parola[7]+z<<" "<< z << " " <<(int)parola[8]+x<<" " <<x<< " " <<(int)parola[9]+c<<" "<<c<<" "<<(int)parola[10]+v<<" "<<v<<" "<<(int)parola[11]+b<<" "<<b<<" "<<(int)parola[12]+n<<" "<<n<<" "<<(int)parola[13]+z<<" "<<z<<" "<<(int)parola[14] +z<< " "<< z << " " <<(int)parola[15]+x<<" " <<x<< " " <<(int)parola[16]+c<<" "<<c<<" "<<(int)parola[17]+v
<<" "<<v<<" "<<(int)parola[18]+b<<" "<<b<<" "<<(int)parola[19]+n<<" "<<n<<endl;  }
ecco xD vorrei sapere se esiste qualche metodo per diminuire questo codice dato che a dovrebbe arrivare a 100-1000 o comunque numeri ben più alti di 20 spero di essermi spiegato

codice sorgente di tutto il programma:
[list]#include<iostream>
#include<ctime>
#include <string>
#include <windows.h>
#include <fstream.h> 


using namespace std;
main ()
{
cout<<"ciao! benvenuto vuoi criptare(seleziona 1) o decriptare(seleziona 2)?"<<endl;
int z,x,c,v,b,n,sel;
srand((unsigned)time(NULL));
z=rand()%700;
x=rand()%700;
c=rand()%700;
v=rand()%700;
b=rand()%700;
n=rand()%700;
system ("pause");
system ("cls");
cout<<"inserisci la parola"<<endl;
string parola;
std::getline(std::cin, parola);
int a;
a=-1;
while(parola[++a]) ;
string d;


        if (a==1)
        { cout<<(int)parola[0]+z<< " "<< z <<endl;  }
        
        
                if (a==2)
        { cout<<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<<endl;   }
        
               
         if (a==3)
        { cout<<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<< " " <<(int)parola[2]+c<<" "<<c<<endl;   }
        
        
        
         if (a==4)
        {     cout<<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<< " " <<(int)parola[2]+c<<" "<<c<<" "<<(int)parola[3]+v
         <<" "<<v<<endl;   }      
        
        
         if (a==5)
        {    cout<<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<< " " <<(int)parola[2]+c<<" "<<c<<" "<<(int)parola[3]+v
         <<" "<<v<<" "<<(int)parola[4]+b<<" "<<b<<endl;      }
        
        
        
        
         if (a==6)
        {cout<<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<< " " <<(int)parola[2]+c<<" "<<c<<" "<<(int)parola[3]+v
        <<" "<<v<<" "<<(int)parola[4]+b<<" "<<b<<" "<<(int)parola[5]+n<<" "<<n<<endl;}
        
             
         if (a==7)
         {cout<<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<< " " <<(int)parola[2]+c<<" "<<c<<" "<<(int)parola[3]+v
         <<" "<<v<<" "<<(int)parola[4]+b<<" "<<b<<" "<<(int)parola[5]+n<<" "<<n<<" "<<(int)parola[6]+z<<" "<<z<<endl;  }
         
         if (a==8)
{cout<<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<< " " <<(int)parola[2]+c<<" "<<c<<" "<<(int)parola[3]+v<<" "<<v<<" "<<(int)parola[4]+b<<" "<<b<<" "<<(int)parola[5]+n<<" "<<n<<" "<<(int)parola[6]+z<<" "<<z<< " "<<(int)parola[7]+z<<" "<< z<<endl;}
         ......

system("pause");
         system ("cls");
         cout<<"vuoi che copi la parola criptata in un file di testo?(rispondi si o no)"<<endl;
         cin>>d;
         system ("cls");
         if (d=="si")
         {
       ofstream f("cripto.txt");
     if(!f)
    {
      cout << "Impossibile aprire cripto.txt.";
      system("pause");
      return main();    
      }
    
    if (a==1)
       {f <<(int)parola[0]+z<< ' '<< z<<endl;}
    
    if (a==2)
       {f <<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<<endl;}

     if (a==3)
        {f <<(int)parola[0]+z<<' '<<z<<' '<<(int)parola[1]+z<<' '<<z<<' '<<(int)parola[2]+z<<' '<<z<<' '<<endl;}
        
     if (a==4)
        {f <<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<< " " <<(int)parola[2]+c<<" "<<c<<" "<<
        (int)parola[3]+v <<" "<<v<<endl;}
        
     if (a==5)
        {f <<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<< " " <<(int)parola[2]+c<<" "<<c<<" "<<
        (int)parola[3]+v<<" "<<v<<" "<<(int)parola[4]+b<<" "<<b<<endl;  }
        
      if (a==6)
        {f<<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<< " " <<(int)parola[2]+c<<" "<<c<<" "<<
        (int)parola[3]+v<<" "<<v<<" "<<(int)parola[4]+b<<" "<<b<<" "<<(int)parola[5]+n<<" "<<n<<endl;}
   
      if (a==7)
         {f<<(int)parola[0]+z<< " "<< z << " " <<(int)parola[1]+x<<" " <<x<< " " <<(int)parola[2]+c<<" "<<c<<" "<<
         (int)parola[3]+v<<" "<<v<<" "<<(int)parola[4]+b<<" "<<b<<" "<<(int)parola[5]+n<<" "<<n<<" "<<(int)parola[6]+z<<" "<<z<<endl; }
    
      f.close();
      cout<<"codice copiato in cripto.txt (nella stessa cartella in cui e' situato questo \nprogramma)"<<endl;
      system("pause");
      system ("cls");
    }
    else
    {
       cout<<"vuoi tornare all'inizio del programma?(rispondi si o no)"<<endl;
      cin>>d;
      
      if (d=="si")
       {
            system("cls");
            return main ();
       }
         
         else if (d=="no")
         {
            return 0;
         }
          else 
          {
             cout<<"carattere non valido"<<endl;
             return 0;
            }
    }
      cout<<"vuoi tornare all'inizio del programma?(rispondi si o no)"<<endl;
      cin>>d;
      
      if (d=="si")
       {
            system("cls");
            return main ();
       }
         
         else if (d=="no")
         {
            return 0;
         }
          else 
          {
             cout<<"carattere non valido"<<endl;
             return 0;
            }
        }[/list]

27 Risposte

  • Re: [c++]aiuto per diminuire il codice

    Allora fai così:
    int i, var;
    for (i = 0; i < a; i++) {
        var = i % 6 == 0 ? z : i % 6 == 1 ? x : i % 6 == 2 ? c : i % 6 == 3 ? v : i % 6 == 4 ? b : n;
        cout << (int)parola[i] + var << " " << var;
        if (i + 1 != a) cout << " ";
        else cout << endl;
    }
  • Re: [c++]aiuto per diminuire il codice

    In fstream non ci vuole .h.

    Io userei delle funzioni e riordinerei un po' il codice.
  • Re: [c++]aiuto per diminuire il codice

    Ma quale sarebbe l'utilità?
  • Re: [c++]aiuto per diminuire il codice

    Alee ha scritto:


    Allora fai così:
    int i, var;
    for (i = 0; i < a; i++) {
        var = i % 6 == 0 ? z : i % 6 == 1 ? x : i % 6 == 2 ? c : i % 6 == 3 ? v : i % 6 == 4 ? b : n;
        cout << (int)parola[i] + var << " " << var;
        if (i + 1 != a) cout << " ";
        else cout << endl;
    }
    ecco! grazie funziona!!! se hai tempo puoi spiegarmi come funziona? mi piacerebbe impararlo
    l'utilità del programma? criptare delle parole xD principalmente l'ho fatto per imparare meglio il c++
  • Re: [c++]aiuto per diminuire il codice

    A me sembra più facile da comprendere questa:
    
    	int i, var;
    	int *indirizzi[6] = {0};
    	indirizzi[0] = &z;
    	indirizzi[1] = &x;
    	indirizzi[2] = &c;
    	indirizzi[3] = &v;
    	indirizzi[4] = &b;
    	indirizzi[5] = &n;
    
    	for (i = 0; i < a; i++) 
    	{
    		var = *(indirizzi[i%6]);
    		cout << (int)parola[i] + var << " " << var;
    		if (i + 1 != a) cout << " ";
    		else cout << endl;
    	}
    
  • Re: [c++]aiuto per diminuire il codice

    O meglio ancora:
    int num[6], i, var;
    srand(clock());
    for (i = 0; i < 6; i++) num[i] = rand() % 700;
    // [...]
    for (i = 0; i < a; i++) cout << (int)parola[i] + num[i % 6] << " " << num[i % 6] << " ";
    cout << endl;
    Senza ovviamente dichiarare z, x, c, ecc...
  • Re: [c++]aiuto per diminuire il codice

    Non li resta che imparare insomma
  • Re: [c++]aiuto per diminuire il codice

    Alee ha scritto:


    O meglio ancora:
    int num[6], i, var;
    srand(clock());
    for (i = 0; i < 6; i++) num[i] = rand() % 700;
    // [...]
    for (i = 0; i < a; i++) cout << (int)parola[i] + num[i % 6] << " " << num[i % 6] << " ";
    cout << endl;
    Senza ovviamente dichiarare z, x, c, ecc...
    grazie! ora ho capito come funziona beh non era difficilissimo ma essendo alle prime armi non ci avevo pensato
  • Re: [c++]aiuto per diminuire il codice

    Rieccomi (purtroppo xD) il programma di prima va alla grande ma ora... dovrei fare un programma che faccia il processo inverso di quello di prima

        #include <iostream>
        #include <fstream>
        using namespace std;
         
        main()
        {
         fstream b("cripto.txt");
        char c[1000];
        
        b.get(c,';');
        b.close();
    int a,s[50];
    a=-1;
    while(c[++a]) ;
    a=(a/3)/2;
    fstream z("cripto.txt" ,ios::in);
    if (a==1)
    {
    z>>s>>s1;
    cout<<(char)(s-s1)<<endl;
    }
    else if (a==2)
    {
    z>>s>>s1>>s2>>s3;
    cout<<(char)(s-s1)<<(char)(s2-s3)<<endl;
    }
    else if (a==3)
    {
    z>>s1>>s2>>s3>>s4>>s5>>s6;
    cout<<(char)(s1-s2)<<(char)(s3-s4)<<(char)(s5-s6)<<endl;
    }
    else if(a==4)
    {
    z>>s1>>s2>>s3>>s4>>s5>>s6>>s7>>s8;
    cout<<(char)(s1-s2)<<(char)(s3-s4)<<(char)(s5-s6)<<(char)(s7-s8)<<endl;
    }
    else if (a==5) 
    {
    z>>s1>>s2>>s3>>s4>>s5>>s6>>s7>>s8>>s9>>s10;
    cout<<(char)(s1-s2)<<(char)(s3-s4)<<(char)(s5-s6)<<(char)(s7-s8)<<(char)(s9-s10)<<endl;
    }
    else
    {
        cout<<"non supportato"<<endl;
    }
    system("pause");
    }
    come potete facilmente immaginare ho lo stesso problema di prima e ci sto impazzendo dalle 18 xD non riesco a fare un codice che non richieda tutto questo casino:
    {
    z>>s1>>s2>>s3>>s4>>s5>>s6>>s7>>s8>>s9>>s10;
    cout<<(char)(s1-s2)<<(char)(s3-s4)<<(char)(s5-s6)<<(char)(s7-s8)<<(char)(s9-s10)<<endl;
    }
    qualche altra buon'anima disposta ad aiutarmi? xD
  • Re: [c++]aiuto per diminuire il codice

    Tutto sto codice
    
    int a;
    a=-1;
    while(c[++a]) ;
    
    è uguale a:
    
    a = srtlen(c);
    
    Passiamo al resto.
    tu hai un vettore s[50] che lo puoi riempire con i primi 50 caratteri letti da z. a sto punto puoi fare un ciclo:
    
    z.get(s,50,'\n');
    for(int i = 1; i < 50; ++i)
          cout << static_cast<char>(s[i-1] - s[i]);
    
    credo che dovrebbe bastare.
  • Re: [c++]aiuto per diminuire il codice

    Basta usare array e for non è difficile.
  • Re: [c++]aiuto per diminuire il codice

    skynet ha scritto:


    tutto sto codice
    
    int a;
    a=-1;
    while(c[++a]) ;
    
    è uguale a:
    
    a = srtlen(c);
    
    Passiamo al resto.
    tu hai un vettore s[50] che lo puoi riempire con i primi 50 caratteri letti da z. a sto punto puoi fare un ciclo:
    
    z.get(s,50,'\n');
    for(int i = 1; i < 50; ++i)
          cout << static_cast<char>(s[i-1] - s[i]);
    
    credo che dovrebbe bastare.
    non funge ho scritto così:
    #include<iostream>
    #include <windows.h>
    #include <fstream> 
        
        using namespace std;
         
        main()
        {
        char s[1000];
    fstream z("cripto.txt" );
    z.get(s,50,';');
    for(int i = 1; i < 50; ++i)
          cout << static_cast<char>(s[i-1] - s[i]);
          system("pause");
    }
    questo programma dovrebbe trasformare la serie di numeri che genera il primo programma in lettere solo che non lo fa come avevo fatto io andava ma era troppo lungo da scrivere.
    il file di testo è 137 38 124 19 335 238 448 337
    ora sottraendo il primo numero al secondo esce un lettera in codice ascii mi sembra non ricordo comunque 137-38= 99 ecco convertendo 99 in char dovrebbe uscire la lettera c poi 124-19 e dovrebbe uscire i e così via
    quindi i primi 3 numeri devono andare in una variabile la seconda serie in un altra... ecc. come hai fatto tu s assumerebbe il valore del primo numero e non della prima serie .
    spero mi capiate xD
  • Re: [c++]aiuto per diminuire il codice

    Allora devi fare così. Con tutti quei s1,s2 ecc non c'è santo che capisca il tuo codice.
    
    for(int i = 1; i < 50; i+= 2)
          cout << static_cast<char>(s[i-1] - s[i]);
    
  • Re: [c++]aiuto per diminuire il codice

    Non funziona nemmeno così perchè con il tuo codice s[i-1] - s nel caso in cui nel file di testo ci fosse scritto 137 38 124 19 335 238 448 337 s[-1] farebbe 1-3(?) invece di 137-38
Devi accedere o registrarti per scrivere nel forum
27 risposte