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

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

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

 
 Ответить  Открыть новую тему 
> Строки, слова в предложениях
сообщение
Сообщение #1


Бывалый
***

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

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


нужно найти самое короткое слово в первом предложении, которого нет во втором предложении.
а также в обоих предложениях удалить символ # и удвоить символ +.

подскажите хотя бы,с чего начать.


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Ищущий истину
******

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

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


Пусть 1 предложение - первая строка , а вторая строка - второе предложение.
Начни с того, что разбей строки на слова.
Как это сделать - возьми любой алгоритм отсюда или FAQ разбиение на слова
Если не нравяться те алгоритмы, можешь взять мою программу - Разбиение на слова

Далее, имея масив (или список) слов, работаешь с ними.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Бывалый
***

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

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


а вот по второй части задания.
попробовала сделать так:

Код
var
   i,k:integer;
begin
   for i:=0 to length(p1) do
     begin
     k:=pos('#',p1);
     delete(p1,k,1);
     k:=pos('+',p1);
     insert('+',p1,k+1);
     end;
   for i:=0 to length(p2) do
     begin
     k:=pos('#',p2);
     delete(p2,k,1);
     k:=pos('+',p2);
     insert('+',p2,k+1);
     end;


символ # удаляется, а вот + становится просто много=)


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


code warrior
****

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

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



//убирает #
procedure RemoveSharp (var S: string);
var i, len: integer;
begin
i:=1;
len:=Length(S);
while i <= len do begin
if S[i] = '#' then begin
delete(S, i, 1);
dec(len);
end;
inc(i);
end;
end;

// удваивает +
procedure DuplicatePlus(var S: string);
var i, Len: ineger;
begin
i:=1;
len:=Length(S);
while i <= len do begin
if S[i] = '+' then begin
insert('+', S, i);
inc(i);
inc(len);
end;
inc(i);
end;
end;


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


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

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

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


Дык можно короче ...

while pos('#', s) <> 0 do delete(s, pos('#', s), 1);


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


code warrior
****

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

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


Я,знаю, но Pos будет много раз просматривать строку, а я за 1 проход убиваю все '#' - мы ведь не что-то вроде substr ищем.


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Бывалый
***

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

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


объясните,пожалуйста,в чем проблема
Код
const
   lim=[#0..#32,'.',',',':',';','!','?','"','+'];
type
   Twords=array[1..40] of string;
   zel=set of byte;
var
   z:zel;
   i,n1,n2,min,d,k:byte;
   w1,w2:Twords;
   function GWords(p:string;var w:Twords):byte;
   var
      i,b,n:byte;
   begin
      i:=1;
      n:=0;
      while (i<=length(p)) do begin
        while (i<=length(p)) and (p[i] in lim) do
         inc(i);{+1}
        if i<=length(p) then begin
           b:=i;
           while (i<=length(p)) and not(p[i] in lim) do
            inc(i);
           inc(n);
           w[n]:=copy(p,b,i-b);
        end;
      end;
      GWords:=n;
   end;
begin
   n1:=GWords(p1,w1);
   n2:=GWords(p2,w2);
   repeat
   min:=length(w1[1]);
   for i:=1 to n1 do
   if length(w1[i])<min then begin
                        min:=length(w1[i]);
                        k:=i;
                        end;
   for i:=1 to n2 do
   d:=pos(w1[k],w2[i])
   until not(d in z);
   Label4.Caption:=w1[k];


end;


в некоторых случаях она даже работает=)


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


code warrior
****

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

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


Вероятно программа разбивает на слова строки p1 и p2 а потом находит самое короткое слово из p1.

А вообще-то написан откровенный бред.


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Бывалый
***

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

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


Цитата(hardcase @ 27.03.2006 22:24) *

Вероятно программа разбивает на слова строки p1 и p2 а потом находит самое короткое слово из p1.

А вообще-то написан откровенный бред.

ну предложите,пожалуйста,свой вариант решения данной проблемы,если не трудно


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


code warrior
****

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

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


Воробще-то нужно для начала написать, что за задание или, то, что вы ожидаете от программы - ТАКОЙ код никто смотреть просто не станет.


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Бывалый
***

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

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


задание в самом начале темы.
мне нужно найти в первом предложении самое короткое слово,которого нет во втором.


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Бывалый
***

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

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


еще вот такой недоработанный вариант выделения искомого слова
Код
begin
   n1:=GWords(p1,w1);
   n2:=GWords(p2,w2);
   m:=0;
   min:=length(w1[1]);
   while i<=n1 do begin
   if length(w1[i])<min then begin
                        min:=length(w1[i]);
                        inc(m);
                        w3[m]:=w1[i];
                        end;
   if m=0 then begin
          inc(m);
          w3[m]:=w1[1];
          end;
   end;
   while i<=n2 do begin
    while j<=m do begin
     if w3[j]<>w2[i] then writeln(w3[j]);
     inc(j);
    end;
    inc(i);
   end;

end;


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Бывалый
***

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

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


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


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


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

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

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


Проверяй ...

uses crt;
type

TWords = array[1..40] of string;

function GetWords(s : string; var w : TWords) : byte;
const

limits = [#0..#32,'.',',',':',';','!','?','"'];
var
i,back,n : byte;
begin
i := 1;
n := 0;
while(i<=length(s)) do begin
while(i<=length(s)) and (s[i] in limits) do
inc(i);
if i<=length(s) then begin
back := i;
while(i<=length(s)) and not(s[i] in limits) do
inc(i);
inc(n);
w[n] := copy(s, back, i-back);
end;
end;

GetWords := n;
end;

function Find(w1, w2 : TWords; n1, n2 : byte) : string;
var
i, j, k, nmin : byte;
begin
// удаляем из первого массива слова, которые есть во втором
i := 1;
while (i <= n1) do begin
j := 1;
while (j <= n2) and (w1[i] <> w2[j]) do inc(j);
if j <= n2 then begin
for k := i to pred(n1) do w1[k] := w1[succ(k)];
dec(n1);
end
else inc(i);
end;

nmin := 0;

if n1 > 0 then begin
nmin := 1;
for i := 2 to n1 do
if w1[i] < w1[nmin] then nmin := i;
end;

if nmin > 0 then Find := w1[nmin] else Find := '';

end;

var

s1, s2 : string;
w1, w2 : TWords;
n1, n2 : byte;

begin

clrscr;

s1 := 'I love pascal, but hate fortran.';
s2 := 'I love pascal, and hate fortran too.';

n1 := GetWords(s1, w1);
n2 := GetWords(s2, w2);

writeln(Find(w1, w2, n1, n2));

readln;

end.


Сообщение отредактировано: volvo -


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


Бывалый
***

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

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


спасибо большое.
а если слов минимальной длины несколько?

я попробовала выводить слова минимальной длины,но выводится только последнее.
в чем ошибка? unsure.gif

Код
i:=1;
while (i<=n1) do begin
   if length(w1[i])=nmin then writeln(w1[i]);
   inc(i);
end;


Сообщение отредактировано: Tribunal -


--------------------
irreparabilium felix olivio rerum
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


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

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

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


if n1 > 0 then begin
nmin := 1;
for i := 2 to n1 do
if w1[i] < w1[nmin] then begin
nmin := i;
writeln(w1[nmin]); { <---- }
end;
end;


вот так.

Сообщение отредактировано: volvo -


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

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

 





- Текстовая версия 28.03.2024 20:36
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name