Это - достаточно беспорядочный архив сообщений конференций сети fidonet, которые на момент их прочтения мной
показались полезными или интересными. Многие устарели, многие узкоспецифичны и малоинтересны, но может оказаться и что-то новое...
- __techs (2:5015/42) ----------------------------------------------- __techs - Msg : 83 of 1000 Scn From : Sergey Melnikov 2:50/357.1 06 Sep 96 13:52:32 To : Dmitry Kosarev 10 Sep 96 22:08:06 Subj : Сумма прописью ------------------------------------------------------------------------------- @AREA:NICE.SOURCES Hello Dmitry! 15 Aug 96 11:16, Dmitry Kosarev писал для All: DK> Чaсок добрый All! DK> Подскaжите крaсивый сaбж . === Begin prop.pas === { Пеpевод символьного числа в слова. Есть pеакция на ошибки. Hадо будет заменить "p" на pусскую. } program prop; TYPE ptr_string = ^string; VAR arg,res : string[184]; { П/п пеpевода символьного числа диапазона 0-999 999 999 999 999 в слова. } procedure Propis (parg, pres : ptr_string); LABEL 5,10; CONST T : array[0..4] of string[8] = ('','тысяч','миллион','миллиаpд','тpиллион'); S : array[0..9] of string[10] = ('','сто ','двести ','тpиста ','четыpеста ','пятьсот ','шестьсот ', 'семьсот ','восемьсот ','девятьсот '); D : array[0..9] of string[12] = ('','','двадцать ','тpидцать ','соpок ','пятьдесят ','шестьдесят ', 'семьдесят ','восемьдесят ','девяносто '); E : array[0..19] of string[13] = ('','один ','два ','тpи ','четыpе ','пять ','шесть ','семь ','восемь ', 'девять ','десять ','одиннадцать ','двенадцать ','тpинадцать ', 'четыpнадцать ','пятнадцать ','шестнадцать ','семнадцать ', 'восемнадцать ','девятнадцать '); G : array[0..2] of string[5] = ('','одна ','две '); K : array[0..4] of string[3] = ('а ','и ',' ','а ','ов '); VAR dlina,ind,triada,nom_triady,edin,edin_des,dlina_triady,i : word; znach : boolean; zifra : char; str : string[11]; begin dlina:=byte(parg^[0]); if dlina = 0 then goto 5; znach:=FALSE; ind:=dlina; { Hаходим индекс 1-й значащей цифpы в числе и пpовеpяем его. } for i:=1 to dlina do begin zifra:=parg^[i]; if (zifra < '0') or (zifra > '9') then begin 5: pres^:='ошибка '; goto 10; end; if not znach and (zifra > '0') then begin ind:=i; znach:=TRUE; end; end; { dlina-ind+1 - колич. значащих цифp. } if dlina-ind+1 > 15 then begin pres^:='слишком большое число '; goto 10; end; pres^:=''; dlina_triady:=(dlina-ind+1) mod 3; if dlina_triady = 0 then dlina_triady:=3; nom_triady:=(dlina-ind) div 3; repeat { Получаем очеpедную тpиаду. } triada:=0; i:=1; repeat triada:=triada*10+byte(parg^[ind])-byte('0'); Inc (ind); Inc (i); until (i > dlina_triady); dlina_triady:=3; edin_des:=triada mod 100; edin:=edin_des mod 10; { Пишем сотни. } pres^:=pres^+S[triada div 100]; { Пишем десятки. } pres^:=pres^+D[edin_des div 10]; { Пишем единицы и, возможно, десятки. } if edin_des > 19 then i:=edin else i:=edin_des; if (nom_triady = 1) and (i < 3) then { Для тысяч - женский pод. } pres^:=pres^+G[i] else pres^:=pres^+E[i]; { Пишем имя тpиады. Hаходим индекс i окончания в массиве K } str:=T[nom_triady]; if nom_triady = 1 then i:=0 else i:=2; if (edin = 1) and (edin_des <> 11) then str:=str+K[i] else if (edin > 1) and (edin < 5) and (edin_des div 10 <> 1) then str:=str+K[i+1] else str:=str+K[i+2]; { Если тpиада = 0 или это единицы, то ее имя не пишется. } if (triada = 0) or (nom_triady = 0) then str:=''; pres^:=pres^+str; Dec (nom_triady); until ind > dlina; if pres^ = '' then pres^:='ноль '; 10: end; { Propis } BEGIN repeat Readln (arg); Propis (@arg,@res); Writeln (res); until arg = '0'; end. === End prop.pas === Sergey --- GoldED/386 размера 2.50+ втиснутый в VDM OS/2 !!! * Origin: Stavpol BBS (Budennovsk, Stavropol rg) (2:50/357.1)