Перейти к содержанию
СофтФорум - всё о компьютерах и не только

Borland C++Builder 6


Рекомендуемые сообщения

Очень нужно решить задачу, помогите, кто может

Задача:

Задача № 18 (170603_4)

Вводится текст - последовательность предложений, каждое из которых заканчивается точкой. Последнее предложение заканчивается восклицательным знаком. Другие знаки препинания в тексте опущены. Предложения состоят из слов, между которыми может быть любое число пробелов. Словом назовем последовательность символов, не содержащую пробелов.

Разработать АЛГОРИТМ, дать его ОПИСАНИЕ (включая ОБЩУЮ СХЕМУ и назначение используемых переменных), привести ПРОГРАММУ нахождения множества слов, содержащихся одновременно во всех предложениях кроме первого.

КОНТРОЛЬНЫЙ ПРИМЕР

Исходные данные:

Предварительное тестирование проводится перед собеседованием. Предстояло тестирование и абитуриенты готовились настойчиво и рассчитывали что результаты будут хорошие. Тестирование дало неожиданно хорошие для комиссии результаты они основывались на количестве затраченного труда!

Решение:

Общие слова: результаты хорошие

Решить нужно именно в Borland C++Builder 6

Ссылка на комментарий
Поделиться на другие сайты

Если так на вскидку:

Считаем количество предложений без первого.

Берем слово №1 (это последовательность символов до первого пробела) из предложения №2 и сохраняем его в переменной tepm. Находим конец этого предложения (символ ".") Просматриваем следующее предложение по словам - берем слово и сравниваем с temp. Если совпадают - увеличиваем счетчик. Так до конца текста. Если счетчик=кол-ву предложений -> слово сохраняем.

Берем следующее млово из предложения №2 и повторяем снова...

Пока на закончатся слова в этом предложении.

Просматривать остальные предложения наверно не имеет смысла, т.к. нам нужны слова, содержащиеся во всех.

Текст можно вводить в компонент Memo, оттуда считывать по строкам.

Ссылка на комментарий
Поделиться на другие сайты

мне нужна сама программа...

Самый простой способ - сесть и написать :)

А если серьезно - то если нужно не завтра, то можно подумать на эту тему :)

Весь вопрос во времени (у меня у самой сессия :D).

Ссылка на комментарий
Поделиться на другие сайты

kaat

если нужно не завтра, то можно подумать на эту тему

Не поверишь, но нужно именно завтра...

Вобщем, спасибо за помощь! Постараюсь как-нибудь, что-нибудь сделать сам...

Желаю удачно сдать сессию!

:(

Ссылка на комментарий
Поделиться на другие сайты

Вобщем я кое-что сделал, с помощью друзей, но программа почему-то не работает, может кто поможет, что здесь не так???

//---------------------------------------------------------------------------

#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;

}

//---------------------------------------------------------------------------

Ссылка на комментарий
Поделиться на другие сайты

В самом начале:

int a=0;

for (int k = 1; k<=WordC[PredlC]; k++) //перебирается по количеству слов

{...

у тебя пустой массив WordC. Ты в цикле говоришь - пока k меньше или равно значения из WordC по индексу PredlC. А массив ты не заполнил данными!!

Я так понимаю, что WordC[PredlC] - количество слов в предложениях. Судя по всему, ты вводишь текст в Memo, а сам алгоритм поместил в обработчик нажатия кнопки. :) Поэтому ты не знаешь, ни сколько у тебя предложений, ни сколько слов в них.

Сначала посчитай их, либо сделай другое условие в цикле, например

while(BeginT!=".")

{

....

}

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

По-моему, основной косяк в этом.

Удачи!!! :D

З.Ы.: Если будут вопросы - пиши на мыло

Ссылка на комментарий
Поделиться на другие сайты

Не знаю, это ещё не смотрел, но так он выдаёт ошибку, что не объявлена переменная '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++;

Изменено пользователем Tom Kruz
Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...