Форум программистов, компьютерный форум CyberForum.ru

Программа, которая переводит числа в слова - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 20, средняя оценка - 4.75
Uinslou
Старичок :)
 Аватар для Uinslou
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
30.07.2011, 12:39     Программа, которая переводит числа в слова #1
Здрасти всем.

Есть код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <stdlib.h>
 
string NumericToString(int n)
{
    string ret;
    int i, index, ir;
    for(i = n % 10, n = (int)n / 10, index = 1; true; i = n % 10, n = (int)n / 10, index++)
    {
        switch(index)
        {
        case 1: switch(i)
                {
        case 0: ret = "ноль" + ret;
            break;
        case 1: ret = "один" + ret;
            break;
        case 2: ret = "два" + ret;
            break;
        case 3: ret = "три" + ret;
            break;
        case 4: ret = "четире" + ret;
            break;
        case 5: ret = "пять" + ret;
            break;
        case 6: ret = "шесть" + ret;
            break;
        case 7: ret = "семь" + ret;
            break;
        case 8: ret = "восемь" + ret;
            break;
        case 9: ret = "девять" + ret;
            break;
                }
                break;
        case 2:
            switch(i)
            {
            case 1:
                {
                    switch (ir)
                    {
                    case 0: ret = "десять";
                        break;
                    case 1: ret = "одиннадцать";
                        break;
                    case 2: ret = "двенадцать";
                        break;
                    case 3: ret = "тринадцать";
                        break;
                    case 4: ret = "четырнадцать";
                        break;
                    case 5:
                        ret = "пятнадцать";
                        break;
                    case 6: ret  = "шестнадцать";
                        break;
                    case 7: ret = "семнадцать";
                        break;
                    case 8: ret = "восемнадцать";
                        break;
                    case 9: ret = "девятнадцать";
                        break;
                    }
                    break;
                }
            case 2: ret = "двадцать";
                break;
            case 3: ret = "тридцать";
                break;
            case 4: ret = "сорок";
                break;
            case 5: ret = "пятьдесят";
                break;
            case 6: ret = "шестьдесят";
                break;
            case 7: ret = "семьдесят";
                break;
            case 8: ret = "восемьдесят";
                break;
            case 9: ret = "девяносто";
                break;
            case 0: ret = "";
                break;
            }
            break;
        }
        ir = i;
        if ( n == 0 )
        { 
            break;
        }
    }
    if(!ret.empty())
    {
        ret[0] = _toupper(ret[0]);
    }
    return ret;
}
Подскажите пожалуйста почему не работает. Это программа, которая переводит числа в слова (1=один). Спасибо заранее.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.07.2011, 12:39     Программа, которая переводит числа в слова
Посмотрите здесь:

программа которая переводит введенные числа в буквенную начертанию (надо немного исправить) C++
Написать программу, которая переводит числа по основанию 8 в 4. Выполнить операцию деления C++
Программа, которая вводит текст, удаляет в нем все слова заданной длины, а оставшиеся слова выводит в алфавитн C++
C++ Программа которая переводит из 2ой системы в 10ую
C++ Составить рекурсивной функции, которая переводит числа из десятичной системы счисления в шестнадцатилетнюю
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
neske
1419 / 786 / 55
Регистрация: 26.03.2010
Сообщений: 2,694
30.07.2011, 12:41     Программа, которая переводит числа в слова #2
C++
1
for(i = n % 10, n = (int)n / 10, index = 1; true; i = n % 10, n = (int)n / 10, index++)
блин, зачем так быдлокодить то? сложно очень разобрать, что вы хотели сделать.
Uinslou
Старичок :)
 Аватар для Uinslou
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
30.07.2011, 13:02  [ТС]     Программа, которая переводит числа в слова #3
Так в чём же проблема ?

З.Ы. Код не мой.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.07.2011, 13:18     Программа, которая переводит числа в слова #4
Цитата Сообщение от Uinslou Посмотреть сообщение
Так в чём же проблема ?
это нам у вас надо спросить, почему не разберетесь в чужем коде? если разобрались бы то и нашли бы ошибку
Uinslou
Старичок :)
 Аватар для Uinslou
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
30.07.2011, 16:00  [ТС]     Программа, которая переводит числа в слова #5
Цитата Сообщение от Maxwe11 Посмотреть сообщение
это нам у вас надо спросить, почему не разберетесь в чужем коде? если разобрались бы то и нашли бы ошибку
Я сюда за помощью пришёл, а не за нравоучениями. Давай не будем оффтопить и вернёмся к теме.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
30.07.2011, 16:08     Программа, которая переводит числа в слова #6
Цитата Сообщение от Uinslou Посмотреть сообщение
Я сюда за помощью пришёл, а не за нравоучениями. Давай не будем оффтопить и вернёмся к теме.
ок, начнем с самого начала тобишь 1-го поста этой темы)

Цитата Сообщение от Uinslou Посмотреть сообщение
Подскажите пожалуйста почему не работает.
Вы написали не работает, и даже неудосужились уточнить как не работает - ошибки компиляции или ошибки линковки или неправильная логика и как следствие неправильный результат на выходе.
Обратились за помощью, так имейте уважение и опишите проблему полностью. К тому же вы выложили в 1-м посте не программу, а лишь ее часть.
AvengerAlive
5 / 5 / 0
Регистрация: 30.07.2011
Сообщений: 257
30.07.2011, 16:29     Программа, которая переводит числа в слова #7
Цитата Сообщение от Uinslou Посмотреть сообщение
Так в чём же проблема ?

З.Ы. Код не мой.
Ну не в своей программе разобраться гораздо сложнее.

Значит так, можно просто задать массив слов.
Например массив со словами ноль, ... , девять (надеюсь это то вы делать умеете).
Вначале надо как-то обработать исключания. Например десять, одиннадцать, сорок, сто, двести и.т.п
Потом найти общее: (дваДЦАТЬ, триДЦАТЬ), (пятьДЕСЯТ, шестьДЕСЯТ).
После ста уже всё сходится к обычному динамическому программированию. Вычисляем первые два разряда и по динамике.

Надеюсь помог
Uinslou
Старичок :)
 Аватар для Uinslou
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
30.07.2011, 16:31  [ТС]     Программа, которая переводит числа в слова #8

Не по теме:

Цитата Сообщение от Maxwe11 Посмотреть сообщение
Вы написали не работает, и даже неудосужились уточнить как не работает - ошибки компиляции или ошибки линковки или неправильная логика и как следствие неправильный результат на выходе.
Обратились за помощью, так имейте уважение и опишите проблему полностью. К тому же вы выложили в 1-м посте не программу, а лишь ее часть.
Я с железом работаю, на программера только учусь. Человек просто попросил скинуть код, чтобы ребята с форума помогли, а не писали какой я плохой, не изучил код. Я понимаю что Вы "гуру" в это деле и надо это показать, но довольно слов, перейдём к делу.



Значит так, можно просто задать массив слов.
Например массив со словами ноль, ... , девять (надеюсь это то вы делать умеете).
Вначале надо как-то обработать исключания. Например десять, одиннадцать, сорок, сто, двести и.т.п
Потом найти общее: (дваДЦАТЬ, триДЦАТЬ), (пятьДЕСЯТ, шестьДЕСЯТ).
После ста уже всё сходится к обычному динамическому программированию. Вычисляем первые два разряда и по динамике.
Спасибо Вам большое, сейчас буду пробывать
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
30.07.2011, 16:36     Программа, которая переводит числа в слова #9
Uinslou, ну раз уж "человек попросил", то
в начале using namespace std;
+ #include <string>
Jupiter
30.07.2011, 17:24
  #10

Не по теме:

Цитата Сообщение от Uinslou Посмотреть сообщение
Я с железом работаю, на программера только учусь. Человек просто попросил скинуть код, чтобы ребята с форума помогли, а не писали какой я плохой, не изучил код. Я понимаю что Вы "гуру" в это деле и надо это показать, но довольно слов, перейдём к делу.
ну насчет меня вы ошибаетесь, я тоже не "гуру", я тоже студент, вот только учусь я не на программера, а на программиста

alkagolik
 Аватар для alkagolik
1510 / 616 / 79
Регистрация: 15.07.2011
Сообщений: 3,552
31.07.2011, 02:27     Программа, которая переводит числа в слова #11
C++
1
for(i = n % 10, n = (int)n / 10, index = 1; true; i = n % 10, n = (int)n / 10, index++)
Это что-то страшное и ползучее)) никогда не выходящее из цикла. А попросту черти что.
вот код, конечно тяжело заставить машину "соображать", а вдруг выстрелит мозг гения)), но это точно не мой. Вот код, просто и понятный
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
#include <iostream>
#include <string>
 
using namespace std;
 
int main()
{
    string _1 = " один";
    string _2 = " два";
    string _3 = " три";
    string _4 = " четыре";
    string _5 = " пять";
    string _6 = " шесть";
    string _7 = " семь";
    string _8 = " восемь";
    string _9 = " девять";
    string _0 = "ноль";
    string _10 = "десять";
    string _11 = "одиннадцать";
    string _12 = "двенадцать";
    string _13 = "тринадцать";
    string _14 = "четырнадцать";
    string _15 = "пятнадцать";
    string _16 = "шестнадцать";
    string _17 = "семнадцать";
    string _18 = "восемнадцать";
    string _19 = "девятнадцать";
    string _20 = "двадцать";
    string _30 = "тридцать";
    string _40 = "сорок";
    string _50 = "пятьдесят";
    string _60 = "шестьдесят";
    string _70 = "семьдесят";
    string _80 = "восемьдесят";
    string _90 = "девяносто";
    string tmp;
    int x, y;
    //по умолчанию работаем число меньше ста
    cin >> x;
    y = x%10;
    if (x < 100 && x >= 0){
        switch (y){
            case 1: tmp = _1; break;
            case 2: tmp = _2; break;
            case 3: tmp = _3; break;
            case 4: tmp = _4; break;
            case 5: tmp = _5; break;
            case 6: tmp = _6; break;
            case 7: tmp = _7; break;
            case 8: tmp = _8; break;
            case 9: tmp = _9; break;
        }
 
        if (x<10){
            if (x==0) cout << _0;
            if (x==1) cout << _1;
            if (x==2) cout << _2;
            if (x==3) cout << _3;
            if (x==4) cout << _4;
            if (x==5) cout << _5;
            if (x==6) cout << _6;
            if (x==7) cout << _7;
            if (x==8) cout << _8;
            if (x==9) cout << _9;
        }
        else if (x < 20){
            if (x==10) cout << _10;
            if (x==11) cout << _11;
            if (x==12) cout << _12;
            if (x==13) cout << _13;
            if (x==14) cout << _14;
            if (x==15) cout << _15;
            if (x==16) cout << _16;
            if (x==17) cout << _17;
            if (x==18) cout << _18;
            if (x==19) cout << _19;
        }
        else if (x < 30){
            if (y == 0) cout << _20;
            else cout << _20 + tmp;
        }
        else if (x < 40){
            if (y == 0) cout << _30;
            else cout << _30 + tmp;
        }
        else if (x < 50){
            if (y == 0) cout << _40;
            else cout << _40 + tmp;
        }
        else if (x < 60){
            if (y == 0) cout << _50;
            else cout << _50 + tmp;
        }
        else if (x < 70){
            if (y == 0) cout << _60;
            else cout << _60 + tmp;
        }
        else if (x < 80){
            if (y == 0) cout << _70;
            else cout << _70 + tmp;
        }
        else if (x < 90){
            if (y == 0) cout << _80;
            else cout << _80 + tmp;
        }
        else if (y == 0) cout << _90;
        else cout << _20 + tmp;
    }
    return 0;
}
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
31.07.2011, 10:55     Программа, которая переводит числа в слова #12
Читайте правильные книжки... Вот из моей С++.Экспресс-курс:
Здесь только руссификацию надо заменить на что-нить более подходящее. А то написано было еще в 2002 году для VC++6.

Числа — прописью
Напишем программу, которая чрезвычайно востребована в реальной жизни: вывод числа прописью. Мы не будем писать совсем уж универсальный вариант, так как наша цель — просто поучиться использовать тип string в реальной программе. Ограничим наши числа положительными целыми в диапазоне от 1 до 999 999 999 — такие числа целиком помещаются в целую переменную типа int.

Замечание
Если требуются большие числа, то в системе Visual C++ мы можем использовать нестандартный целый тип __int64. Стандартное решение — использовать структуру с двумя полями типа long.

Мы не зря написали число 999 999 999 с пробелами между тройками чисел — числительные от 1 до 999 пишутся одинаково, независимо от местоположения. Вся разница — в слове после очередной тройки: старшая — это миллионы, средняя — это тысячи, а младшая — непосредственно рубли. Поэтому естественно написать функцию, которая получает число от 1 до 999, и выдает результат типа string. В этом случае мы сможем инкапсулировать все массивы числительных в этой процедуре. Однако миллионы и рубли у нас мужского рода, а тысячи — женского. Поэтому вместо «один» и «два» надо писать «одна» и «две». В остальном числительные полностью совпадают. Поэтому мы должны прописать второй параметр типа bool, который всегда будет false, а для тысяч — true (листинг 5.6).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Листинг 5.6. Функция toNumeral — трехзначное число прописью
 //--обрабатывает только 3-хзначное число
string toNumeral(unsigned long Number, bool Thousands)
{ string units    [] = 
  {"один","два","три","четыре","пять","шесть", "семь","восемь","девять"}; 
  string tens     [] = 
  {"десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят",
   "семьдесят", "восемьдесят","девяносто"}; 
  string hundreds [] =
  {"сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот",
   "восемьсот","девятьсот"}; 
  string secondten[] = 
  {"одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать",
   "шестнадцать","семнадцать","восемнадцать","девятнадцать"}; 
  string Women    [2]= {"одна","две"};    
  string result("");                                // пустая строка-результат
  typedef unsigned char byte;   
  byte digits[3] = {0};                 // - цифры числа
  unsigned long n = Number;
  digits[0] = n % 10;               //--младшая цифра
  digits[1] = (n / 10) % 10;            //--средняя цифра
  digits[2] = n / 100;                  //--старшая цифра
  if (digits[2]>0) result +=(hundreds[digits[2]-1]+" "); 
  if (digits[1]>0)
  { if ((digits[1]==1)&&(digits[0]!=0)) 
    { result +=(secondten[digits[0]-1]+" "); return result; }
    else result +=(tens[digits[1]-1]+" ");
  }
  if (digits[0]>0) 
  { if (((digits[0]>2)&&(digits[1]!=1))||(!Thousands)) 
      result +=(units[digits[0]-1]+" ");
    else result +=(Women[digits[0]-1]+" ");
  }
  return result;
}
Вначале объявляются и инициализируются массивы числительных: в каждом массиве ровно 9 элементов. Затем объявляется и заполняется массив для трех цифр числа: младшая цифра — по меньшему индексу. Наконец, начинаются проверки цифр и получение строки-результата. Первоначально строка-результат пустая. Если очередная цифра не равна нулю, то к строке-результату прицепляется очередное числительное. Особый случай составляет вторая цифра: если она равна 1, то мы тут же проверяем третью. Если она не равна нулю, то мы прицепляем числительное из массива secondten и выходим. При определении единиц для 1 или 2 используется массив Women для числительного женского рода.
Обратите также внимание на то, как вычисляется индекс числительного — это довольно распространенный прием. Протестируем нашу функцию (листинг 5.7).
C++
1
2
3
4
5
6
7
8
9
10
Листинг 5.7. Тестовая программа для функции toNumeral
int main()
{ unsigned long Number[] = 
  {1,2,9,10,11,19,20,21,22,45,100,101,102,109,110,118,150,870,912,999};
  int k = sizeof(Number)/sizeof(unsigned long);
  char s[200]={0}; 
  for (int i = 0; i < k; ++i)
  { CharToOem(toNumeral(Number[i],true).c_str(),s); cout<<s<<endl;  }
  return 0;
}
В этой программе мы объявили тестовый массив Number, и вычислили его длину. Затем в цикле выполняется непосредственное обращение к функции перекодировки. Мы не стали использовать написанные нами ранее функции Rus (см. листинги 4.9 и 5.4). Первый операнд написан несколько необычно. Поскольку мы не записали результата в переменную, система создает анонимный временный объект. Наша функция toNumeral возвращает string, поэтому у результата (временного объекта) есть метод c_str(). Использование временных объектов — полезный прием, которым мы еще не раз будем применять.

Теперь напишем функцию, которая будет формировать наше число прописью. Очевидно, эта функция должна трижды вызвать функцию toNumeral, прицепляя после каждого вызова соответствующее слово (листинг 5.8).
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Листинг 5.8. Сумма — прописью  
string Numeral(unsigned int Number)
{   string what_[3][3] = {{"миллион", "миллиона", "миллионов" },
                {"тысяча",  "тысячи",   "тысяч"     },
                {"рубль","рубля","рублей"}};
    unsigned int t = Number;
    unsigned int treads[3];     //--вычисление троек числа
    treads[0]=t%1000; treads[1]=t/1000%1000; treads[2]=t/1000000;
    string result = "";
    if (treads[2] > 0) { result +=toNumeral(treads[2], false);
    if (treads[2]/10 % 10==1) result += what_[0][2];                    //-1-
    else 
        switch (treads[2] % 10)
    { case 0: case 5: case 6: case 7: case 8: case 9: 
                                           result += what_[0][2]; break;
      case 2: case 3: case 4: result += what_[0][1]; break;
      case 1:                  result += what_[0][0]; break;
    }
    result+=' ';
    }
    if (treads[1] > 0) { result +=toNumeral(treads[1], true);
    if (treads[1]/10 % 10==1) result += what_[1][2];                      //-2-
    else switch (treads[1] % 10)
    { case 0: case 5: case 6: 
          case 7: case 8: case 9: result += what_[1][2]; break;
      case 2: case 3: case 4: result += what_[1][1];break;
      case 1:                  result += what_[1][0];break;
    }
    result+=' ';
    }
       result +=toNumeral(treads[0], false);
    if (treads[0]/10 % 10==1) result += what_[2][2];                      //-3-
    else switch (treads[0] % 10)
    { case 0: case 5: case 6: 
         case 7: case 8: case 9: result += what_[2][2];break;
      case 2: case 3: case 4: result += what_[2][1];break;
      case 1:            result += what_[2][0];break;
    }
    result+=' ';
    return result;
}
Как видите, получилась довольно простая программа. Единственное, на что надо обратить внимание — это помеченные цифрам строки: если у нас вторая цифра в тройке равна 1, то можно сразу прицеплять нужное слово. В стальных случаях мы должны анализировать последнюю цифру. Можно еще больше упростить функцию, если выделить в отдельную функцию совершенно однотипные действия в операторе switch, но оставим это на упражнения.
Протестировать нашу программу очень просто: надо в листинге 5.7 увеличить тестовый массив, задав уже и тысячи, и миллионы, и заменить первый параметр в вызове функции CharToOem
C++
1
CharToOem(Numeral(Number[i]).c_str(), s);
Gepar
31.07.2011, 16:43
  #13

Не по теме:

[quote=Uinslou;1876321]case, case, case, case, case, case, case ... CASE CASE CASE CASE/quote]
ааааа, не давайте ему программировать, ну пожалуйста.

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.07.2011, 18:50     Программа, которая переводит числа в слова
Еще ссылки по теме:

Не компилится программа, которая переводит градусы Цельсия по Фарангейту и наоборот C++
Программа на C++, которая переводит цветовую модель RGB в модель HSV C++
Написать программу, которая переводит числа с шестнадцатеричной системы в десятичную C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Uinslou
Старичок :)
 Аватар для Uinslou
728 / 315 / 5
Регистрация: 03.04.2011
Сообщений: 1,430
31.07.2011, 18:50  [ТС]     Программа, которая переводит числа в слова #14
Спасибо огромное за помощь всем, ребят

Не по теме:

З.Ы.

я не на программера, а на программиста
Ну простите меня не грамотного.

Yandex
Объявления
31.07.2011, 18:50     Программа, которая переводит числа в слова
Ответ Создать тему
Опции темы

Текущее время: 19:16. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru