Форум программистов, компьютерный форум CyberForum.ru

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

Войти
Регистрация
Восстановить пароль
 
nopluto
0 / 0 / 0
Регистрация: 03.11.2013
Сообщений: 4
#1

Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно - C++

22.03.2014, 01:04. Просмотров 314. Ответов 5
Метки нет (Все метки)

Помогите, пожалуйста! Проблема: при сдвиге более, чем на длину алфавита выдаёт всякие символы, хотя проверку я установила
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include "stdafx.h"
#include <iostream>
#include <string>
#include <fstream>
#include <locale.h>
 
using namespace std;
 
int main()
{
    setlocale(0, "");
 
            int k;
 
            cout << "Введите величину сдвига" << endl;
            cin >> k;
            if (k > 32)
                k = k % 32;
 
            ifstream in("Зашифровать текст.txt");
            ofstream out("Результат шифрования.txt");
 
            for (;;)
            {
                string x;
                getline(in, x);
                string y;
 
                for (int i = 0; i < x.length(); i++)
                {
                    if ((x[i] >= 'а' && x[i] <= 'я') || (x[i] >= 'А' && x[i] <= 'Я'))
                    if ((x[i] + k) > 32)
                        y += x[i] + k - 32;
                    else
                        y += x[i] + k;
                    else
                        y += x[i];
                }
 
                out << y << '\n';
 
                if (in.fail())
                    break;
            }
            out.close();
            in.close();
 
            cout << "Зашифровка выполнена, результат в Результат шифрования.txt" << endl;
        }
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.03.2014, 01:04     Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно
Посмотрите здесь:

Шифр Цезаря C++
C++ Шифр Цезаря
Шифр Цезаря C++
Шифр Цезаря полосками C++
C++ Шифр Цезаря
C++ Шифр цезаря на кириллице
Шифр Цезаря - усложненный C++
C++ Кириллица. Шифр Цезаря
C++ Шифр Цезаря
Шифр Цезаря (пароль) C++
Шифр Цезаря C++
C++ Шифр Цезаря

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
22.03.2014, 07:17     Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно #2
Цитата Сообщение от nopluto Посмотреть сообщение
C++
1
2
3
4
5
6
if ((x[i] + k) > 32)
    y += x[i] + k - 32;
else
    y += x[i] + k;
else
    y += x[i];
И когда по-вашему выполнится последняя ветвь?
А вообще посмотрите формулы в вики, эта пачка условий заменяется одной строкой: http://ru.wikipedia.org/wiki/%D0%A8%...B0%D1%80%D1%8F
nopluto
0 / 0 / 0
Регистрация: 03.11.2013
Сообщений: 4
25.03.2014, 01:17  [ТС]     Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно #3
Ок, но проблема никуда не делась: выступание за границы алфавита всё равно происходит

C++ (Qt)
1
2
3
4
if ((x[i] >= 'а' && x[i] <= 'я') || (x[i] >= 'А' && x[i] <= 'Я'))
                        y += (x[i] + k)%32;
                    else
                        y += x[i];
C++ (Qt)
1
2
3
4
if ((y[i] >= 'а' && y[i] <= 'я') || (y[i] >= 'А' && y[i] <= 'Я'))
                        x += (y[i] + 32 - k)%32;
                    else
                        x += y[i];
IrineK
Заблокирован
25.03.2014, 03:40     Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Для больших 'А' - 'Я' расстояние 32 символа - они идут подряд в кодировке. Для маленьких - это совсем не так. Поэтому, если речь идет о кириллице есть смысл переделать код только для больших букв.
Миниатюры
Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно  
Корд
7 / 7 / 0
Регистрация: 22.03.2013
Сообщений: 188
25.03.2014, 05:30     Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно #5
IrineK все правильно сказал. если вы работаете с русским алфавитом то будьте внимательны там идет разрыв. Советую создать просто отдельный массив из 66 букв и пробегать по нему, а не по таблице аски кодов. В противном случае вам придется очень сильно изощряться.
nopluto
0 / 0 / 0
Регистрация: 03.11.2013
Сообщений: 4
25.03.2014, 22:38  [ТС]     Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно #6
Спасибо большое
Yandex
Объявления
25.03.2014, 22:38     Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно
Ответ Создать тему
Опции темы

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