Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Строка из одинаковых слов

Автор: 18192123 5.01.2007 22:45

Даны две строки, состоящие из слов. Получить 3-ю строку, состоящую из слов, которые содержаться в обеих строках.

Правильно ли я понимаю : сначала мне нужно разбить обе строки на слова, а потом их сравнивать? А вот каким способом?

Автор: volvo 5.01.2007 22:50

Достаточно разбить на слова одну строку, а потом просто проверять через Pos (ну, или BMSearch есть уже реализованный, если тебе нельзя пользоваться встроенными функциями Паскаля), присутствует или нет каждое слово во второй строке... Если присутствует - добавить в строку-результат...

Автор: Bokul 5.01.2007 22:51

Можно и так, это один из способов.

Цитата
А вот каким способом?

Как разбивать? Выбирай любой наиболее удобный для тебя.

Автор: 18192123 5.01.2007 23:28

Цитата(volvo @ 5.01.2007 18:50) *

а потом просто проверять через Pos (ну, или BMSearch есть уже реализованный, если тебе нельзя пользоваться встроенными функциями Паскаля), присутствует или нет каждое слово во второй строке...

А если мне нельзя этого использовать, только length, тогда как мне проверить?

Автор: Bokul 5.01.2007 23:35

Т.е. тебе нельзя написать свой аналог pos? Если нет, то делай как ты описала.

Автор: klem4 5.01.2007 23:50

Цитата
Достаточно разбить на слова одну строку, а потом просто проверять через Pos (ну, или BMSearch есть уже реализованный, если тебе нельзя пользоваться встроенными функциями Паскаля), присутствует или нет каждое слово во второй строке... Если присутствует - добавить в строку-результат...


Pos в чистом виде не пойдет smile.gif
Ведь слово из первой строки во второй может не присутсвовать отдельно, но являться частью дугого слова ... Хотя все это можно и с Pos обыграть при желании smile.gif

Автор: volvo 5.01.2007 23:55

Я уже 5 раз показывал, КАК именно это делается - в 3 строках кода... Еще раз привести? Поиск что, уже можно отменять? dry.gif

Автор: 18192123 5.01.2007 23:55

Цитата(Bokul @ 5.01.2007 19:35) *

Т.е. тебе нельзя написать свой аналог pos? Если нет, то делай как ты описала.

Не, свой аналог я могу написать (пока не знаю, как..), но там нельзя использовать стандартные процедуры Паскаль, кроме length.

Автор: klem4 6.01.2007 0:19

Цитата
Я уже 5 раз показывал, КАК именно это делается - в 3 строках кода... Еще раз привести? Поиск что, уже можно отменять? dry.gif


Так я же не сказал что нельзя сделать через Pos ...

Кстати что-то я не могу в поиске Pos рукодельный найти пока, так что могу предложить такой вариант

function _Pos(const subS, s: String): Integer;
var
i, j, LenS, LenSb: Integer;
find: Boolean;
begin

i := 1;

find := false;

LenS := Length(s);
LenSb := Length(subS);

while (i <= LenS) and not(find) do begin

while (i <= LenS) and (s[i] <> subS[1]) do
inc(i);

if (i <= LenS) and ( i + LenSb - 1 <= LenS) then begin

j := 0;

while (j < LenSb) and (s[i + j] = subS[j + 1]) do
inc(j);

find := (j > LenSb - 1);

end;

if not(find) then inc(i);

end;

if find then _Pos := i else _Pos := 0;

end;

Автор: 18192123 6.01.2007 16:23

у меня получилось разбить на слова первую строку, больше ничего не могу сделать...
не пойму, как сравнить со второй...( даже с использованием функции function _Pos(const subS, s: String): Integer)



Function slovo ( const s : string; var i : byte) : string;
var
w : string;
begin
w := '';
while ( i <= length (s) ) and ( s[i] <> ' ' ) do
begin
w := w + s[i];
i := i+1;
end;
slovo := w;
end;



Автор: arhimag 6.01.2007 17:06

Предложение :
Возьми и засунь слова в массив, дальше сделай тоже самое для второй строки а дальше просто пробегись по всему первому массиву проверяя есть ли такой же элемент во втором массиве

Автор: Malice 6.01.2007 21:26

Предлагаю поменять твою функцию "Slovo" так, чтобы она возвращала i-тое слово из строки s, тогда все твои подобные задачи гораздо упростятся. В этой можно будет сдела перебор, типа:

for i:=1 to n1 do 
for j:=1 to n2 do
if Slovo (s1,i)=slovo(s2,j) then ..

Автор: 18192123 6.01.2007 22:36

Цитата(Malice @ 6.01.2007 17:26) *

Предлагаю поменять твою функцию "Slovo" так, чтобы она возвращала i-тое слово из строки s, тогда все твои подобные задачи гораздо упростятся. В этой можно будет сдела перебор, типа:

for i:=1 to n1 do 
for j:=1 to n2 do
if Slovo (s1,i)=slovo(s2,j) then ..


что- то вроде этого?


function exsl (var str : string; var pos : byte ) : string;
var
sl : string;
begin
sl := '';
while sl[pos] <> ' ' do
begin
sl := sl + str[pos];
inc (pos);
end;
inc (pos);
exsl := sl;
end;




Автор: Malice 6.01.2007 22:47

Нет, типа этого:

function Slovo(s:string;n:integer):string;
const lim =[' ',',','!'];
var ss:string;
k,c,i:integer;
begin
ss:=''; c:=1; k:=1;
while k<=length(s) do begin
while not(s[k] in lim) and (k<=length(s)) do begin
if c=n then ss:=ss+s[k];
inc (k); end;
inc ( c );
while (s[k] in lim) and (k<=length(s)) do inc (k);
end;
Slovo:=ss;
end;


Еще понадобится подсчет кол-ва слов:
n:=1; while slovo(s,n)<>'' do inc (n);

Автор: 18192123 7.01.2007 0:09

что здесь не так (программа не работает... )


uses crt;
function Slovo(s:string;n:integer):string;
const lim =[' ',',','!'];
var ss:string;
k,c,i:integer;
begin
ss:=''; c:=1; k:=1;
while k<=length(s) do begin
while not(s[k] in lim) and (k<=length(s)) do begin
if c=n then ss:=ss+s[k];
inc (k); end;
inc ( c );
while (s[k] in lim) and (k<=length(s)) do inc (k);
end;
Slovo:=ss;
end;

var
s1, s2, srez : string;
n1, n2 : integer;
i, j : integer;

begin
clrscr;
writeln (' vvedite 1-u stroky' ); readln (s1);
writeln (' vvedite 2-u stroky' ); readln (s2);
n1 := 1;
n2 := 1;
srez := ' ';
while slovo (s1, n1) <> ' ' do inc (n1);
while slovo (s2, n2) <> ' ' do inc (n2);
for i := 1 to n1 do
for j := 1 to n2 do
if slovo (s1, i) = slovo (s2, j) then srez := srez + slovo (s1, i) +' ';
writeln (' stroka - rezyltat : ' );
writeln (srez);
readkey;
end.



Автор: Malice 7.01.2007 0:14

Цитата(18192123 @ 6.01.2007 20:09) *

что здесь не так (программа не работает... )

while slovo (s1, n1) <> ' ' do inc (n1);
while slovo (s2, n2) <> ' ' do inc (n2);



В этих циклах в кавычках не должно быть пробела.

Автор: 18192123 7.01.2007 0:32

Цитата(Malice @ 6.01.2007 20:14) *

В этих циклах в кавычках не должно быть пробела.

Спасибо! Теперь всё хорошо!

Автор: Ellsa 10.01.2007 20:25

а может кто-нибудь сказать,что такое c и почему не должно быть в кавычках пробела....просто у меня очень похожая задача...но я не могу понять....что такое c? unsure.gif Помогите,пожалуйста!

Автор: Malice 10.01.2007 20:34

Цитата(Ellsa @ 10.01.2007 16:25) *

а может кто-нибудь сказать,что такое c и почему не должно быть в кавычках пробела....просто у меня очень похожая задача...но я не могу понять....что такое c? unsure.gif Помогите,пожалуйста!

с- номер текущего (обрабатываемого) слова в строке
Функция slovo возвращает пустую строку если запрашивается слово, которого нет (всего 5 слов, просится 4-тое)

Автор: Ellsa 10.01.2007 20:37

то есть наоборот....всего 4 слова и просится 5-ое?
а n-количество слов в строке получается?

Автор: Ellsa 10.01.2007 21:03

и еще....почему мы в самом начале процедуы ставим с и n равными 1....а не нулю...ведь мы не знаем сколько слов в строке.... unsure.gif

Автор: Malice 10.01.2007 21:03

Цитата(Ellsa @ 10.01.2007 16:37) *

то есть наоборот....всего 4 слова и просится 5-ое?

Да, да, попутал..
Цитата

а n-количество слов в строке получается?

нет, н - номер запрашиваемого слова.
Цитата

и еще....почему мы в самом начале процедуы ставим с и n равными 1....а не нулю...ведь мы не знаем сколько слов в строке....

Алгоритм такой smile.gif Если слов будет 0, то функция вернет пустую строку.

Автор: Ellsa 10.01.2007 21:55

то есть эта функция разделяет строку на слова...никуда их не записывая.....
а в циклах

while slovo (s1, n1) <> ' ' do inc (n1);
while slovo (s2, n2) <> ' ' do inc (n2);

не должно быть пробела...я вот понимаю наверно почему не должно быть пробела там....потому что у нас в функции изначально результат задан пробелом....но я не понимаю....символ '' это что за символ такой будет?ТО есть цикл должен идти пока результат не станет никаким...то есть пока слова не закончатся...чо-то я запуталась....
если писать пробел-прога не работает...это потому что в начале функции пробел-значение результата функции....
а цикл надо выполнить пока результат функции не закончится....
можно это написать как-то по-другому?
не просто ''....
я не понимаю что такое символ ''....

Автор: volvo 10.01.2007 21:59

Цитата
я не понимаю что такое символ ''....
Это - пустая строка... Просто пустая. Нулевой длины... (пробел - это строка длины 1, кстати)

Автор: Malice 10.01.2007 21:59

Функция возвращает строку, а не символ, а строка может быть пустой.
Т.е. ''-пустая строка.
По другому:

while length(slovo (s1, n1))>0 do 

Циклы эти считают колво слов в строке.

Автор: Ellsa 10.01.2007 22:07

volvo
Malice



СПАСИБО ВАМ БОЛЬШОЕ ЗА ПОМОЩЬ.Я ТЕПЕРЬ ВСЕ ПОНЯЛА.СПАСИБО! give_rose.gif