С++ Закодируйте фразу 'Съешь же ещё этих мягких французских булок, да выпей чаю' с...

0 голосов
113 просмотров

С++
Закодируйте фразу 'Съешь же ещё этих мягких французских булок, да выпей чаю' с помощью шифра Цезаря. Со сдвигом на 7.


Информатика (2.7k баллов) | 113 просмотров
Дан 1 ответ
0 голосов
Правильный ответ

Dec C++

#include
#include
using namespace std;
 
int main()
{
    setlocale (LC_CTYPE, "Russian"); 
 
    char alpha[] = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    char buff[]="Съешь же ещё этих мягких французских булок, да выпей чаю.";
    int n = 66, k=7;
         k %= n;

    for (int i = 0; i < sizeof(buff)-1; ++i)
        if (strchr(alpha,buff[i])) 
buff[i] = alpha[(strchr(alpha,buff[i])-alpha+k) % n];

    cout<<buff<<endl;<br>        system("pause");
    return 0;
}

(194k баллов)
0

Можете объяснить вот этот кусок for (int i = 0; i < sizeof(buff)-1; ++i)
if (strchr(alpha,buff[i]))
buff[i] = alpha[(strchr(alpha,buff[i])-alpha+k) % n]; ?

0

Функция strchr() выполняет поиск первого вхождения символа в строку, т.е. в строке alpha ищется очередной (i-ый) символ заданной строки buff. Если символ найден, т.е. если проверяемый символ - русская буква, то из строки alpha берётся символ, номер которого на k больше, чем номер текущего символа.

0

Если при сложении получается значение >= 66 (= числу символов в alpha), то номер определяется как остаток от деления полученного значения на 66. Например, для буквы "ю": 64+7 = 71, 71 % 66 = 5. Таким образом, буква "ю" заменяется на 5-ый символ строки alpha, т.е. на "Е".