• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Szyfr Cezara. Działa z dużymi literami, nie działa z małymi.

0 głosów
164 wizyt
pytanie zadane 30 grudnia 2021 w C i C++ przez gaszalottii Nowicjusz (120 p.)

Poniższy program dot. szyfrowania Cezara z Książki Informatyka na czasie 3 podręcznik liceum str. 39 daje przykład szyfrowania dużych liter i wygląda, że działa prawidłowo.

*Myślałem, że prosta zamiana w linii nr 18 warunku z 'Z' na 'z' pozwoli, że program będzie działał podobnie z dla wpisywanych małych liter. Jednak dla wpisywanych liter "s, t, u, v, w, x, y, z" program daje wynik nieprawidłowy czyli spoza zakresy liter to jest Ç, ü, é, â, ä, ů, ć. Należy sądzić, że tylko dla tych liter nie działa działanie -26 w programie.

Nie rozumiem tego, dlaczego to się dzieje. 

Moje próby poszerzenia tego programu o dwie poniższe linijki  które mają zadanie wykryć duże i małe litery kończy się również niepowodzeniem

if (znak>='A' && znak<='Z') //sprawdzamy czy jest duża litera
if (znak>='a' && znak<='z') //sprawdzamy czy jest mała litera
        

Załączam kod programu, który opisuję tekście wyżej oznaczonym gwiazdką

Proszę o pomoc w zrozumieniu ww. problemu

#include <iostream>
#include <string>

using namespace std;

string Cezar (int klucz, string tekst)
{
    char kod;
    int dl = tekst.length();
    string szyfrogram = "";

    for (int i=0; i<dl; i++)
    {
       if (tekst[i] ==  ' ') kod = ' ';
       else
       {
            kod = tekst[i] + klucz;
            if (kod>'z') kod = kod - 26;
       }
       szyfrogram = szyfrogram + kod;
    }
    return szyfrogram;
}


int main ()
{
   string jawny;
   int klucz;

   cout << "Podaj tekst: ";
   getline(cin,jawny);

   cout << "Podaj klucz: ";
   cin >> klucz;
   cout << "Szyfrogram:  " << Cezar(klucz,jawny) << endl;


   return 0;
}

 

1 odpowiedź

+3 głosów
odpowiedź 30 grudnia 2021 przez Oscar Nałogowiec (25,750 p.)
Raczej nie działa warunek kod > 'z'.  Domyślnie typ char jest ze znakiem, przechowuje wartości od -128 do 127. Jeśli wcześniejsze dodawanie da wynik większy od 127 wystąpi przepełnienie i wyjdzie wartość ujemna. Warunek nie będzie spełniony. Znaki jakie wychodzą są właśnie z zakresu 'ponad 127'. Oznacz zmienne jako unsigned lub użyj odpowiedniej opcji kompilacji.

Podobne pytania

0 głosów
0 odpowiedzi 136 wizyt
pytanie zadane 25 listopada 2019 w C i C++ przez juske00 Początkujący (370 p.)
0 głosów
1 odpowiedź 447 wizyt
pytanie zadane 24 marca 2019 w C i C++ przez inc0gnito Początkujący (260 p.)
+1 głos
1 odpowiedź 72 wizyt

88,355 zapytań

136,952 odpowiedzi

305,666 komentarzy

58,619 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...