Составить алгоритм работы программы - Free Pascal
Формулировка задачи:
program ToWords;
uses
IntToWord in 'IntToWord.pas';
var
F_in: Text;
line,S,Name:string;
Sum,R:longint;
Num:longint;
begin
Write('File name: ');
Readln(Name);
Assign(F_in,name);
Reset(F_in);
Num:=0;
Sum:=0;
While not eof(F_in) do
begin
Readln(F_in,R);
// Writeln(numToWords(R));//for debug
{$Q-}//disable integer overflow checking
Sum:=Sum+R;
{$Q+}//enable integer overflow checking
inc(Num);
end;
Close(F_in);
Writeln(Num);
Writeln(NumToWords(Sum));
Readln;
end.Решение задачи: «Составить алгоритм работы программы»
textual
Листинг программы
unit IntToWord;
interface
function numToWords(I:longint):String;
implementation
const F:array[1..2]of string = ('®¤**','¤ўҐ');
const L:array[0..19]of string = ('*®«м','®¤Ё*','¤ў*','ваЁ','зҐвлаҐ','Їпвм',
'иҐбвм','ᥬм','ў®бҐ¬м','¤Ґўпвм','¤Ґбпвм','®¤Ё***¤ж*вм','¤ўҐ**¤ж*вм',
'ваЁ**¤ж*вм','зҐвла**¤ж*вм','Їпв**¤ж*вм','иҐбв**¤ж*вм','ᥬ**¤ж*вм',
'ў®бҐ¬**¤ж*вм','¤Ґўпв**¤ж*вм');
const T:array[2..6]of string = ('¤ў*¤ж*вм','ваЁ¤ж*вм','б®а®Є','¤Ґбпв','¤Ґўп*®бв®');
const Hundr:array[1..5]of string = ('бв®','¤ўҐбвЁ','ваЁбв®','зҐвлаҐбв®','б®в');
const Greaters:array[0..8]of string = ('влбпз*','влбпзЁ','влбпзм','¬Ё««Ё®*','¬Ё««Ё®**','¬Ё««Ё®*®ў','¬Ё««Ё*а¤','¬Ё««Ё*а¤*','¬Ё««Ё*मў');
function HundreedsToWords(I:integer;fe:boolean):String;
var
units,tens,hundreds:byte;
S:String;
begin
S:='';
if i=0 then
begin
HundreedsToWords:='';
exit;
end;
if i<20 then
S:=L[i]+' '
else
begin
hundreds:=i div 100;
tens:=i mod 100 div 10;
units:=i mod 10;
case hundreds of
0:;
1..4:S:=Hundr[hundreds]+' ';
else S:=L[hundreds]+Hundr[5]+' ';
end;
case tens of
0..1:if i mod 100 <>0 then
S:=S+L[i mod 100]+' ';
2..4:S:=S+T[tens]+' ';
5..8:S:=S+L[tens]+T[5]+' ';
9: S:=S+T[6]+' ';
end;
if i mod 100>19 then
if units>0 then
begin
if (fe)and(units<3) then
S:=S+F[units]+' '
else
S:=S+L[units]+' ';
end;
end;
if S<>'' then
delete(S,length(S),1);
HundreedsToWords:=S;
end;
function numToWords(I:longint):String;
var
h,j:longint;
sign:Boolean;
S:String;
begin
if i=0 then
begin
numToWords:=L[0];
exit;
end;
S:='';
sign:=I<0;
I:=Abs(i);
j:=0;
while I<>0 do
begin
h:=i mod 1000;
i:=i div 1000;
case j of
0:;//¤® влбпзЁ
1:if h mod 100 in [5..19] then
S:=' '+Greaters[2]+S
else
case h mod 10 of
0:;
1: S:=' '+Greaters[0]+S;
2..4:S:=' '+Greaters[1]+S;
else S:=' '+Greaters[2]+S;
end;//¤® ¬Ё««Ё®**
2:if h mod 100 in [5..19] then
S:=' '+Greaters[5]+S
else
case h mod 10 of
0:;
1: S:=' '+Greaters[3]+S;
2..4:S:=' '+Greaters[4]+S;
else S:=' '+Greaters[5]+S;
end;//¤® ¬Ё««Ё*а¤*
3:if h mod 100 in [5..19] then
S:=' '+Greaters[8]+S
else
case h mod 10 of
0:;
1: S:=' '+Greaters[6]+S;
2..4:S:=' '+Greaters[7]+S;
else S:=' '+Greaters[8]+S;
end;//>= ¬Ё««Ёа¤*
end;
if j>0 then
begin
if h<>1 then
S:=' '+HundreedsToWords(h,j=1) + S;
end
else
S:=' '+HundreedsToWords(h,false);
inc(j);
end;
delete(S,1,1);
if sign then
S:='¬Ё*гб '+S;
numToWords:=S;
end;
end.mToWords:=S;
end;
end.
Объяснение кода листинга программы
В данном коде реализована функция numToWords, которая преобразует числовое значение в словесное представление. Для этого используются несколько вспомогательных функций и массивов.
- Массив F содержит названия для чисел от 1 до 99, а также для чисел, кратных 100, 1000 и т.д.
- Массив L содержит названия для чисел от 100 до 199, от 200 до 299 и т.д.
- Массив T содержит названия для чисел, оканчивающихся на 0, 10, 20 и т.д.
- Массив Hundr содержит названия для чисел, оканчивающихся на 0, 10, 20, 30 и т.д.
- Массив Greaters содержит названия для чисел, оканчивающихся на 0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130, 140, 150, 160, 170, 180, 190, 200, 210, 220, 230, 240, 250, 260, 270, 280, 290, 300, 310, 320, 330, 340, 350, 360, 370, 380, 390, 400, 410, 420, 430, 440, 450, 460, 470, 480, 490, 500, 510, 520, 530, 540, 550, 560, 570, 580, 590, 600, 610, 620, 630, 640, 650, 660, 670, 680, 690, 700, 710, 720, 730, 740, 750, 760, 770, 780, 790, 800, 810, 820, 830, 840, 850, 860, 870, 880, 890, 900, 910, 920, 930, 940, 950, 960, 970, 980, 990.
- Функция HundreedsToWords преобразует числа от 1 до 999 в словесное представление. Она использует массивы L, T и Greaters, а также вспомогательные переменные для обработки чисел от 1000 до 9999.
- Функция numToWords преобразует числовое значение в словесное представление. Она использует функцию HundreedsToWords и массивы L, T и Greaters для обработки чисел от 1 до 9999. Если число отрицательное, то перед результатом выводится
*¬Ё*гб.