3 / 1 / 2
Регистрация: 13.05.2018
Сообщений: 49
1

Шифр Цезаря

20.07.2018, 12:57. Показов 1503. Ответов 5

Здравствуйте. Помогите, пожалуйста. Необходимо сделать так, чтобы шифр не вылезал за рамки заданного алфавита..сейчас же он все равно смещается на Н позиций и берет ASCII элементы, если не ошибаюсь..
Таким образом получается, что, если ввести xyz при сдвиге на 2 позиции, то он выдаст что то вроде z{|}, вместо zab..

Я понимаю, что нужно брать остаток от деления, но как впихнуть в код - не могу догнать.
P.S - В коде есть мусор и я об этом знаю. Суть не в этом.

VISUAL STUDIO 2017
Исходный код:

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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <stdio.h>
#include "stdafx.h"
#include <conio.h>
#include <string>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
 
using namespace std;
 
void Help()
{
    setlocale(LC_ALL, "Russian");
    system("cls"); 
    printf ( "Используйте: stegano.exe -(e|d) [-n ШАГ] -src ИМЯ_ФАЙЛА [-out ИМЯ_ФАЙЛА] для кодирования сообщения." );
    exit(0);
}
int  main(int argc, char *argv[]) 
{
    char abc[] = "abcedfghijklmnopqrstuvwxyz"; //Алфавит
    setlocale(LC_ALL, "Russian"); 
    char string4[255] = {0};
    int rN = 0, i = 0, j = 0, n = 0, way = 0, filein = 0, fileout = 0, k = 0, retr = 0;
    string EncodeHelped; 
    ofstream encodeTXT; 
    ifstream src;
    char name_in[255], name_out[255]; 
    for (i; i < argc; i++)
    {
        if (strcmp(argv[i], "-e") == 0)   
            way = 1;
        if (strcmp(argv[i], "-d") == 0)
            way = 2;
        if (strcmp(argv[i], "-n") == 0)
        {
            sscanf_s(argv[i++], "%i", &rN);
        }
        if (strcmp(argv[i], "-src") == 0)
        {
            strcpy_s(name_in, argv[i + 1]);
            filein = 1;
        }
        if (strcmp(argv[i], "-out") == 0)
        {
            strcpy_s(name_out, argv[i + 1]);
            fileout = 1;
        }
    }
    if (way == 1 && filein == 1 && fileout == 1)
    {
        cout << "Внесенные параметры: \n Шаг сдвига: " << rN << " \n Файл с текстом: " << name_in << "\n Файл для вывода закодированного сообщения: " << name_out << endl << endl;
        src.open(name_in);
        if (src.is_open())
        {
            src.getline(string4, 255);
            src.close();
            for (j; j < strlen(string4); j++)
            {
                string4[j] += rN;
                encodeTXT.open(name_out);
                encodeTXT << (EncodeHelped += string4[j]);
                encodeTXT.close();
 
            }
        }
    }
    else if (way == 1 && filein == 1 && fileout == 0)
    {
        src.open(name_in);
            if (src.is_open())
            {
                src.getline(string4, 255);
                src.close();
                cout << "Результат кодирования :";
                for (j; j < strlen(string4); j++)
                {
                    string4[j] += rN;
                    cout << string4[j];
                }
            }
    }
    else if (way == 1 && filein == 0 && fileout == 1)
    {
        cout << "Сообщение: "; cin.getline(string4, 255);
            for (j; j < strlen(string4); j++)
            {
                string4[j] += rN;
                encodeTXT.open(name_out);
                encodeTXT << (EncodeHelped += string4[j]);
                encodeTXT.close();
            }
        }else if (way == 2 && filein==1 && fileout==1)
        {
            src.open(name_in);
            if (src.is_open())
            {
                src.getline(string4, 255);
                src.close();
                for (j; j < strlen(string4); j++)
                {
                    string4[j] -= rN;
                    encodeTXT.open(name_out);
                    encodeTXT << (EncodeHelped += string4[j]);
                    encodeTXT.close();
                }
            }
        }else if (way == 2 && filein == 1 && fileout == 0)
        {
            src.open(name_in);
            if (src.is_open())
            {
                src.getline(string4, 255);
                src.close();
                cout << "Результат декодирования :";
                for (j; j < strlen(string4); j++)
                {
                    string4[j] -= rN;
                    cout << string4[j];
                }
            }
 
 
        }else if (way == 2 && filein == 0 && fileout == 1)
        {
            cout << "Сообщение для декодирования: "; cin.getline(string4, 255);
            for (j; j < strlen(string4); j++)
            {
                string4[j] -= rN;
                encodeTXT.open(name_out);
                encodeTXT << (EncodeHelped += string4[j]);
                encodeTXT.close();
            }
        }
        else {
            Help();
            exit(0);
        }
    cout << "\n";
    return 0;
    }
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.07.2018, 12:57
Ответы с готовыми решениями:

Шифр Цезаря
Здравствуйте. Написал программу, какая шифрует введенный текст сдвигом по алфавиту вправо, но она...

Шифр Цезаря С++
Уже долго сижу, мучаюсь. Не могу понять, что я делаю не так. Подскажите пожалуйста что неправильно,...

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

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

5
621 / 468 / 273
Регистрация: 24.02.2017
Сообщений: 1,674
20.07.2018, 21:45 2
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
#include <iostream>
#include <string>
using namespace std;
 
int main()
{
  char abc[27]="abcedfghijklmnopqrstuvwxyz";
  char shift[27]="";
  string s;
  int pos,i,j=0;
 
  cin>>pos;
  cin.ignore();
  pos--;
  for( i=25;i>=25-pos;i--)
    {
       shift[i]=abc[pos-j];
         j++;
    }
  i=pos+1;
  j=0;
  while(i<26)
     shift[j++]=abc[i++];
  cout<<abc<<"\n";
  cout<<shift<<"\n";
  i=0;
  getline(cin, s);
  while(s[i]!='\0')
   {
     j=0;
     while(abc[j]!='\0')
      {
        if(s[i]==abc[j])
          {
             s[i]=shift[j];
             break;
          }
        j++;
      }
     i++;
    }
  cout<<s<<"\n";
  system("pause");
  return 0;
}
0
3 / 1 / 2
Регистрация: 13.05.2018
Сообщений: 49
22.07.2018, 14:35  [ТС] 3
Скажите, а можно как то подключать и использовать свой алфавит ? Если не подключать, то исп. стандартный ?
0
3 / 1 / 2
Регистрация: 13.05.2018
Сообщений: 49
23.07.2018, 14:43  [ТС] 4
повар1, Подскажите, а как декодировать в таком случае ? если писать -2 шаг смещения, то за границы abc он выдаст ASCII символы
0
621 / 468 / 273
Регистрация: 24.02.2017
Сообщений: 1,674
23.07.2018, 21:46 5
декодирование(вместо

C++
1
2
3
system("pause");
  return 0;
}
вставь

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 i=0;
  while(s[i]!='\0')
   {
     j=0;
     while(shift[j]!='\0')
      {
        if(s[i]==shift[j])
          {
             s[i]=abc[j];
             break;
          }
        j++;
      }
     i++;
    }
  cout<<s<<"\n";
  system("pause");
  return 0;
}
0
3 / 1 / 2
Регистрация: 13.05.2018
Сообщений: 49
28.07.2018, 12:45  [ТС] 6
повар1, Спасибо..нашел еще одну проблему..если ввести в ваш код 52 и т.д, то он ломается..а по идее не должно происходить ничего..т.е введя abc и шаг 52 - получаем abc..и можно как то сделать так, чтобы при вводе отрицательного значения pos, цикл не выходил за рамки алфавита и не шел по таблице ASCII ?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2018, 12:45

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

Шифр Цезаря
Створити програму, що реалізовує алгоритм дешифрування Цезаря, для латинського алфавіту з...

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

C++ Шифр Цезаря
Help нужно написать программу на С++, которая шифрует русские и английские слова. Делает запрос на...


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

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

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