Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
MonteC
1 / 1 / 0
Регистрация: 11.10.2011
Сообщений: 23
#1

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

11.10.2011, 17:15. Просмотров 1525. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2011, 17:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Шифр Цезаря: программа выводит не то, что нужно (C++):

Объяснить, что происходит в заданном фрагменте кода (шифр Цезаря) - C++
#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...

Шифр Цезаря - C++
Створити програму, що реалізовує алгоритм дешифрування Цезаря, для латинського алфавіту з прогресуючим кроком від 3 до 10 (ВЕЛИКІ малі...

Шифр Цезаря - C++
text - исходный code - закодированный decode - дешифрованный после компиляции в файл code в конец ложится пробел, откуда он...

Шифр Цезаря - C++
Объясните пожалуйста есть формула для шифра Цезаря :En(x) = (x +n)mod26 почему в коде надо еще отнять 65, а потом прибавить. 65- это код...

Шифр Цезаря - C++
Вот есть готовый код программы, может, кому понадобиться:) #include&lt;iostream&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; using namespace...

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

12
o-user
244 / 201 / 7
Регистрация: 03.02.2009
Сообщений: 786
11.10.2011, 17:43 #2
1. Надо обрабатывать не все 100 символов, а только то количество, которое ввели.

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

B=(x[i]-'A'+k)%m;
1
Infinity3000
1058 / 577 / 24
Регистрация: 03.12.2009
Сообщений: 1,255
11.10.2011, 17:44 #3
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
MonteC
1 / 1 / 0
Регистрация: 11.10.2011
Сообщений: 23
11.10.2011, 18:04  [ТС] #4
Цитата Сообщение от 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
o-user
244 / 201 / 7
Регистрация: 03.02.2009
Сообщений: 786
11.10.2011, 18:12 #5
Цитата Сообщение от 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
MonteC
1 / 1 / 0
Регистрация: 11.10.2011
Сообщений: 23
11.10.2011, 18:43  [ТС] #6
Для всех букв работает кроме "Z" , ввожу Z и ничего не выводит.
0
o-user
244 / 201 / 7
Регистрация: 03.02.2009
Сообщений: 786
11.10.2011, 18:52 #7
Цитата Сообщение от MonteC Посмотреть сообщение
Для всех букв работает кроме "Z" , ввожу Z и ничего не выводит.
Какой вариант программы?
А что выводит для A ?
А что выводит для Y ?
0
MonteC
1 / 1 / 0
Регистрация: 11.10.2011
Сообщений: 23
11.10.2011, 18:55  [ТС] #8
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
441 / 204 / 13
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 19:00 #9
у вас размер алфавита - 26 символов,а не 25. Замените везде 25 на 26
1
Net_Wanderer
235 / 208 / 19
Регистрация: 08.06.2011
Сообщений: 467
11.10.2011, 19:06 #10
до кучи: Помогите с Шифром Цезаря
0
Thinker
Эксперт С++
4228 / 2202 / 150
Регистрация: 26.08.2011
Сообщений: 3,802
Записей в блоге: 5
11.10.2011, 19:53 #11
Для каждого символа 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
o-user
244 / 201 / 7
Регистрация: 03.02.2009
Сообщений: 786
11.10.2011, 22:48 #12
Цитата Сообщение от 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
Dakster
0 / 0 / 0
Регистрация: 23.04.2013
Сообщений: 75
25.11.2013, 03:03 #13
можешь написать программу которая у тебя получилась? очень нужна..
0
25.11.2013, 03:03
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2013, 03:03
Привет! Вот еще темы с ответами:

Шифр цезаря - C++
Столкнулся с такой проблемой нужно &quot;Разработать прикладное приложение для шифрования текста с помощью шифра простой замены. Приложение...

Шифр Цезаря - C++
есть код программы для взлома Шыффра Цэзара но никак немогу доделать ее чтобы взломать строку VTA.P,JR;STJQATPZX,VJX,JF;A...

Шифр Цезаря - C++
Ребята , помогите решить задачку, битый час сижу, не могу понять . Надо чтобы введенная буква алфавита сдвигалась на 3 буквы вперед...

C++ Шифр Цезаря - C++
Help нужно написать программу на С++, которая шифрует русские и английские слова. Делает запрос на сдвиг. Зашифрованный код переводил...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru