→ Для вступления в общество новичков и профессионалов программирования, пожалуйста нажмите здесь ...

Форум программистов: C++, Basic, Delphi, Pascal, JavaScript
Логин: Пароль:
Запомнить?  
@Mail.ru



Начать новую тему Ответить на тему  [ 1 сообщение ] 
помогите пожалуйста 
Автор Сообщение
Начинающий

Регистрация: 18.05.2012
Сообщения: 1

Репутация: 0 [ ? ]
Сообщение помогите пожалуйста
как реализовать данную программу с помощью классов

~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;
}
/


18.05.2012 10:34
Профиль Отправить email
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ 1 сообщение ] 


Кто сейчас на конференции

Зарегистрированные пользователи: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
cron
© 2013 «Форум программистов Украины»