Tom Kruz Posted December 25, 2004 Report Share Posted December 25, 2004 Очень нужно решить задачу, помогите, кто может Задача: Задача № 18 (170603_4) Вводится текст - последовательность предложений, каждое из которых заканчивается точкой. Последнее предложение заканчивается восклицательным знаком. Другие знаки препинания в тексте опущены. Предложения состоят из слов, между которыми может быть любое число пробелов. Словом назовем последовательность символов, не содержащую пробелов. Разработать АЛГОРИТМ, дать его ОПИСАНИЕ (включая ОБЩУЮ СХЕМУ и назначение используемых переменных), привести ПРОГРАММУ нахождения множества слов, содержащихся одновременно во всех предложениях кроме первого. КОНТРОЛЬНЫЙ ПРИМЕР Исходные данные: Предварительное тестирование проводится перед собеседованием. Предстояло тестирование и абитуриенты готовились настойчиво и рассчитывали что результаты будут хорошие. Тестирование дало неожиданно хорошие для комиссии результаты они основывались на количестве затраченного труда! Решение: Общие слова: результаты хорошие Решить нужно именно в Borland C++Builder 6 Link to comment Share on other sites More sharing options...
kaat Posted December 26, 2004 Report Share Posted December 26, 2004 Если так на вскидку: Считаем количество предложений без первого. Берем слово №1 (это последовательность символов до первого пробела) из предложения №2 и сохраняем его в переменной tepm. Находим конец этого предложения (символ ".") Просматриваем следующее предложение по словам - берем слово и сравниваем с temp. Если совпадают - увеличиваем счетчик. Так до конца текста. Если счетчик=кол-ву предложений -> слово сохраняем. Берем следующее млово из предложения №2 и повторяем снова... Пока на закончатся слова в этом предложении. Просматривать остальные предложения наверно не имеет смысла, т.к. нам нужны слова, содержащиеся во всех. Текст можно вводить в компонент Memo, оттуда считывать по строкам. Link to comment Share on other sites More sharing options...
Tom Kruz Posted December 27, 2004 Author Report Share Posted December 27, 2004 kaat Спасибо конечно, но это мне мало о чём говорит, мне нужна сама программа... Link to comment Share on other sites More sharing options...
kaat Posted December 27, 2004 Report Share Posted December 27, 2004 мне нужна сама программа... Самый простой способ - сесть и написать :) А если серьезно - то если нужно не завтра, то можно подумать на эту тему :) Весь вопрос во времени (у меня у самой сессия :D). Link to comment Share on other sites More sharing options...
Tom Kruz Posted December 29, 2004 Author Report Share Posted December 29, 2004 kaat если нужно не завтра, то можно подумать на эту тему Не поверишь, но нужно именно завтра... Вобщем, спасибо за помощь! Постараюсь как-нибудь, что-нибудь сделать сам... Желаю удачно сдать сессию! :( Link to comment Share on other sites More sharing options...
Tom Kruz Posted December 30, 2004 Author Report Share Posted December 30, 2004 Вобщем я кое-что сделал, с помощью друзей, но программа почему-то не работает, может кто поможет, что здесь не так??? //--------------------------------------------------------------------------- #include <vcl\vcl.h> #pragma hdrstop #include "Unit1.h" //--------------------------------------------------------------------------- #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { //---------переменные------------ AnsiString BeginT; AnsiString Word; AnsiString WordL[100][100]; int WordC[100]; //кол-во слов int PredlC=0;//кол-во предложений AnsiString ResultL[100]; int ResultC; //----------обработка 1--------- BeginT=Memo1->Text; for (int i = 1; i<BeginT.Length()+1; i++) //цикл по количеству символов в строке { if (BeginT==' ') //Если символ - пробел, то { int a=0; for (int k = 1; k<=WordC[PredlC]; k++) //перебирается по количеству слов { if (WordL[PredlC][k]==Word) //и проверяется, есть ли слово в списке { a=1; //если да, то переменная приравнивается к единице }; } ; if (a==1) //если а равна единице, то {} else { WordC[PredlC]++; //количество слов увеличивается на 1 WordL[PredlC][WordC[PredlC]]=Word; //слово записывается в массив слов }; Word=""; //переменная очищается для поиска следующего слова } else //если символ не является пробелом, { if (PredlC==0) PredlC=1; if (BeginT=='.' || BeginT=='!') //то проверяется, является ли символ точкой { //если да, то int a = 0; for (int k = 1; k<WordC[PredlC]+1; k++) //перебирается по количеству слов { if (WordL[PredlC][k]==Word) //и проверяется, есть ли слово в списке { a=1; //если да, то переменная приравнивается к единице }; }; if (a==1) {} //если а равна единице, то else { WordC[PredlC]++; //количество слов увеличивается на 1 WordL[PredlC][WordC[PredlC]]=Word; //слово записывается в массив слов }; Word=""; //переменная очищается для поиска следующего слова if (BeginT!='!') PredlC++; } else //если символ не является точкой, то { Word=Word+BeginT; //символ добавляется в переменную для хранения слов }; }; }; //переход к следующему символу //-------------обработка слов------------ for (int i=2; i<=PredlC; i++) for (int j=1; j<=WordC; j++) { int a=0; Word=WordL[j]; for (int k=2; k<=PredlC; k++) { if (k!=i) for (int v=1; v<=WordC[k]; v++); { if ( Word==WordL[k][v]) a++; } } if (a==PredlC-2) { int b=0; for (int m = 1; m<WordC[PredlC]+1; m++) //перебирается по количеству слов { if (ResultL[m]==Word) //и проверяется, есть ли слово в списке { b=1; //если да, то переменная приравнивается к единице }; }; if (b==1) {} //если а равна единице, то else { ResultC++; //количество слов увеличивается на 1 ResultL[ResultC]=Word; //слово записывается в массив слов }; } } //-------вывод результата--------- Word=""; for (int i=1; i<=ResultC; i++) Word=Word+ResultL+' '; Memo2->Text=Word; } //--------------------------------------------------------------------------- Link to comment Share on other sites More sharing options...
kaat Posted December 30, 2004 Report Share Posted December 30, 2004 В самом начале: int a=0;for (int k = 1; k<=WordC[PredlC]; k++) //перебирается по количеству слов {... у тебя пустой массив WordC. Ты в цикле говоришь - пока k меньше или равно значения из WordC по индексу PredlC. А массив ты не заполнил данными!! Я так понимаю, что WordC[PredlC] - количество слов в предложениях. Судя по всему, ты вводишь текст в Memo, а сам алгоритм поместил в обработчик нажатия кнопки. :) Поэтому ты не знаешь, ни сколько у тебя предложений, ни сколько слов в них. Сначала посчитай их, либо сделай другое условие в цикле, например while(BeginT!=".") { .... } т.е. пока не встретится точка мы будем сравнивать слова. По-моему, основной косяк в этом. Удачи!!! :D З.Ы.: Если будут вопросы - пиши на мыло Link to comment Share on other sites More sharing options...
Tom Kruz Posted December 30, 2004 Author Report Share Posted December 30, 2004 (edited) Не знаю, это ещё не смотрел, но так он выдаёт ошибку, что не объявлена переменная 'v' вот в этом месте for (int i=2; i<=PredlC; i++) for (int j=1; j<=WordC; j++) { int a=0; Word=WordL[j]; for (int k=2; k<=PredlC; k++) { if (k!=i) for (int v=1; v<=WordC[k]; v++); { if ( Word==WordL[k][v]) a++; } } if (a==PredlC-2) { int b=0; for (int m = 1; m<WordC[PredlC]+1; m++) //перебирается по количеству слов { if (ResultL[m]==Word) //и проверяется, есть ли слово в списке { b=1; //если да, то переменная приравнивается к единице }; }; if (b==1) {} //если а равна единице, то else { ResultC++; //количество слов увеличивается на 1 ResultL[ResultC]=Word; //слово записывается в массив слов }; } } А ещё конкретней в этом if ( Word==WordL[k][v]) a++; Edited December 30, 2004 by Tom Kruz Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now