Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 11.10.2011
Сообщений: 23

Шифр Цезаря: программа выводит не то, что нужно

11.10.2011, 17:15. Показов 2631. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пытался реализовать код цезаря на С++
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
using namespace std;
 
const char alphavit[]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
 
 int main()
 {
    char x[100];
    cout << "Vvedite ishodnoe soobchenie: ";
    gets(x);
    cout << "Ishodnoe soobchenie: " << x <<'\n';
    int m=25;
    int n=1;
    int k=3, B;
 
 
  
 
    for (int i=0; i<99; i++)
        for(int j=0; j<25; j++)
 
    {
        if(x[i] == alphavit[j])
        {
            B = (i*n+k)% m;
            
 
            cout << alphavit[B];
        }
    } 
 
    return 0;
 }
При вводе латинской буквы "A" программа должна выводит "D", но вместо этого он выводит D и еще лишние буквы WSWV, в чем может быть проблема?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.10.2011, 17:15
Ответы с готовыми решениями:

Объяснить, что происходит в заданном фрагменте кода (шифр Цезаря)
#include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;stdlib.h&gt; #include &lt;sstream&gt; #include &lt;fstream&gt; using...

Шифр Полибия. Программа выводит шифр в разной последовательности.
Реализую шифр полибия для русского алфавита. Возникла проблема при выводе шифра. Например при вводе исходного сообщения &quot;ВОВА&quot;...

Шифр Цезаря - программа зацикливается
Добрый вечер, задача была сделать программу, которая шифрует введенный текст введенным ключом, и все бы хорошо, но я уперлась в проблему,...

12
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
11.10.2011, 17:43
1. Надо обрабатывать не все 100 символов, а только то количество, которое ввели.

2. B = (i*n+k)% m; - это неправильно
B зависит только от ASCII кода символа x[i], смещения m и длины алфавита m (m=26):

B=(x[i]-'A'+k)%m;
1
 Аватар для Infinity3000
1066 / 583 / 87
Регистрация: 03.12.2009
Сообщений: 1,255
11.10.2011, 17:44
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "stdafx.h"
#include "iostream"
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    setlocale(0,""); 
    int j;
    char str[256] = {0};
    char chr;
    std::cout << "Введите искомую строку!" << '\n';
    std::cin >> str;
 
    for (int i = 0; i < strlen(str); i++)
        {
          j = (int)str[i]; // узнаем числовое значение символа
          j += 3; // меняем это значение
          chr = (char)j; // узнаем, какой это символ получился
          std::cout << chr;
        }
    std::cout << '\n';
    system("pause >> NULL");
    return 0;
}
0
1 / 1 / 0
Регистрация: 11.10.2011
Сообщений: 23
11.10.2011, 18:04  [ТС]
Цитата Сообщение от o-user Посмотреть сообщение
1. Надо обрабатывать не все 100 символов, а только то количество, которое ввели.

2. B = (i*n+k)% m; - это неправильно
B зависит только от ASCII кода символа x[i], смещения m и длины алфавита m (m=26):

B=(x[i]-'A'+k)%m;
Все работает, а можно еще подробнее про строку B=(x[i]-'A'+k)%m; непонятно зачем отнимать 'A'
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
11.10.2011, 18:12
Цитата Сообщение от Infinity3000 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include "stdafx.h"
#include "iostream"
 
int _tmain(int argc, _TCHAR* argv[])
{
 
    setlocale(0,""); 
    int j;
    char str[256] = {0};
    char chr;
    std::cout << "Введите искомую строку!" << '\n';
    std::cin >> str;
 
    for (int i = 0; i < strlen(str); i++)
        {
          j = (int)str[i]; // узнаем числовое значение символа
          j += 3; // меняем это значение
          chr = (char)j; // узнаем, какой это символ получился
          std::cout << chr;
        }
    std::cout << '\n';
    system("pause >> NULL");
    return 0;
}
Неправильно!
Что будет на выходе, если ввести последний символ алфавита Z ?
Надо закольцовывать значения символов!



Цитата Сообщение от MonteC Посмотреть сообщение
Все работает, а можно еще подробнее про строку B=(x[i]-'A'+k)%m; непонятно зачем отнимать 'A'

Надо получить НОМЕР следующего символа, а не компот из ASCII-кодов символов и номеров символов в алфавите!
Т.е. если не вычитать, то работаем со значениями 65..97, а если вычитаем, то со значениями 0..25.

Попробуйте посчитать с конкретными символами.
1
1 / 1 / 0
Регистрация: 11.10.2011
Сообщений: 23
11.10.2011, 18:43  [ТС]
Для всех букв работает кроме "Z" , ввожу Z и ничего не выводит.
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
11.10.2011, 18:52
Цитата Сообщение от MonteC Посмотреть сообщение
Для всех букв работает кроме "Z" , ввожу Z и ничего не выводит.
Какой вариант программы?
А что выводит для A ?
А что выводит для Y ?
0
1 / 1 / 0
Регистрация: 11.10.2011
Сообщений: 23
11.10.2011, 18:55  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
using namespace std;
 
const char alphavit[]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
 
 int main()
 {
    char x[100];
    cout << "Vvedite ishodnoe soobchenie: ";
    gets(x);
    cout << "Ishodnoe soobchenie: " << x <<'\n';
    int m=25;
    int n=1;
    int k=3, B;
 
 
  
 
    for (int i=0; x[i]; i++)
        for(int j=0; j<25; j++)
 
    {
        if(x[i] == alphavit[j])
        {
            B=(x[i]-'A'+k)%m;
            
 
            cout << alphavit[B];
        }
    } 
 
    return 0;
 }
Для A выводит D
Для Y выводит C
0
 Аватар для aeshes
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 19:00
у вас размер алфавита - 26 символов,а не 25. Замените везде 25 на 26
1
237 / 210 / 29
Регистрация: 08.06.2011
Сообщений: 467
11.10.2011, 19:06
до кучи: Помогите с Шифром Цезаря
0
Эксперт С++
 Аватар для Thinker
4267 / 2241 / 203
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.10.2011, 19:53
Для каждого символа c зашифрование:
C
1
2
3
4
5
      if (isalpha(c))
         if (islower(c))
            c = (c - 'a' + 3)%26 + 'a';
         else
            c = (c - 'A' + 3)%26 + 'A';
При этом замечу, что Цезарь занимался не кодированием, а шифрованием, поэтому "шифр Цезаря" или тогда уж "кот Цезаря"
0
247 / 205 / 26
Регистрация: 03.02.2009
Сообщений: 785
11.10.2011, 22:48
Цитата Сообщение от MonteC Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#include <iostream>
 
using namespace std;
 
const char alphavit[]={'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};
 
 int main()
 {
    char x[100];
    cout << "Vvedite ishodnoe soobchenie: ";
    gets(x);
    cout << "Ishodnoe soobchenie: " << x <<'\n';
    int m=25;
    int n=1;
    int k=3, B;
 
 
  
 
    for (int i=0; x[i]; i++)
        for(int j=0; j<25; j++)
 
    {
        if(x[i] == alphavit[j])
        {
            B=(x[i]-'A'+k)%m;
            
 
            cout << alphavit[B];
        }
    } 
 
    return 0;
 }
Для A выводит D
Для Y выводит C

Я же сразу написал, что m=26 !
0
0 / 0 / 1
Регистрация: 23.04.2013
Сообщений: 75
25.11.2013, 03:03
можешь написать программу которая у тебя получилась? очень нужна..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.11.2013, 03:03
Помогаю со студенческими работами здесь

Программа выводит не то что нужно
Пытаюсь реализовать дешифрацию шифра Полибия. char alphavit = { {'А','Б', 'В', 'Г', 'Д','Е'}, ...

Шифр Цезаря и шифр Виженера
1. Используя шифр Цезаря расшифруйте слово ЛГПЗРГ. Шифр Цезаря для русского алфавита со сдвигом на три позиции вправо 2. Используя шифр...

Шифр Цезаря
Учительница истории Ирина Викторовна очень любит археологические находки. Однажды , посещая один из музеев Рима , она прочитала...

Шифр Цезаря
помогите нужно сделать прогу шифратор и дешифратор методом Цецаря

Шифр Цезаря
Пологаю, все знают о чем идет речь. Вот ссылка если что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru