Programma cifratura

di il
34 risposte

Programma cifratura

Ciao a tutti, ho un problema abbastanza complicato. Devo usare il C++ per scrivere un programma che apre un file txt, converte tutte le minuscole in maiuscole e "somma" alle lettere e ai numeri una costante K, in modo da cifrare il messaggio. Finora ho scritto questo
#include <iostream>
#include <stdlib.h>
#include <string>
#include <fstream>
using namespace std;

int main() {
    int k;
    string inputFile, outputFile;
    cout<<"Inserire il nome del file di ingresso con l'estensione: ";
    getline(cin, inputFile);
    cout<<"Inserire il nome del file di uscita con l'estensione: ";
    getline(cin, outputFile);
    cout<<"Inserire una costante per la cifratura: ";
    cin>>k;
    ifstream inFile;
    ofstream outFile;
    inFile.open(inputFile.c_str(),ios::in);
    outFile.open(outputFile.c_str(),ios::out);
    char c = inFile.get();
    while (inFile.good()) {
    if (int(c)>=65 && int(c)<=90) {
        c=(char)(int(c)+k);
    }
    else if (int(c)>=97 && int(c)<=122) {
        c=(char)(int(c)-32+k);
    }
    else if (int(c)>=48 && int(c)<=57) {
        c=(char)(int(c)+k);
    }
}
    outFile<<c<<endl;
    inFile.close();
    outFile.close();
    system("PAUSE");
}

}

Non so di preciso cosa avviene. Credo vada in loop infinito senza però visualizzare niente.
Ogni suggerimento è gradito. Grazie a tutti.

34 Risposte

  • Re: Programma cifratura

    Ciao! Scusa se piombo così nella tua discussione ma ho un problema abbastanza simile e magari ci possono aiutare in contemporanea...
    Il mio prof di Fondamenti di Informatica ci ha assegnato questo esercizio
    4.2 Cifrario di Cesare
    Leggere un testo da un file e riscriverlo, una
    lettera alla volta, in un altro file, ma...
    Trasformare tutte le lettere in maiuscolo
    Sostituire ciascuna lettera con quella che la
    segue dopo K posizioni nell'alfabeto
    Effettuare una rotazione
    analoga per le cifre
    Scartare ogni altro carattere
    Usare l'operatore % per limitare i valori in un intervallo
    che io ho svolto in questo modo:
    #include <iostream>
    #include <fstream>
    #include <string>
    using namespace std;
    
    int main()
    {
        string line;
        ifstream inText ("Testo.txt");
        ofstream outText ("TestoCifrato.txt");
        int K, J;
        cout << "Di quanto deve essere aumentata ogni lettera una volta trasformata in maiuscolo?(inserisci un numero minore di 26)" <<endl;
        cin >> K;
        cout << "Di quanto vuoi aumentare ogni cifra?(inserisci un numero minore di 9)" << endl;
        cin >> J;
        while (inText.good())
        {
            getline(inText, line);
            for (int i=0; i < 1000; ++i)
            {
                if (line[i] >= 'a' && line[i] <= 'z')
                {
                    line[i] = line[i] - ('a' - 'A') + K;
                }
                if (line[i] >= '0' && line[i] <= '9')
                {
                    line[i] = line[i] + J;
                }
            }
            outText << line << endl;
        }
        inText.close();
        outText.close();
        return 0;
    }
    
    Solo che così facendo le lettere e i numeri non vengono trasformate solo in lettere e numeri ma non so come utilizzare il suggerimento che ci ha dato il Prof, cioè quello dell'opertatore %
    Mi potreste aiutare?!
  • Re: Programma cifratura

    Ciao! io sono riuscito a far funzionare il mio programma, ma anche io ho il tuo stesso problema...
  • Re: Programma cifratura

    A posto! Allora ci siamo trovati...aspetteremo qualcuno che ne sappia qualcosa di più e ci aiuti entrambi!
    Comunque, piacere di conoscerti! xD
  • Re: Programma cifratura

    Piacere mio. comunque bisognerebbe dire al programma, una volta raggiunta la Z, di ricominciare dalla A, escludendo tutti gli altri valori della tabella ASCII...facile a dirsi...
  • Re: Programma cifratura

    
    #include <iostream>
    #include <stdlib.h>
    #include <string>
    #include <fstream>
    using namespace std;
    
    int main() {
        int k;
        string inputFile, outputFile;
        cout<<"Inserire il nome del file di ingresso con l'estensione: ";
        getline(cin, inputFile);
        cout<<"Inserire il nome del file di uscita con l'estensione: ";
        getline(cin, outputFile);
        cout<<"Inserire una costante per la cifratura: ";
        cin>>k;
        ifstream inFile;
        ofstream outFile;
        inFile.open(inputFile.c_str(),ios::in);
        outFile.open(outputFile.c_str(),ios::out);
        char c = inFile.get();
        while (inFile.good()) {
        if (int(c)>=65 && int(c)<=90) {
            c=(char)(int(c)+k);
        }
        else if (int(c)>=97 && int(c)<=122) {
            c=(char)(int(c)-32+k);
        }
        else if (int(c)>=48 && int(c)<=57) {
            c=(char)(int(c)+k);
        }
    }
        outFile<<c<<endl;
        inFile.close();
        outFile.close();
        system("PAUSE");
    }
    
    }
    
    
    Guarda il blocco while. dentro sto blocco in nessun passaggio avviene la successiva lettura del file. Quindi non basta che prendere il carattere successivo, trasformarlo e il programma non sarà + in loop.

    quindi direi che un: char c = inFile.get(); dentro il loop farebbe a caso tuo. Poi se potete mettete anche il file txt così si possono fare le prove.
  • Re: Programma cifratura

    Grazie ma quel problema l'ho già risolto esattamente nel modo che hai suggerito tu. ora il problema è un altro: i caratteri cifrati non sono solo lettere e numeri, ma anche altri simboli ASCII. Come possiamo fare in modo che il programma, arrivato alla Z ricominci dalla A?
  • Re: Programma cifratura

    Per ~Mari_91~.

    Usare il % significa fare questo:
    
    char c = //carattere preso da file
    c = 'A' + ((c+k) % ('Z' - 'A'));
    siccome 'Z' - 'A' fisso a 90-65=25 (+ 1 x stare nell range delle maiuscole)  puoi scrivere
    c= 'A' + (c+k)%26;
    
    per i numeri farai
    
    c = '0' + (c+k)%10
    
    Credo che dovrebbe risolvere.
  • Re: Programma cifratura

    
    if (line[i] >= 'a' && line[i] <= 'z')
                {
                    line[i] = 'A' + ((line[i] - ('a' - 'A')) + K) % 26;
                }
                if (line[i] >= '0' && line[i] <= '9')
                {
                    line[i] = '0' + (line[i] + J)%10;
                }
    
    così dovrebbe funzionare
  • Re: Programma cifratura

    Potete usare anche queste funzioni invece dei if lunghi
    isalnum per vedere se è un carattere o un numero
    isalpha per vedere se è un carattere
    islower per vedere se il carattere è minuscolo
    isdigit per vedere se è un numero.
    quindi l'esempio di sopra si traduce in
    
    if (isalnum(line[i])
    {
    	if(isalpha(line[i])
    	{
    		if(islower(line[i]))
    			line[i] = 'A' + ((line[i] - ('a' - 'A')) + K) % 26;
    	}
    	else
    		line[i] = '0' + (line[i] + J)%10;
    }
    
    oppure
    
    if (isalnum(line[i])
    {
    	if(isdigit(line[i])
    	{
    		line[i] = '0' + (line[i] + J)%10;
    	}
    	else
    	{
    		if(islower(line[i]))
    			line[i] = 'A' + ((line[i] - ('a' - 'A')) + K) % 26;
    	}
    }
    
  • Re: Programma cifratura

    Così le lettere restano lettere e i numeri restano numeri, però succede una cosa strana...se io provo a cifrare la parola "CIAO" con costante di cifratura 2 mi aspetterei la parola "EKCQ" e invece trovo "RXPD". Come mai?
  • Re: Programma cifratura

    Errore mio.
    ecco la soluzione corretta.
    
    if (isalnum(line[i])
    {
       if(isalpha(line[i])
       {
          if(islower(line[i]))
             line[i] = 'A' + ((line[i] - ('a' - 'A')) + K) %  ('Z' + 1);
       }
       else
          line[i] = '0' + (line[i] + J)% ('9' + 1);
    }
    
    oppure
    
    if (isalnum(line[i])
    {
       if(isdigit(line[i])
       {
          line[i] = '0' + (line[i] + J)% ('9' + 1);
       }
       else
       {
          if(islower(line[i]))
             line[i] = 'A' + ((line[i] - ('a' - 'A')) + K) % )('Z' + 1);
       }
    }
    
  • Re: Programma cifratura

    Ti dispiacerebbe modificarmi questo codice? perchè io non ho usato le righe, ma ho estratto un carattere alla volta
    
    if (c >= 'A' && c <= 'Z') {
            c='A' + ((c+k) % 26);;
        }
        else if ( c>= 'a' && c <= 'z') {
            c= 'A' + ((c - ('a' - 'A')) + k) % 26;
        }
        else if (int(c)>=48 && int(c)<=57) {
            c='0' + (c+k)%10;
        }
        outFile<<c;
    
    ancora grazie mille
  • Re: Programma cifratura

    Anzi scusate son mezzo fuso oggi.
    
    if(isalnum(line[i]))
    		{
    			if(isdigit(line[i]))
    			{
    				line[i] = (line[i] + J)% ('9' + 1);
    				if(!isdigit(line[i]))
    					line[i] += '0';
    			}
    			else
    			{
    				if(islower(line[i]))
    				{
    					line[i] = ((line[i] - ('a' - 'A')) + K) % ('Z'+ 1);
    					if(!isalpha(line[i]))
    						line[i] += 'A';
    				}
    			}
    		}
    
  • Re: Programma cifratura

    Caso di minomic
    
    if(isalnum(c))
    {
    	if(isdigit(c))
    	{
    		c = (c + K)% ('9' + 1);
    		if(!isdigit(c))
    			c += '0';
    	}
    	else
    	{
    		if(islower(c))
    		{
    			c = ((c - ('a' - 'A')) + K) % ('Z'+ 1);
    			if(!isalpha(c))
    				c += 'A';
    		}
    	}
    }
    
    outfile << c;
    
Devi accedere o registrarti per scrivere nel forum
34 risposte