Падежи: день, дня, дней - Free Pascal
Формулировка задачи:
день
", которое должно стоять в нужном падеже. Т. е., например, 1день
, 102дня
, 227дней
. Мне в голову пришел такой метод: берем число лет, преобразуем в строку, "смотрим" последнюю цифру. Если она равна 1, то пишем слово "день
" и т. д. В силу ничтожных знаний в программировании и испорченности мозга беспробудной гуманитарностью, получился вот такой код. Т. к. это мне нужно частенько, то хочу использовать его в качестве процедуры.program proba; uses crt,math; var i,a:integer; s,day:string; key:char; begin randomize; repeat clrscr; i:=random(15); if (1=11) or (i=12) or (i=13) or (i=14) then day:=' дней' else begin str(i,s); a:=length(s); s:=copy(s,a,1); val(s,a); case a of 1 : day:=' день'; 2,3,4 : day:=' дня'; else day:=' дней'; end; end; writeln(i,day); writeln('Для выхода - Esc'); key:=readkey; until key=chr(27); end.
Решение задачи: «Падежи: день, дня, дней»
type TGrammarNumber = (gnSingle, gnDual, gnPlural); function GrNum(n: Integer): TGrammarNumber; begin case n mod 100 of 11..19: GrNum:=gnPlural; else case n mod 10 of 1: GrNum:=gnSingle; 2..4: GrNum:=gnDual; else GrNum:=gnPlural; end; end; end; const sDays: array [TGrammarNumber] of String[15] = ('день','дня','дней'); sRubs: array [TGrammarNumber] of String[15] = ('рубль','рубля','рублей'); ... WriteLn(n,' ',sDays[GrNum(n)],' ',r,' ',sRubs[GrNum(r)]);
Объяснение кода листинга программы
В данном коде определен тип TGrammarNumber, который является перечислением и содержит три значения: gnSingle (единственное число), gnDual (множественное число, близкое к единственному), gnPlural (множественное число).
Функция GrNum принимает целое число и возвращает значение TGrammarNumber, которое соответствует количеству дней или рублей в зависимости от числа. Например, для чисел от 11 до 19 она возвращает gnPlural, для чисел от 5 до 9 - gnDual, для остальных - gnSingle.
Определены константные массивы sDays и sRubs, которые содержат строки для дня (день, дня, дней) и рублей (рубль, рубля, рублей) соответственно.
В основной части кода происходит вывод строки, состоящей из числа, пробела, строки из массива sDays, пробела, числа и строки из массива sRubs.
Таким образом, код определяет грамматическое согласование для числительных день
и рубль
в зависимости от их количества.