Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.03.2008, 19:13   #1
gred
Пока ещё
Форумчанин
 
Аватар для gred
 
Регистрация: 26.02.2008
Сообщений: 116
По умолчанию Дано четырехзначное число, заданное в символьном виде, например, '1954'. Напечатать его текстом, например

Дано четырехзначное число, заданное в символьном виде, например, '1954'. Напечатать его текстом, например, 'тысяча девятьсот пятьдесят четыре'.
Заранее спасибо
Я мегапрограммер потерявший память.
Если кому помог, поставте '+' я буду благодарен
gred вне форума Ответить с цитированием
Старый 29.03.2008, 19:22   #2
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Решение в лоб:
1. Создаём массив с нужными словами.
2. Пользуясь циклом и оператором выбора case выводим результат.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...
Карась вне форума Ответить с цитированием
Старый 29.03.2008, 19:26   #3
gred
Пока ещё
Форумчанин
 
Аватар для gred
 
Регистрация: 26.02.2008
Сообщений: 116
По умолчанию

Цитата:
Сообщение от Карась Посмотреть сообщение
Решение в лоб:
1. Создаём массив с нужными словами.
Надо к кажному числу тысяча,две тысячи, три тысячи.... как его сортировать?
Можешь создать этот массив? Буду очень благодарен
Я мегапрограммер потерявший память.
Если кому помог, поставте '+' я буду благодарен
gred вне форума Ответить с цитированием
Старый 29.03.2008, 19:35   #4
SunKnight
Участник клуба Подтвердите свой е-майл
 
Аватар для SunKnight
 
Регистрация: 14.12.2007
Сообщений: 1,434
По умолчанию

A[1]:='тысяча';
A[2]:='две тысячи';
...........
A[10]:='десять тысячь'
A[11]:='сто';
A[12]:='двести';
..................
A[21]:='одинадцать';
...........................
A[29]:='девятнадцать';
A[30]:='двадцать';
A[31]:='тридцать';
.......................
A[42]:='один';
A[43]:='два';
................

только сформирой в нужном порядке
Проповедую design patterns, верую в MVC, доверяю eXtrime programming.
SunKnight вне форума Ответить с цитированием
Старый 30.03.2008, 13:45   #5
gred
Пока ещё
Форумчанин
 
Аватар для gred
 
Регистрация: 26.02.2008
Сообщений: 116
По умолчанию

Можете сортировку написать ,у меня пишет только первое значение
Я мегапрограммер потерявший память.
Если кому помог, поставте '+' я буду благодарен
gred вне форума Ответить с цитированием
Старый 30.03.2008, 14:52   #6
maLoy*508
Форумчанин
 
Аватар для maLoy*508
 
Регистрация: 28.03.2008
Сообщений: 672
По умолчанию

по-моему проще будет просто делить число нацело на 10(по-моему команада mod) остаток сравнивать с числом и писать его...
напр. 1954 делим на 10 получаем 195 и остаток 4, это остаток в переменную и сравниваем case' ом со значениями... потом 195 делим на 10 получаем 19 и 5 остаток и так далее...
или еще чтобы не делить делаем строку из этого числа и по очереди по позициям берем символы преобразовываем в число и опять же case... вот так...
НО это только работает с числами после двадцати, до двадцати надо руками писать
maLoy*508 вне форума Ответить с цитированием
Старый 30.03.2008, 14:55   #7
Карась
Участник клуба
 
Аватар для Карась
 
Регистрация: 26.10.2007
Сообщений: 1,244
По умолчанию

Ты бы код показал...мало ли что ты там написал у себя в программе.

Как вариант решения "в лоб" предлагаю такой вариант:

Код:
program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils;

Function Rus(Mes : string) : string;
Var  i : integer;
Begin
For i := 1 to length(mes) do
  Case mes[i] of
    'А'..'п' : mes[i] := Chr(Ord(mes[i]) - 64);
    'р'..'я' : mes[i] := Chr(Ord(mes[i]) - 16);
  End;
Rus := Mes;
End;

Var N : String;
      i : Byte;

Begin

Readln (N);

    Case StrToInt(N[1]) of
      1 : Write(Rus(('Одна тысяча ')));
      2 : Write(Rus(('Две тысячи ')));
      3 : Write(Rus(('Три тысячи ')));
      4 : Write(Rus(('Четыре тысячи ')));
      5 : Write(Rus(('Пять тысяч ')));
     End;

     Case StrToInt(N[2]) of
      1 : Write(Rus(('сто ')));
      2 : Write(Rus(('двести ')));
      3 : Write(Rus(('триста ')));
      4 : Write(Rus(('четыресто ')));
      5 : Write(Rus(('пятьсот ')));
     End;

If N[3] = '1' Then
  Begin
     Case StrToInt(N[3]) of
      1 : Write(Rus(('одинадцать ')));
      2 : Write(Rus(('двенадцать ')));
      3 : Write(Rus(('тринадцать ')));
      4 : Write(Rus(('четырнадцать ')));
      5 : Write(Rus(('пятнадцать ')));
     End;
  End
Else
  Begin
    Case StrToInt(N[3]) of
      2 : Write(Rus(('двадцать ')));
      3 : Write(Rus(('традцать ')));
      4 : Write(Rus(('сорок ')));
      5 : Write(Rus(('пятьдесят ')));
     End;

     Case StrToInt(N[4]) of
      2 : Write(Rus(('два ')));
      3 : Write(Rus(('три ')));
      4 : Write(Rus(('четыре ')));
      5 : Write(Rus(('пять ')));
     End;
  End;
Readln;
End.
Сделанно до 5555 числа.
Дя увеличения диапазона до 9999 нужно тупо дописать в блоки Case нужные строки.
Так как Delphi незахотела выводить Русский текст пришлось написать необходимую функцию.
Писалось для консоли.

АДД: Ф топку массивы.. без них проще получается. А также я заметил что моя программа невыводит числа 1521, 3241, 4441 и т.д. Я просто забыл коечто дописать, вот автору как раз этопоможет тщательней изучить код

Незабудь про брекпоинты.. при отладке вещь незаменимая.
Умом Россию не понять, пока не выпито ноль пять,
А если выпито ноль пять всё делом кажется не хитрым,
Попытка глубже понимать уже попахивает литром...

Последний раз редактировалось Карась; 30.03.2008 в 15:30.
Карась вне форума Ответить с цитированием
Старый 30.03.2008, 16:31   #8
maLoy*508
Форумчанин
 
Аватар для maLoy*508
 
Регистрация: 28.03.2008
Сообщений: 672
По умолчанию

а вот что у меня получилось, выводит все числа до 9999 включительно
писал в делфи...
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
a:integer;
b:integer;
c:integer;
stEd:string;
stDes:string;
stSot:string;
stTus:string;
label labe,labe1,labe2;
begin
stEd:='';
stDes:='';
stSot:='';
stTus:='';
a:=strToInt(edit1.Text);
labe: if a<20 then begin
case a of
0: stEd:='ноль';
1: stEd:='один';
2: stEd:='два';
3: stEd:='три';
4: stEd:='четыре';
5: stEd:='пять';
6: stEd:='шесть';
7: stEd:='сем';
8: stEd:='восем';
9: stEd:='девять';
10: stEd:='десять';
11: stEd:='одиннадцать';
12: stEd:='двеннадцать';
13: stEd:='тринадцать';
14: stEd:='четырнадцать';
15: stEd:='пятнадцать';
16: stEd:='шестнадцать';
17: stEd:='семнадцать';
18: stEd:='восемнадцать';
19: stEd:='девятнадцать';

end;

end
else
if a<100 then
labe1: begin
i:=a div 10 ;
case i of
2: stDes:='двадцать ';
3: stDes:='тридцать ';
4: stDes:='сорок ';
5: stDes:='пятьдесят ';
6: stDes:='шестьдесят ';
7: stDes:='семдесят ';
8: stDes:='восемдесят ';
9: stDes:='девяносто ';
end;
a:=a mod 10;
if a<>0 then
goto labe;
end
else
if a<1000 then
labe2: begin
c:=a div 100;
case c of
1: stSot:='сто ';
2: stSot:='двести ';
3: stSot:='триста ';
4: stSot:='четыреста ';
5: stSot:='пятьсот ';
6: stSot:='шестьсот ';
7: stSot:='семсот ';
8: stSot:='восемсот ';
9: stSot:='девятьсот ';
end;
a:=a mod 100;
if a<>0 then
goto labe1;
end
else
if a<10000 then
begin
b:=a div 1000;
case b of
1: stTus:='Одна тысяча ';
2: stTus:='Две тысячи ';
3: stTus:='Три тысячи ';
4: stTus:='Четыре тысячи ';
5: stTus:='Пять тысяч ';
6: stTus:='Шесть тысяч ';
7: stTus:='Сем тысяч ';
8: stTus:='Восем тысяч ';
9: stTus:='Девять тысяч ';
end;
a:=a mod 1000;
if a<>0 then
goto labe2;
end;
edit2.Text:=stTus+stSot+stDes+stEd;
end;

end.
maLoy*508 вне форума Ответить с цитированием
Старый 31.03.2008, 00:07   #9
gred
Пока ещё
Форумчанин
 
Аватар для gred
 
Регистрация: 26.02.2008
Сообщений: 116
По умолчанию

Цитата:
Сообщение от Карась Посмотреть сообщение
Т

Код:

     Case StrToInt(N[4]) of
      2 : Write(Rus(('два ')));
      3 : Write(Rus(('три ')));
      4 : Write(Rus(('четыре ')));
      5 : Write(Rus(('пять ')));
     End;
  End;
Readln;
End.
А также я заметил что моя программа невыводит числа 1521, 3241, 4441 и т.д. Я просто забыл коечто дописать, вот автору как раз этопоможет тщательней изучить код
1 забыл присвоить
Ешё несколько ошибок но так огромное спасибо.
Из за ошибки тож я зато разобрался)
Я мегапрограммер потерявший память.
Если кому помог, поставте '+' я буду благодарен
gred вне форума Ответить с цитированием
Старый 31.03.2008, 01:47   #10
Valter
Пользователь
 
Регистрация: 29.03.2008
Сообщений: 51
По умолчанию

Карась
Со всем согласен, но вот вопрос: меня глючит уже под ночь или вот в этом отрывке у тебя в коде
Цитата:
Код:
    
If N[3] = '1' Then
  Begin
     Case StrToInt(N[3]) of
      1 : Write(Rus(('одинадцать ')));
      2 : Write(Rus(('двенадцать ')));
      3 : Write(Rus(('тринадцать ')));
      4 : Write(Rus(('четырнадцать ')));
      5 : Write(Rus(('пятнадцать ')));
     End;
.....
должно быть не StrToInt(N[3]), а StrToInt(N[4]) уже? ведь единицу (N[3]) ты уже зафиксировал в if, а дальше уже идет проверка на N[4], чтобы определить, что это за -надцатое число. Или я ошибаюсь?

Последний раз редактировалось Valter; 31.03.2008 в 01:49.
Valter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание графиков(например декартов лист) DUMOH Компоненты Delphi 10 21.12.2008 23:10
Как печатать в верхней подстроке в Delphi например 2 в квадрате Moel Общие вопросы Delphi 3 19.06.2008 15:30
игра про карты например (дурак) alex@x Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 06.12.2007 15:53
как наклонить метку (Label) с текстом, например, на 45 грудусов? krem Компоненты Delphi 2 09.05.2007 19:20
как сделать в memo строку не 256 символов, а 1024 например. Alar Компоненты Delphi 0 29.10.2006 18:46