Szyfr Cezara-przesunięcie o 13

0

Potrzebuję stworzyć szyfr, który każdą literę alfabetu łacińskiego zamieni na 12-stą od niej wartość kodu ascii, pozostałe znaki mają pozostać bez zmian
Przykładowo dla słowa "test" poprawny wynik funkcji to "grfg", natomiast u mnie są to jakieś "krzaczki"

#include <string>
#include<iostream>
using namespace std;

string rot13(string msg)

{
  int i=-1;
  int rot;
  for(i=0;i<msg.length();i++)
    {

    if(((int(msg[i])>=65)&&(int(msg[i])<=90))||((int(msg[i])>=97)&&(int(msg[i])<=122)))

    {   rot=int(msg[i])+12;
        msg[i]=char(rot);

    }}

  return msg;
}
3

Co się stanie z z jeśli przesuniesz kod ASCII o 12?

0

@hauleth: Nie wiem, jest błąd moim zdaniem w treści zadania, jednak dla "bezpiecznych" liter również on nie ziała poprawnie
dla słowa "test" również wyświetla błędny wynik, chciałbym najpierw wiedzieć czemu w normalnym wypadku działa niepoprawnie

2

No to zastanów się co powinno się stać z literką z kiedy przesuniesz ją o 1 i zobacz czy w swoim kodzie coś takiego obsługujesz.

0

@Shalom: Znak "z" zmieni się na znak "{"

3

A co mówi treść zadania? Ma co powinno się zamienić? Nie czasem na a?

0

@Shalom: Tak, teraz sprawdziłem, w treści powinno zamienić się na a, myślałem, że błędnie zamienia on na znaki ascii, kod działa jednak poprawnie jeśli chodzi o przesuwanie w kodzie ascii, dziękuję za zwrócenie uwagi

0

wiesz co to bit shifting ?

0
#include <iostream>
#include <string>
#include <cctype>
using namespace std;

string rot13(string msg)
{
    for(int i=0;i<msg.length();++i)
    {
        char ch=msg[i],lf;
        if(islower(ch)) lf='a';
        else if(isupper(ch)) lf='A';
        else continue;
        msg[i]=lf+(ch-lf+13)%26;
    }
    return msg;
}

int main()
{
    string x="Ala ma kota";
    string y=rot13(x);
    string z=rot13(y);
    cout<<x<<endl;
    cout<<y<<endl;
    cout<<z<<endl;
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0