Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 0
Регистрация: 21.09.2022
Сообщений: 3

Буквы заменяются на их номер в алфавите, увеличенный вдвое. Шифровка и расшифровка

21.09.2022, 13:01. Показов 1225. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите разобраться с задачей:
Пользователю предлагается ввести строку, состоящую из русских букв. Введенная строка записывается в переменную str.
Реализовать шифрование строки str: Буквы заменяются на их номер в алфавите, увеличенный вдвое.
использовать тип char. (класс string не использовать)
Полученная зашифрованная строка записывается в переменную str.
Реализовать расшифровку строки str.
Полученная зашифрованная строка записывается в переменную str.

начала так и запуталась))

C++ (Qt)
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
using namespace std;
 
void input(), output(), code(), decode();
 
char str[80];
 
void input()
 
{
    cout << "Введите строку: " << endl;
    gets_s(str, 79);
}
 
void output()
{
    cout << "Ваша строка: " << endl;
    cout << str << endl;
}
 
void code()
{
    //тут не работает...
//думала так: есть алфавит, каждой букве присвоила номер, проверила если такая буква в веденной строке, если есть присвоила этой букве номер и умножила на то же число, запомнила в переменной
 
    
    
    char alfavit[] ="абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    int Q = 256, k = 13;
    char c1 = '\0';
    for (int i = 0; i < strlen(alfavit); i++)
    {
        alfavit[i] = i;
        for (int j = 0; j < strlen(str); i++)
        {
            if (str[j] = alfavit[i])
                str[j] *= i + c1;
        }
    }
    cout << "Зашифровано успешно: " << str <<endl;
    
}
 
 
void decode()
{
    //...здесь код для расшифровки
    cout << "Расшифровано успешно: " << str << endl;
    
}
Добавлено через 1 час 32 минуты
так, с шифровкой разобралась немного, но как записать теперь это в переменную str?
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void code()
{
    char letters[] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
    for (int i = 0; i < strlen(str); i++)
    {
        for (int j = 0; j < strlen(letters); j++)
        {
            if (str[i] == letters[j])
            {
                
                cout << (j+1)*(j+1); //это правильно!!!
                str[i]= (j + 1) * (j + 1);  // а это не работает
            }
 
        }
    }
  cout << "Зашифровано успешно: " << str << endl;
 
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.09.2022, 13:01
Ответы с готовыми решениями:

Шифровка: заменение рус.сим английскими. Расшифровка: анг.сим заменяются русскими
Здравствуйте, помогите пожалуйста написать программу которая будет шифровать и расшифровывать слово. Пример: Шифровка: привет --&gt;...

Шифровка текста по принципу замены буквы на двухзначный символ, обозначающий положение этой буквы в алфавите
Господа,нужна прога для шифровки текста.Работает принципом замены буквы на двухзначный символ,обозначающий положение этой буквы в алфавите...

Порядковый номер буквы в алфавите
как в С# получить порядковый номер буквы в алфавите? (например, а - 0, б - 1). есть ли какая-то функция специальная?

7
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
21.09.2022, 13:31
Цитата Сообщение от Alina-Ya Посмотреть сообщение
но как записать теперь это в переменную str?
Цитата Сообщение от Alina-Ya Посмотреть сообщение
(класс string не использовать)
Так вот, ограничиваем длину входной строки, что бы ничего не выделять/копировать.
C++
1
2
3
4
const IN  = 80; 
const ON = IN*3; // так как каждый символ может быть представлен двузначным числом (2 символа) + пробелы между ними
char str_in[IN+1]="";
char str_out[ON+1]="";
Как записать число в массив в текстовом представлении ?
C++
1
2
3
4
5
6
int pos = 0; // позиция для записи
int num = 20;
do{
   str[pos++] = '0'+num%10;
   num = num / 10;
}while(num!=0);
Не забываем про разделитель (пробел).
И нуль-терминатор в конце строки.
Ничего не отлаживал, могут быть ошибки.
0
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
21.09.2022, 13:34
1. Коды русские буквы имеют отрицательные значения, когда записаны в переменную типа char,
поэтому надо использовать unsigned char.
2. При умножении кода на 2 получится значение большее 256, т.е. больше, чем помещается в один байт.
Так что, надо что-то придумывать. Например, хранить результат не в char, а в int
Или можно предположить, что кроме маленьких русских букв ничего больше не будет(и буквы ё тоже).
и хранить разницу кодов:
'а'-'а'=0, 'б'-'а'=1,...,'z'-'а'=31
0*2+1=1, 1*2+1=3,...., 31*2+1=63
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
void code(unsigned char* result,unsigned char* str)
{
    for (int i = 0; i < str[i]; i++)
    {
        if (str[i]>='а' && str[i]<='я')
            result[i] = (str[i]-'а')*2+1;
        else
            result[i] = str[i]; // остальные оставляем без изменений
    }
}
void encode(unsigned char* result,unsigned char* str)
{
    for (int i = 0; i < str[i]; i++)
    {
        if (str[i]>=1 && str[i]<=63)
            result[i] = (str[i]-1)/2+'а';
        else
            result[i] = str[i]; // остальные оставляем без изменений
    }
}
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
21.09.2022, 13:46
поправочка
Цитата Сообщение от zss Посмотреть сообщение
2. При умножении кода на 2
Цитата Сообщение от Alina-Ya Посмотреть сообщение
Буквы заменяются на их номер в алфавите
Добавлено через 5 минут
Цитата Сообщение от SmallEvil Посмотреть сообщение
do{
   str[pos++] = '0'+num%10;
   num = num / 10;
}while(num!=0);
Получаются перевернутые числа.
Что бы не заморачиваться, на двух значных числах можем написать костыль (частный случай).

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
 
using namespace std;
 
int main(){
    int nums[] = {0,25,33,45,10,};
    char str[256];
    int pos = 0; 
    for(auto n : nums){
        
        if (n<10) // однозначное
            str[pos++] = '0'+n%10; 
        else{ // двузначное
            str[pos++] = '0'+(n/10)%10; 
            str[pos++] = '0'+n%10; 
        }
        str[pos++] = ' '; // разделитель
    }
    str[pos] = '\0'; // нуль-терминатор, обозначающий конец строки
    cout << str;
}
0
0 / 0 / 0
Регистрация: 21.09.2022
Сообщений: 3
21.09.2022, 15:20  [ТС]
надо по номеру алфавита
а-1 -> *2 = 1
б-2-> *2 = 4
в-3-> *2 = 6
...
я-33-> *2 = 66
с записью в переменную str и выводом на экран, а потом назад все расшифровать с записью в переменную str и выводом на экран

ввожу например
абв
зашифровано
146
расшифровано
абв

если можно полный код...
сижу туплю
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
21.09.2022, 15:41
Цитата Сообщение от Alina-Ya Посмотреть сообщение
сижу туплю
Для однозначной расшифровки нужны разделители, или записывайте каждую зашифрованную букву как байт, а не как текст.
Например, по вашей логике :
зашифрованная строка - "122412", имеет несколько вариантов расшифровки.
Alina-Ya,
Сколько по вашему таких вариантов ?

Цитата Сообщение от Alina-Ya Посмотреть сообщение
если можно полный код...
Это не ко мне, я помогаю чем могу. Будут еще вопросы, задавайте.

Добавлено через 1 минуту
Цитата Сообщение от Alina-Ya Посмотреть сообщение
146
А почему не "ах" ?? Так понятно ?

Добавлено через 3 минуты
Цитата Сообщение от SmallEvil Посмотреть сообщение
или записывайте каждую зашифрованную букву как байт
C++
1
str[i]= (j + 1) * (j + 1);  // а это не работает
Вот так и записывайте )

Добавлено через 3 минуты
Цитата Сообщение от Alina-Ya Посмотреть сообщение
с записью в переменную str и выводом на экран
Что бы вывести "числа" в текстовом виде, вашу зашифрованную строку
Преобразуйте в int
C++
1
2
for(int i=0, sz = strlen(str); i<sz; ++i)
   cout << int(str[i]);
0
0 / 0 / 0
Регистрация: 21.09.2022
Сообщений: 3
21.09.2022, 15:46  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
А почему не "ах" ?? Так понятно ?
да, так понятнее ))
надо разделители
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
21.09.2022, 16:06
Лучший ответ Сообщение было отмечено Alina-Ya как решение

Решение

и не 146, а 246, 1*2 + 2*2 +3*2
Цитата Сообщение от SmallEvil Посмотреть сообщение
записывайте каждую зашифрованную букву как байт
Вот почти готовый код, и думается это то что вам нужно, сделайте дешифровку (хоть что то), и сможете сдавать с чистой совестью.
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
#include <iostream>
#include <cstring>
using namespace std;
 
 
void encrypt(const char* src, char* str);
void decrypt();
void print_encrypt(const char* str);
 
int main()
{
    const int src_size = 256;
    char src[src_size]="";
    char str[src_size]="";
    cin.getline(src, src_size);
    encrypt(src, str);
    print_encrypt(str);
}
 
static const int ALPHAS=32;
static const char alphabet[ALPHAS+1] = "абвгдеёжзийклмнопрстуфхцчшщъыьэюя";
 
void encrypt(const char* src, char* str){
    int i = 0;
    for (int sz=strlen(src); i < sz; ++i){
        for (int j = 0; j < ALPHAS; ++j){
            if (src[i] == alphabet[j]){
                str[i] = (j+1)*2;
                break;
            }
        }
    }
    str[i] = '\0';
};
void print_encrypt(const char * str){
    for(int i=0, sz = strlen(str); i<sz; ++i)
        cout << int(str[i]);
}
Добавлено через 51 секунду
Не забываем установить русскую локаль.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.09.2022, 16:06
Помогаю со студенческими работами здесь

Порядковый номер буквы в алфавите?
К примеру я вожу H а он мне выводит 8 ? Console.Write(&quot;Введите позицую: &quot;); char x =...

Порядковый номер буквы в алфавите
В русском тексте каждую букву заменить ее порядковым номером в алфавите. При выводе в одной строке печатать текст с двумя ...

Получить номер буквы в алфавите
Приветствую! Мне по заданию надо узнать, какой номер в алфавите имеет буква на определенной позиции в QString. Попытался сделать так: ...

Получить порядковый номер буквы в алфавите
Здравствуйте, скажите пожалуйста, есть ли способы получить порядковый номер буквы в алфавите (например в латинском), кроме int num = 'z'...

Заменить буквы, на их порядковый номер в алфавите?
В тексті кожну літеру замінити її порядковим номером в алфавіті. При виведенні в одному рядку друкувати текст з двома пропусками між...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru