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 sprawdź 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:
czyandroidysniaoelektrycznychowcachDo zamiany tekstu na małe litery możesz użyć metody toLowerCase() obiektu typu String.
Przykładowe rozwiązanie zadania:
public class Main {
public static void main(String[] args) {
String tekst = "Czy androidy snia o elektrycznych owcach?";
System.out.println(zamien(tekst));
}
public static String zamien(String tekst) {
StringBuilder nowyTekst = new StringBuilder();
for (int i = 0; i < tekst.length(); i++) {
char znak = tekst.charAt(i);
if (znak >= 'A' && znak <= 'Z') {
znak += 32;
}
if (znak >= 'a' && znak <= 'z') {
nowyTekst.append(znak);
}
}
return nowyTekst.toString();
}
}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 – inne znaki powinny być usuwane z szyfrogramu.
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
QdCdfkrgclhehccpldqW funkcji szyfrującej należy szyfrować znaki będące wielkimi literami, których kody ASCII należą do zakresu , lub małymi literami, których kodu ASCII należą do zakresu .
Przykładowe rozwiązania zadania
Rozwiązanie wykorzystujące normalizację:
public class Main {
public static void main(String[] args) {
String tekst = "Na Zachodzie bez zmian?";
System.out.println(szyfruj(tekst, tekst.length()));
System.out.println(szyfruj(tekst, -tekst.length()));
}
public static String szyfruj(String tekst, int klucz) {
StringBuilder szyfrogram = new StringBuilder();
klucz = (klucz % 26 + 26) % 26;
char znak;
for (int i = 0; i < tekst.length(); i++) {
znak = tekst.charAt(i);
if (!((znak >= 'A' && znak <= 'Z') || (znak >= 'a' && znak <= 'z'))) {
continue;
}
if (znak >= 'A' && znak <= 'Z') {
if (znak + klucz <= 'Z')
szyfrogram.append((char) (znak + klucz));
else
szyfrogram.append((char) (znak + klucz - 26));
}
else if (znak >= 'a' && znak <= 'z') {
if (znak + klucz <= 'z')
szyfrogram.append((char) (znak + klucz));
else
szyfrogram.append((char) (znak + klucz - 26));
}
}
return szyfrogram.toString();
}
}Rozwiązanie, które nie wykorzystuje normalizacji:
public class Main {
public static void main(String[] args) {
String tekst = "Na Zachodzie bez zmian?";
System.out.println(szyfruj(tekst, tekst.length()));
System.out.println(szyfruj(tekst, -tekst.length()));
}
public static String szyfruj(String tekst, int klucz) {
StringBuilder szyfrogram = new StringBuilder();
klucz = klucz % 26;
char znak;
for (int i = 0; i < tekst.length(); i++) {
znak = tekst.charAt(i);
if (!((znak >= 'A' && znak <= 'Z') || (znak >= 'a' && znak <= 'z'))) {
continue;
}
if (klucz >= 0) {
if (znak >= 'A' && znak <= 'Z') {
if (znak + klucz <= 'Z')
szyfrogram.append((char) (znak + klucz));
else
szyfrogram.append((char) (znak + klucz - 26));
}
else if (znak >= 'a' && znak <= 'z') {
if (znak + klucz <= 'z')
szyfrogram.append((char) (znak + klucz));
else
szyfrogram.append((char) (znak + klucz - 26));
}
} else {
if (znak >= 'A' && znak <= 'Z') {
if (znak + klucz >= 'A')
szyfrogram.append((char) (znak + klucz));
else
szyfrogram.append((char) (znak + klucz + 26));
}
else if (znak >= 'a' && znak <= 'z') {
if (znak + klucz >= 'a')
szyfrogram.append((char) (znak + klucz));
else
szyfrogram.append((char) (znak + klucz + 26));
}
}
}
return szyfrogram.toString();
}
}Napisz program, który dla każdego klucza z zakresu (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: 25Dla każdego klucza z zakresu z wyłączeniem zera wywołaj uzupełnioną funkcję deszyfruj().
Przykładowe rozwiązania zadania
Rozwiązanie wykorzystujące normalizację klucza:
public class Main {
public static void main(String[] args) {
String szyfrogram = "QUQM UWRM: QHUIMT";
for (int klucz = -25; klucz < 26; klucz++) {
if (klucz == 0) {
continue;
}
System.out.println(deszyfruj(szyfrogram, klucz) + " Klucz: " + klucz);
}
}
public static String deszyfruj(String szyfrogram, int klucz) {
StringBuilder tekst = new StringBuilder();
klucz = (-klucz % 26 + 26) % 26;
for (int i = 0; i < szyfrogram.length(); i++) {
char znak = szyfrogram.charAt(i);
if (znak < 'A' || znak > 'Z') {
tekst.append(znak);
continue;
}
if (znak - klucz >= 'A')
tekst.append((char) (znak - klucz));
else
tekst.append((char) (znak - klucz + 26));
}
return tekst.toString();
}
}Rozwiązanie, które nie wykorzystuje normalizacji:
public class Main {
public static void main(String[] args) {
String szyfrogram = "QUQM UWRM: QHUIMT";
for (int klucz = -25; klucz < 26; klucz++) {
if (klucz == 0) {
continue;
}
System.out.println(deszyfruj(szyfrogram, klucz) + " Klucz: " + klucz);
}
}
public static String deszyfruj(String szyfrogram, int klucz) {
StringBuilder tekst = new StringBuilder();
klucz = klucz % 26;
for (int i = 0; i < szyfrogram.length(); i++) {
char znak = szyfrogram.charAt(i);
if (znak < 'A' || znak > 'Z') {
tekst.append(znak);
continue;
}
if (klucz >= 0) {
if (znak + klucz <= 'Z')
tekst.append((char) (znak + klucz));
else
tekst.append((char) (znak + klucz - 26));
} else {
if (znak + klucz >= 'A')
tekst.append((char) (znak + klucz));
else
tekst.append((char) (znak + klucz + 26));
}
}
return tekst.toString();
}
}