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

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
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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

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