Помощь - Поиск - Пользователи - Календарь
Полная версия: Строка из одинаковых слов
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
18192123
Даны две строки, состоящие из слов. Получить 3-ю строку, состоящую из слов, которые содержаться в обеих строках.

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

Как разбивать? Выбирай любой наиболее удобный для тебя.
18192123
Цитата(volvo @ 5.01.2007 18:50) *

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

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


Pos в чистом виде не пойдет smile.gif
Ведь слово из первой строки во второй может не присутсвовать отдельно, но являться частью дугого слова ... Хотя все это можно и с Pos обыграть при желании smile.gif
volvo
Я уже 5 раз показывал, КАК именно это делается - в 3 строках кода... Еще раз привести? Поиск что, уже можно отменять? dry.gif
18192123
Цитата(Bokul @ 5.01.2007 19:35) *

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

Не, свой аналог я могу написать (пока не знаю, как..), но там нельзя использовать стандартные процедуры Паскаль, кроме length.
klem4
Цитата
Я уже 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
у меня получилось разбить на слова первую строку, больше ничего не могу сделать...
не пойму, как сравнить со второй...( даже с использованием функции 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
Предложение :
Возьми и засунь слова в массив, дальше сделай тоже самое для второй строки а дальше просто пробегись по всему первому массиву проверяя есть ли такой же элемент во втором массиве
Malice
Предлагаю поменять твою функцию "Slovo" так, чтобы она возвращала i-тое слово из строки s, тогда все твои подобные задачи гораздо упростятся. В этой можно будет сдела перебор, типа:

for i:=1 to n1 do 
for j:=1 to n2 do
if Slovo (s1,i)=slovo(s2,j) then ..
18192123
Цитата(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
Нет, типа этого:

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
что здесь не так (программа не работает... )


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
Цитата(18192123 @ 6.01.2007 20:09) *

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

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



В этих циклах в кавычках не должно быть пробела.
18192123
Цитата(Malice @ 6.01.2007 20:14) *

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

Спасибо! Теперь всё хорошо!
Ellsa
а может кто-нибудь сказать,что такое c и почему не должно быть в кавычках пробела....просто у меня очень похожая задача...но я не могу понять....что такое c? unsure.gif Помогите,пожалуйста!
Malice
Цитата(Ellsa @ 10.01.2007 16:25) *

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

с- номер текущего (обрабатываемого) слова в строке
Функция slovo возвращает пустую строку если запрашивается слово, которого нет (всего 5 слов, просится 4-тое)
Ellsa
то есть наоборот....всего 4 слова и просится 5-ое?
а n-количество слов в строке получается?
Ellsa
и еще....почему мы в самом начале процедуы ставим с и n равными 1....а не нулю...ведь мы не знаем сколько слов в строке.... unsure.gif
Malice
Цитата(Ellsa @ 10.01.2007 16:37) *

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

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

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

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

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

Алгоритм такой smile.gif Если слов будет 0, то функция вернет пустую строку.
Ellsa
то есть эта функция разделяет строку на слова...никуда их не записывая.....
а в циклах
while slovo (s1, n1) <> ' ' do inc (n1);
while slovo (s2, n2) <> ' ' do inc (n2);

не должно быть пробела...я вот понимаю наверно почему не должно быть пробела там....потому что у нас в функции изначально результат задан пробелом....но я не понимаю....символ '' это что за символ такой будет?ТО есть цикл должен идти пока результат не станет никаким...то есть пока слова не закончатся...чо-то я запуталась....
если писать пробел-прога не работает...это потому что в начале функции пробел-значение результата функции....
а цикл надо выполнить пока результат функции не закончится....
можно это написать как-то по-другому?
не просто ''....
я не понимаю что такое символ ''....
volvo
Цитата
я не понимаю что такое символ ''....
Это - пустая строка... Просто пустая. Нулевой длины... (пробел - это строка длины 1, кстати)
Malice
Функция возвращает строку, а не символ, а строка может быть пустой.
Т.е. ''-пустая строка.
По другому:
while length(slovo (s1, n1))>0 do 

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



СПАСИБО ВАМ БОЛЬШОЕ ЗА ПОМОЩЬ.Я ТЕПЕРЬ ВСЕ ПОНЯЛА.СПАСИБО! give_rose.gif
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.