Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.03.2017, 17:54   #1
lisica198808
Пользователь
 
Регистрация: 06.11.2012
Сообщений: 64
По умолчанию Все сначала. Виженер, шифрование.ошибки

Преподаватель сказала, упростить поставленную задачу: и лишь используя русский алфавит из 32 символов(букв) шифровать, без ACSII. Начала делать и опять ошибки..

Код:
// 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 = ""; //Строка - результат
	
	int shift;//буква(позиция одной буквы алфавита)
	сhar 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 строке:
Код:
 if (!isalpha(s[i]))//если не буква
а как исправить - не пойму.. помогите пожалуйста
lisica198808 вне форума Ответить с цитированием
Старый 18.03.2017, 21:26   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

У вас же не аски, реализуйте свой аналог для вашего алфавита.
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
паскаль преобразовать массив таким образом чтобы сначала располагались все элементы целая часть которых не превышает единицу а потом все остальные Matvey Sadkov Паскаль, Turbo Pascal, PascalABC.NET 6 09.10.2016 15:52
C#массив Преобразовать чтобы сначала располагались все элементы, logikal Помощь студентам 2 28.04.2014 20:06
Преобразовать массив таким образом, чтобы сначала располагались элементы из интервала [a,b] , а затем все parka Паскаль, Turbo Pascal, PascalABC.NET 7 15.05.2011 22:17
Массивы на pascal (преобразовать массив так, чтобы сначала были единицы, а потом - все остальные) Mercial Помощь студентам 6 18.02.2011 22:07
В заданном массиве C(8) переставить элементы так щеб сначала шли все отрицатильние а затем положительные. basav1k Помощь студентам 2 26.05.2010 21:10