singlepost

Pascal (задача про строковые процедуры и функции 2) << На главную или назад  

Выявить во введённом тексте слова. напечатать и подсчитать те из них, которые начинаются с заданной приставки. Значение приставки вводить с клавиатуры. Слова в предложении отделяются пробелом.
Код проги:

Program vubor_slov;
uses crt;
Var st1,sl,sl2,sl3:string[200]; pr:string[100];
k,i:integer;
Begin
clrscr;
textcolor(10);
writeln('­ введите несколько слов');
readln(st1); writeln;
textcolor(11);
writeln('­ введите приставку');
readln(pr);writeln;
sl2:=' ';
for i:=1 to length(st1) do
if st1[length(st1)]<>' ' then insert(sl2,st1,length(st1)+1);
for i:=1 to length(st1) do
if copy(st1,i,length(pr))=pr then begin
k:=pos(' ',st1);
sl:=copy(st1,i,k);
sl3:=copy(st1,i,length(sl));
textcolor(14);
writeln('подходящие слова ',sl3)
end;
readln
End.

Проблема в том, что прога некорректно работает если приставка встречается в середине слова.
Как сделать так, чтоб приставка проверялась только вначале слова?

106 ответов в теме “Pascal (задача про строковые процедуры и функции 2)”

  1. 17
    Сергей Владимирович ответил:

    ааа, вот оно что)

  2. 16
    Антон Щиров ответил:

    А в хелпе почитать?
    в LPos хранится индекс первого пробельного символа

  3. 15
    Сергей Владимирович ответил:

    возвращает "Lpos" значение "1" в пробеле.
    так?

  4. 14
    Сергей Владимирович ответил:

    а "Lpos" за что отвечает?

  5. 13
    Антон Щиров ответил:

    LPos := Pos(' ', LWords);
    Угадай с трех раз

  6. 12
    Антон Щиров ответил:

    Проверяет найден ли в слове пробел.

    Вообще говоря правильнее заменить на конструкцию
    repeat
    …….
    until LPos = 0
    но я привык работать с while

  7. 11
    Сергей Владимирович ответил:

    А что делает
    LRes := '';
    __LPos := 1;
    __while LPos <> 0 do begin

  8. 10
    Сергей Владимирович ответил:

    Работает! УРА! Спасибо!
    Блин как долго я мучался с этой задачкой…
    Спасибо Антон!

  9. 9
    Антон Щиров ответил:

    Как не работает?
    Входные данные и полученные результаты в студию

  10. 8
    Антон Щиров ответил:

    Да, правильно. Вместо
    Delete(LWords, 1, LPos);
    нужно
    Delete(LWords, 1, LPos – 1);

  11. 7
    Сергей Владимирович ответил:

    не работает….

  12. 6
    Антон Щиров ответил:

    var
    __LPrefix, LWords, LRes: String;
    __LPos, LLen: Integer;
    begin
    __writeln('enter some words: ');
    __readln(LWords);
    __writeln('enter prefix: ');
    __readln(LPrefix);
    __LWords := ' ' + LWords + ' ';
    __LRes := '';
    __LPos := 1;
    __while LPos <> 0 do begin
    ____LLen := Length(LWords);
    ____while (LPos <= LLen) and (LWords[LPos] = ' ') do
    ______Inc(LPos);
    ____if LPos <= LLen then begin
    ______Delete(LWords, 1, LPos);
    ______LPos := Pos(' ', LWords);
    ______if Pos(LPrefix, LWords) = 1 then
    ________LRes := LRes + Copy(LWords, 1, LPos – 1) + ' ';
    ____end else
    ______LPos := 0;
    __end;
    __writeln('matching words: ', LRes);
    end

  13. 5
    Сергей Владимирович ответил:

    блин, так и не получается до сих пор(

  14. 4
    Сергей Владимирович ответил:

    тогда вообще слов не находти(

  15. 3
    Сергей Старовой ответил:

    sl:=sl+copy(st1,i,k-i+1);

  16. 2
    Сергей Владимирович ответил:

    чё-то всё равно нето(
    во-первых последнее слово выводитдва раза
    во-вторых прога не работает с длинными словами
    пример
    yyyyyyyyyfgjhgfjh dyhdtfghtrh yyyyyyyyyyyyfhgfh
    yyy

  17. 1
    Сергей Старовой ответил:

    Она некорректно работала не только в средине слова )
    Program vubor_slov;
    Var st1,sl:string[200]; pr:string[100];
    k,i:integer;
    Begin
    writeln('enter some words: ');
    readln(st1);
    writeln;
    writeln('enter prefix: ');
    readln(pr);
    writeln;
    if st1[length(st1)] <> ' ' then st1:=st1+' ';
    sl:='';
    i:=1;
    while i <= length(st1) do begin
    if ((i=1) or (st1[i-1]=' ')) and (copy(st1,i,length(pr))=pr) then begin
    k:=pos(' ',st1);
    sl:=sl+copy(st1,i,k);
    delete(st1, 1, k);
    i:=1;
    end else inc(i);
    end;
    writeln('matching words: ', sl);
    readln
    End.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.