Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ Склонение существительных (строки)

Автор: -=BR@BUS=- 9.12.2006 0:39

Склонение существительных.
При склонении существительных мужского рода, оканчивающихся на -ок: кружок, масленок, брелок и т.д. буква о становится беглой гласной: кружка, масленком и т.д. Из этого правила есть исключения: 1) слова из трех букв: ток, сок и т.д.; 2) слова: скок ,блок, волок, восток, шток - и слова, основа которых оканчивается на такие сочетания бука: перескок, пищеблок, юго-восток и т.д.; 3) ряд слов-исключений, среди которых наиболее употребляемы следующие: брелок, щелок, войлок, челнок, зарок, срок, урок, знаток, поток, сток, артишок.
Из заданного текста выбрать слова на -ок и получить их в указанном падеже, падеж указывается соответствующей буквой в скобках непосредственно после слова.

Помогите... кто знает... хоть часть

Автор: klem4 10.12.2006 1:20

Вот, потестируй:

uses crt;

type

TWord = String;
TCase = (I, R, D, V, T, P);


function IsException(const word: TWord): Boolean;
const

n = 16;

exceptions: array [1..n] of TWord = (
'скок' ,'блок', 'волок', 'восток', 'шток',
'брелок', 'щелок', 'войлок', 'челнок', 'зарок', 'срок',
'урок', 'знаток', 'поток', 'сток', 'артишок'
);

var
i: Integer;

begin

i := 1;

while (i <= n) and (word <> exceptions[i]) and
not ((i <= 5) and (Copy(word, Length(word) - Length(exceptions[i]) + 1, 255)
= exceptions[i])) do inc(i);


IsException := not(i > n);

end;

function Convert(word: TWord; _case: TCase): TWord;
begin

if (Length(word) = 3) or IsException(word) then begin
case _case of
I: Convert := word;
R: Convert := word + 'а';
D: Convert := word + 'у';
V: Convert := word;
T: Convert := word + 'ом';
P: Convert := word + 'е';
end;
end
else case _case of
I: Convert := word;
R: Convert := Copy(word, 1, Length(word) - 2) + 'ка';
D: Convert := Copy(word, 1, Length(word) - 2) + 'ку';
V: Convert := word;
T: Convert := Copy(word, 1, Length(word) - 2) + 'ком';
P: Convert := Copy(word, 1, Length(word) - 2) + 'ке';
end;

end;

begin
clrscr;

writeln('Именительный: ',Convert('брелок', I));
writeln('Родительный: ', Convert('брелок', R));
writeln('Дательный: ', Convert('брелок', D));
writeln('Винительный: ', Convert('брелок', V));
writeln('Творительный: ', Convert('брелок', T));
writeln('Предложный: ', Convert('брелок', P));

writeln;

writeln('Именительный: ',Convert('мешок', I));
writeln('Родительный: ', Convert('мешок', R));
writeln('Дательный: ', Convert('мешок', D));
writeln('Винительный: ', Convert('мешок', V));
writeln('Творительный: ', Convert('мешок', T));
writeln('Предложный: ', Convert('мешок', P));

writeln;

writeln('Именительный: ',Convert('рок', I));
writeln('Родительный: ', Convert('рок', R));
writeln('Дательный: ', Convert('рок', D));
writeln('Винительный: ', Convert('рок', V));
writeln('Творительный: ', Convert('рок', T));
writeln('Предложный: ', Convert('рок', P));

readln;
end.



Автор: -=BR@BUS=- 17.12.2006 17:15

Тут нужно из введёного текста выбрать слово с окончаноем -ok и вывести это слово, вот у меня такая накидка


var
d,s:string;
q,c,i,p:byte;
begin
Writeln('Vvedite text');
Readln(s);
p:=pos('ok',s);
Writeln(p);
q:=0;
for i:=p downto length(' ') do
q:=q+1;
writeln(q);
c:=p-q;
d:=Copy(s,c,p-1);
writeln(d);
Readln;
end.


Но чего-то явно не хватает, подскажите... unsure.gif

Автор: -=BR@BUS=- 20.12.2006 2:24

Или может ещё какой-нибудь способ есть?

Автор: klem4 20.12.2006 3:09

http://forum.pascal.net.ru/index.php?showtopic=6972

разбиваешь строку на слова, находу или потом проходя по массиву слов (если возьмешь вариант с массивом), смотришь его последние 2 символа ...