Sprawdź się
Napisz program, który przekształci podany łańcuch znaków tekst
do postaci, w której składa się wyłącznie z małych liter alfabetu łacińskiego.
Działanie programu przetestuj dla łańcucha znaków Czy androidy snia o elektrycznych owcach?
Specyfikacja problemu:
Dane:
tekst
– łańcuch znaków
Wynik:
łańcuch znaków zawierający tylko małe litery
Przykładowe wyjście:
czyandroidysniaoelektrycznychowcach
Przykładowe rozwiązanie zadania:
#include <iostream>
#include <string>
using namespace std;
string zamien(string tekst) {
string nowy_tekst = "";
for (int i = 0; i < tekst.size(); i++) {
if (tekst[i] >= 'A' && tekst[i] <= 'Z') {
tekst[i] = tekst[i] + 32;
}
}
for (int i = 0; i < (int)tekst.size(); i++) {
if (tekst[i] < 'a' || tekst[i] > 'z')
continue;
nowy_tekst += tekst[i];
}
return nowy_tekst;
}
int main() {
string tekst = "Czy androidy snia o elektrycznych owcach?";
cout << zamien(tekst) << endl;
return 0;
}
Napisz program, który zaszyfruje łańcuch znaków tekst, używając uogólnionego szyfru Cezara. Szyfrowanie powinno odbyć się zgodnie z następującymi regułami:
łańcuch znaków powinien zostać zaszyfrowany dwa razy – z użyciem klucza równego długości tego łańcucha znaków oraz z użyciem klucza równego liczbie przeciwnej długości łańcucha znaków;
program powinien rozpoznawać wielkość liter;
program powinien szyfrować wyłącznie litery – spacje oraz znaki interpunkcyjne powinny być kasowane.
Sprawdź działanie programu dla tekstu Na Zachodzie bez zmian?
.
Specyfikacja problemu:
Dane:
tekst
– łańcuch znaków do zaszyfrowania
Wynik:
dwa zaszyfrowane łańcuchy znaków
Przykładowe wyjście:
KxWxzelawfbybwwjfxk
QdCdfkrgclhehccpldq
W funkcji szyfrującej należy szyfrować znaki będące wielkimi literami, których kody ASCII należą do zakresu <65; 90>, lub małymi literami, których kodu ASCII należą do zakresu <97; 122>.
Przykładowe rozwiązania zadania
Rozwiązanie wykorzystujące normalizację:
#include <iostream>
#include <string>
using namespace std;
string szyfruj(string tekst, int klucz) {
string szyfrogram = "";
klucz = (klucz % 26 + 26) % 26;
char znak = ' ';
for (int i = 0; i < (int)tekst.size(); i++) {
znak = tekst[i];
if (znak >= 'A' && znak <= 'Z') {
if (znak + klucz <= 'Z')
szyfrogram += znak + klucz;
else
szyfrogram += znak + klucz - 26;
}
// Szyfrowanie dla małych liter
else if (znak >= 'a' && znak <= 'z') {
if (znak + klucz <= 'z')
szyfrogram += znak + klucz;
else
szyfrogram += znak + klucz - 26;
}
}
return szyfrogram;
}
int main() {
string tekst = "Na Zachodzie bez zmian?";
cout << szyfruj(tekst, tekst.size()) << endl;
cout << szyfruj(tekst, -tekst.size()) << endl;
return 0;
}
Rozwiązanie, które nie wykorzystuje normalizacji:
#include <iostream>
#include <string>
using namespace std;
string szyfruj(string tekst, int klucz) {
string szyfrogram = "";
klucz = klucz % 26;
char znak = ' ';
for (int i = 0; i < (int)tekst.size(); i++) {
znak = tekst[i];
if (klucz >= 0) {
if (znak >= 65 && znak <= 90) {
if (znak + klucz <= 'Z')
szyfrogram += znak + klucz;
else
szyfrogram += znak + klucz - 26;
} else if (znak >= 97 && znak <= 122) {
if (znak + klucz <= 'z')
szyfrogram += znak + klucz;
else
szyfrogram += znak + klucz - 26;
}
} else {
if (znak >= 65 && znak <= 90) {
if (znak + klucz >= 'A')
szyfrogram += znak + klucz;
else
szyfrogram += znak + klucz + 26;
} else if (znak >= 97 && znak <= 122) {
if (znak + klucz >= 'a')
szyfrogram += znak + klucz;
else
szyfrogram += znak + klucz + 26;
}
}
}
return szyfrogram;
}
int main() {
string tekst = "Na Zachodzie bez zmian?";
cout << szyfruj(tekst, tekst.size()) << endl;
cout << szyfruj(tekst, -tekst.size()) << endl;
return 0;
}
Napisz program, który dla każdego klucza z zakresu <-25; 25> (z wyłączeniem zera) odszyfruje wiadomość zaszyfrowaną za pomocą uogólnionego algorytmu szyfru Cezara. Tekst jawny oraz szyfrogram muszą składać się z wielkich liter alfabetu łacińskiego, szyfrogram może zawierać niezaszyfrowane znaki białe i interpunkcyjne.
Sprawdź działanie programu dla szyfrogramu QUQM UWRM: QHUIMT
Specyfikacja problemu:
Dane:
szyfrogram
– łańcuch znaków, zaszyfrowana wiadomośćklucz
– liczba całkowita z zakresu <-25; 25> (z wyłączeniem zera)
Wynik:
łańcuchy znaków zawierające odszyfrowaną wiadomość oraz liczby całkowite oznaczające klucz
Przykładowe wyjście:
RVRN VXSN: RIVJNU Klucz: -25
SWSO WYTO: SJWKOV Klucz: -24
...
OSOK SUPK: OFSGKR Klucz: 24
PTPL TVQL: PGTHLS Klucz: 25
Dla każdego klucza z zakresu <-25; 25> z wyłączeniem zera wywołaj uzupełnioną funkcję deszyfruj()
.
Przykładowe rozwiązania zadania
Rozwiązanie wykorzystujące normalizację klucza:
#include <iostream>
#include <string>
using namespace std;
string deszyfruj(string szyfrogram, int klucz) {
string tekst = "";
klucz = (-klucz % 26 + 26) % 26;
for (int i = 0; i < (int)szyfrogram.size(); i++) {
if (szyfrogram[i] < 'A' || szyfrogram[i] > 'Z') {
tekst += szyfrogram[i];
continue;
}
if (szyfrogram[i] - klucz >= 'A')
tekst += szyfrogram[i] - klucz;
else
tekst += szyfrogram[i] - klucz + 26;
}
return tekst;
}
int main() {
string szyfrogram = "QUQM UWRM: QHUIMT";
for (int klucz = -25; klucz < 26; klucz++) {
if (klucz == 0) continue;
cout << deszyfruj(szyfrogram, klucz) << " Klucz: " << klucz << endl;
}
return 0;
}
Rozwiązanie, które nie wykorzystuje normalizacji:
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
string deszyfruj(string szyfrogram, int klucz) {
string tekst = "";
klucz = klucz % 26;
for (int i = 0; i < (int)szyfrogram.size(); i++) {
if (szyfrogram[i] < 'A' || szyfrogram[i] > 'Z') {
tekst += szyfrogram[i];
continue;
}
if (klucz >= 0) {
if (szyfrogram[i] + klucz <= 'Z')
tekst += szyfrogram[i] + klucz;
else
tekst += szyfrogram[i] + klucz - 26;
} else {
if (szyfrogram[i] + klucz >= 'A')
tekst += szyfrogram[i] + klucz;
else
tekst += szyfrogram[i] + klucz + 26;
}
}
return tekst;
}
int main() {
string szyfrogram = "QUQM UWRM: QHUIMT";
for (int klucz = -25; klucz < 26; klucz++) {
if (klucz == 0) continue;
cout << deszyfruj(szyfrogram, klucz) << " Klucz: " << klucz << endl;
}
return 0;
}