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