IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Строка из одинаковых слов
18192123
сообщение 5.01.2007 18:45
Сообщение #1


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


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

Правильно ли я понимаю : сначала мне нужно разбить обе строки на слова, а потом их сравнивать? А вот каким способом?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.01.2007 18:50
Сообщение #2


Гость






Достаточно разбить на слова одну строку, а потом просто проверять через Pos (ну, или BMSearch есть уже реализованный, если тебе нельзя пользоваться встроенными функциями Паскаля), присутствует или нет каждое слово во второй строке... Если присутствует - добавить в строку-результат...
 К началу страницы 
+ Ответить 
Bokul
сообщение 5.01.2007 18:51
Сообщение #3


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


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

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


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 5.01.2007 19:28
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


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

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

А если мне нельзя этого использовать, только length, тогда как мне проверить?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Bokul
сообщение 5.01.2007 19:35
Сообщение #5


Гуру
*****

Группа: Пользователи
Сообщений: 1 117
Пол: Мужской
Реальное имя: Богдан

Репутация: -  11  +


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


--------------------
Лао-Цзы :
Знать много и не выставлять себя знающим есть нравственная высота. Знать мало и выставлять себя знающим есть болезнь. Только понимая эту болезнь, мы можем избавиться от нее.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 5.01.2007 19:50
Сообщение #6


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


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


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


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 5.01.2007 19:55
Сообщение #7


Гость






Я уже 5 раз показывал, КАК именно это делается - в 3 строках кода... Еще раз привести? Поиск что, уже можно отменять? dry.gif
 К началу страницы 
+ Ответить 
18192123
сообщение 5.01.2007 19:55
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


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

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

Не, свой аналог я могу написать (пока не знаю, как..), но там нельзя использовать стандартные процедуры Паскаль, кроме length.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
klem4
сообщение 5.01.2007 20:19
Сообщение #9


Perl. Just code it!
******

Группа: Модераторы
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


Цитата
Я уже 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;


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 6.01.2007 12:23
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


у меня получилось разбить на слова первую строку, больше ничего не могу сделать...
не пойму, как сравнить со второй...( даже с использованием функции 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;




Сообщение отредактировано: 18192123 - 6.01.2007 12:24
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
arhimag
сообщение 6.01.2007 13:06
Сообщение #11


Знаток
****

Группа: Пользователи
Сообщений: 424
Пол: Мужской

Репутация: -  2  +


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


--------------------
Чего хочет женщина – того хочет Бог
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 6.01.2007 17:26
Сообщение #12


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


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

for i:=1 to n1 do 
for j:=1 to n2 do
if Slovo (s1,i)=slovo(s2,j) then ..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 6.01.2007 18:36
Сообщение #13


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


Цитата(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;



 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 6.01.2007 18:47
Сообщение #14


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


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

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


Сообщение отредактировано: Malice - 6.01.2007 18:48
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 6.01.2007 20:09
Сообщение #15


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


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


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.


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 6.01.2007 20:14
Сообщение #16


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


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

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

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



В этих циклах в кавычках не должно быть пробела.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
18192123
сообщение 6.01.2007 20:32
Сообщение #17


Профи
****

Группа: Пользователи
Сообщений: 920
Пол: Женский
Реальное имя: Марина

Репутация: -  2  +


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

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

Спасибо! Теперь всё хорошо!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Ellsa
сообщение 10.01.2007 16:25
Сообщение #18


lehf
**

Группа: Пользователи
Сообщений: 115
Пол: Женский

Репутация: -  4  +


а может кто-нибудь сказать,что такое c и почему не должно быть в кавычках пробела....просто у меня очень похожая задача...но я не могу понять....что такое c? unsure.gif Помогите,пожалуйста!
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Malice
сообщение 10.01.2007 16:34
Сообщение #19


Профи
****

Группа: Пользователи
Сообщений: 705
Пол: Мужской

Репутация: -  20  +


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

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

с- номер текущего (обрабатываемого) слова в строке
Функция slovo возвращает пустую строку если запрашивается слово, которого нет (всего 5 слов, просится 4-тое)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Ellsa
сообщение 10.01.2007 16:37
Сообщение #20


lehf
**

Группа: Пользователи
Сообщений: 115
Пол: Женский

Репутация: -  4  +


то есть наоборот....всего 4 слова и просится 5-ое?
а n-количество слов в строке получается?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

2 страниц V  1 2 >
 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 19.04.2024 2:06
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"