Падежи: день, дня, дней - 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.
Убедительная просьба подсказать - возможно это все реализуется гораздо проще и изящнее? Очень хотелось бы увидеть подсказки и критику (конструктивную). А, может, вообще это все делается гораздо проще.

Решение задачи: «Падежи: день, дня, дней»

textual
Листинг программы
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. Таким образом, код определяет грамматическое согласование для числительных день и рубль в зависимости от их количества.

Оцени полезность:

9   голосов , оценка 4 из 5
Похожие ответы