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

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

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

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

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

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

Split(string[] s); - Разбивает по нескольким строкам-разделителям.
Массив из строк существует?
Код:
void Split (string razs)
{
	string srt;
	int k = 0,z = 0;
	for (int i = 0; i < str.length(); i++)
	{
		srt += str[i];
		if ( str[i] == razs[k])
		{
		k++;
		}
		else k = 0;
		if (k == razs.length())
		{
		z = i;
			if (srt[0] == ' ')
			{
				for (int h = 1; h < (srt.length()- razs.length()); h++)
				{
					cout<<srt[h];
				}
				k = 0;
			}
			else
				for (int h = 0; h < (srt.length()- razs.length()); h++)
				{
				cout<<srt[h];
				}
				cout<<"\n";
				srt.clear();
				k = 0;
			}
	}
	if (z < str.length())
	{
		if (str[z+1] == ' ')
		{
			for (int i = z+2; i < str.length(); i++)
			{
			cout<<str[i];
			}
			cout<<"\n";
		}
		else
		{
			for (int i = z+1; i < str.length(); i++)
			{
			cout<<str[i];
			}
			cout<<"\n";
		}
	}
}
Отдельно код работает, а как в программу кинул так сразу не то выдает(

Последний раз редактировалось Dima-91; 08.12.2015 в 16:09.
Dima-91 вне форума Ответить с цитированием
Старый 08.12.2015, 18:28   #102
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Массив из строк существует?
А чего ему не существовать? )
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.12.2015, 20:38   #103
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

Может не совсем так как нужно, но каждая функция работает. Массив символов через new? void Split(string[] s) не представляю даже)
Код:
#include <stdio.h>
#include <iostream.h>
#include <string>

class SplitText
{
protected:
	char c;
	int size;
	string str, razs;
public:
string stroka (string s)
{
	cout<<"Vvedite stroky"<<"\n";
	getline(cin,s);
	for (int i = 0; i < s.length(); i++)
	{
	str += s[i];
	}
	return str;
}
string Razdelstr (string sraz)
{
	cout<<"Vvedite stroky razdelitel'"<<"\n";
	getline(cin,sraz);
	for (int i = 0; i < sraz.length(); i++)
	{
	razs += sraz[i];
	}
	return razs;
}
void Split(char c)
{
	int k;
	string st,se;
	for (int i = 0; i < str.length()-1; i++)
		{
			st += str[i];
			if (str[i] == c)
			{
				k = i;
				{
					if (st[0] == ' ' )
					{
						for (int j = 1;j < st.length()-1; j++)
						{
							cout<<st[j];
						}
						cout<<"\n";
					}
					else
					{
                        	for (int j = 0;j < st.length()-1; j++)
						{
							cout<<st[j];
						}
						cout<<"\n";
                    }
				}
			se += st;
			st.clear();
			}
		}
		if (se.length() < str.length())
	{
		if (str[k+1] == ' ' )
		{
			for (int j = k+2;j < str.length(); j++)
			{
				cout<<str[j];
			}
		}
		else
		{
			for (int j = k+1;j < str.length(); j++)
			{
				cout<<str[j];
			}
        }
		cout<<"\n";
	}
	cout<<"\n";
}
void Split (string razs)
{
	string srt;
	int k = 0,z = 0;
	for (int i = 0; i < str.length(); i++)
	{
		srt += str[i];
		if ( str[i] == razs[k])
		{
		k++;
		}
		else k = 0;
		if (k == razs.length())
		{
		z = i;
			if (srt[0] == ' ')
			{
				for (int h = 1; h < (srt.length()- razs.length()); h++)
				{
					cout<<srt[h];
				}
				k = 0;
			}
			else
				for (int h = 0; h < (srt.length()- razs.length()); h++)
				{
				cout<<srt[h];
				}
				cout<<"\n";
				srt.clear();
				k = 0;
		}
	}
	if (z < str.length())
	{
		if (str[z+1] == ' ')
		{
			for (int i = z+2; i < str.length(); i++)
			{
			cout<<str[i];
			}
			cout<<"\n";
		}
		else
		{
			for (int i = z+1; i < str.length(); i++)
			{
			cout<<str[i];
			}
			cout<<"\n";
		}
	}
}
/*void Split (string[] s)
{

}       */


};

 int _tmain(int argc, _TCHAR* argv[])
{
	string s;
	char c;
	int k;
	SplitText a;
	a.stroka(s);
	cout<<"<<If you want split simbol write 0"<<"\n";
	cout<<"<<If you want string split  write 1"<<"\n";
	cin>>k;
	switch (k)
	{
	case 0:
	{
		cout<<"Vvedite c"<<"\n";
		cin>>c;
		a.Split(c); break;
	}
	case 1:
	{
		string sraz;
		a.Split(a.Razdelstr(sraz));
		break;
    }
	default: cout<<"Bye Bye ..."<<"\n";
                   break;
		;
	}
	system("pause");
	return 0;
}
Dima-91 вне форума Ответить с цитированием
Старый 09.12.2015, 20:51   #104
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну в теории могу поставить троечку. Будем считать что задача решена более менее удовлетворительно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 09.12.2015, 20:54   #105
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну в теории могу поставить троечку. Будем считать что задача решена более менее удовлетворительно.
Задание слегка сложнова-то, да и видно по коду наверное что примитивом решал всё. Addelim Это как бы через switch функция void Split(string s)??
Stilet можете показать код тех функций что я не осилил. Попробую разобраться.

Кому не сложно новое задание, желательно с тем что я не осилил, только на уровень проще)

Последний раз редактировалось Dima-91; 10.12.2015 в 19:17.
Dima-91 вне форума Ответить с цитированием
Старый 11.12.2015, 19:57   #106
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Цитата:
Сообщение от Dima-91 Посмотреть сообщение
Кому не сложно новое задание, желательно с тем что я не осилил, только на уровень проще)
не используя сторонних библиотек,
в частности, не используя регулярные выражения
(std::regex/boost::regex нельзя использовать. иначе будет не интересно)

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

Код:
bool matches(const char* mask, const char* name);
функция должна вернуть true,
если указанная файловая маска удовлетворяет
указанному имени

примеры:

Код:
if( matches("*.lib", "expat.lib") )
    std::cout<< "detected library: expat.lib\n";
если справитесь, то у меня есть пакет тестов.
можно будет проверить корректность работы.

а так же может будет выполнить сравнительные тесты
по скорости и затратам памяти.

и узнать насколько оно быстрее, или медленнее работает
в сравнении например, с std::regex
_Bers вне форума Ответить с цитированием
Старый 11.12.2015, 20:31   #107
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Stilet можете показать код тех функций что я не осилил. Попробую разобраться.
Ну не. Так не пойдет )
Это же задание.
Ладно. Проехали. Для начала неплохо. ОТК дает добро
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 12.12.2015, 00:48   #108
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Цитата:
Сообщение от Dima-91 Посмотреть сообщение
Задание слегка сложнова-то, да и видно по коду наверное что примитивом решал всё. Addelim Это как бы через switch функция void Split(string s)??
Stilet можете показать код тех функций что я не осилил. Попробую разобраться.

Кому не сложно новое задание, желательно с тем что я не осилил, только на уровень проще)
Давай. Интересная и "пугающая" задача. Но если подумать, то очень простая.

Она научит тебя искать в сети информацию, продумывать алгоритмы и ход решения ( надеюсь ). Не пугайся.

Задача:

Дана строка encrypted, зашифрованная c неизвестным ключом шифром Цезаря.
Дана строка str_encrypted и str_decrypted с каким-то зашифрованным текстом и расшифрованным соответственно. Строки str_encrypted и encrypted зашифрованы одним ключом и одним шифром.

Расшифровать строку encrypted.

Ключ гарантированно меньше 26, т.к при ключах >= 26 алгоритм для латинского алфавита теряет смысл, потому что любой ключ X >= 26 эквивалентен ключу Y = X - k * 26

На вход подаются три строки: строка encrypted, str_encrypted и str_decrypted соответственно.
Вывод: расшифрованная encrypted


Пример:

Вход:

Bhdk, brx duh uljkw!
Hqfubswhg vwu1
Encrypted str1

Выход:

Yeah, you are right!

Код готов, не справишься - выложу

Последний раз редактировалось Malriser; 12.12.2015 в 14:19.
Malriser вне форума Ответить с цитированием
Старый 13.12.2015, 01:13   #109
Dima-91
Форумчанин
 
Регистрация: 28.09.2010
Сообщений: 198
По умолчанию

Malriser попробую Ваше задание.
_Bers Ваше задание с виду сложнее))

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

const int ABCSize = 26;

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 str_decrypted (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 _tmain(int argc, _TCHAR* argv[])
{
	string s1,s2;
	int shift = 3;
	cout<<"Vvedite stroky 1"<<"\n";
	getline(cin, s1);
	cout<<"Vvedite stroky 2"<<"\n";
	getline(cin, s2);
	cout<<str_decrypted(s2,3)<<"\n";
	cout<<str_decrypted(s1,3)<<"\n";
    system("pause");
	return 0;
}
Выполняет только поставленную задачу. Большая часть задания копипаст(

Последний раз редактировалось Stilet; 13.12.2015 в 13:53.
Dima-91 вне форума Ответить с цитированием
Старый 13.12.2015, 23:56   #110
Malriser
xor esp, esp
Форумчанин
 
Регистрация: 11.02.2014
Сообщений: 135
По умолчанию

Цитата:
Сообщение от Dima-91 Посмотреть сообщение
Malriser попробую Ваше задание.
_Bers Ваше задание с виду сложнее))

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

const int ABCSize = 26;

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 str_decrypted (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 _tmain(int argc, _TCHAR* argv[])
{
	string s1,s2;
	int shift = 3;
	cout<<"Vvedite stroky 1"<<"\n";
	getline(cin, s1);
	cout<<"Vvedite stroky 2"<<"\n";
	getline(cin, s2);
	cout<<str_decrypted(s2,3)<<"\n";
	cout<<str_decrypted(s1,3)<<"\n";
    system("pause");
	return 0;
}
Выполняет только поставленную задачу. Большая часть задания копипаст(
Задача решена неверно, поставленную задачу НЕ выполняет.

1) Ключ неизвестен.

2) Твоя программа работает только для key = 3, на деле ключ может принимать любое значение на интервале (0;26)

3) Задача состояла не в расшифровке с заданным ключом строк, а в расшифровке первой строки по заданному соответствию между шифротекстом и открытым текстом

Читай внимательнее ТЗ! На вход 3 строки, а не две!

Твоя главная проблема - ты не умеешь читать условия. Как сказал Stilet, прочитай еще раз!

Объясню еще раз:

У тебя есть ДВЕ строки зашифрованные ОДНИМ ключом. Для одной из строк известен ее открытый текст, надо найти открытый текст для другой строки.

Тебе надо реализовать это и расшифровать первую строку: https://ru.wikipedia.org/wiki/%D0%90...82%D0%BE%D0%B2


Дополнительные входные данные


на вход:
ahgzkmoy!
Aopz pz h alea
This is a text

Твоя задача написать код для атаки на основе открытого текста для шифра Цезаря, далее расшифровать "ahgzkmoy!" и выложить вместе с кодом сюда.


P.S. Этот алгоритм можно реализовать без массива алфавита, т.к он итак закодирован в стандартной кодировке.

Последний раз редактировалось Malriser; 14.12.2015 в 00:41.
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