Cifrario di Cesare in C++

Eren88

Utente Attivo
1,471
686
CPU
Intel Core i5-8400
HDD
SSD 240GB, HDD 1TB
RAM
8GB DDR4
GPU
NVIDIA GeForce GTX 1050Ti
OS
Windows 7 Professional
Ciao a tutti, sto provando a creare un programma che cifri un testo utilizzando il cifrario di Cesare, quindi che sposti di n lettere in avanti ogni carattere del testo, per esempio "CIAO" cifrandolo con chiave 1 diventa "DJBP". Stò però avendo dei problemi con dei cicli for che dovrebbero controllare carattere per carattere il testo di input, quindi se un carattere è una lettera spostarla in avanti di n caratteri (n è la variabile c), mentre se è qualcosaltro deve ignorarlo e passare avanti. Il problema è che alla fine il programma restituisce qualcosa di totalmente insensato. Secondo voi cosa potrei aver sbagliato?
Vi allego il codice nel messaggio, grazie mille in anticipo.
C++:
#include <iostream>
#include <cstring>
using namespace std;
int main(){
    string lettere = "ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    int c = 0, o = 0;
    string frase = "";
    cout<<"Inserire la frase: ";
    getline(cin, frase);
    int l = frase.length();
    cout<<"Seleziona l'operazione da fare:\n1.Cripta\n2.Decripta\n";
    cin>>o;
    if(o==1){//cripta
        cout<<"Inserire la chiave (Da 1 a 25): ";
        cin>>c;
        //questi sono i for che danno problemi
        for (int i = 0; i<l; i++){
            for (int j=0; j<25; j++){
                if(frase[i]==lettere[j]){
                    frase[i]=lettere[j+c];   
                }
            }
        }
        cout<<frase;
    }else if(o==2){//decripta
        
    }else{
        
    }
    return 0;
}
 

DispatchCode

Moderatore
Staff Forum
Utente Èlite
2,208
1,845
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
Ciao, un errore che si vede è sicuramente l'indice. j va da 0 a 25, ma inserendo ad esempio c=20, dopo 5 iterazioni, ti ritroveresti con un "out of bounds": ovvero accedi ad una posizione dell'array che non è allocata (per array intendo la tua stringa); dovresti usare qualcosa come (j+c) % lettere.length() come indice.
Un altro errore è nel tuo alfabeto, hai solo maiuscole (ripetute 2 volte); penso tu voglia anche includere le lettere minuscole.

L'errore che non ti permette di vedere il risultato corretto è che sostituisci il carattere alla i-esima posizione, ma continui a ciclare, quindi vai a sostituirlo nuovamente. Dovresti mettere un break all'interno di quell'if.

Questo dovrebbe essere corretto:

C++:
#include <iostream>
#include <cstring>
using namespace std;
int main(){
    string lettere = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    int c = 0, o = 0;
    string frase = "";
    cout<<"Inserire la frase: ";
    getline(cin, frase);
    int l = frase.length();
    cout<<"Seleziona l'operazione da fare:\n1.Cripta\n2.Decripta\n";
    cin>>o;
    if(o==1){//cripta
        cout<<"Inserire la chiave (Da 1 a 25): ";
        cin>>c;
        //questi sono i for che danno problemi
        for (int i = 0; i<l; i++){
            for (int j=0; j<25; j++){
                if(frase[i]==lettere[j]){
                    frase[i]=lettere[(j+c) % lettere.length()];
                    break;
                }
            }
        }
        cout<<frase;
    }else if(o==2){//decripta
        
    }else{
        
    }
    return 0;
}

Dovresti anche gestire l'alfabeto minuscolo.
Prova a trovare una soluzione utilizzando solo ASCII. Non ti servono nemmeno due cicli for, ne basta uno (quello sulla stringa inserita in input).
 
  • Mi piace
Reazioni: Eren88

Eren88

Utente Attivo
1,471
686
CPU
Intel Core i5-8400
HDD
SSD 240GB, HDD 1TB
RAM
8GB DDR4
GPU
NVIDIA GeForce GTX 1050Ti
OS
Windows 7 Professional
Grazie mille per l'aiuto! Hai ragione, cercherò di migliorare la gestione dell'alfabeto in modo da implementare anche le lettere minuscole
 
  • Mi piace
Reazioni: DispatchCode

Andretti60

Utente Èlite
6,440
5,091
Non c’è bisogno di scomodare un vettore, basta che prendi il codice Ansii di ogni singolo carattere della frase, ti accerti che sia negli intervalli a-z o A-Z, e aggiungi il valore della chiave, con il dovuto riporto. Elimini la dichiarazione di un vettore e un ciclo for()
 
  • Mi piace
Reazioni: BAT

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili