Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
2 / 2 / 1
Регистрация: 23.11.2016
Сообщений: 51
1

Почему дешифровывается только 1 слово до пробела, а остальные - нет?

29.03.2019, 03:23. Показов 507. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вопрос в заголовке. Код в спойлере.
Кликните здесь для просмотра всего текста

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <string>
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "russian");
    int size = 256;
    char* buff = new char[size];
 
    cout << "Введите по-английски исходное сообщение:\n";
    cin.getline(buff, size);
 
    // кодирование
    for (int i = 0; i < strlen(buff); i++)
    {
        // кодирование заглавных букв
        if ((int)buff[i] <= 90 && (int)buff[i] >= 65)
        {
            // кодирование A - H
            if ((3 * (int)buff[i] + 2) >= 197 && (3 * (int)buff[i] + 2) <= 218)
                buff[i] = (3 * (int)buff[i] + 2) - 130;
 
            // кодирование I - Q
            else if ((3 * (int)buff[i] + 2) >= 221 && (3 * (int)buff[i] + 2) <= 245)
                buff[i] = (3 * (int)buff[i] + 2) - 156;
 
            // кодирование R - Z
            else if ((3 * (int)buff[i] + 2) >= 248 && (3 * (int)buff[i] + 2) <= 272)
                buff[i] = (3 * (int)buff[i] + 2) - 182;
        }
 
        // кодирование строчных букв
        else if ((int)buff[i] <= 122 && (int)buff[i] >= 97)
        {
            // кодирование a - h
            if ((3 * (int)buff[i] + 2) >= 293 && (3 * (int)buff[i] + 2) <= 314)
                buff[i] = (3 * (int)buff[i] + 2) - 194;
 
            // кодирование i - q
            else if ((3 * (int)buff[i] + 2) >= 317 && (3 * (int)buff[i] + 2) <= 341)
                buff[i] = (3 * (int)buff[i] + 2) - 220;
 
            // кодирование r - z
            else if ((3 * (int)buff[i] + 2) >= 344 && (3 * (int)buff[i] + 2) <= 368)
                buff[i] = (3 * (int)buff[i] + 2) - 246;
        }
    }
    cout << "\nРезультат шифрования:\n" << buff << endl;
 
    // декодирование
    for (int j = 0, k = 197, l = 221, m = 248; j < strlen(buff), k <= 218, l <= 245, m < 272; j++, k+=3, l+=3, m+=3)
    {
        // декодирование заглавных букв
        if ((int)buff[j] <= 90 && (int)buff[j] >= 65)
        {
            // декодирование A - H
            if (((int)buff[j] + 130) == k)
                buff[j] = ((int)buff[j] + 130 - 2) / 3.0;
 
            // декодирование I - Q
            else if (((int)buff[j] + 156) == l)
                buff[j] = ((int)buff[j] + 156 - 2) / 3.0;
 
            // декодирование R - S
            else if (((int)buff[j] + 182) == m)
                buff[j] = ((int)buff[j] + 182 - 2) / 3.0;
        }
    }
    cout << "\nРезультат дешифрования: " << endl << buff << endl;
    _getch();
    return 0;
}
Изображения
 
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2019, 03:23
Ответы с готовыми решениями:

Почему введенное значение в консоли считывается только до пробела?
Не могу прочитать строку полностью, считывает только до пробела, та самая ситуация с вводом в...

читает только первую строку,а остальные нет
из файла считывается только одна строка,а остальные нет...что надо сделать?

Почему whois.nic.cc при любом домене выводиться как "kapuska23.cc is registered", а остальные - нет?
if(!in_array($_POST,$extensions_array)){$errors = &quot;Domain extension is not supported.&quot;;} ...

Считает почему то только первый код, на остальные пишет что код не найден, хотя он есть в списке, не понимаю п
Написать процедуру поиска в списке, расположенном на рабочем листе с именем «Цены» активной рабочей...

11
nd2
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
29.03.2019, 04:20 2
Цитата Сообщение от BananaHack Посмотреть сообщение
C++
1
j < strlen(buff), k <= 218, l <= 245, m < 272;
Будет выполняться только первое условие.
1
2 / 2 / 1
Регистрация: 23.11.2016
Сообщений: 51
29.03.2019, 09:46  [ТС] 3
Ок. А как правильно? Оно же вроде считывает всю строку, как есть
0
rikimaru2013
29.03.2019, 10:05
  #4

Не по теме:

nd2, а не последнее?

0
2 / 2 / 1
Регистрация: 23.11.2016
Сообщений: 51
29.03.2019, 15:04  [ТС] 5
Напишите пожалуйста, что надо сделать, чтобы остальные слова тоже дешифровались
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
29.03.2019, 15:52 6

Не по теме:

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
nd2, а не последнее?
Если ничего не поменяли, то должно быть последнее, т.к. оператор запятой всегда возвращает выражение по правую сторону.


Цитата Сообщение от BananaHack Посмотреть сообщение
Напишите пожалуйста, что надо сделать, чтобы остальные слова тоже дешифровались
Например поправить ошибку в условии, на которую вам указали в 1м посте.
1
2 / 2 / 1
Регистрация: 23.11.2016
Сообщений: 51
29.03.2019, 16:34  [ТС] 7
Ну я перенёс
C++
1
 j < strlen(buff)
в конец и ничего не изменилось. Напишите, пожалуйста, прямо, я не понимаю, что вы имеете в виду и что надо сделать.
0
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
29.03.2019, 16:56 8
Цитата Сообщение от BananaHack Посмотреть сообщение
в конец и ничего не изменилось.
Конечно, ведь это ничего не меняет, Вы хотели вероятно что бы все условия были выполнены здесь:
C++
1
j < strlen(buff), k <= 218, l <= 245, m < 272;
, но на деле в любом случае выполнится только одно. Вам надо расставить логическую цепочку, например, так:
C++
1
j < strlen(buff) && k <= 218 && l <= 245 && m < 272;
, но не стоит копировать это строчку это только пример как сделать что бы все условия выполнялись, я не знаю какое именно условие нужно вам.
Еще подробнее об этом можно узнать, например, тут.

Добавлено через 2 минуты
Цитата Сообщение от BananaHack Посмотреть сообщение
(int)buff[j]
И да, все эти приведения лишни. Чар и так целый тип.

Добавлено через 1 минуту
BananaHack, после правок, если не поможет пройдитесь отладчиком, посмотрите что у вас происходит в циклах по декодированию.
1
2 / 2 / 1
Регистрация: 23.11.2016
Сообщений: 51
29.03.2019, 18:43  [ТС] 9
Сделал вот так. Конечно, пока ещё неправильно дешифрует, т.к. не продумано полностью, но уже хоть как-то "дешифрует", а не выводит зашифрованную строку заново
Кликните здесь для просмотра всего текста

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
for (int j = 0; j < strlen(buff); j++)
    {
        // декодирование заглавных букв
        if (buff[j] <= 90 && buff[j] >= 65)
        {
            // декодирование A - H
            for (int k = 197; k <= 218; k += 3)
            {
                if ((buff[j] + 130) == k)
                    buff[j] = (k - 2) / 3.0;
            }
    
            // декодирование I - Q
            for (int l = 221; l <= 245; l += 3)
            {
                if ((buff[j] + 156) == l)
                    buff[j] = (l - 2) / 3.0;
            }
 
            // декодирование R - Z
            for (int m = 248; m <= 272; m += 3)
            {
                if ((buff[j] + 182) == m)
                    buff[j] = (m - 2) / 3.0;
            }
Миниатюры
Почему дешифровывается только 1 слово до пробела, а остальные - нет?  
0
rikimaru2013
29.03.2019, 21:00
  #10

Не по теме:

Azazel-San, спасибо

0
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
29.03.2019, 21:58 11
BananaHack, Просто решил ради интереса написать свой шифратор, можно сделать намного эффективнее и меньше кода, но хотел написать как можно проще и понятнее
Кликните здесь для просмотра всего текста
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
50
51
52
53
54
#include <iostream>
#include <ctime>
using namespace std;
 
char str[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ .,";
char key[56];
 
void genKey() {
    int N = rand() % 200 + 100;
    memcpy(key, str, 56);
    for (int i = 0; i < N; i++) {
        int a = rand() % 55;
        int b = rand() % 55;
        swap(key[a], key[b]);
    }
}
 
void encode(char * txt) {
    for (int i = 0; txt[i]; i++) {
        for (int j = 0; j < 55; j++) {
            if (txt[i] == str[j]) {
                txt[i] = key[j];
                break;
            }
        }
    }
}
 
void decode(char * txt) {
    for (int i = 0; txt[i]; i++) {
        for (int j = 0; j < 55; j++) {
            if (txt[i] == key[j]) {
                txt[i] = str[j];
                break;
            }
        }
    }
}
 
int main() {
    srand((unsigned)time(0));
    genKey();
 
    char txt[] = "London is the capital of Great Britain.";
    cout << txt << endl;
 
    encode(txt);
    cout << txt << endl;
 
    decode(txt);
    cout << txt << endl;
 
    return 0;
}
1
2 / 2 / 1
Регистрация: 23.11.2016
Сообщений: 51
30.03.2019, 14:18  [ТС] 12
Avaddon74, спасибо, конечно, но по заданию мне нужно именно так.

Шифр простой моноалфавитной замены является обобщением шифра Цезаря и выполняет шифрование по следующей схеме:
С = а * Р + К mod M,
где а = 3 и К = 2 - ключи шифрования, Р - исходный код буквы, С - зашифрованный код буквы, М - размер алфавита
0
30.03.2019, 14:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2019, 14:18
Помогаю со студенческими работами здесь

В файл почему-то записывается только одно слово
у меня есть форма на ней 2 textbox і одна кнопка, в один я записываю количество раз прокрутки...

Почему при таком алгоритме записывается только 1 слово
void save(CHAR buff) { DWORD lpNumberOfBytesWritten; char path = &quot;c:\\base.db&quot;; //char...

Почему при вводе массива из символов воспринимается только первое слово?
Вот примерный код: char article; int main() { cin &gt;&gt; char; cout &lt;&lt; char; ...

Почему у меня в файл записует только первую букву а не все слово
Почему у меня в файл записует только первую букву а не все слово Вот программа char ch; cout...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru