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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2015, 21:02   #111
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

Код:

int shift (  std::string s1, std::string s2)
{
	for ( int i = 0; i <  s1.length(); i++)
	{
		for (int j = 0; j < s2.length();j++)
		{
			if ( ((int(s1[i]) >= 65) && ((int (s1[i]))<= 90 )) &&
			 ((int(s2[i]) >= 65) && ((int (s2[i]) <= 90 ))) )
			{
				if (s1[i] < s2[j])
				{
					key = int(s2[j]) - int (s1[i]);
					
				}
				else
				{
					key = int(s2[j]) - int (s1[i]) + ABCSize;
					
				}
			}
			else if  ( ((int(s1[i]) >= 97) && (int (s1[i] )<= 122 )) &&
			 ((int(s2[i]) >= 97) && ((int (s2[i])<= 122 ))) )
			{
				if (s1[i] < s2[j])
				{
					key = int(s2[j]) - int (s1[i]);
					
				}
				else
				{
					key = int(s2[j]) - int (s1[i]) + ABCSize;
				
				}
			}
			else
			{
			break;
			}
		}
	}
	cout<<key<<"\n";
	return key;
}
пока что ключ верное ищу? Программа работает не правильно.
Блин ключ 7, я не так смотрел на программу думал она плюсовать должна)

Последний раз редактировалось Dima-91; 14.12.2015 в 21:29.
Dima-91 вне форума Ответить с цитированием
Старый 14.12.2015, 21:08   #112
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
ключ 13 ?
Ну расшифруйте с 13 и узнаете )

В любом случае ж вам скорее всего надо написать корректно работающую функцию расшифровки (ну в смысле которой передается ключ и зашифрованный текст, а возвращается расшифрованный).
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 14.12.2015, 21:41   #113
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

готово конечно не без помощи копипаста, если не будете согласны буду переделывать;-)
Код:
const int ABCSize = 26;
int key;

const char low_ch[] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l',
 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
const char high_ch[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

std::string decoder (const std::string input_s, const int shift)
	{
		bool ok;
		std::string output_s("");
		for (unsigned i = 0 ; i < input_s.length(); i++)
		{
			ok = false;
			for (int j = 0; j < ABCSize; j++)
			{
				if ( input_s[i] == low_ch[j])
				{
					j -= shift;
					while (j <= 0) j += ABCSize;
					while (j >= ABCSize) j -= ABCSize;
					output_s += low_ch[j];
					ok = true;
					break;
				}
				else if (input_s[i] == high_ch[j])
				{
					j -= shift;
					while (j <= 0) j += ABCSize;
					while (j >= ABCSize) j -= ABCSize;
					output_s += high_ch[j];
					ok = true;
					break;
				}
			}
		if (!ok) output_s += input_s[i];
	}
	return output_s;
	}

int shift (  std::string s1, std::string s2)
{
	for ( int i = 0; i <  s1.length(); i++)
	{
		for (int j = 0; j < s2.length();j++)
		{
			if ( ((int(s1[i]) >= 65) && ((int (s1[i]))<= 90 )) &&
			 ((int(s2[i]) >= 65) && ((int (s2[i]) <= 90 ))) )
			{
				if (s1[i] < s2[j])
				{
					key = int (s1[i]) + ABCSize - int(s2[j]);
				}
				else
				{
					key = int(s1[j]) - int (s2[i]) ;

				}

			}
			else if  ( ((int(s1[i]) >= 97) && (int (s1[i] )<= 122 )) &&
			 ((int(s2[i]) >= 97) && ((int (s2[i])<= 122 ))) )
			{
				if (s1[i] < s2[j])
				{
					key = int(s1[j]) - int (s2[i]) + ABCSize;

				}
				else
				{
					key = int(s1[j]) - int (s2[i]) ;

				}

			}
			else
			{
			break;
			}
		}
	}
	cout<<key<<"\n";
	return key;
}


 int _tmain(int argc, _TCHAR* argv[])
{
	string str_encrypted,str_decrypted,s3;
	cout<<"Vvedite stroky s"<<"\n";
	getline(cin, s3);
	cout<<"Vvedite str_encrypted"<<"\n";
	getline(cin, str_encrypted);
	cout<<"Vvedite str_decrypted"<<"\n";
	getline(cin, str_decrypted);
	cout<<decoder ( s3, shift(str_encrypted,str_decrypted))<<"\n";

    system("pause");
	return 0;
}
Ключ ведь 7?
Dima-91 вне форума Ответить с цитированием
Старый 14.12.2015, 22:11   #114
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Dima-91, верно работает. Конечно, было бы замечательно, если бы без копипаста и массивов low_ch и high_ch

Мое решение:

Код:
#include <iostream>
#include <string>

using namespace std;

class Cipher
{
private:
	int key;
public:
	string encrypted;
	string decrypted;
	Cipher()
	{
		key = 0;
	}
	void Decrypt(string *str_enc)
	{
		decrypted = *str_enc;
		char *str = (char*)decrypted.c_str();
		for (size_t i = 0; i < decrypted.length(); i++)
		{
			switch (str[i])
			{
			case 'A':
			case 'a':
				str[i] += 26;
				str[i] -= key;
				break;
			default:
				if (isalpha(str[i]))
				{
					for (int j = 0; j < key; j++)
					{
						str[i]--;
						if (!isalpha(str[i]))
						{
							str[i] += 26;
						}
					}
				}
				break;
			}
		}
	}
	void SetKey(int Key)
	{
		key = Key;
	}
};

int GenKey(Cipher *str)
{
	size_t i = 0;
	char a, b;
	do
	{
		a = (str->encrypted.c_str())[i];
		b = (str->decrypted.c_str())[i];
	} while ((a == b) && (i++ < str->encrypted.length()));

	int key = 0;
	for (; a != b; key++, b++)
	{
    	if (!isalpha(b))
		{
			b -= 27;
			key--;
		}
	}
	return key;
}

int main()
{
	Cipher encrypted;
	Cipher str;
	getline(cin, encrypted.encrypted);
	getline(cin, str.encrypted);
	getline(cin, str.decrypted);

	encrypted.SetKey(GenKey(&str));
	encrypted.Decrypt(&encrypted.encrypted);

	cout << encrypted.decrypted.c_str() << endl;

	cin.get();
}
Malriser вне форума Ответить с цитированием
Старый 14.12.2015, 22:24   #115
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Новое задание, опять со строками и шифрованием

Задача:

Написать класс StringExt, который расширяет класс string и дает возможность вводить строку при объявлении объекта, а также предоставляет возможность шифрования строки с ее хранением в отдельной инкапсулированной переменной, доступ к которой происходит через открытый метод интерфейса.

Использовать можно любой алгоритм шифрования.

Т.е, пример работы с классом:

Код:

StringExt str(true, 3); // true указывает, что нужно прочитать строку с клавиатуры, а 3 задает ключ шифрования
str.crypt(); // шифрует введенную строку
cout << "You entered: " << str << endl; // выводит введенную строку
cout << "encrypted: " << str.Encrypted() << endl;  // выводит зашифрованную строку
Подсказка : использовать наследование

P.S. Код готов

Последний раз редактировалось Malriser; 14.12.2015 в 22:35.
Malriser вне форума Ответить с цитированием
Старый 14.12.2015, 22:24   #116
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

Malriser, спасибо за задание и за свой вариант решения. Спасибо за новое задание постараемся сделать)
Dima-91 вне форума Ответить с цитированием
Старый 16.12.2015, 19:51   #117
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

Код:
#include <stdio.h>
#include <iostream.h>
#include <string>

class Stringg
{
protected:
string str;
int key;
bool l;
public:
	Stringg()
	{
	key = 0;
	l = false;
	}
	string cinstr ()
	{
	cout<<"Vvedite stroky"<<"\n";
	getline(cin, str);
	return str;
	}
};

class StringExt : public Stringg
{
private:
	string str1, output_s;
public:
	StringExt (bool l, int x)
	{
		if (l == true)
		{
			str1 = str;
			key = x;
		}
	}

	string crypt()
	{
	string output_s("");
	for (int i = 0; i < str1.length(); i++)
	{
		if  ((int(str1[i]) >= 65) && ((int (str1[i]))<= 90 ))
		{
			output_s += char(int (str1[i]) + key);
			while ((int (str1[i]) + key )> 90) output_s += char (int (str1[i]) + key-26);
			break;
		}
		else if  ((int(str1[i]) >= 97) && (int (str1[i] )<= 122 ))
		{
			output_s += char(int (str1[i]) + key);
			while ((int (str1[i]) + key )> 122) output_s += char (int (str1[i]) + key-26);
			break;
		}
		else
		{
			output_s += str[i];
			break;
        }
	}
	return output_s;
	}
};

 int _tmain(int argc, _TCHAR* argv[]) 
{
	bool l = false;
	int z, key = 0;
	Stringg a;
	a.cinstr();
	cout<<"Zashifrovat' stroky? "<< "\n"<< " 0 - yes, - no" <<"\n";
	cin>>z;
	if (z == 0)
	{
		l = true;
	}
	else
	{
		cout<< "Bye bye "<<"\n";
        system ("pause");
		return 0;
	}
	cout<<"Press key"<<"\n";
	cin>>key;
	StringExt str( l  , key);
	str.crypt();
  //	cout<<"You entered "<< str << endl;
	cout<<"Encrypted "<<str.crypt()<< endl;
	system ("pause");
	return 0;
}
Пока что не получается, в воскресенье попробую сделать.
Dima-91 вне форума Ответить с цитированием
Старый 16.12.2015, 19:55   #118
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

Цитата:
Сообщение от Malriser Посмотреть сообщение
Dima-91, верно работает. Конечно, было бы замечательно, если бы без копипаста и массивов low_ch и high_ch

Мое решение:

Код:
#include <iostream>
#include <string>

using namespace std;

class Cipher
{
private:
	int key;
public:
	string encrypted;
	string decrypted;
	Cipher()
	{
		key = 0;
	}
	void Decrypt(string *str_enc)
	{
		decrypted = *str_enc;
		char *str = (char*)decrypted.c_str(); 
		for (size_t i = 0; i < decrypted.length(); i++)
		{
			switch (str[i])
			{
			case 'A':                 //здесь правильно должно быть пусто??
			case 'a':
				str[i] += 26;
				str[i] -= key;
				break;
			default:
				if (isalpha(str[i]))
				{
					for (int j = 0; j < key; j++)
					{
						str[i]--;
						if (!isalpha(str[i]))
						{
							str[i] += 26;
						}
					}
				}
				break;
			}
		}
	}
	void SetKey(int Key)
	{
		key = Key;
	}
};

int GenKey(Cipher *str)
{
	size_t i = 0;
	char a, b;
	do
	{
		a = (str->encrypted.c_str())[i];
		b = (str->decrypted.c_str())[i];
	} while ((a == b) && (i++ < str->encrypted.length()));

	int key = 0;
	for (; a != b; key++, b++)
	{
    	if (!isalpha(b))
		{
			b -= 27;
			key--;
		}
	}
	return key;
}

int main()
{
	Cipher encrypted;
	Cipher str;
	getline(cin, encrypted.encrypted);
	getline(cin, str.encrypted);
	getline(cin, str.decrypted);

	encrypted.SetKey(GenKey(&str));
	encrypted.Decrypt(&encrypted.encrypted);

	cout << encrypted.decrypted.c_str() << endl;

	cin.get();
}
Код непонятен, только вижу что использовались указатели и узнал что такое isalpha.
Dima-91 вне форума Ответить с цитированием
Старый 16.12.2015, 22:07   #119
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Цитата:
Сообщение от Dima-91 Посмотреть сообщение
Код непонятен, только вижу что использовались указатели и узнал что такое isalpha.
Изи же, у нас в ANSI кодировке все буквы закодированы. Мы инкрементим в цикле код буквы, например, B и становится C ( 'B' + 1 = 'C' ), далее проверяем через isalpha вышли ли за границы ( там уже будут не буквы ) и если да, то отматываем назад на букву A и продолжаем. Так шифруем.

Дешифровка обратным путем, в GenKey узнаем key имея шифротекст и открытый текст. Ищем в цикле две соответственно различающиеся буквы, т.к !,;. и подобное не шифруется, нам нужно именно различие, например, буква A и C, далее идем в цикле пока не встретим эту букву тем же способом, что при и дешифровки, количество сделанных шагов и есть ключ, для A и C он равен, очевидно, 2-м

P.S. Ток ща комментарий твой увидел в коде. Да, там правильно, у нас там и для case 'A' и case 'a' одинаковый код, поэтому из case 'A' его можно убрать и сделать следом case 'a'
Malriser вне форума Ответить с цитированием
Старый 16.12.2015, 22:10   #120
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Цитата:
Сообщение от Dima-91 Посмотреть сообщение
Код:
#include <stdio.h>
#include <iostream.h>
#include <string>

class Stringg
{
protected:
string str;
int key;
bool l;
public:
	Stringg()
	{
	key = 0;
	l = false;
	}
	string cinstr ()
	{
	cout<<"Vvedite stroky"<<"\n";
	getline(cin, str);
	return str;
	}
};

class StringExt : public Stringg
{
private:
	string str1, output_s;
public:
	StringExt (bool l, int x)
	{
		if (l == true)
		{
			str1 = str;
			key = x;
		}
	}

	string crypt()
	{
	string output_s("");
	for (int i = 0; i < str1.length(); i++)
	{
		if  ((int(str1[i]) >= 65) && ((int (str1[i]))<= 90 ))
		{
			output_s += char(int (str1[i]) + key);
			while ((int (str1[i]) + key )> 90) output_s += char (int (str1[i]) + key-26);
			break;
		}
		else if  ((int(str1[i]) >= 97) && (int (str1[i] )<= 122 ))
		{
			output_s += char(int (str1[i]) + key);
			while ((int (str1[i]) + key )> 122) output_s += char (int (str1[i]) + key-26);
			break;
		}
		else
		{
			output_s += str[i];
			break;
        }
	}
	return output_s;
	}
};

 int _tmain(int argc, _TCHAR* argv[]) 
{
	bool l = false;
	int z, key = 0;
	Stringg a;
	a.cinstr();
	cout<<"Zashifrovat' stroky? "<< "\n"<< " 0 - yes, - no" <<"\n";
	cin>>z;
	if (z == 0)
	{
		l = true;
	}
	else
	{
		cout<< "Bye bye "<<"\n";
        system ("pause");
		return 0;
	}
	cout<<"Press key"<<"\n";
	cin>>key;
	StringExt str( l  , key);
	str.crypt();
  //	cout<<"You entered "<< str << endl;
	cout<<"Encrypted "<<str.crypt()<< endl;
	system ("pause");
	return 0;
}
Пока что не получается, в воскресенье попробую сделать.

Зачем свой string реализовывать??)))

Наследование от string сразу сделать можно

Код:
#include <iostream>
#include <string>

using namespace std;

class StringExt : public string
{
private:
	int key;
	string encrypted;
	size_t len;
public:
	const char *Encrypted()
	{
		return encrypted.c_str();
	}
	StringExt(bool enter = false, int Key = 0)
	{
		key = Key;
		if (enter)
		{
			getline(cin, *this);
			len = this->length();
		}
	}
	void crypt()
	{
		encrypted = *this;
		char *str = const_cast<char*>(encrypted.c_str());
		for (size_t i = 0; i < len; i++)
			str[i] ^= key;
	}
};

int main()
{
	StringExt str(true, 3); // true указывает, что нужно прочитать строку с клавиатуры, а 3 задает ключ шифрования

	str.crypt(); // шифрует введенную строку
	cout << "You entered: " << str << endl; // выводит введенную строку
	cout << "encrypted: " << str.Encrypted() << endl;  // выводит зашифрованную строку
	cin.get();
}
Malriser вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
что вас мотивирует, почему вы предпочитаете именно работу за компьютером, работу программиста? sgasgar Свободное общение 47 03.05.2016 07:27
Какая у вас была мотивация для начала и изучения программирования? monolit9951 Свободное общение 22 14.02.2014 19:57
Мотивация к программированию Nik_Parker Свободное общение 30 05.10.2013 19:12
Программирование, мотивация, перспективы Frants Свободное общение 6 03.10.2012 23:52