Консультация № 66929
14.12.2006, 11:18
0.00 руб.
0 5 2
Доброе время суток эксперты!
У меня опять проблема((( С клавиатуры вводится число (от нуля до миллиона). Необходимо записать это сумму словами огласно правилам русского языка. и проблема в том что мне наждо сделать это в console aplication(((я заню что есть даже функция но вот в консоли ничего незнаю((((

Заранее благодарен

Обсуждение

Неизвестный
14.12.2006, 11:43
общий
это ответ
Здравствуйте, Тесленко Максим Юревич!
В приложении ссылки на ряд примеров функции перевода. Работа с консолью хорошо описана тут http://www.gptelecom.ru/Articles/Console/index.htm

Приложение:
http://www.soft32.ru/delphi.shtml?topic=syntax&title=int_to_string и еще http://articles.org.ru/myfaq/10042003.php#anc18
Неизвестный
14.12.2006, 12:33
общий
это ответ
Здравствуйте, Тесленко Максим Юревич!

В приложении Вы увидете код рабочего консольного приложения, которое переводит число в его строковое представление...

Так как при выводе текста на кирилице в окно консоли, то необходимо сделать преобразование кодировок таким методом:
<code>
sn:= StrAlloc(Length(st) + 1);
AnsiToOem(Pchar(st),sn);
write(sn);
StrDispose(sn);
readln;
</code>

В программе используется функция <b>GetRepresentationInWords</b>, которая и делает преобразование числа в его строковое представление (функция была взята со старого доброго <a href=http://www.delphiworld.narod.ru/dw.html><font color=purple><b>DelphiWorld</b></font></a>).

Good Luck!!!


Приложение:
program Project1; {$APPTYPE CONSOLE} uses SysUtils, windows; const Mas1: array[‘0‘..‘9‘, 1..3] of string = ((‘‘, ‘‘, ‘‘), (‘сто ‘, ‘‘, ‘один ‘), (‘двести ‘, ‘двадцать ‘, ‘два ‘), (‘триста ‘, ‘тридцать ‘, ‘три ‘), (‘четыреста ‘, ‘сорок ‘, ‘четыре ‘), (‘пятьсот ‘, ‘пятьдесят ‘, ‘пять ‘), (‘шестьсот ‘, ‘шестьдесят ‘, ‘шесть ‘), (‘семьсот ‘, ‘семьдесят ‘, ‘семь ‘), (‘восемьсот ‘, ‘восемьдесят ‘, ‘восемь ‘), (‘девятьсот ‘, ‘девяносто ‘, ‘девять ‘)); Mas2: array[‘0‘..‘9‘] of string = (‘десять ‘, ‘одиннадцать ‘, ‘двенадцать ‘, ‘тринадцать ‘, ‘четырнадцать ‘, ‘пятнадцать ‘, ‘шестнадцать ‘, ‘семнадцать ‘, ‘восемнадцать ‘, ‘девятнадцать ‘); Mas3: array[‘1‘..‘2‘] of string = (‘одна ‘, ‘две ‘); Mas4: array[‘0‘..‘9‘, 1..4] of string = ((‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘), (‘‘, ‘тысяча ‘, ‘миллион ‘, ‘миллиард ‘), (‘‘, ‘тысячи ‘, ‘миллиона ‘, ‘миллиарда ‘), (‘‘, ‘тысячи ‘, ‘миллиона ‘, ‘миллиарда ‘), (‘‘, ‘тысячи ‘, ‘миллиона ‘, ‘миллиарда ‘), (‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘), (‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘), (‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘), (‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘), (‘‘, ‘тысяч ‘, ‘миллионов ‘, ‘миллиардов ‘)); function GetRepresentationInWords(S: string): string; var i: Byte; Str: PChar; begin Result := ‘‘; if S = ‘‘ then Exit; for i := 1 to Length(S) do if S[i] <> ‘0‘ then Break; if i = Length(S) + 1 then begin Result := ‘Ноль‘; Exit end; Str := @S[1]; while Length(S) mod 3 <> 0 do Insert(‘0‘, S, 1); for i := Length(S) div 3 downto 1 do begin if (Str[0] = ‘0‘) and (Str[1] = ‘0‘) and (Str[2] = ‘0‘) then begin Inc(Str, 3); Continue; end; Result := Result + Mas1[Str[0], 1]; if Str[1] = ‘1‘ then Result := Result + Mas2[Str[2]] + Mas4[‘0‘, i] else begin Result := Result + Mas1[Str[1], 2]; if (i = 2) and (Str[2] in [‘1‘..‘2‘]) then Result := Result + Mas3[Str[2]] else Result := Result + Mas1[Str[2], 3]; Result := Result + Mas4[Str[2], i]; end; Inc(Str, 3) end; SetLength(Result, Length(Result) - 1) end; {var i:integer;} var sn:PAnsiChar; st:string; begin st:=GetRepresentationInWords(‘13‘); sn:= StrAlloc(Length(st) + 1); AnsiToOem(Pchar(st),sn); write(sn); StrDispose(sn); readln; end.
Неизвестный
14.12.2006, 13:15
общий
<b>Gh0stik</b>, при вставке в приложение у вас тоже "полетела" кодировка. Я не знаю, что было у вас, так что даю тот вариант, который был у меня (чкачивал с инета, не проверял)<code> CONST MAX3 = 5; {Максимальное количество триад} A11: ARRAY[1..2] OF STRING[20] = (‘одна ‘, ‘две ‘); A1: ARRAY[0..19] OF STRING [20] = (‘‘, ‘один ‘, ‘два ‘,‘три ‘, ‘четыре ‘, ‘пять ‘, ‘шесть ‘, ‘семь ‘, ‘восемь ‘, ‘девять ‘, ‘десять ‘, ‘одиннадцать ‘, ‘двенадцать ‘, ‘тринадцать ‘, ‘четырнадцать ‘, ‘пятнадцать ‘, ‘шестнадцать ‘, ‘семнадцать ‘, ‘восемнадцать ‘, ‘девятнадцать ‘); A10: ARRAY[0..9] OF STRING [20] = (‘‘, ‘десять ‘, ‘двадцать ‘, ‘тридцать ‘, ‘сорок ‘, ‘пятьдесят ‘, ‘шестьдесят ‘, ‘семьдесят ‘, ‘восемьдесят ‘, ‘девяносто ‘); A100: ARRAY[0..9] OF STRING[20]= (‘‘, ‘сто ‘, ‘двести ‘, ‘триста ‘, ‘четыреста ‘, ‘пятьсот ‘, ‘шестьсот ‘, ‘семьсот ‘, ‘восемьсот ‘, ‘девятьсот ‘); {четвертым параметром является обозначение мужского или женского рода, где ‘0‘ - женский род; ‘1‘ - мужской род. Это дает возможность, например, изменяя "рубли" на "штуки" просто поменять ‘1‘ на ‘0‘ не меняя кода.} A0: ARRAY[0..MAX3-1, 0..3] OF STRING[20]= ((‘рубль‘, ‘рубля‘, ‘рублей‘, ‘1‘),(‘тысяча‘, ‘тысячи‘, ‘тысяч‘, ‘0‘), (‘миллион‘, ‘миллиона‘, ‘миллионов‘, ‘1‘), (‘миллиард‘, ‘миллиарда‘, ‘миллиардов‘, ‘1‘), (‘триллион‘, ‘триллиона‘, ‘триллионов‘, ‘1‘)); procedure TForm1.Edit1Change(Sender: TObject); VAR Value: LongInt; i100, i10, i1: Integer; V, p, n, i: Integer; begin TRY Value := StrToInt(Edit1.Text); Memo1.Clear; n := 0; {Обработка отрицательного значения и нуля} IF Value <0 THEN BEGIN Memo1.Lines.Add(‘минус‘); Value := -Value; END ELSE IF Value = 0 THEN Memo1.Lines.Add(‘ноль‘) ELSE Memo1.Lines.Add(‘‘); REPEAT {Разбивка на триады с конца} V := Value MOD 1000; Value := Value DIV 1000; {Обработка} IF (V > 0) OR (n = 0) THEN BEGIN i100 := V DIV 100; V := V-(i100*100); IF V >= 20 THEN BEGIN i1 := V MOD 10; V := V DIV 10; i10 := V MOD 10; END ELSE BEGIN i1 := V; i10 := 0; END; CASE i1 OF 1: p := 0; 2..4: p := 1; ELSE p := 2; END; {Изменение в зависимости от женского или мужского рода} IF (A0[n,3] = ‘0‘) AND ((i1 = 1) OR (i1 = 2)) THEN Memo1.Lines.Insert(1, A100[i100]+A10[i10]+A11[i1]+A0[n,p]) ELSE Memo1.Lines.Insert(1, A100[i100]+A10[i10]+A1[i1]+A0[n,p]); END; Inc(n); {Проверка выхода за максимальное количество триад} IF n > MAX3 THEN Exit; UNTIL Value <= 0; EXCEPT Memo1.Clear; Memo1.Lines.Add(‘Ошибка‘); END end;</code>Мой код, правда, нужно немного довести до ума, прежде чем получится решение требуемой задачи.Ну и AnsiToOEM, надо дописывать.
Неизвестный
14.12.2006, 14:06
общий
Спасибо за коментарий, уже исправил...Большое спасибо - <b>Сухомлин Кирилл Владимирович</b>!!!
Неизвестный
14.12.2006, 14:10
общий
2 <b>Сухомлин Кирилл Владимирович</b>....Совет....Замените в своем сообщении тэг <PRE> на <CODE>, будет намного читабельней!!!:о)
Форма ответа