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

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

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

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

22.03.2014, 01:04. Просмотров 327. Ответов 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++
скажите как сделать шифр в кольце 26(для латиницы), т.е. чтобы последняя буква в первую переходила int main() { ...

Шифр Цезаря (пароль) - C++
Помогите сделать, пожалуйста. Чтобы пароль заменялся звездочками. П.5.18 Правил Запрещено размещать задания и решения в виде картинок...

Шифр цезаря. Кодировка - C++
Народ подскажите пожалуйста как сделать так что бы при букве &quot;z&quot; он кодировал в букву &quot;a&quot; при заданном шаге +1 например :( Программа...

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

Шифр замены(код Цезаря) - C++
Привет всем!!! Шифр замены(код Цезаря) Занумеровать алфавит исходного сообщения. Пусть m-длина алфавита сообщения; n,k-целые числа и...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,012
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
Сообщений: 190
25.03.2014, 05:30     Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно #5
IrineK все правильно сказал. если вы работаете с русским алфавитом то будьте внимательны там идет разрыв. Советую создать просто отдельный массив из 66 букв и пробегать по нему, а не по таблице аски кодов. В противном случае вам придется очень сильно изощряться.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2014, 22:38     Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно
Еще ссылки по теме:

Шифр Цезаря. Чтение из файла - C++
Задача заключается в том, что нужно из определенного файла достать текст и расшифровать его или зашифровать шифром Цезаря. Текст написан на...

шифр Цезаря с русским алфавитом - C++
Всем добрый вечер... мне не очень удобно просить, но у меня появилась одна поблемка... есть программа написанная на C# на Visual 2010, а...

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

Шифр Цезаря проблемы со знаками препинания - C++
Реализую шифр цезаря, возникла проблема со знаками препинания, не выводятся как надо. Что нужно исправить? #include &lt;iostream&gt; ...

Шифр Цезаря со сдвигом на 1 символ для русского текста - C++
Дан файл содержащий зашифрованный русский текст. Каждая буква замененна на следующую за ней. Получить в новом файле расшифрованный текст

Раскодировать строку, используя шифр Цезаря (ключ неизвестен) - C++
Задали раскодировать сроку используя код цезаря, ключ не известен, перепробовал множество сдвигов, препод сказал, что 5-ти классник может...


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

Или воспользуйтесь поиском по форуму:
nopluto
0 / 0 / 0
Регистрация: 03.11.2013
Сообщений: 4
25.03.2014, 22:38  [ТС]     Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно #6
Спасибо большое
Yandex
Объявления
25.03.2014, 22:38     Шифр Цезаря при сдвиге более, чем на длину алфавита работает некорректно
Ответ Создать тему
Опции темы

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