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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 20.11.2011, 22:56   #1
malisheshka
 
Аватар для malisheshka
 
Регистрация: 20.11.2011
Сообщений: 3
По умолчанию Задача со строками. (C++)

Помогите пожалуйста решить задачу!

Найти в строке тройку слов таких, что из букв двух слов можно получить третье (при составлении этого слова следует использовать все буквы двух других). Если таких троек несколько, вывести ту, которая имеет максимальное суммарное количество букв.
malisheshka вне форума Ответить с цитированием
Старый 21.11.2011, 21:25   #2
Sprocket
 
Регистрация: 15.11.2011
Сообщений: 6
По умолчанию

создаёшь функцию которая из строки тебе будет выделять слова ( просто возвращать символы между пробелами), затем создаёшь 3 буфера которые будешь использовать для сравнения, и погнала в цикле забиваешь одно слово и сравниваешь со всеми комбинация других двух, при совпадении выводишь .
Sprocket вне форума Ответить с цитированием
Старый 22.11.2011, 13:52   #3
malisheshka
 
Аватар для malisheshka
 
Регистрация: 20.11.2011
Сообщений: 3
По умолчанию

Алгоритм понятен, проблемка с реализацией(((((
malisheshka вне форума Ответить с цитированием
Старый 22.11.2011, 14:01   #4
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

malisheshka

Алгоритм понятен, проблемка с реализацией(((((

если алгоритм понятен, напиши на псевдокоде, как бы ты его решала, проверим, не обманываешь ли ты нас...
Rififi вне форума Ответить с цитированием
Старый 22.11.2011, 19:03   #5
malisheshka
 
Аватар для malisheshka
 
Регистрация: 20.11.2011
Сообщений: 3
По умолчанию

Ну то есть ты не помочь мне хочешь, а проверить!?)
А если серьезно, то в жизни не писала на псевдокоде, так что заранее ссори))

От 1 до длины строки откусываем с начала строки по одному символу и запихиваем в массив его код;

От 1 до длины строки делаем:
Если встретился пробел, то:
увеличиваем счетчик;
запоминаем индекс ячейки массива в котором лежит пробел;
если счетчик = 3, то
приставляем третье слово к каждому символу второго и проверяем совпадают ли коды, если совпадают проверяем второе слово, если нет, то меняем текущее значение индекса на (сохраненное ранее) значение индекса второго пробела(чтобы проверять следующую тройку слов т.е 2е 3е и 4е слово)

Последний раз редактировалось malisheshka; 22.11.2011 в 19:08.
malisheshka вне форума Ответить с цитированием
Старый 22.11.2011, 23:00   #6
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

malisheshka

Ну то есть ты не помочь мне хочешь, а проверить!?)

чего я точно НЕ хочу, так это делать за тебя твою лабу.
вот представь, сидишь ты на лекциях, протираешь штаны, то есть, пардоньте, юбку :D, а на твоем месте мог бы быть голодающий студент по обмену из Африки, который хочет стать образованным гражданином, чтобы мама с папой им гордились. а ты не даешь ему получить образование ): и все что ему светит - это малолетний преступник, живущий по законам улиц. А ведь мог бы стать приличным человеком...



От 1 до длины строки откусываем с начала строки по одному символу и запихиваем в массив его код;

От 1 до длины строки делаем:
Если встретился пробел, то:
увеличиваем счетчик;
запоминаем индекс ячейки массива в котором лежит пробел;
если счетчик = 3, то
приставляем третье слово к каждому символу второго и проверяем совпадают ли коды, если совпадают проверяем второе слово, если нет, то меняем текущее значение индекса на (сохраненное ранее) значение индекса второго пробела(чтобы проверять следующую тройку слов т.е 2е 3е и 4е слово)


перевод псевдокода на C++:

Код:
char str[100];
fgets(str, 100, stdin);

const size_t length = strlen(str);
int* codes = new int[length];

// От 1 до длины строки откусываем с начала строки по одному символу и запихиваем в массив его код;
for (size_t i=1; i<length; i++)
   codes[i] = (int) str[i];

size_t counter = 0;
size_t index = (size_t) -1;

// От 1 до длины строки делаем:
for (size_t i=1; i<length; i++)
{
    // Если встретился пробел, то:
    if (str[i] == ' ')
    {
        // увеличиваем счетчик;
        // запоминаем индекс ячейки массива в котором лежит пробел;
        counter++;
        index = i;
    }

    // если счетчик = 3, то
    if (counter == 3)
    {
        //приставляем третье слово к каждому символу второго и проверяем совпадают ли коды, если совпадают проверяем второе слово

        ???
    }
}
что делать после "если счетчик = 3" непонятно, потому что согласно алгоритму, на данном этапе у нас нет ни второго, ни третьего слова, да и что за "коды" у слов - тоже загадка...
Rififi вне форума Ответить с цитированием
Старый 22.11.2011, 23:25   #7
_kilik_
Пользователь
 
Аватар для _kilik_
 
Регистрация: 16.08.2011
Сообщений: 69
По умолчанию

написал первое что в голову пришло.
не проверял-
Код:
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
struct match{//хранит rezultat
	string A,B,C;
	int size;
};
string i_slovo(string &text,int n);//возращает н-ое слово из текста если n выходит за пределы возратим пустую строку 
int cmp_str(string one,string two,string tree);//сравнеия слов 
void out_words(match res);//vivjd res
int main(){
	setlocale(LC_ALL,"Russian");
	string text;
	match max;
	max.size=0;
	getline(cin,text);//читаем

	for(int i=0;!i_slovo(text,i+2).empty();i++)//первое слово
		for(int m=i+1;!i_slovo(text,m+1).empty();m++)//второе
			for(int n=i+2;!i_slovo(text,n).empty();n++){//тр
				if(cmp_str(i_slovo(text,i),i_slovo(text,m),i_slovo(text,n))>max.size){//если есть совпадения и длина больше
					max.A=i_slovo(text,i);
					max.B=i_slovo(text,m);
					max.C=i_slovo(text,n);
					max.size=((max.A.size()+max.B.size()+max.C.size())/2);
				}
			}
	out_words(max);
	cout<<endl;
	system("pause");
	return 0;
}

////******вывод данных на монитор*************?///
void out_words(match res){
	if(res.size!=0){
		cout<<"слова совпадают \n";
		cout<<res.A<<endl<<res.B<<endl<<res.C<<endl;
		cout<<"количество символов k="<<res.size;
	}
	else
		cout<<"совпадений нет\n";
}
/////************сравнеия слов***************?//// 
int cmp_str(string A,string B,string C){
	string A_B,A_C,B_C;
	A_B=A+B;
	A_C=A+C;
	B_C=B+C;
	sort(A.begin(),A.end());
	sort(B.begin(),B.end());
	sort(C.begin(),C.end());
	sort(B_C.begin(),B_C.end());
	sort(A_B.begin(),A_B.end());
	sort(A_C.begin(),A_C.end());
	if((!strcmp(A_B.c_str(),C.c_str()))||(!strcmp(A_C.c_str(),B.c_str()))||(!strcmp(B_C.c_str(),A.c_str()))){
		return ((A.size()+B.size()+C.size())/2);
	}
	else 
		return 0;
}
////**********vozratim n-oe slovo ******////
string i_slovo(string &text,int n){
	int t=0;
	string anse;
	for(unsigned i=0;text.size()>i;i++){
		if(t==n && isalpha(text[i]))
			anse+=text[i];
		if(!isalpha(text[i])&&(isalpha(text[i+1])))//если символ не буква и слодущий буква 
			t++; //переходим к след слову
	}
	return anse;
}
_kilik_ вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача в С++ со строками Алексей6565 Visual C++ 0 21.05.2011 21:01
задача со строками Цветик Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 13.10.2010 16:53
Задача со строками Panda Помощь студентам 8 02.07.2008 09:10
Задача со строками Klyan Общие вопросы C/C++ 6 21.09.2007 22:22