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

Форум программистов: 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 сообщение ] 


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

Зарегистрированные пользователи: Google [Bot], Yahoo [Bot]


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

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