Помощь - Поиск - Пользователи - Календарь
Полная версия: Определить слова первого предложения, которые встречаются во втором
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
artem66rus
Даны два предложения. Определить слова первого предложения, которые встречаются во втором, причем неважно, на каком регистре набраны эти слова (т.е. одинаковыми считаются слова ГОД и год).

Помогите кто чем может! Заранее спасибо!
Lapp
Цитата(artem66rus @ 25.04.2011 11:27) *
Даны два предложения. Определить слова первого предложения, которые встречаются во втором, причем неважно, на каком регистре набраны эти слова (т.е. одинаковыми считаются слова ГОД и год).

Помогите кто чем может! Заранее спасибо!

Поставь задачу почетче. Чем разделены слова? предложения в строках?

И скажи, с чем именно у тебя затруднения. Что сделал, и что не получается.
TarasBer
1. Привести обе строки к верхнему регистру.
2. Разбить на слова.
3. Перебором найти общие элементы разбиений. Просто я не знаю, как правильно находить пересечение множеств, поэтому предлагаю перебрать. Если бы я делал для себя, я бы с хешами замутил чего.
artem66rus
Цитата(Lapp @ 25.04.2011 14:00) *

Поставь задачу почетче. Чем разделены слова? предложения в строках?

И скажи, с чем именно у тебя затруднения. Что сделал, и что не получается.


Ну введите первое предложение, введите второе предложение. ну а вто дальше я встал... Я считаю сравниваются 2 строки, вот тока как это сделать не соображу
Lapp
Цитата(TarasBer @ 25.04.2011 12:03) *
1. Привести обе строки к верхнему регистру.
2. Разбить на слова.
3. Перебором найти общие элементы разбиений. Просто я не знаю, как правильно находить пересечение множеств, поэтому предлагаю перебрать. Если бы я делал для себя, я бы с хешами замутил чего.
Можно схитрить. Разбить на слова одно, потом использовать фукцию Pos для поиска их во втором )). Хотя это только усложнит дело)). Полагаю, тут речь пока не об эффективности, а о принципиальной возможности.

Цитата(artem66rus @ 25.04.2011 12:05) *
Ну введите первое предложение, введите второе предложение. ну а вто дальше я встал... Я считаю сравниваются 2 строки, вот тока как это сделать не соображу
Ну покажи хотя бы, что есть..
И ты забыл ответить про разделители.
artem66rus
Цитата(Lapp @ 25.04.2011 14:14) *

Можно схитрить. Разбить на слова одно, потом использовать фукцию Pos для поиска их во втором )). Хотя это только усложнит дело)). Полагаю, тут речь пока не об эффективности, а о принципиальной возможности.

Ну покажи хотя бы, что есть..
И ты забыл ответить про разделители.



program predlog;
Uses Crt;
var
stroka : string;

begin
ClrScr;
WriteLn('Введите 2 предложения разделих их точкой ');
TextColor(Cyan);
ReadLn(stroka);
stroka:=stroka + '.';




Может точкой разделить? или как лучше я даж не знаю
Lapp
Цитата(artem66rus @ 25.04.2011 12:22) *
Может точкой разделить? или как лучше я даж не знаю

Зачем точкой? Просто сделай два разных ввода

  write('введите первое предложение: ');
readln(s1);
write('введите второе предложение: ');
readln(s2);


artem66rus
Добавлено через
Вот вроде, дотумкал!!!



uses crt;
type str=array[1..100] of string;

Procedure Split(var s:string; var output:str; var index:integer);
var i:integer;
Begin
index:=1;
For i:=1 to length(s) do
if (s[i] = ' ') then inc(index)
else output[index]:=output[index]+s[i];

End;
//------------------------------------------------------------------------------
var s1,s2,equals:string;
i,j,size1,size2:integer;
A,B:str;
begin
Write('Enter s1: ');
ReadLn(s1);
Write('Enter s2:');
ReadLn(s2);

Split(s1,A,size1);
Split(s2,B,size2);
WriteLn;

For i:=1 to size1 do
For j:=1 to size2 do
if (A[i] = B[j]) then WriteLn(A[i]);

Readln;
end.




ПРОВЕРТЕ ПЛЗ!! Че то с регистром у меня никак не выходит
Lapp
Цитата(artem66rus @ 25.04.2011 13:30) *
Че то с регистром у меня никак не выходит
А тебе надо русский текст обрабатывать? В какой кодировке?


Добавлено через 14 мин.
Вот примерно так можно сравнивать независимо от регистра. Но это только для английских букв. Для русских надо переписывать функцию UpCase.
function Eq(s,t: string): boolean;
var
i: integer;
e: boolean;
begin
e:= Length(s)=Length(t);
i:= 1;
while e and (i<=Length(s)) and (UpCase(s[i])=UpCase(t[i]) do Inc(i);
Eq:= e and (i>Length(s))
end;


Еще: я бы советовал перед главным циклом пройтись по обоим массвам, A и B, и убрать повторения.
artem66rus
Цитата(Lapp @ 25.04.2011 16:15) *

А тебе надо русский текст обрабатывать? В какой кодировке?
Добавлено через 14 мин.
Вот примерно так можно сравнивать независимо от регистра. Но это только для английских букв. Для русских надо переписывать функцию UpCase.
function Eq(s,t: string): boolean;
var
i: integer;
e: boolean;
begin
e:= Length(s)=Length(t);
i:= 1;
while e and (i<=Length(s)) and (UpCase(s[i])=UpCase(t[i]) do Inc(i);
Eq:= e and (i>Length(s))
end;


Еще: я бы советовал перед главным циклом пройтись по обоим массвам, A и B, и убрать повторения.


Кодировка русскими буквами нужна, это я уже тоже нашел...

Перевод в верхний регистр:


procedure UpCaseRus(var s:string);{приведение к верхнему регистру русских букв}
{русские в верхний регистр}
var i:integer;
begin
for i:=1 to length(s) do
if s[i] in ['а'..'п'] then s[i]:=chr(ord(s[i])-32)
else if s[i] in ['р'..'я'] then s[i]:=chr(ord(s[i])-80)
else if s[i]='ё' then s[i]:='Ё';
end;



еще


function UpCase(s:string):string;{приведение к верхнему регистру всей строки}
{UpCase}
var i,k:byte;
st:string;
begin
st:=s;
for i:=1 to length(s) do
if st[i] in ['a'..'z'] then st[i]:=UpCase(st[i])
else if st[i] in [' '..'Ї'] then st[i]:=chr(ord(st[i])-32)
else if st[i] in ['а'..'п'] then st[i]:=chr(ord(st[i])-80)
else if st[i]='с' then st[i]:='р';
while st[1]=' 'do delete(st,1,1);
while st[length(st)]=' ' do delete(st,length(st),1);
UpCase:=st;
end;



и


procedure LowCase(var s:string);{приведение к нижнему регистру}
var i:byte;
begin
for i:=1 to length(s) do
if s[i] in ['A'..'Z','А'..'П'] then s[i]:=chr(ord(s[i])+32)
else if s[i] in ['Р'..'Я'] then s[i]:=chr(ord(s[i])+80)
else if s[i]='Ё'then s[i]:='ё';
end;



Как теперь это все объеденить без ошибки???
Lapp
Цитата(artem66rus @ 25.04.2011 15:00) *
Как теперь это все объеденить без ошибки???

мм.. Знаешь, Артем, я бы советовал тебе бросать эту практику - дергать всякие фрагменты из кодов, найденных в Инете. Вот, ты привел три функции неизвестно откуда, все они имеют смысл, но ни одна точно не подходит к тому, что я сказал выше. И теперь я должен менять, подстраивать (хотя лично мне было бы НАМНОГО проще написать все сразу и самому за пять минут). Ну, хорошо, допустим, я сделаю (я сегодня добрый). Но ТЕБЕ-ТО какой от этого смысл?.. blink.gif Мне в некоторый момент показалось, что ты хочешь чему-то научиться. Но как только я пойму, что тебя беспокоит только сдача - мой интерес к твоей персоне резко упадет.

Без ошибки, гришь? Без ошибок даже ложку мимо рта не проносить не научишься.. Учатся как раз именно на ошибках. Ты сделай ошибку и исправь - вот тогда будет тебе польза и щастье..
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.