Старый 07.03.2006, 19:52   #1   
Registered User
 
Аватар для dzidrop
 
Сообщений: 37
Регистрация: 26.10.2005
Возраст: 36

dzidrop вне форума Не в сети
Задача на C++ помогите плиз:)))

У меня есть задача я её почти сделал т.е не то чтобы почти, но не до конца вот условие:"Текстовый файл содержит две строки (неограниченного размера) нужно вывести все слова второй строки, которые не получаются конкатенацией некоторых слов первой строки."
Вся проблема в том, что нельзя использовать классы и длина строк не ограничена
Ну я делал её методом перебора, точнее хотел сделать, я разбил строки по словам и все слова слил в массив (не слова а указатели на них), соответственно для первой и второй строки.
И вот теперь не знаю чё делать...
Есть индексы и эти массивы слов, перебираю индексы, по полученным сочетаниям получаю новое слово, и сравниваю его с словом из второй строки..только вот блин как

typedef char** string; это короче массив ссылок он динамический т.к. строки не ограниченные

string* mas1=new string[w1];//массив указателей для слов первой строки
string* mas2=new string[w2];//массив указателей для слов второй строки
w1 и w2 это количество слов в первой и второй строке соответственно
Да и на конце каждого слова '\0'
далее заполнение этих массивов ;
Ещё известна длина каждой строки cl1 и cl2.
мне теперь нужна функция которая будет перебирать все возможные варианты или проще говоря рабочая функция которая сразу выдаст ответ
Помогите плиз )

Если у кого нибудь есть такая задача поделитесь))) или помогите написать эту функцию...
  Ответить с цитированием
Старый 07.03.2006, 23:16   #2   
Форумец
 
Аватар для Kent
 
Сообщений: 142
Регистрация: 17.12.2002
Возраст: 43

Kent вне форума Не в сети
Если правельно понял, и тебе необходимо беребрать комбинации слов - есть примерчик. Только учти, что кол-во комбинаций будет факториал от кол-ва слов. Вокак!!! Неслабое ограничение....

Собсно пример:

void variant(int *rez,int kch,int *gur);
int factorial(int ks);

int _tmain(int argc, _TCHAR* argv[])
{
//
int mas[256],//ьрёёшт ё ўшёырьш фы* яхЁхсюЁр трЁшрэЄют
gur[256],// ¤ї, хёышс ьюцэю с√ыю ъырёё√.....
kolch,//ъюышўхёЄтю ўшёхы т ьрёёштх фы* яхЁхсюЁр
i, kolvar;
//чряюыэ*хь
kolch = 16;
for(i=0;i<kolch;i++)
{
mas[i] = i;
gur[i] = 1;
}
// т√тюфшь ш яхЁхсшЁрхь, т√тюфшь ш яхЁхсшЁрхь
kolvar = factorial(kolch);
for(i=0;i<kolvar;i++)
{
printf("\n");
for(int j=0;j<kolch;j++)printf("%d ",mas[j]);
variant(mas,kolch,gur);
}
return 0;
}

int factorial(int ks)
{
int rez = 1;
for(int i = 1; i <= ks; i++) rez = rez * i;
return rez;
}

void variant(int *rez,int kch,int *gur)
{
static int i,kv,l,tur=2,j,ur[30];
for(l=0;l<kch;l++)ur[l]=rez[l];
for(l=tur;l>tur/2;l--)
{
ur[kch-l]=rez[kch-tur+l-1];
ur[kch-tur+l-1]=rez[kch-l];
}
gur[tur]++;
if(gur[tur]>=tur)
{
for(l=2;l<kch && gur[l]>=l;l++);
for(j=0;j<l;j++)gur[j]=1;
tur=l;
}
else tur=2;
for(l=0;l<kch;l++)rez[l]=ur[l];
return ;
}
  Ответить с цитированием
Старый 07.03.2006, 23:47   #3   
Форумец
 
Аватар для M0l0t
 
Сообщений: 5,975
Регистрация: 22.04.2003
Записей в дневнике: 4

M0l0t вне форума Не в сети
длина строки cl1 и cl2 - это кол-во символов в строке? вместе с пробелами?
  Ответить с цитированием
Старый 08.03.2006, 08:18   #4   
Registered User
 
Аватар для dzidrop
 
Сообщений: 37
Регистрация: 26.10.2005
Возраст: 36

dzidrop вне форума Не в сети
да cl1 и cl2 это количество символов в строке с пробелами
Нет ты не правильно понял как перебирать я знаю мне необходимо разобраться с указателями на слова....

Хотя тут прикинул, что лучше всего будет написать функцию которая по заданному номеру слова (количество слов в первой строке w1 во второй w2) будет давать результатом это слово и просто с этой функцией работать в переборе. Вот терь думаю как её написать
  Ответить с цитированием
Старый 08.03.2006, 15:57   #5   
Наркоман...
 
Аватар для Shoroh
 
Сообщений: 1,858
Регистрация: 20.06.2005
Возраст: 36

Shoroh вне форума Не в сети
dzidrop где учишься?
  Ответить с цитированием
Старый 08.03.2006, 16:04   #6   
Registered User
 
Аватар для dzidrop
 
Сообщений: 37
Регистрация: 26.10.2005
Возраст: 36

dzidrop вне форума Не в сети
это важно???
  Ответить с цитированием
Старый 10.03.2006, 14:55   #7   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
Цитата:
Сообщение от dzidrop
typedef char** string; это короче массив ссылок он динамический т.к. строки не ограниченные
string* mas1=new string[w1];//массив указателей для слов первой строки
string* mas2=new string[w2];//массив указателей для слов второй строки
w1 и w2 это количество слов в первой и второй строке соответственно
Да и на конце каждого слова '\0'
Цитата:
Сообщение от dzidrop
да cl1 и cl2 это количество символов в строке с пробелами
Нет ты не правильно понял как перебирать я знаю мне необходимо разобраться с указателями на слова....
Хотя тут прикинул, что лучше всего будет написать функцию которая по заданному номеру слова (количество слов в первой строке w1 во второй w2) будет давать результатом это слово и просто с этой функцией работать в переборе. Вот терь думаю как её написать
Ну во первых
в твоем примере
mas1 и mas2 это не массив указателей для слов - это массив массивов указателей на строки!!! в данном виде чушь (ИМХО ты ошибся на одну звездочку в описании типа string)
Во вторых если хочешь перебором ну удачи тебе...Если слов действительно много то результата ждать запаришься.
Для ускорения можешь сразу выкинуть слова из ворой строки которые не начинаются ни с одного слова, и не оканчиваются ни на одно слово из первой строки, а с оставшимися работать. Варианты либо как ты и хотел тупым перебором либо конечный автомат(имхо более быстрый вариант хотя будут трудности с динамическим построением атомата). Боле пока на ум ничего не приходит.
В третьих
Что значит разобраться с указателями? Есть у тебя индекс так и вперед mas1[index] - слово из вервой строки
strcat(mas1[index1],mas1[index2]) объединение двух слов из первой строки
int strcmp( const char *string1, const char *string2 );сравнение строк.
Тебе это надо?
  Ответить с цитированием
Старый 11.03.2006, 12:21   #8   
Наркоман...
 
Аватар для Shoroh
 
Сообщений: 1,858
Регистрация: 20.06.2005
Возраст: 36

Shoroh вне форума Не в сети
бросать надо это неблагодарное занятие
  Ответить с цитированием
Старый 16.03.2006, 14:52   #9   
Благобадаря
 
Аватар для Collateral
 
Сообщений: 120
Регистрация: 25.10.2005
Возраст: 36

Collateral вне форума Не в сети
Ну тут у вас и загоны .
А чё такое конкатенация?
  Ответить с цитированием
Старый 20.03.2006, 22:50   #10   
Vulture[BUG]
 
Аватар для Strucka
 
Сообщений: 899
Регистрация: 21.05.2005
Возраст: 37

Strucka вне форума Не в сети
kancher zasupalsya *)
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind