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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 119, средняя оценка - 4.82
breeve
75 / 75 / 14
Регистрация: 01.08.2009
Сообщений: 177
#1

Вывести число прописью - C++

05.01.2010, 16:44. Просмотров 16665. Ответов 21
Метки нет (Все метки)

Я бы тоже внес свою лепту в форумский FAQ. Есть у меня программа которая конвертирует число от 1 до 999 в прописную строку.. Не раз наблюдал людей которым она необходима..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.01.2010, 16:44
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вывести число прописью (C++):

Вывести число прописью - C++
С клавиатуры вводится натуральное число, не превосходящее 1000. Представить его в виде соответствующей словесной записи

Вывести трехзначное число прописью - C++
Дано целое число в диапазоне 100–999. Вывести строку-описание данного числа, например: 256 — «двести пятьдесят шесть», 814 — «восемьсот...

Вывести число прописью с использование функции - C++
Нуждаюсь в помощи... Вот задание: Заданное натурально число n, не превосходящее 1000, записать прописью, т.е. вывести соответствующее...

Вывести число прописью на английском языке - C++
Задача заключается в том, чтобы из числа получить строку на английском, причём данное число в диапазоне от 100 до 999. Если можно, не нужно...

Вывести прописью введенное пользователем число - C++
Код на С++ , который должен выводить введенное пользователем число прописью. #include <iostream> #include <stdio.h> #include...

Найти сумму двух денежных сумм заданных прописью, ответ вывести прописью - C++
Приветствую форумчан, прошу момочь с задачей : Сложить две денежные суммы в рублях и копейках, заданные прописью. Результат вывести также...

21
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
08.01.2010, 15:10 #2
2breeve: оформи в виде функции.
Причем лучше на C.
Не всем нужен C++.
И лучше чтобы функция брала числа от 0 до 999999 хотя бы.
А совсем хорошо - от 0 до MAX_INT.

Функция на C:
C++
1
char *itonumeral_ru( int n, size_t size, char *buf );
n - число
size - размер буфера
buf - буфер

Функция на С++:
C++
1
string itonumeral_ru( int n );
Добавлено через 7 минут
Функции не должны печатать числительное, а должны записывать его в строку.
А дальше уже вызывающая программа разберется - печатать его, или записывать в файл.
1
breeve
75 / 75 / 14
Регистрация: 01.08.2009
Сообщений: 177
10.01.2010, 20:29  [ТС] #3
Код получился грамоздким поскольку обрабатывал каждый порядок. сделал в си, в виде функции, до 999999, как просили.
Вот
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
 
char *itonumeral_ru( int n, size_t size, char *buf );
 
int main()
{
    char *str;
    char *buf;
    int choice;
    while(1)
    {
        printf("Vvedite chislo:\t");
        scanf("%u", &choice);
        str = itonumeral_ru(choice, 256, buf);
        printf("%s\n", str);
    }
    return 0;
}
 
char *itonumeral_ru( int n, size_t size, char *buf )
{
    char *one[] = {"","один ","два ","три ","четыре ","пять ","шесть ","семь ","восемь ","девять ",
                  "десять ","одиннадцать ","двенадцать ","тринадцать ","четырнадцать ","пятнадцать ",
                  "шестнадцать ","семнадцать ","восемнадцать ","девятнадцать " };
    char *ten[] = {"","", "двадцать ", "тридцать ", "сорок ", "пятьдесят ", "шестьдесят ", "семьдесят ", 
                  "восемьдесят ", "девяносто " };
    char *hundred[] = {"","сто ","двести ", "триста ", "четыреста ", "пятьсот ", "шестьсот ", 
                      "семьсот ", "восемьсот ", "девятьсот " };
    char *thouOne[] =  {"","одна ","две ","три ","четыре ","пять ","шесть ","семь ","восемь ","девять ",
                  "десять ","одиннадцать ","двенадцать ","тринадцать ","четырнадцать ","пятнадцать ",
                  "шестнадцать ","семнадцать ","восемнадцать ","девятнадцать " };                     
    char *thousand[] = {"тысяч ", "тысяча ", "тысячи ", "тысячи ", "тысячи ", "тысяч " ,"тысяч ", "тысяч ",
                "тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч ","тысяч "
                "тысяч "};
    buf = malloc(size);
    sprintf(buf, "%u", n);
    int len = strlen(buf);
    int temp, temp2;
        switch(len)
{
    case 1:
        sprintf(buf,"%s", one[n]);
        break;
    case 2:
        if(n < 20)
        {
            sprintf(buf,"%s", one[n]);
        }
        else if(n < 100)
        {
            if((n%10)==0) sprintf(buf,"%s", ten[n/10]);
            else sprintf(buf,"%s%s", ten[n/10], one[n%10]);
        }
        break;
    case 3:
        temp = n/100;
        n -= (n/100)*100;
        if(n < 20)
        {
            sprintf(buf,"%s%s", hundred[temp], one[n]);
            
        }
        else if(n < 100)
        {
            if((n%10)==0) sprintf(buf,"%s%s", hundred[temp], ten[n/10]);
            else sprintf(buf,"%s%s%s", hundred[temp], ten[n/10], one[n%10]);
        }
        break;
    case 4:
        temp = n/1000;
        n -= (n/1000)*1000;
        sprintf(buf,"%s%s", thouOne[temp], thousand[temp]);
        temp = n/100;
        n -= (n/100)*100;
        if(n < 20)
        {
            strncat(buf, hundred[temp], 30);
            strncat(buf, one[n], 15);
        }
        else if(n < 100)
        {
            if((n%10)==0){
                 strncat(buf, hundred[temp], 30);
                 strncat(buf, ten[n/10], 30); 
             }
            else {
                strncat(buf, hundred[temp], 30);
                strncat(buf, ten[n/10], 30); 
                strncat(buf, one[n%10], 30);
            }
        }
        break;
    case 5:
        temp = n/1000;
        n -= (n/1000)*1000;
        if(temp<20){
            sprintf(buf,"%s%s", thouOne[temp], thousand[temp%10]);
        }
        else if(temp < 100)
        {
            if((temp%10)==0) sprintf(buf,"%s%s", ten[temp/10], thousand[temp%10]);
            else sprintf(buf,"%s%s%s", ten[temp/10], thouOne[temp%10], thousand[temp%10]);
        }
        temp = n/100;
        n -= (n/100)*100;
        if(n < 20)
        {
            strncat(buf, hundred[temp], 30);
            strncat(buf, one[n], 30);
            
        }
        else if(n < 100)
        {
            if((n%10)==0){
                 strncat(buf, hundred[temp], 30);
                 strncat(buf, ten[n/10], 30); 
             }
            else {
                strncat(buf, hundred[temp], 30);
                strncat(buf, ten[n/10], 30); 
                strncat(buf, one[n%10], 30);
            }
        }
        break;
    case 6:
        temp2 = n/1000;
        n -= (n/1000)*1000;
        
        temp = temp2/100;
        temp2 -=temp*100;
        
        if(temp2<20){
            sprintf(buf,"%s%s%s", hundred[temp], thouOne[temp2], thousand[temp2]);
        }
        else if(temp2 < 100)
        {
            if((temp%10)==0) sprintf(buf,"%s%s%s",hundred[temp], ten[temp2/10], thousand[temp2%10]);
            else sprintf(buf,"%s%s%s%s", hundred[temp],ten[temp2/10], thouOne[temp2%10], thousand[temp2%10]);
        }
        temp = n/100;
        n -= (n/100)*100;
        if(n < 20)
        {
            strncat(buf, hundred[temp], 30);
            strncat(buf, one[n], 30);
            
        }
        else if(n < 100)
        {
            if((n%10)==0){
                 strncat(buf, hundred[temp], 30);
                 strncat(buf, ten[n/10], 30); 
             }
            else {
                strncat(buf, hundred[temp], 30);
                strncat(buf, ten[n/10], 30); 
                strncat(buf, one[n%10], 30);
            }
        }
        break;
}
    
    
    return buf;                                
}
Можно было бы тысячи обрабатывать рекурсией, но там проблема была в склонениях(один,два - одна, две), тогда кода было бы почти в двое меньше..
3
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
10.01.2010, 21:14 #4
Добавил ссылку в Большая коллекция решенных задач на эту тему.
Ждем отзывов
1
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
10.01.2010, 23:09 #5
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Можно попробовать так:
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
#include <stdio.h>
 static char *sot[]={"сто","двести","триста","четыреста",
             "пят","шест", "сем","восем","девят" };
 static char *desiat[]={" двадцать"," тридцать"," сорок"," пят"," шест",
                " сем"," восем"," девяносто" };
 static char *edm[]={""," один"," два"," три"," четыре"," пять"," шесть",
             " семь"," восемь",
             " девять"," десять"," один"," две"," три",
             " четыр"," пят"," шест"," сем"," восем"," девят" };
 static char *edw[]={" одна"," две" };
 static char *nmtr[]={" тысяч"," миллион"," миллиард", " триллион",
               " квадриллион", " квинтиллион", " сектиллион", " септаллион", NULL };
         // дальше не знаю, м.б. товарищи подскажут ...
 static char *nokm[]={"а","ов" };
 static char *nokt[]={"а","и","" };
/* ------------------ */
Propis2(unsigned long L, int n, char *s) // Число прописью
{ int R, ns, nd, r; char *p; unsigned long M;
 
   M = L / 1000;
   R = L % 1000;
   if (M != 0) Propis2(M, n+1, s);  // Рекурсия!
   if (R==0) return;
   ns = R / 100;
   if (ns)    sprintf(s+strlen(s), " %s", sot[ns-1]);
   if (ns>=5) strcat(s, "ьсот");
   R = R % 100;  // < 100
   nd = R / 10;  // Десятки
   if (nd >= 2) {
      strcat(s, desiat[nd-2]);
      if (nd>=5 && nd<=8) strcat(s, "ьдесят");
      R = R % 10;
   }
   r = sklon(R);
   if (n==1 && R>0 && R<3) p = edw[R-1];
   else                    p = edm[R];
   strcat(s, p);
   if (R > 10) strcat(s, "надцать");
   if (n > 0) {
     strcat(s, nmtr[n-1]);
     if     (n==1) strcat(s, nokt[r]);
     else if (r>0) strcat(s, nokm[r-1]);
   }
}
/*********************/
sklon(int dd)    /* Определение склонения числа */
{ int n, r;
 
    r = 2;
    n = dd % 100;
    if (n>4 && n<20) return(r);
    n = n % 10;
    if      (n==1)       r = 0;
    else if (n>1 && n<5) r = 1;
    return(r);
}
/* ------------------ */
long atol(char *b);
main()
{ char b[200], s[1000]; unsigned long L;
 
a: printf(">");
   gets(b);
   if (strlen(b)==0) return;
   s[0] = '\0';
   L = atol(b);
   Propis2(L, 0, s);
   printf("%s\n", s);
   goto a;
}
/**********************/
Этот алгоритм несложно модифицировать и для более длинных чисел,
стоит только выбрать для них подходящее представление.
7
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
11.01.2010, 00:35 #6
long в 4 байта дает максимум миллиард, поэтому дальше не нужно
0
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
11.01.2010, 11:18 #7
Цитата Сообщение от odip Посмотреть сообщение
long в 4 байта дает максимум миллиард, поэтому дальше не нужно
Ваша правда, но алгоритм легко обобщается и для более длинных чисел с подходящим представлением.
А обрезать его до миллиарда, выкинуть лишнее - еще легче
1
טאַראַס
7 / 7 / 1
Регистрация: 11.01.2010
Сообщений: 123
14.01.2010, 06:39 #8
А до триллионов с дробями можно?

Добавлено через 1 минуту
Я делал и сам. Просто хочу сравнить. + может ещё кому пригодиться.
0
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
14.01.2010, 10:42 #9
Цитата Сообщение от טאַראַס Посмотреть сообщение
А до триллионов с дробями можно?
Приведи, пожалуйста, пример
"число(с дробями) - его текст"
0
טאַראַס
7 / 7 / 1
Регистрация: 11.01.2010
Сообщений: 123
14.01.2010, 11:24 #10
Я просто криво написал. Я имел ввиду поддержку и целых, и дробей: 423185.434 в "четыреста двадцать тысяч сто восемьдесят пять целых четыреста тридцать четыре сысячных", а 43252345 в "сорок три миллиона двести пятьдесят две тысячи триста сорок пять".
0
odip
Эксперт С++
7158 / 3220 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
14.01.2010, 12:54 #11
Я делал и сам. Просто хочу сравнить. + может ещё кому пригодиться.
Давай - выберем лучший вариант
0
Day
1158 / 963 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
14.01.2010, 21:26 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Что-то в таком роде (вариант с дробями)
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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 static char *sot[]={"сто","двести","триста","четыреста",
             "пят","шест", "сем","восем","девят" };
 static char *desiat[]={" двадцать"," тридцать"," сорок"," пят"," шест",
                " сем"," восем"," девяносто" };
 static char *edm[]={""," один"," два"," три"," четыре"," пять"," шесть",
             " семь"," восемь",
             " девять"," десять"," один"," две"," три",
             " четыр"," пят"," шест"," сем"," восем"," девят" };
 static char *edw[]={" одна"," две" };
 static char *nmtr[]={" тысяч"," миллион"," миллиард", " триллион",
               " квадриллион", " квинтиллион", " сектиллион", " септаллион", NULL };
         // дальше не знаю, м.б. товарищи подскажут ...
 static char *nokm[]={ "а" , "ов" };
 static char *nokt[]={ "а", "и", "" };
/* ------------------ */
Propis3(unsigned long L, int n, char *s, int rg) // Число прописью
{ int R, ns, nd, r; char *p; unsigned long M;
 
   if (n==0 && L==0) {
     strcat(s, " ноль ");
     return;
   }
   M = L / 1000;
   R = L % 1000;
   if (M != 0) Propis3(M, n+1, s, 0);  // Рекурсия!
   if (R==0) return;
   ns = R / 100;
   if (ns)    sprintf(s+strlen(s), " %s", sot[ns-1]);
   if (ns>=5) strcat(s, "ьсот");
   R = R % 100;  // < 100
   nd = R / 10;  // Десятки
   if (nd >= 2) {
      strcat(s, desiat[nd-2]);
      if (nd>=5 && nd<=8) strcat(s, "ьдесят");
      R = R % 10;
   }
   r = sklon(R);
   if (n==1 && R>0 && R<3) p = edw[R-1];
   else                    p = edm[R];
   if (rg==1 && n==0) {
     if      (R==1) p = " одна";
     else if (R==2) p = " две";
   }
   if (rg==2 && n==0 && R==1) p = " одна";
   strcat(s, p);
   if (R > 10) strcat(s, "надцать");
   if (n > 0) {
     strcat(s, nmtr[n-1]);
     if     (n==1) strcat(s, nokt[r]);
     else if (r>0) strcat(s, nokm[r-1]);
   }
}
/*********************/
sklon(int dd)    /* Определение склонения числа */
{ int n, r;
 
    r = 2;
    n = dd % 100;
    if (n>4 && n<20) return(r);
    n = n % 10;
    if      (n==1)       r = 0;
    else if (n>1 && n<5) r = 1;
    return(r);
}
/* ------------------ */
static char *drob[] = {
   " десят", " сот", " тысячн", " деятитысячн", " стотысячн",
   " миллионн", " десятимиллионн", " стомиллионн", " миллиардн",
   " десятимиллиардн", " стомиллиардн", " триллионн"  };
/* ------------------ */
main()
{ char b[200], s[1000], *d, *p; unsigned long L; int nn, k, rg;
 
a: printf(">");
   gets(b);
   if (strlen(b)==0) return;
   d = strchr(b, '.');
   if (d==NULL) rg = 0;
   else         rg = 2;
   s[0] = '\0';
   L = atol(b);
   Propis3(L, 0, s, rg);
   if (d!=NULL) {
     k = L % 10;
     if (k!=1) p = "целых";
     else      p = "целая";
     sprintf(s+strlen(s), " %s и ", p);
     L = atol(d+1);
     nn = 0;  // Кол-во дробных знаков
     for (nn=0, d=d+1; *d!='\0' && *d>='0' && *d<='9'; d++, nn++) ;
     if (nn==0) nn = 1;
     Propis3(L, 0, s+strlen(s), 1);
     strcat(s, drob[nn-1]);
     k = L % 10;
     if (k!=1) strcat(s, "ых");
     else      strcat(s, "ая");
   }
   printf("%s\n", s);
   goto a;
}
Если надо считать более длинные числа, давайте придумаем их представление.
У меня есть одно на примете, могу выложить.
4
PointsEqual
ниначмуроФ
836 / 520 / 33
Регистрация: 12.10.2009
Сообщений: 1,915
03.07.2010, 14:40 #13
как и было в задании(для С++) функция принимает целое число, и возвращает string-строку;
Числа от 0 до INT_MAX;

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
#include <iostream>
#include <conio.h>
 
std::string towords(int numb);
 
int main()
{
    int numb=INT_MAX;
    std::string str=towords(numb);
    std::cout<<numb<<" = "<<str;
    
    getch();
    return EXIT_SUCCESS;
}
 
std::string towords(int numb){
    //массив, для определения разряда, в котором находимся(сотни,десятки,еденицы...)
    int osn[11]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
 
    //массив оснований
    std::string basis[11][10]={
        {"","","","","","","","","",""},
        {"","один","два","три","четыре","пять","шесть","семь","восемь","девять"},
        {"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},
        {"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},
        {"","одна","две","три","четыре","пять","шесть","семь","восемь","девять"},
        {"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},
        {"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},
        {"","один","два","три","четыре","пять","шесть","семь","восемь","девять"},
        {"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},
        {"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},
        {"","один","два","три ","четыре","пять","шесть","семь","восемь","девять"}};
 
    //массив окончаний
    std::string termination[10][10]={
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяча","","","миллион","","","миллиард"},
        {"","","","тысячи","","","миллиона","","","миллиарда"},
        {"","","","тысячи","","","миллиона","","","миллиарда"},
        {"","","","тысячи","","","миллиона","","","миллиарда"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"},
        {"","","","тысяч","","","миллионов","","","миллиардов"}};
 
    std::string dec[10]={"десять","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать","шестнадцать","семнадцать","восемнадцать","девятнадцать"};
    std::string result;
 
    if (!numb){
        result="ноль";
        return result;
    }
    int n1=numb;
    int cnt=0;
 
    //подсчет количесива цифр в числе
    while (numb){
        numb/=10;
        ++cnt;
    }
    int celoe=0;
 
    //перевод
    while (n1){
        if (!((cnt+1) % 3)){
            if ((n1/osn[cnt])==1){
                    n1%=osn[cnt];
                    --cnt;
                    celoe=n1/osn[cnt];
                    n1%=osn[cnt];
                    result+=dec[celoe];
                --cnt;
                if (!(cnt % 3))
                    result+=" "+termination[0][cnt]+" ";
            }
            if (!cnt) break;
        }
        celoe=n1/osn[cnt];
        n1%=osn[cnt];
        result+=basis[cnt][celoe]+" ";
        --cnt;
        if (!(cnt % 3))
            result+=termination[celoe][cnt]+" ";
    }
 
    return result;
}
Добавлено через 14 часов 9 минут
Цитата Сообщение от Day Посмотреть сообщение
Если надо считать более длинные числа, давайте придумаем их представление.
int массив - самое лучшее
1
Хохол
Эксперт С++
475 / 443 / 13
Регистрация: 20.11.2009
Сообщений: 1,292
12.07.2010, 12:38 #14
Инглиш.
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
char* to_text(int x)// 0 - 999999
{
    char res[100];
    char *ptr = res;
    const char *a[] = {"zero",
                "one",
                "two",
                "three",
                "four",
                "five",
                "six",
                "seven",
                "eight",
                "nine",
                "ten",
                "eleven",
                "twelve"};
    if(x <= 12)
    {
        ptr += sprintf(ptr,"%s ",a[x]);
        return strdup(res);
    }
    if(x >= 1000)
    {
        ptr += sprintf(ptr,to_text(x/1000));
        x %= 1000;
        ptr += sprintf(ptr,"thousand ");
    }
    if(x >= 100)
    {
        ptr += sprintf(ptr,"%s ",a[x/100]);
        x %= 100;
        ptr += sprintf(ptr,"hundred ");
    }
    if(x >= 20)
    {
        switch(x/10)
        {
            case 2 : ptr += sprintf(ptr,"twen"); break;
            case 3 : ptr += sprintf(ptr,"thir"); break;
            case 5 : ptr += sprintf(ptr,"fif"); break;
            case 8 : ptr += sprintf(ptr,"eigh"); break;
            default : ptr += sprintf(ptr,a[x/10]); break;
        }
        ptr += sprintf(ptr,"ty ");
        x %= 10;
    }
    if(x >= 13)
    {
        x %= 10;
        switch(x)
        {
            case 2 : ptr += sprintf(ptr,"twen"); break;
            case 3 : ptr += sprintf(ptr,"thir"); break;
            case 5 : ptr += sprintf(ptr,"fif"); break;
            case 8 : ptr += sprintf(ptr,"eigh"); break;
            default : ptr += sprintf(ptr,a[x]);
        }
        ptr += sprintf(ptr,"teen");
    }
    else if(x > 0)
        ptr += sprintf(ptr,"%s ",a[x]);
    return strdup(res);
}
1
manfeese
129 / 128 / 16
Регистрация: 04.01.2009
Сообщений: 415
13.07.2010, 12:43 #15
Не стал заморачиваться в консоли с языками, вот как вариант в ООП:
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
//$$---- Form CPP ----
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    try
    {
        int num = Edit1->Text.ToInt();
        ToText(num);
    }
    catch(...)
    {
 
    }
}
 
String __fastcall ToLowerCase(String str, bool NotUse)
{
    return NotUse ? str : AnsiLowerCase(str);
}
 
void __fastcall TForm1::ToText(int Number)
{
    String Group[4][3] = {{"тысяча ",   "тысячи ",    "тысяч "},
                  {"миллион ",  "миллиона ",  "миллионов "},
                  {"миллиард ", "миллиарда ", "миллиардов "},
                  {"триллион ", "триллиона ", "триллионов "}};
 
    String All[3][10] = {{"", "Один ", "Два ", "Три ", "Четыре ", "Пять ", "Шесть ", "Семь ", "Восемь ", "Девять "},
                 {"", "", "Двадцать ","Тридцать ","Сорок ","Пятьдесят ","Шестьдесят ","Семдесят ","Восемдесят ","Девяносто "},
                 {"","Сто ","Двести ", "Тристо ", "Четыресто ", "Пятьсот ", "Шестьсот ", "Семьсот ","Восемсот ","Девятсот "}};
 
    String El_Nine[10] = { "Десять ",    "Одиннадцать ", "Двенадцать ", "Тринадцать ",   "Четырнадцать ",
                   "Пятнадцать ", "Шестнадцать ", "Семнадцать ", "Восемнадцать ", "Девятнадцать " };
 
    String NumStr = IntToStr(Number); //Number;
    int NumLength = NumStr.Length();
    int Groups = (NumLength-1)/3;
    String str = "";
    for (int i = Groups; i>=0; i--)
    {
        int k = (i==Groups ? NumLength - Groups*3 : 3);
        String NOG_Str = NumStr.SubString(NumLength+1-i*3-k,k);
        String strgr="";
 
        for (int j = 1; j<=k ; j++)
        {
            if (j==k-1 && NOG_Str[j] == '1')
            {
                strgr += ToLowerCase(El_Nine[StrToInt(NOG_Str[k])], i==Groups && j==1);
                break;
            }
            else 
            {
                if (i==1 && j==k && NOG_Str[j] == '1') strgr += ToLowerCase("Одна", i==Groups && j==1);
                else if (i==1 && j==k && NOG_Str[j] == '2') strgr += ToLowerCase("Две", i==Groups && j==1);
                else strgr += ToLowerCase(All[k-j][StrToInt(NOG_Str[j])], i==Groups && j==1);
            }
        }
        String grName = "";
        if (i>0 && NOG_Str.ToInt() > 0) 
        {
            int LOG = NOG_Str.ToInt()%100;
            if (LOG > 10 && LOG < 19 ) grName = Group[i-1][2];
            else if (LOG%10 == 1) grName = Group[i-1][0];
            else if (LOG%10 > 1 && LOG%10 < 5) grName = Group[i-1][1];
            else grName = Group[i-1][2];
        }
        str+=strgr + grName;
    }
        
    Label1->Caption = str;
}
 
//---------------------------------------------------------------------------

Если тип входящей переменной использовать не int, а переделать процедуру под строковый (а также изменить строку 50 кода), тогда расширяя массив Group можно преобразовывать большие числа

Добавлено через 19 часов 12 минут
Расширяем возможности до дробных чисел...

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
//$$---- Form CPP ----
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{
    String Currency[2][4] = {{"рубль",   "рубля",   "рублей", "М"},
                 {"копейка", "копейки", "копеек", "Ж"}};
 
    try
    {
        Label1->Caption = ToText(Edit1->Text.ToDouble(), Currency);
    }
    catch(...)
    {
 
    }
}
 
String __fastcall ToLowerCase(String str, bool NotUse)
{
    return NotUse ? str : AnsiLowerCase(str);
}
 
String __fastcall TForm1::ToText(double Number, String Currency[2][4])
{
    String Group[4][3] = {{"тысяча ",   "тысячи ",    "тысяч "},
                  {"миллион ",  "миллиона ",  "миллионов "},
                  {"миллиард ", "миллиарда ", "миллиардов "},
                  {"триллион ", "триллиона ", "триллионов "}};
 
    String All[3][10] = {{"", "Один ", "Два ", "Три ", "Четыре ", "Пять ", "Шесть ", "Семь ", "Восемь ", "Девять "},
                 {"", "", "Двадцать ","Тридцать ","Сорок ","Пятьдесят ","Шестьдесят ","Семдесят ","Восемдесят ","Девяносто "},
                 {"","Сто ","Двести ", "Тристо ", "Четыресто ", "Пятьсот ", "Шестьсот ", "Семьсот ","Восемсот ","Девятсот "}};
 
    String El_Nine[10] = { "Десять ",    "Одиннадцать ", "Двенадцать ", "Тринадцать ",   "Четырнадцать ",
                   "Пятнадцать ", "Шестнадцать ", "Семнадцать ", "Восемнадцать ", "Девятнадцать " };
 
    String str = "";
    String FullStr = FloatToStr(Number);//IntToStr(Number);
    int DecPos = FullStr.Pos('.') > 0 ? FullStr.Pos('.') :
                 FullStr.Pos(',') > 0 ? FullStr.Pos(',') : FullStr.Length()+1;
 
    for (int s = 0; s <= (DecPos<FullStr.Length()); s++)
    {
        String NumStr = (!s ? FullStr.SubString(1,DecPos-1) : FullStr.SubString(DecPos+1,FullStr.Length()));
 
        int NumLength = NumStr.Length();
        int Groups = (NumLength-1)/3;
        for (int i = Groups; i>=0; i--)
        {
            int k = (i==Groups ? NumLength - Groups*3 : 3);
            String NOG_Str = NumStr.SubString(NumLength+1-i*3-k,k);
            String strgr="";
 
            for (int j = 1; j<=k ; j++)
            {
                bool LowerNotFirst = (s==0 && i==Groups && j==1);
                if (j==k-1 && NOG_Str[j] == '1')
                {
                    strgr += ToLowerCase(El_Nine[StrToInt(NOG_Str[k])], LowerNotFirst);
                    break;
                }
                else
                {
                    if ((j==k && NOG_Str[j] == '1') && (i>0 && Group[i-1][3] == "Ж" || Currency[s][3] == "Ж")) strgr += ToLowerCase("Одна ", LowerNotFirst);
                    else if ((j==k && NOG_Str[j] == '2') && (i>0 && Group[i-1][3] == "Ж" || Currency[s][3] == "Ж")) strgr += ToLowerCase("Две ", LowerNotFirst);
                    else strgr += ToLowerCase(All[k-j][StrToInt(NOG_Str[j])], LowerNotFirst);
                }
            }
            String grName = "";
            if (i>0 && NOG_Str.ToInt() > 0)
            {
                int LOG = NOG_Str.ToInt()%100;
                if (LOG > 10 && LOG < 19 ) grName = Group[i-1][2]+" ";
                else if (LOG%10 == 1) grName = Group[i-1][0]+" ";
                else if (LOG%10 > 1 && LOG%10 < 5) grName = Group[i-1][1]+" ";
                else grName = Group[i-1][2]+" ";
            }
            str+=strgr + grName;
        }
        int LOG = NumStr.ToInt()%100;
        if (LOG > 10 && LOG < 19 ) str += Currency[s][2] + " ";
        else if (LOG%10 == 1) str += Currency[s][0]+" ";
        else if (LOG%10 > 1 && LOG%10 < 5) str += Currency[s][1]+" ";
        else str += Currency[s][2]+" ";
    }
    return str;
}
 
//---------------------------------------------------------------------------
1
13.07.2010, 12:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2010, 12:43
Привет! Вот еще темы с ответами:

Число прописью - C++
Дано двухзначное число.Вывести его прописью. с помошью switch... бес понятия!помогите по быстрому,пожалуйста!

Число прописью - C++
Помогите сделать программу которая пишет числа прописью от 1 до 1000000, через оператор switch

Число прописью, от 1 до 99 на русском - C++
Программа работает, но не совсем правильно, отлично выводит числа от 1 до 20 потом при вводе 21 - выводит один один; 47 - выводит семь...

Sentence. Записать число прописью - C++
Once upon a time in a land far far away, inhabited only by math students, Iva and Vedran were discussing self-explanatory sentences. A part...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru