Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
MonteC
1 / 1 / 0
Регистрация: 11.10.2011
Сообщений: 23
1

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

11.10.2011, 17:15. Просмотров 1579. Ответов 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
Ответы с готовыми решениями:

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

Шифр цезаря
Столкнулся с такой проблемой нужно &quot;Разработать прикладное приложение для...

Шифр Цезаря
Добрый вечер, не могу реализовать шифр цезаря на C builder, программа...

Шифр Цезаря: провести частотный анализ текста, определить ключ
Здравствуйте, помогите пожалуйста. Дан в файле текс на русском...

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

12
o-user
245 / 202 / 26
Регистрация: 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
1060 / 579 / 87
Регистрация: 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
245 / 202 / 26
Регистрация: 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
245 / 202 / 26
Регистрация: 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
442 / 205 / 21
Регистрация: 07.10.2011
Сообщений: 462
11.10.2011, 19:00 9
у вас размер алфавита - 26 символов,а не 25. Замените везде 25 на 26
1
Net_Wanderer
235 / 208 / 29
Регистрация: 08.06.2011
Сообщений: 467
11.10.2011, 19:06 10
до кучи: Помогите с Шифром Цезаря
0
Thinker
Эксперт С++
4232 / 2206 / 203
Регистрация: 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
245 / 202 / 26
Регистрация: 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 / 1
Регистрация: 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

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

Шифр Цезаря
есть код программы для взлома Шыффра Цэзара но никак немогу доделать ее чтобы...

Шифр Цезаря
text - исходный code - закодированный decode - дешифрованный после...


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

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

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