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

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

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

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

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

Я бы тоже внес свою лепту в форумский FAQ. Есть у меня программа которая конвертирует число от 1 до 999 в прописную строку.. Не раз наблюдал людей которым она необходима..
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
08.01.2010, 15:10     Вывести число прописью #2
2breeve: оформи в виде функции.
Причем лучше на C.
Не всем нужен C++.
И лучше чтобы функция брала числа от 0 до 999999 хотя бы.
А совсем хорошо - от 0 до MAX_INT.

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

Функция на С++:
string itonumeral_ru( int n );

Добавлено через 7 минут
Функции не должны печатать числительное, а должны записывать его в строку.
А дальше уже вызывающая программа разберется - печатать его, или записывать в файл.
breeve
74 / 74 / 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;                                
}
Можно было бы тысячи обрабатывать рекурсией, но там проблема была в склонениях(один,два - одна, две), тогда кода было бы почти в двое меньше..
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
10.01.2010, 21:14     Вывести число прописью #4
Добавил ссылку в Большая коллекция решенных задач на эту тему.
Ждем отзывов
Day
1154 / 959 / 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;
}
/**********************/
Этот алгоритм несложно модифицировать и для более длинных чисел,
стоит только выбрать для них подходящее представление.
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
11.01.2010, 00:35     Вывести число прописью #6
long в 4 байта дает максимум миллиард, поэтому дальше не нужно
Day
1154 / 959 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
11.01.2010, 11:18     Вывести число прописью #7
Цитата Сообщение от odip Посмотреть сообщение
long в 4 байта дает максимум миллиард, поэтому дальше не нужно
Ваша правда, но алгоритм легко обобщается и для более длинных чисел с подходящим представлением.
А обрезать его до миллиарда, выкинуть лишнее - еще легче
טאַראַס
7 / 7 / 1
Регистрация: 11.01.2010
Сообщений: 123
14.01.2010, 06:39     Вывести число прописью #8
А до триллионов с дробями можно?

Добавлено через 1 минуту
Я делал и сам. Просто хочу сравнить. + может ещё кому пригодиться.
Day
1154 / 959 / 57
Регистрация: 29.10.2009
Сообщений: 1,385
14.01.2010, 10:42     Вывести число прописью #9
Цитата Сообщение от טאַראַס Посмотреть сообщение
А до триллионов с дробями можно?
Приведи, пожалуйста, пример
"число(с дробями) - его текст"
טאַראַס
7 / 7 / 1
Регистрация: 11.01.2010
Сообщений: 123
14.01.2010, 11:24     Вывести число прописью #10
Я просто криво написал. Я имел ввиду поддержку и целых, и дробей: 423185.434 в "четыреста двадцать тысяч сто восемьдесят пять целых четыреста тридцать четыре сысячных", а 43252345 в "сорок три миллиона двести пятьдесят две тысячи триста сорок пять".
odip
Эксперт С++
7155 / 3295 / 59
Регистрация: 17.06.2009
Сообщений: 14,164
14.01.2010, 12:54     Вывести число прописью #11
Я делал и сам. Просто хочу сравнить. + может ещё кому пригодиться.
Давай - выберем лучший вариант
Day
1154 / 959 / 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;
}
Если надо считать более длинные числа, давайте придумаем их представление.
У меня есть одно на примете, могу выложить.
PointsEqual
ниначмуроФ
833 / 517 / 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 массив - самое лучшее
Хохол
Эксперт C++
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);
}
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;
}
 
//---------------------------------------------------------------------------
Oleshka777
0 / 0 / 0
Регистрация: 28.06.2011
Сообщений: 3
24.11.2012, 15:10     Вывести число прописью #16
народ, помогите плиз.
беру предложеные варианты на с++ и ни один не работает. что делать?
проект создаю в визуал студио 10. консольное приложение вин32
Байт
Эксперт C
15536 / 9878 / 1484
Регистрация: 24.12.2010
Сообщений: 18,475
24.11.2012, 15:46     Вывести число прописью #17
Цитата Сообщение от Oleshka777 Посмотреть сообщение
и ни один не работает.
Расшифруйте, плз.
Oleshka777
0 / 0 / 0
Регистрация: 28.06.2011
Сообщений: 3
25.11.2012, 13:40     Вывести число прописью #18
ругается сильно, выдает кучу ошибок, пробовал разобраться не получилось.
Нашел другой код, не много доделал,все работает.
Не могу только сделать чтоб русский писало.в команде не верный параметр, и какой надо не пойму.
_sg
3381 / 3213 / 216
Регистрация: 12.05.2012
Сообщений: 2,213
07.02.2015, 22:36     Вывести число прописью #19
как вариант, Сommon Lisp:
Lisp
1
2
> (1- (expt 10 66))
999999999999999999999999999999999999999999999999999999999999999999
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
> (format nil "~r" (1- (expt 10 66)))
"nine hundred and ninety-nine vigintillion, nine hundred and ninety-nine novemdecillion, 
nine hundred and ninety-nine octodecillion, nine hundred and ninety-nine septendecillion, 
nine hundred and ninety-nine sexdecillion, nine hundred and ninety-nine quindecillion, 
nine hundred and ninety-nine quattuordecillion, nine hundred and ninety-nine tredecillion, 
nine hundred and ninety-nine duodecillion, nine hundred and ninety-nine undecillion, nine 
hundred and ninety-nine decillion, nine hundred and ninety-nine nonillion, nine hundred 
and ninety-nine octillion, nine hundred and ninety-nine septillion, nine hundred and 
ninety-nine sextillion, nine hundred and ninety-nine quintillion, nine hundred and ninety-nine 
quadrillion, nine hundred and ninety-nine trillion, nine hundred and ninety-nine billion, 
nine hundred and ninety-nine million, nine hundred and ninety-nine thousand, 
nine hundred and ninety-nine"
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
31.03.2015, 22:18     Вывести число прописью
Еще ссылки по теме:

C++ Вывести прописью введенное пользователем число
C++ Число прописью
Вывести число прописью C++
C++ Вывести число прописью на английском языке
C++ Вывести трехзначное число прописью

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

Или воспользуйтесь поиском по форуму:
NextGen25
2 / 2 / 1
Регистрация: 01.03.2015
Сообщений: 131
31.03.2015, 22:18     Вывести число прописью #20
Цитата Сообщение от manfeese Посмотреть сообщение
ToText(num);
Привет не подскажите как подключить функцию , если я правильно понимаю
ошибка call to undedined function 'ToText'
Yandex
Объявления
31.03.2015, 22:18     Вывести число прописью
Ответ Создать тему
Опции темы

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