Rezolvare completă PbInfo #2615 CaesarCrypt

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:

  1. Pe prima linie un text format din maxim 256 caractere.
  2. Pe a doua linie un număr n reprezentând numărul de poziții.
  3. 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.

Cum e corect?

cout < "As la info"; cout << "As la info"; cout >> "As la info";

Felicitări! Poți mai mult?

Avem sute de probleme pentru tine, fiecare cu explicații ușor de înțeles.

Greșit, dar nu-i bai!

Antrenează-te cu sutele de probleme pe care ți le-am pregătit. Îți explicăm fiecare problemă în parte.

Rezolvare

Iată rezolvarea de 100 de puncte pentru problema CaesarCrypt:

//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;
}

Atenție

Enunțurile afișate pe această pagină aparțin exclusiv site-ului PbInfo. Astfel, pentru ștergerea conținutului, puteți să ne contactați la adresa Adresa de email.

Rezolvarea problemei #2615 CaesarCrypt

Pe această pagină găsești rezolvarea de 100 de puncte pentru problema #2615 CaesarCrypt de pe PbInfo.ro. Atenție: nu încurajăm copiatul codului! Totuși, credem cu tărie că analizarea unei soluții corecte este o metodă foarte ușoară de a învăța informatică, astfel că oferim sursele pentru peste 1500 de probleme de pe platforma PbInfo.ro.

Pentru rezolvări PbInfo de la peste 1500 de probleme, vă invităm să intrați pe site-ul nostru!