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

Как данную программу реализовать при помощи классов - C++

Восстановить пароль Регистрация
 
feniks-igor@mai
Сообщений: n/a
18.05.2012, 19:33     Как данную программу реализовать при помощи классов #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
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
168
169
170
171
172
173
174
175
176
177
178
179
~cpp
 
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <iostream.h>
 
#pragma hdrstop
 
//---------------------------------------------------------------------------
 
#pragma argsused
 
// класс для вывода кириллицы в консоль
class Rus 
{
public:
Rus(const char* msg): data(new char [lstrlen(msg)+1]) {CharToOemA(msg, data);}
~Rus() {delete [] data;};
operator const char* () const {return data;}
private:
    char* data;
};
int DigitsCount(double num, int* out)
{
 if (num == 0.0f) return 0;
 *out = (int)((num * 100) + 0.5);
return 2;
}
int DigitsCount(long num)
{
 int count = 0;
 while (num)
 {
 num /= 10;
 ++count;
 }
 return count;
}
void IntToWords(long num, int cnt, char* result)
{
  //массив, для определения разряда, в котором находимся(сотни,десятки,еденицы...)   
 int osn[11]={0,1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000};
 
  //массив оснований
    char *basis[11][10]={
{"","","","","","","","","",""},{"","один","два","три","четыре","пять","шесть","семь","восемь","девять"},{"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},{"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},{"","одна","две","три","четыре","пять","шесть","семь","восемь","девять"},{"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},{"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},{"","один","два","три","четыре","пять","шесть","семь","восемь","девять"},{"","десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят","семьдесят","восемьдесят","девяносто"},    {"","сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот","восемьсот","девятьсот"},  {"","один","два","три ","четыре","пять","шесть","семь","восемь","девять"}}; 
    
//массив окончаний
char *termination[10][10]={
 {"","","","тысяч","","","миллионов","","","миллиардов"}, {"","","","тысяча","","","миллион","","","миллиард"},
 {"","","","тысячи","","","миллиона","","","миллиарда"}, {"","","","тысячи","","","миллиона","","","миллиарда"},
 {"","","","тысячи","","","миллиона","","","миллиарда"}, {"","","","тысяч","","","миллионов","","","миллиардов"},
 {"","","","тысяч","","","миллионов","","","миллиардов"}, {"","","","тысяч","","","миллионов","","","миллиардов"},
 {"","","","тысяч","","","миллионов","","","миллиардов"}, {"","","","тысяч","","","миллионов","","","миллиардов"}};
 
char *dec[10]={"десять","одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать",  "шестнадцать","семнадцать","восемнадцать","девятнадцать"};
 
 int celoe;
 
 while (num > 0)
 {
 // обрабатываем числа 10-19
 if ((cnt % 3) == 2 && ((num/osn[cnt]) == 1))
 {
 // отсекаем цифру 1, т.к. определили ее предыдущим условием
 num %= osn[cnt];
 --cnt;
 // число в текущем разряде (т.е. после 1)
 celoe = num/osn[cnt];
 // оставшееся число
 num %= osn[cnt];
 --cnt;
 // пополнение результата строковым представлением числа 10-19
 strcat(result, dec[celoe]);
 // пополнение результата классом чисел (тысячи, миллионы, ...)
 strcat(result, termination[0][cnt]);
 if (strcmp(termination[0][cnt], "") != 0)
 strcat(result, " ");
  }
  // иначе обрабатываем единицы или сотни
 else
 {
 // отсекаем следующую цифру
 celoe = num / osn[cnt];
 num %= osn[cnt];
 // пополняем результат строковым выражением этой цифры в зависимости от ее разряда
 strcat(result, basis[cnt][celoe]);
 --cnt;
 strcat(result, " ");
 // если осталось целое количество классов чисел, то...
 if ((cnt % 3) == 0)
 {
 // пополняем результат классом чисел (тысячи, миллионы, ...)
 strcat(result, termination[celoe][cnt]);
 if (strcmp(termination[celoe][cnt], "") != 0)
strcat(result, " ");
}
}
}
}
 
char *towords(double numb)
{
    char *dollars[10]={"долларов","доллар","доллара","доллара","доллара","долларов","долларов",  "долларов","долларов", "долларов"};
 
 char *cents[10]={"центов","цент","цента","цента","цента","центов","центов","центов","центов","центов"};
 
 // выделение целой и дробной части
 long    n1 = numb;
 double  n2 = numb - n1;
 
    // подсчет количества цифр...
    int     cntDollars = DigitsCount(n1);
    int     lastDigitDollar = n1 % 10;
 
    // ... и преобразование дробной части к целому числу центов
    int     cent;
    int     cntCents = DigitsCount(n2, &cent);
    int     lastDigitCent = cent % 10;
 
    if (cntDollars == 0 && cntCents == 0) return "ноль долларов ноль центов";
 
    char    result[512] = "";
    bool    dollarsExist = false;
 
    // конвертируем доллары (n1)
    if (cntDollars > 0)
    {
    dollarsExist = true;
 
    IntToWords(n1, cntDollars, result);
    strcat(result, dollars[lastDigitDollar]);
    }
 
    // конвертируем центы (n2)
    if (cntCents > 0)
    {
    if (dollarsExist)
    strcat(result, " ");
 
    IntToWords(cent, cntCents, result);
    strcat(result, cents[lastDigitCent]);
    }
 
    return result;
    }
 
    int main(int argc, char* argv[])
    {             
    char    str[100];
    char    ch;
    double  inputNumber;
 
    do
    {
    cout << Rus("Введите число") << endl;
    cin.getline(str, 128);
 
    inputNumber = atof(str);
 
    if (inputNumber < 0)
    cout << Rus("Вы ввели отрицательное число") << endl;
    else if (inputNumber > std::numeric_limits<long>::max())
    cout << Rus("Вы ввели число более максимального предела - ") << std::numeric_limits<long>::max() << endl;
    else
     {
    cout << Rus("Вы ввели: ") << Rus(towords(inputNumber)) << endl;
     }
 
     cout << Rus("Хотите продолжить? (Y = да)") << endl;
     ch = cin.get();
     cin.get();
     }
     while ((ch == 'y') || (ch == 'Y'));
 
    return 0;
    }
   /
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.05.2012, 19:33     Как данную программу реализовать при помощи классов
Посмотрите здесь:

Составить программу для решения задачи с целыми числами при помощи циклов C++
C++ написать программу, при помощи которой можно проверять синтаксические ошибки слов текста, хранящегося в файле
C++ Написать программу учета сдачи зачетов при помощи битовых полей (исправить код)
Написать программу,которая находит среднее значение массива целых чисел при помощи функции C++
C++ как написать данную программу через функцию?
Как реализовать наследование классов C++
C++ Как скомпилировать данную программу?
Как правильно переделать данную программу используя указатели? C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 1
19.05.2012, 09:49     Как данную программу реализовать при помощи классов #2
feniks-igor@mai, она и так реализована при помощи классов. Задача решена!
Yandex
Объявления
19.05.2012, 09:49     Как данную программу реализовать при помощи классов
Ответ Создать тему
Опции темы

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