Last active
August 29, 2015 14:13
-
-
Save madduci/a45fc74f8626149d5aec to your computer and use it in GitHub Desktop.
Caesar Code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <string> //usiamo std::string | |
#include <cctype> //usato per std::isalnum | |
#include <algorithm> //usato per std::transform ed std::erase | |
using namespace std; | |
//la chiave di default | |
int key{3}; | |
char codifica(char &x) | |
{ | |
//qui salveremo l'output - inizializziamo con il carattere 'a' | |
char output{'a'}; | |
//definiamo ora i limiti: il valore ASCII (numerico) di 'a' e 'z' | |
int primo{'a'}, ultimo{'z'}; | |
//convertiamo il carattere esaminato nel suo corrispondente valore numerico | |
int corrente{x}; | |
//se si analizza un carattere non alfanumerico, allora non va' modificato | |
if(!isalnum(x)) | |
return output = char{x}; | |
//calcoliamo il valore numerico del carattere codificato | |
int aggiornato{corrente + key}; | |
//se la chiave è positiva, allora bisogna analizzare il limite superiore ('z') | |
if(key > 0) | |
{ | |
if(aggiornato > ultimo) //se si va oltre 'z' | |
{ | |
int diff = aggiornato - ultimo; //valuto di quanto si supera la 'z' | |
output = primo + (diff - 1); //riparto da 'a' aggiungendo (diff - 1) | |
} | |
else | |
output = aggiornato; | |
} | |
else //se la chiave è negativa, bisogna analizzare il limite inferiore ('a') | |
{ | |
if(aggiornato < primo) //se si va prima di 'a' | |
{ | |
int diff = primo - aggiornato; //valuto di quanto si supera la 'a' | |
output = ultimo - (diff - 1); //riparto da 'z' sottraendo (diff - 1) | |
} | |
else | |
output = aggiornato; | |
} | |
return output; | |
} | |
void mostraHelp() | |
{ | |
cout << "Uso: caesar \"Stringa da Codificare o Decodificare\" chiave, dove: " << endl | |
<< "- chiave = 0 \t indica nessuna codifica" << endl | |
<< "- chiave > 0 \t indica di codificare in positivo (a-b-c-d..)" << endl | |
<< "- chiave < 0 \t indica di codificare in negativo (a-z-x-y..)" << endl; | |
} | |
int main(int argc, char *argv[]) | |
{ | |
string source{}, target{}; | |
/* | |
* argc = 1 indica che abbiamo eseguito l'applicazione senza parametri, argv[0] = nome_applicazione | |
* argc = 2 significa: nome_applicazione un_parametro, quindi argv[1] = un_parametro | |
* argc = 3 significa: nome_applicazione un_parametro due_parametri, quindi argv[2] = due_parametri, ecc.. | |
*/ | |
switch(argc) | |
{ | |
//nessun parametro immesso | |
case 1: { | |
cout << "Errore: nessuna stringa da cifrare"; | |
mostraHelp(); | |
return -1; | |
} | |
break; | |
//solo la stringa da cifrare: si usa la chiave key = 3 di default | |
case 2: source = string{argv[1]}; //estraggo la stringa da codificare | |
break; | |
//stringa e chiave da usare | |
case 3: { | |
source = string{argv[1]}; //estraggo la stringa da codificare | |
key = atoi(argv[2]); //estraggo la chiave da usare | |
if(key < -26 || key > 26) | |
{ | |
cerr << "Errore, la chiave utilizzata è piú grande del numero di lettere dell'alfabeto" << endl; | |
return -1; | |
} | |
} | |
break; | |
//troppi parametri immessi | |
default: { | |
cout << "Numero di argomenti non valido" << endl; | |
mostraHelp(); | |
return -1; | |
} | |
} | |
//rimuovo gli apici dalla stringa, così si puó procedere alla codifica | |
string chars{"\""}; | |
for (auto symbol:chars) | |
source.erase (remove(source.begin(), source.end(), symbol), source.end()); | |
//mostra l'input immesso | |
cout << "Stringa immessa: " << source << " con chiave k = " << key << endl; | |
target = string{source}; | |
//trasforma tutto in caratteri minuscoli (ignora le maiuscole) | |
transform(target.begin(), target.end(), target.begin(), ::tolower); | |
//esegui la codifica sulla stringa target | |
transform(target.begin(), target.end(), target.begin(), codifica); | |
cout << "Risultato: " << target << endl; | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment