Skip to content

Instantly share code, notes, and snippets.

@madduci
Last active August 29, 2015 14:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save madduci/a45fc74f8626149d5aec to your computer and use it in GitHub Desktop.
Save madduci/a45fc74f8626149d5aec to your computer and use it in GitHub Desktop.
Caesar Code
#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