1

Тема: дешифрування коду Цезаря (С++)

Задача написати код, який дешифрує повідомлення (великий текст, а не 2-3 слова) за вказаним ключем зміщення. Потрібно використовувати масив символів. Алфавіт без літери ґ. Також цей код повинен обов'язково працювати в онлайн-компіляторі, бо перевіряти будуть саме через нього. В мене є початковий варіант коду, але він не працює:

#include <iostream> 
#include <iomanip> 
 #include<stdio.h>
using namespace std; 
 
int main()
{

    int i = 0, k;
    char A[] = { "А","Б","В","Г","Д","Е","Є","Ж","З",
                "И","Й","К","Л","М","Н","О","П","Р",
                "С","Т","У","Ф","Х","Ц","Ч","Ш","Щ",
                "Ь","Ю","Я"};
    char msg[200];
    cout << "Enter your mesage: " << endl;
    cin.getline(msg, 200);
    cout << "Enter key" << endl;
    cin >> k;
    cout << endl;
    char* begin = A;
    char* end = A + sizeof(A);
    for (; msg[i]; ++i)
    {
        char* ch = find(begin, end, msg[i]);
        if (ch != end) msg[i] = *(begin + (ch - begin + k) % sizeof(A));
    }
    cout << "Your text: " << endl;
    cout << msg << endl;
    return 0;
} 

Компілятор видає таку помилки: error: too many initializers for ‘char []’
error: no matching function for call to ‘find(char*&, char*&, char&)’
З таким раніше ще не працювала, допомжіть будь ласка

2

Re: дешифрування коду Цезаря (С++)

    char A[] = { "А","Б","В","Г","Д","Е","Є","Ж","З",
                "И","Й","К","Л","М","Н","О","П","Р",
                "С","Т","У","Ф","Х","Ц","Ч","Ш","Щ",
                "Ь","Ю","Я"};

Уважно подивись!

3

Re: дешифрування коду Цезаря (С++)

Якщо моєте на увазі лапки, то їх вже перевіряла. З одинарними видає помилку до кожної літери warning: multi-character character constant [-Wmultichar]

4 Востаннє редагувалося lucas-kane (09.12.2022 16:11:46)

Re: дешифрування коду Цезаря (С++)

Llewellynka написав:

Якщо моєте на увазі лапки, то їх вже перевіряла. З одинарними видає помилку до кожної літери warning: multi-character character constant [-Wmultichar]

Ну тоді присвоюй латиницю масиву char A[]. Якщо хочеш кирилицю, тоді вибери для цього масиву вірний тип даних.

5

Re: дешифрування коду Цезаря (С++)

Llewellynka написав:

Якщо моєте на увазі лапки, то їх вже перевіряла. З одинарними видає помилку до кожної літери warning: multi-character character constant [-Wmultichar]

Я не фахівець зі С++, але, здається, для кирилиці вам потрібно щось із підтримкою UTF8.

wcout is the equivalent of wprintf just like cout is the equivalent of printf - the last two won't do Unicode.

6

Re: дешифрування коду Цезаря (С++)

Дякую за допомогу. Єдине, що я зрозуміла, так те, що онлайн-компілятори - не моє, в тому ж Visual Studio все працює без питань, а компілятор вирішив познущатись з мене (або викладач, який дав такий таск, просто відішлю йому лістинг та відео працюючої програми). Але якщо все ж таки можна реалізувати даний код в компіляторі якось, маякніть мені. Сподіваюсь, зайвим не буде.

7 Востаннє редагувалося bebyk (09.12.2022 18:46:56)

Re: дешифрування коду Цезаря (С++)

Llewellynka написав:

Дякую за допомогу. Єдине, що я зрозуміла, так те, що онлайн-компілятори - не моє, в тому ж Visual Studio все працює без питань, а компілятор вирішив познущатись з мене (або викладач, який дав такий таск, просто відішлю йому лістинг та відео працюючої програми). Але якщо все ж таки можна реалізувати даний код в компіляторі якось, маякніть мені. Сподіваюсь, зайвим не буде.

Онлайн-компілятори зазвичай спираються на існуючі стандарти. Наприклад, на Codewars це Clang. Ваш Visual Studio можливо використовує інший компілятор, ніж на тому вашому онлайні, наприклад, Clang vs GCC, тому виникають такі розбіжності.

8

Re: дешифрування коду Цезаря (С++)

А де буква "і"?

Подякували: leofun011

9 Востаннє редагувалося wander (09.12.2022 19:55:54)

Re: дешифрування коду Цезаря (С++)

Llewellynka написав:

Дякую за допомогу. Єдине, що я зрозуміла, так те, що онлайн-компілятори - не моє, в тому ж Visual Studio все працює без питань, а компілятор вирішив познущатись з мене (або викладач, який дав такий таск, просто відішлю йому лістинг та відео працюючої програми). Але якщо все ж таки можна реалізувати даний код в компіляторі якось, маякніть мені. Сподіваюсь, зайвим не буде.

До чого тут онлайн компілятори? У вас явна помилка – невідповідність типів.

"А"             // грубо кажучи, ось це має тип char*
char A[]        // це має тип char[N], який може перетворюватись у char*
{"А","Б", ... } // це тип char[N][M], який може перетворюватись у char*[]
і char[N] не сумісний з char[N][M]
*насправді все трохи складніше, але нехай буде так*

Про це вам скаже будь-який компілятор. І Студія не виключення, не могла вона пропустити такий код. Компілятор лише слідує правилам мови і якщо ви їх порушуєте, він має право не скомпілювати ваш код.

А, взагалі, це знову до питань з кодуванням (як вже сказали вище), на форумі вже є купа тем, де це все розжовано, пошукайте.

10

Re: дешифрування коду Цезаря (С++)

Справа в тому, що C++ не нав'язує програмісту дуже багато деталей, а залишає їх на розсуд програміста. Відповідно, при роботі з символами програміст має обрати і знати:
- в якому кодуванні знаходиться джерельний код;
- в якому кодуванні знаходяться вхідні дані;
- в якому кодуванні стрічки зберігаються в пам'яті.
Ніщо не зобов'язує їх усіх бути в одному кодуванні.
На щастя для початківців, ASCII сумісний з купою інших кодувань. Не виходьте за межі англійської абетки - і часто можете казати, що у вас усе в ASCII.
А тут можу лише порадити переробити все на широкі символи: замість char - wchar_t, замість cin/cout/string - wcin/wcout/wstring, до всіх символьних/стрічкових літералів додати L, десь так:

wchar_t a[]={L'А',L'Б'...};
Подякували: leofun01, Llewellynka, bebyk3

11

Re: дешифрування коду Цезаря (С++)

Знову якийсь вундеркінд не засвоїв програму дитячого садочку, але якимось чином потрапив до вишу.

    char A[] = { "А","Б","В","Г","Д","Е","Є","Ж","З",
                "И","Й","К","Л","М","Н","О","П","Р",
                "С","Т","У","Ф","Х","Ц","Ч","Ш","Щ",
                "Ь","Ю","Я"};

Ну цей хоча б без російських літер обійшовся, як його попередник..

12

Re: дешифрування коду Цезаря (С++)

Отже, такий варіант у Visual Studio працює так, як треба (працював ще спочатку):

#include <iostream>
#include <Windows.h>
#include <iomanip> 
using namespace std;

int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int i = 0, k;
    char ABC[] = { 'А','Б','В','Г','Д','Е','Є','Ж','З',
                'И','І','Ї','Й','К','Л','М','Н','О','П','Р',
                'С','Т','У','Ф','Х','Ц','Ч','Ш','Щ',
                'Ь','Ю','Я' };
    char msg[440];
    cout << "Enter your message: " << endl;
    cin.getline(msg, 440);
    cout << "\nEnter the key:" << endl;
    cin >> k;
    cout << endl;
    char* begin = ABC;
    char* end = ABC + sizeof(ABC);
    for (; msg[i]; ++i)
    {
        char* ch = find(begin, end, msg[i]);
        if (ch != end) msg[i] = *(begin + (ch - begin + k) % sizeof(ABC));
    }
    cout << "Your message is " << endl;
    cout << msg << endl;
    return 0;
}

З онлайн-компілятором вже все зрозуміло, дякую