# PBinfo #2615 – CaesarCrypt – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: Darius

## Enunț

Cerința
Se citește un text de maxim 256 caractere. Să se afișeze textul după aplicarea Cifrului Caesar.

Cifrul Caesar este o metodă de criptare în care fiecare literă este înlocuită cu o altă literă ce se află la un număr fix de poziții după aceasta în alfabet. Este numită după Julius Caesar, care o folosea în corespondența privată. 

Date de intrare
Fișierul de intrare caesar.in conține:

Pe prima linie un text format din maxim 256 caractere.
Pe a doua linie un număr n reprezentând numărul de poziții.
Pe a treia linie operația ce se va aplica pe text:

encrypt pentru criptare.
decrypt pentru decriptare.



Date de ieșire
Fișierul de ieșire dbftbs.out va conține textul prelucrat.

Restricții și precizări

1 ≤ n ≤ 100
Se va folosi alfabetul englez. Literele își păstrează capitalizarea.
Atenție la exemple!

Exemple:
Exemplu #1
caesar.in

caesar
1
encrypt
dbftbs.out

dbftbs
Exemplu #2
caesar.in

dbftbs
1
decrypt
dbftbs.out

caesar
Exemplu #3
caesar.in

caeSaR
10
encrypt
dbftbs.out

mkoCkB
Exemplu #4
caesar.in

CAEsAr
10
decrypt
dbftbs.out

SQUiQh
Exemplu #5
caesar.in

If he had anything confidential to say, he wrote it in cipher, that is, by so changing the order of the 26 letters of the alphabet, that not a word could be made out.
7
encrypt
dbftbs.out

Pm ol ohk hufaopun jvumpkluaphs av zhf, ol dyval pa pu jpwoly, aoha pz, if zv johunpun aol vykly vm aol 26 slaalyz vm aol hswohila, aoha uva h dvyk jvbsk il thkl vba.

## Cod sursă C++

```cpp
//C++11
#include <fstream>
#include <string>   //biblioteca specifica C++ pentru a lucra cu string-uri. A nu se confunda cu <cstring>.
using File = std::fstream;  //creem un alias
File in, out;   //declaram stream-urile
std::string textin, op, textout;
int n;
int main()
{
    in.open("caesar.in", File::in);                     //deschidem stream-ul de intrare.
    out.open("dbftbs.out", File::out | File::trunc);    //deschidem stream-ul de iesire.
    std::getline(in, textin);   //citim prima textul.
	in>>n>>op;                  //citim numarul si operatia.
    n%=26; //26 caractere in alfabetul englez.
	if(op=="encrypt")
    {
        for(char c : textin)    //structura for_each din C++11. Inlocuieste for(int i=0; i<textin.size(); i++){...textin[i]...}. A nu se confunda cu std::for_each din <algorithm>.
        {
            if(std::isspace(c) || !std::isalpha(c)) textout+=c; //verificam daca e litera.
            else if(std::isupper(c)) textout+=(char)(((int)(c)+n-65)%26+65);        //
            else textout+=(char)(((int)(c)+n-97)%26+97);                            // convertim caracterul.
        }
    }
    if(op=="decrypt")
    {
        for(char c : textin)    //structura for_each din C++11. Inlocuieste for(int i=0; i<textin.size(); i++){...textin[i]...}. A nu se confunda cu std::for_each din <algorithm>.
        {
            if(std::isspace(c) || !std::isalpha(c)) textout+=c; //verificam daca e litera.
            else if(std::isupper(c)) textout+=(char)(((int)(c)-65+26-n)%26+65);     //
            else textout+=(char)(((int)(c)-97+26-n)%26+97);                         //aplicam acceasi operatie ca si la encrypt iar 'n' devine '26-n'.
        }
    }
    out<<textout;   //afisam textul prelucrat
    return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/2615)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/2615/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-2615/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
