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

Код Виженера. Не полностью выполняется. Что не так?

16.03.2017, 21:12. Показов 1464. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Программ на тему код Виженера достаточно много и здесь на форуме, и в интернете.. Решила не искать легкого пути, готовое, а разобраться что к чему, сделав все самой при помощи методички..Вроде поняла все,не сложно. сделала для начала шифрование. Но на шифровании подвисает и выводит только первый символ в файл, а не все зашифрованное слово
Не могу понять почему так..
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
#include "stdafx.h"
 
 
#include <iostream>
#include <stdio.h>
#include <conio.h>
using namespace std;
 
int main()
{   FILE *f1;
    FILE *f2;
    FILE *f3;
    char key[100];
    char c;//буква слова
    int cur=0;//буква ключа
    setlocale(LC_ALL, "Russian");//подключаем кириллицу
    f1=fopen("file.txt","r");//открываем-считываем информацию из файла с текстом
    f2=fopen("shifr.txt","w");//открываем - записываем шифрованный текст в файл
    f3=fopen("deshifr.txt","w");//открываем - записываем дешифрованный текст в файл
    if (f1==NULL) 
    {
        printf("file not found\n");
        return 0;
    } 
    printf("ключ: ");
    scanf("%s",key);
    //шифрование файла
 
    int k;
    cout<<"Введите 1 для шифрования или 2 для расшифрования текста\n";
    cin>>k; 
    switch (k) //Если k
    {
    case 1: //Если выбрано шифрование
        {
 
            while (!feof(f1))
            {
                if (fread(&c,1,1,f1))//читаем файл с текстом
                { if (!isalpha((unsigned char)c))  // если текущий символ  буква     
                    {if ( (isupper((unsigned char)c))) // если текущий символ - прописной(заглавный,isupper) 
                       { c=key[cur]+c-159;;//буква шифра=буква ключа+буква текста- 159(крайний символ в прописном алфавите( реестре))
                         fprintf(f2,"%c",c);    //сохраняем в файл для шифрованного текста - shifr.txt
                       }
                    }
                  else if (islower((unsigned char)c))// если текущий символ -  строчный(islower)
                       { c=key[cur]+c-239;;//буква шифра=буква ключа+буква текста- 239(крайний символ в строчном алфавите(реестре)
                         fprintf(f2,"%c",c);    //сохраняем в файл для шифрованного текста - shifr.txt
                       }
                       else //if(c==32)
                       {fprintf(f2,"%c",c);}
                   break; }
            }
        }
        fclose(f1); 
        fclose(f2); 
}
    _getch();
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.03.2017, 21:12
Ответы с готовыми решениями:

Компилятор не выполняет полностью код. Что я не так делаю?
!!! import java.util.Scanner; public class Main { static Scanner str = new Scanner(System.in); //static...

Код, в событии загрузки формы, выполняется не полностью
Привет. Есть 2 формы - One и Second. One с кнопкой, при нажатии на которую для Second происходит Second.Show() В Second на событии...

Шифр Виженера: переписать код так, чтобы программа не только зашифровала, но и расшифровала текст
Текст он зашифрует но не расшифрует. А как сделать чтобы он зашифровал и расшифровал текст??? #include &quot;stdafx.h&quot; ...

13
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
16.03.2017, 22:05
Лучший ответ Сообщение было отмечено Милашечка как решение

Решение

И тебя преподаватель учил eof() везде вставлять?
C++
1
2
3
4
5
6
7
8
9
10
11
            int c;
            while (fgetc(f1)) != EOF)
            {
                    if ( isupper(c)) // если текущий символ - прописной(заглавный,isupper) 
                    { c=key[cur]+c-159;;//буква шифра=буква ключа+буква текста- 159(крайний символ в прописном алфавите( реестре))
                    }
                    else if ( islower(c))
                    { c=key[cur]+c-239;;//буква шифра=буква ключа+буква текста- 239(крайний символ в строчном алфавите(реестре)
                       }
                   fputc(c, f2);    //сохраняем в файл для шифрованного текста - shifr.txt
            }
1
0 / 0 / 4
Регистрация: 16.02.2013
Сообщений: 123
17.03.2017, 19:23  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
И тебя преподаватель учил eof() везде вставлять?
не.. это я сама..." химичу"
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
17.03.2017, 19:30
Цитата Сообщение от Милашечка Посмотреть сообщение
c=key[cur]+c-159
Что-то странное, не похожее на циклический сдвиг в алфавите.
Советую ограничиться случаем, когда весь текст вместе с ключем состоит из маленьких букв.
Или можно взять алфавит из 256 символов, тогда можно сдвигать произвольные символы.
0
0 / 0 / 4
Регистрация: 16.02.2013
Сообщений: 123
18.03.2017, 18:10  [ТС]
Наверное, чтоб не разводить подобные темы, буду писать сюда дальше.. Опять таки Виженер. Шифрование.
Преподаватель сказала, лишь используя русский алфавит из 32 символов(букв) шифровать, без ACSII.
то есть чтоб было зашифрованное=слово-ключ+слово-32(если значение получается >32). Начала делать и опять ошибки..
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
// sama.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
 
 
#include <iostream>
#include <string>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    string s=" ";//Строка с текстом
    string key = "";//строка-ключ
    string key_on_s = "";//строка заполненная ключем
    string result = ""; //Строка - результат
    
    
    char tabl_vigh[32] = {'а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я'};//для таблицы Виженера/ будет строка-массив с алфавитом
    int kl=0, bukva=0; int x;
    int dlina = 0; 
    int symbol=0;
    cout<<"Vvedite klu4:";
    cin>>key;
    cout<<"Vvedite строку:";
    cin>>s;
 
    
    dlina=s.length();
    for (int i = 1; i < dlina; i++) //Формирование строки, длиной шифруемой, состоящей из повторений ключа
    {
        key_on_s += key[i % key.length()];
    }
    //cout<<key_on_s<<endl;//
 
    for (int i = 1; i < dlina; i++)
    { if (!isalpha(s[i]))//если не буква
      result += s[i];
       else 
        while (symbol<=32)
        {   int kl=0; int bukva=0;
            if (s[i] == tabl_vigh[symbol])//если символ строки найден
                  {bukva=symbol;}
            if (key_on_s[i] == tabl_vigh[symbol])//Если ключ-символ найден
                  {kl = symbol;}//Запоминаем в х номер ключа-символа 
            symbol++;
        }
 
     if ((bukva+kl)>32)
     {   x=bukva+kl-32;//шифруем
        result+=tabl_vigh[x];//заносим шифр в результат
     }
      else 
         { x=bukva+kl;//шифруем
           result+=tabl_vigh[x];//заносим шифр в результат
         }
    }
    cout<<"Зашифрованный текст:\n";
    cout<<result; //Вывод результата
    cout<<"\n";
    system("pause");
 
}
Виснет и выбивает Debug Assertion Failed!
Expression: unsigned (c+1)<=256

Если по отладчику правильно поняла,то ругается на 48 строке:
C++
1
if (!isalpha(s[i]))//если не буква
,
пишу
C++
1
if (!isalpha((unsigned)s[i]))
- все равно ругается..
Не пойму что сделать надо. Подскажите что к чему, пожалуйста
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.03.2017, 18:15
Лучший ответ Сообщение было отмечено Милашечка как решение

Решение

C++
1
isalpha(static_cast<unsigned char>(s[i]))
1
0 / 0 / 4
Регистрация: 16.02.2013
Сообщений: 123
18.03.2017, 20:29  [ТС]
nmcf, спасибо..еще мелкие ошибки понаходила, поисправляла. Теперь шифрует, но не всю строку ((
первое слово - и все.На пробеле все заканчивается. Какую функцию лучше применить вместо
C++
1
dlina=s.length();
, чтоб полную длину строки посчитать??На strlen - ругается, потому что
C++
1
 string s=" ";//Строка с текстом
..
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.03.2017, 20:58
Цитата Сообщение от Милашечка Посмотреть сообщение
Какую функцию лучше применить вместо
Нужно getline() применить при считывании.
1
0 / 0 / 4
Регистрация: 16.02.2013
Сообщений: 123
18.03.2017, 22:39  [ТС]
вот так должно быть???
C++
1
2
3
    cout<<"Vvedite строку:";
    getline(cin,s);
    dlina=s.length();
правильно? а потом уже и в циклах пойдет:
C++
1
2
3
4
5
for (int i = 0; i < dlina; i++)
{  
        key_on_s += key[i % key.length()];
    }
    cout<<key_on_s<<endl;//
у меня просто все равно только первое слово выводит и шифрует
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
18.03.2017, 22:55
Цитата Сообщение от Милашечка Посмотреть сообщение
вот так должно быть???
Да.
Цитата Сообщение от Милашечка Посмотреть сообщение
у меня просто все равно только первое слово выводит и шифрует
А symbol у тебя бесконечно возрастает? Его перед входом в while не надо сбрасывать? И почему условие не строгое? Максимальный индекс для tabl_vigh - 31.
0
0 / 0 / 4
Регистрация: 16.02.2013
Сообщений: 123
19.03.2017, 00:32  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Максимальный индекс для tabl_vigh - 31.
- если б писала char tabl_vigh[31] = "a...я" ругался бы..последнее место ведь вроде отводится под ноль, если правильно помню, вроде компилятор сам добавляет его в конец строки . поэтому от 0до31 - мой алфавит, 32 - идет под ноль..
Цитата Сообщение от nmcf Посмотреть сообщение
А symbol у тебя бесконечно возрастает? Его перед входом в while не надо сбрасывать?
-у меня в начале указано,что
C++
1
 int symbol=0;
,да и когда пошагово компилила все нормально было в нем.
Цитата Сообщение от nmcf Посмотреть сообщение
И почему условие не строгое?
.условие , да - строгое должно быть, не досмотрела..

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
// sama.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
 
 
#include <iostream>
#include <string>
#include <conio.h>
#include <stdlib.h>
#include <stdio.h>
//#include <Windows.h>
 
using namespace std;
 
int main()
{
    setlocale(LC_ALL, "Russian");
    //SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
    //SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
    string s=" ";//Строка с текстом
    string key = "";//строка-ключ
    string key_on_s = "";//строка заполненная ключем
    string result = ""; //Строка - результат
    
    
    char tabl_vigh[32] = {'а','б','в','г','д','е','ж','з','и','й','к','л','м','н','о','п','р','с','т','у','ф','х','ц','ч','ш','щ','ъ','ы','ь','э','ю','я'};//для таблицы Виженера/ будет строка-массив с алфавитом
    int kl=0, bukva=0; int x;
    int dlina = 0; 
    int symbol=0;
    cout<<"Vvedite klu4:";
    cin>>key;
    cout<<"Vvedite строку:";
    getline(cin,s);
    dlina=s.length();
    for (int i = 0; i < dlina; i++) //Формирование строки, длиной шифруемой, состоящей из повторений ключа
    {
        key_on_s += key[i % key.length()];
    }
    cout<<key_on_s<<endl;//
 
    for (int i = 0; i < dlina; i++)
     { if (!isalpha(static_cast<unsigned char>(s[i])))//если не буква
      result += s[i];
       else
        //{int symbol=0;
        while (symbol<32)
        {   int kl=0; int bukva=0;
            if (s[i] == tabl_vigh[symbol])//если символ строки найден
                  {bukva=symbol;}
            if (key_on_s[i] == tabl_vigh[symbol])//Если ключ-символ найден
                  {kl = symbol;}//Запоминаем в х номер ключа-символа 
            symbol++;
        }
    
 
     if ((bukva+kl)>32)
     {   x=bukva+kl-32;//шифруем
        result+=tabl_vigh[x];//заносим шифр в результат
     }
      else 
         { x=bukva+kl;//шифруем
           result+=tabl_vigh[x];//заносим шифр в результат
         }
    }
    cout<<"Зашифрованный текст:\n";
    cout<<result; //Вывод результата
    cout<<"\n";
    system("pause");
 
}
Ввожу ключ, а строка не вводится в итоге..Как на скрине выводит все..Видно спать пора -- теперь вообще не пойму что не так
Миниатюры
Код Виженера. Не полностью выполняется. Что не так?  
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
19.03.2017, 08:36
Лучший ответ Сообщение было отмечено Милашечка как решение

Решение

Во-первых, чтобы использовать русские буквы, нужно обеспечить ввод в кодировке 1251: Русские шрифты в консоли
Алфавит определить одной строкой:
C++
1
string tabl_vigh = "абв...я";
isalpha() будет учитывать и русские и английские. Можно использовать поиск в алфавите.
Шифрование - сложение с остатком от деления:
C++
1
2
3
4
5
6
7
    for (int i = 0; i < dlina; i++)
    {
        if (tabl_vigh.find(s[i]) == string::npos)
            result += s[i];
        else
            result += 'а' + (key_on_s[i] - 'а' + s[i] - 'а') % 32;
    }
1
0 / 0 / 4
Регистрация: 16.02.2013
Сообщений: 123
19.03.2017, 14:56  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Во-первых, чтобы использовать русские буквы, нужно обеспечить ввод в кодировке 1251
- у меня както по очередно - в одном проекте надо подключать ввод в кодировке, а здесь наоборот абракадабра выползает, когда подключаю..
Цитата Сообщение от nmcf Посмотреть сообщение
Шифрование - сложение с остатком от деления:
- а так как я писала , считать не будет разве?

мне больше не понятно, почему после того как я написала
C++
1
2
3
cout<<"Vvedite строку:";
    getline(cin,s);
    dlina=s.length();
- не могу потом строку написать в консольке.. После ввода ключа, нажимаю Enter и сразу как на скрине выбивает.. пишу getch после getline - но при нажатии на любую кнопку выбивает дальше, и ничего не вводится.. помню,мы разбирали примеры когда через
C++
1
while ( getline(cin,s)){}
как-то прописывали. Может как-то так нужно записать тоже??
Извиняюсь за множество вопросов, ну у меня со строками, символами мрак просто.. Из учебы немного выпала, теперь сложно наверстывать
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
19.03.2017, 15:56
Цитата Сообщение от Милашечка Посмотреть сообщение
а так как я писала , считать не будет разве?
Не знаю. Мне не понятна твоя реализация. Алгоритм прост и не требует столько.
Цитата Сообщение от Милашечка Посмотреть сообщение
После ввода ключа, нажимаю Enter и сразу как на скрине выбивает.. пишу getch после getline - но при нажатии на любую кнопку выбивает дальше, и ничего не вводится.. помню,мы разбирали примеры когда через
Не работает шифрование у тебя, ввод здесь не при чём.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.03.2017, 15:56
Помогаю со студенческими работами здесь

Объясните почему код выполняется именно так (private)
Добрый день коллеги! Всех с наступающим! Есть вот такой кусок кода : public class Solution { private String name; ...

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

Что не так в коде? Не выполняется второе условие
var gl:= 'кпстфхцчшщ';* zv:= 'бвгджзлмнр';* zi: array of integer; * s: string;* i,n:integer;* chet:boolean; begin ...

Не могу понять почему код не работает так, как нужно. При выводе weight не выполняется функция void eat(float how_much)
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; class Worker { private: float weight; public: void a(int...

If выполняется не полностью
namespace Test { class Program { static void Main() { //Создание отсылки к Классу и...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
1С: Контроль уникальности заводского номера
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью. Данные берутся из регистра сведений, по которому настроено. . .
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru