[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]

No.27633 Reply
File: expert-sibir_209_061_1.jpg
Jpg, 21.73 KB, 220×281 - Click the image to expand
edit Find source with google Find source with iqdb
expert-sibir_209_061_1.jpg
Очень нужна была функция разделения строки на слова, и я нашел ее в учебнике "Паскаль для математиков". Только при запуске возникает ошибка "индекс за пределами массива". Вот код:


Var
s : String;   {строка}
w : String;  {слово}
j : Byte;
Const
Letters : Set Of Char = ['а'..'п','р'..'я','А'..'Я']; {буквы языка }
Begin
Write('Введите текст ');  ReadLn(s);
j:=1;
While j<=Length(s) Do {последовательно проверяем все симвлы}
    If s[j] In Letters Then Begin  {встретили букву}                w:=‘’;  {начинаем формировать слово}
        While (s[j] In Letters)And(j<=Length(s)) Do Begin
            w:=w+s[j]; Inc(j); End;
{слово сформировано, теперь либо s[j] - не буква, либо строка закончилась}
        WriteLn(w);
    End
    Else Inc(j); {пропускаем “пробел”}
End.
  

В чем может быть ошибка? На первый взгляд все очень правильно.
>> No.27635 Reply
>>27633
> Обратите внимание, что во внутреннем цикле условия s[j] In Letters недостаточно, если последний символ строки - буква, поэтому необходимо продублировать условие выполнения внешнего цикла j<=Length(s) и во внутреннем цикле.
Заменил все нестрогие снаки неравенства на строгие, и все заработало. Что за хуйня? Тем более что судя по коду, нестрогий знак неравенства нужен для обработки последнего символа массива, но вроде бы все работает и так. Хотя возможно, что при каких-нибудь крайних данных программа будет крашиться.
>> No.27774 Reply
>>27633
unword же
var s:string;
i,j:integer;
const Letters = ['а'..'Я']
begin
readln(s);
i:=0;
while i<strlen(s) do begin
inc(i);
if not s[i] in letters then continue;
j:=i;
while s[j] in letters do inc j;
writeln (substr(s,i,j));
i:=j;
end;
end.


Password:

[ /tv/ /rf/ /vg/ /a/ /b/ /u/ /bo/ /fur/ /to/ /dt/ /cp/ /oe/ /bg/ /ve/ /r/ /mad/ /d/ /mu/ /cr/ /di/ /sw/ /hr/ /wh/ /lor/ /s/ /hau/ /slow/ /gf/ /vn/ /w/ /ma/ /azu/ /wn/ ] [ Main | Settings | Bookmarks | Music Player ]