Пользователь
Регистрация: 21.02.2017
Сообщений: 29
|
Вывести весь текст словами в виде количественного числительного - Pascal
Задано некоторое натуральное число k. Требуется вывести весь текст словами в виде количественного числительного, которое означает заданное число в соответствии с требуемым падежом (числа от 1 до 99 , падеж задаётся цифрой)
Помогите сделать так, что бы число и падеж читались из файла, а результат выводился в этот же файл и в самой программе.
Код:
const
TewTwenty : set of Byte = [2, 5];
Ones : array [1..9, 1..6] of string = (('один', 'одного', 'одному', 'один', 'одним', 'одном'),
('два', 'двух', 'двум', 'два', 'двумя', 'двух'),
('три', 'трёх', 'трём', 'три', 'тремя', 'трёх'),
('четыре', 'четырёх', 'четырём', 'четыре', 'четырьмя', 'четырёх'),
('пять', 'пяти', 'пяти', 'пятью', 'пятью', 'пяти'),
('шесть', 'шести', 'шести', 'шести', 'шестью', 'шести'),
('семь', 'семи', 'семи', 'семь', 'семью', 'семи'),
('восемь', 'восьми', 'восьми', 'восьми', 'восемью', 'восьми'),
('девять', 'девяти', 'девяти', 'девять', 'девятью', 'девяти '));
BetWeen10And19 : array [1..10, 1..6] of string = (('десять', 'десяти', 'десяти', 'десять', 'десятью', 'десяти'),
('одиннадцать', 'одиннадцати', 'одиннадцати', 'одиннадцать', 'одиннадцатью', 'одиннадцати'),
('двенадцать', 'двенадцати', 'двенадцати', 'двенадцать', 'двенадцатью', 'двенадцати'),
('тринадцать', 'тринадцати', 'тринадцати', 'тринадцать', 'тринадцатью', 'тринадцати'),
('четырнадцать', 'четырнадцати', 'четырнадцати', 'четырнадцать', 'четырнадцатью', 'четырнадцати'),
('пятнадцать', 'пятнадцати', 'пятнадцати', 'пятнадцать', 'пятнадцатью', 'пятнадцати'),
('шестнадцать', 'шестнадцати', 'шестнадцати', 'шестнадцать', 'шестнадцатью', 'шестнадцати'),
('семнадцать','семнадцати', 'семнадцати', 'семнадцать', 'семнадцатью', 'семнадцати'),
('восемнадцать','восемнадцати','восемнадцати','восемнадцать','восемнадцатью','восемнадцати'),
('девятнадцать', 'девятнадцати', 'девятнадцати', 'девятнадцать', 'девятнадцатью', 'девятнадцати'));
Tens : array [1..8, 1..6] of string = (('двадцать', 'двадцати', 'двадцати', 'двадцать', 'двадцатью', 'двадцати'),
('тридцать', 'тридцати', 'тридцати', 'тридцать', 'тридцатью', 'тридцати'),
('сорок', 'сорока', 'сорока', 'сорок', 'сорока', 'сорока'),
('пятьдесят', 'пятидесяти', 'пятидесяти', 'пятьдесят', 'пятьюдесятью', 'пятидесяти'),
('шестьдесят', 'семидесяти', 'семидесяти', 'семьдесят', 'семьюдесятью', 'семидесяти '),
('семьдесят', 'семидесяти', 'семидесяти', 'семьдесят', 'семьюдесятью', 'семидесяти'),
('восемьдесят', 'восьмидесяти', 'восьмидесяти', 'восемьдесят', 'восемьюдесятью', 'восьмидесяти'),
('девяносто', 'девяноста', 'девяноста', 'девяносто', 'девяносто', 'девяноста'));
type
TDigits = array [1..100] of Byte;
function PrintPst (const num, position, pad : Integer) : string;
begin
case position of
1 : PrintPst := Ones[num, pad];
2 : PrintPst := Tens[num-1, pad];
end
end;
procedure GetDigits (const s : string; var digits : TDigits; var n : Integer);
var
i : Integer;
begin
n := Length(s);
for i := 1 to n do
digits[i] := Ord(s[i]) - 48
end;
procedure PrintDigits (const num, NextNum, position, pad : Integer; var flag : Boolean; f:text; s:string);
begin
if num = 0 then
Exit;
if (position in TewTwenty) and (num*10 + NextNum >= 10)
and (num*10 + NextNum <= 19) then begin
Write (f,Between10And19[NextNum+1, pad],s);
flag := FALSE;
if position <> 2 then
Write (f,PrintPst(num, position, pad), ' ',s);
Write (PrintPst(num, position, pad), ' ')
end
else begin
flag := TRUE;
Write (f,PrintPst (num, position, pad), ' ',s);
Write (PrintPst(num, position, pad), ' ')
end
end;
var
s : string;
digits : TDigits;
i, n, pad : Integer;
flag : Boolean;
f :text;
begin
Assign(f,'File.txt');
Rewrite(f);
writeln('Введите число и падеж = ');
ReadLn (s);
GetDigits (s, digits, n);
ReadLn (pad);
flag := TRUE;
digits[n+1] := 0;
for i := 1 to n do
if flag then
PrintDigits (digits[i], digits[i+1], n-i+1, pad, flag,f,s);
Close(f);
end.
|