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

Программа, которая переводит числа в слова - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Указатели в C++. http://www.cyberforum.ru/cpp-beginners/thread337499.html
Я никак не могу понять чем отличаются следующие объявления: int const * pTemp; const int * pTemp; И вот еще что не понятно: const char = "Some string" char const = "Some other string"; Еще в одном исходнике видел: int const iTemp;
C++ файл .obj и его редактирование привет всем. пытался кое что вырезать и скомпилировать один проект (созданный не мной) ошибка компилятора: blabla.obj : error LNK2019: ссылка на неразрешенный внешний символ "int __cdecl GetDDS(char *)" (?GetDynDNS@@YAHPAD@Z) в функции "void __cdecl SPass(void)" (?SPass@@YAXXZ) Может можно как-то отредактировать файл .obj ? http://www.cyberforum.ru/cpp-beginners/thread337486.html
C++ Идентификатор не определен
разобрался :)
C++ Написание приложениея под винду
Доброй ночи. Вопрос глупый, но он есть.Прошу Вашей помощи. Научился немного писать консольный приложения, сейчас хочу начинать учится писать программульки для винды в людском виде. Вообщем с окнами и т.д. и т.п. Порыскал в инете и столкнулся с кучой инфы. Подскажите с чего лучше начать,литература или видеоуроки. И как лучше начать это дело :) Всем заранее спасибо.
C++ Посоветуйте парсер kml и igc на С http://www.cyberforum.ru/cpp-beginners/thread337433.html
Нужна библиотека, которая из файла igc и kml вытаскивает точки и позволяет бы работать с ними. Буду благодарен за помощь!
C++ Ошибочки в функции bool dfs (int i1, int pArray,int q) { bool test; int n=10, m=12; int d1; for(int d=0; d<m; d++) { if(pArray==1) { for(int d1=0; d1<n; d1++) подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
31.07.2011, 10:55     Программа, которая переводит числа в слова
Читайте правильные книжки... Вот из моей С++.Экспресс-курс:
Здесь только руссификацию надо заменить на что-нить более подходящее. А то написано было еще в 2002 году для VC++6.

Числа — прописью
Напишем программу, которая чрезвычайно востребована в реальной жизни: вывод числа прописью. Мы не будем писать совсем уж универсальный вариант, так как наша цель — просто поучиться использовать тип string в реальной программе. Ограничим наши числа положительными целыми в диапазоне от 1 до 999 999 999 — такие числа целиком помещаются в целую переменную типа int.

Замечание
Если требуются большие числа, то в системе Visual C++ мы можем использовать нестандартный целый тип __int64. Стандартное решение — использовать структуру с двумя полями типа long.

Мы не зря написали число 999 999 999 с пробелами между тройками чисел — числительные от 1 до 999 пишутся одинаково, независимо от местоположения. Вся разница — в слове после очередной тройки: старшая — это миллионы, средняя — это тысячи, а младшая — непосредственно рубли. Поэтому естественно написать функцию, которая получает число от 1 до 999, и выдает результат типа string. В этом случае мы сможем инкапсулировать все массивы числительных в этой процедуре. Однако миллионы и рубли у нас мужского рода, а тысячи — женского. Поэтому вместо «один» и «два» надо писать «одна» и «две». В остальном числительные полностью совпадают. Поэтому мы должны прописать второй параметр типа bool, который всегда будет false, а для тысяч — true (листинг 5.6).
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
Листинг 5.6. Функция toNumeral — трехзначное число прописью
 //--обрабатывает только 3-хзначное число
string toNumeral(unsigned long Number, bool Thousands)
{ string units    [] = 
  {"один","два","три","четыре","пять","шесть", "семь","восемь","девять"}; 
  string tens     [] = 
  {"десять","двадцать","тридцать","сорок","пятьдесят","шестьдесят",
   "семьдесят", "восемьдесят","девяносто"}; 
  string hundreds [] =
  {"сто","двести","триста","четыреста","пятьсот","шестьсот","семьсот",
   "восемьсот","девятьсот"}; 
  string secondten[] = 
  {"одиннадцать","двенадцать","тринадцать","четырнадцать","пятнадцать",
   "шестнадцать","семнадцать","восемнадцать","девятнадцать"}; 
  string Women    [2]= {"одна","две"};    
  string result("");                                // пустая строка-результат
  typedef unsigned char byte;   
  byte digits[3] = {0};                 // - цифры числа
  unsigned long n = Number;
  digits[0] = n % 10;               //--младшая цифра
  digits[1] = (n / 10) % 10;            //--средняя цифра
  digits[2] = n / 100;                  //--старшая цифра
  if (digits[2]>0) result +=(hundreds[digits[2]-1]+" "); 
  if (digits[1]>0)
  { if ((digits[1]==1)&&(digits[0]!=0)) 
    { result +=(secondten[digits[0]-1]+" "); return result; }
    else result +=(tens[digits[1]-1]+" ");
  }
  if (digits[0]>0) 
  { if (((digits[0]>2)&&(digits[1]!=1))||(!Thousands)) 
      result +=(units[digits[0]-1]+" ");
    else result +=(Women[digits[0]-1]+" ");
  }
  return result;
}
Вначале объявляются и инициализируются массивы числительных: в каждом массиве ровно 9 элементов. Затем объявляется и заполняется массив для трех цифр числа: младшая цифра — по меньшему индексу. Наконец, начинаются проверки цифр и получение строки-результата. Первоначально строка-результат пустая. Если очередная цифра не равна нулю, то к строке-результату прицепляется очередное числительное. Особый случай составляет вторая цифра: если она равна 1, то мы тут же проверяем третью. Если она не равна нулю, то мы прицепляем числительное из массива secondten и выходим. При определении единиц для 1 или 2 используется массив Women для числительного женского рода.
Обратите также внимание на то, как вычисляется индекс числительного — это довольно распространенный прием. Протестируем нашу функцию (листинг 5.7).
C++
1
2
3
4
5
6
7
8
9
10
Листинг 5.7. Тестовая программа для функции toNumeral
int main()
{ unsigned long Number[] = 
  {1,2,9,10,11,19,20,21,22,45,100,101,102,109,110,118,150,870,912,999};
  int k = sizeof(Number)/sizeof(unsigned long);
  char s[200]={0}; 
  for (int i = 0; i < k; ++i)
  { CharToOem(toNumeral(Number[i],true).c_str(),s); cout<<s<<endl;  }
  return 0;
}
В этой программе мы объявили тестовый массив Number, и вычислили его длину. Затем в цикле выполняется непосредственное обращение к функции перекодировки. Мы не стали использовать написанные нами ранее функции Rus (см. листинги 4.9 и 5.4). Первый операнд написан несколько необычно. Поскольку мы не записали результата в переменную, система создает анонимный временный объект. Наша функция toNumeral возвращает string, поэтому у результата (временного объекта) есть метод c_str(). Использование временных объектов — полезный прием, которым мы еще не раз будем применять.

Теперь напишем функцию, которая будет формировать наше число прописью. Очевидно, эта функция должна трижды вызвать функцию toNumeral, прицепляя после каждого вызова соответствующее слово (листинг 5.8).
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
Листинг 5.8. Сумма — прописью  
string Numeral(unsigned int Number)
{   string what_[3][3] = {{"миллион", "миллиона", "миллионов" },
                {"тысяча",  "тысячи",   "тысяч"     },
                {"рубль","рубля","рублей"}};
    unsigned int t = Number;
    unsigned int treads[3];     //--вычисление троек числа
    treads[0]=t%1000; treads[1]=t/1000%1000; treads[2]=t/1000000;
    string result = "";
    if (treads[2] > 0) { result +=toNumeral(treads[2], false);
    if (treads[2]/10 % 10==1) result += what_[0][2];                    //-1-
    else 
        switch (treads[2] % 10)
    { case 0: case 5: case 6: case 7: case 8: case 9: 
                                           result += what_[0][2]; break;
      case 2: case 3: case 4: result += what_[0][1]; break;
      case 1:                  result += what_[0][0]; break;
    }
    result+=' ';
    }
    if (treads[1] > 0) { result +=toNumeral(treads[1], true);
    if (treads[1]/10 % 10==1) result += what_[1][2];                      //-2-
    else switch (treads[1] % 10)
    { case 0: case 5: case 6: 
          case 7: case 8: case 9: result += what_[1][2]; break;
      case 2: case 3: case 4: result += what_[1][1];break;
      case 1:                  result += what_[1][0];break;
    }
    result+=' ';
    }
       result +=toNumeral(treads[0], false);
    if (treads[0]/10 % 10==1) result += what_[2][2];                      //-3-
    else switch (treads[0] % 10)
    { case 0: case 5: case 6: 
         case 7: case 8: case 9: result += what_[2][2];break;
      case 2: case 3: case 4: result += what_[2][1];break;
      case 1:            result += what_[2][0];break;
    }
    result+=' ';
    return result;
}
Как видите, получилась довольно простая программа. Единственное, на что надо обратить внимание — это помеченные цифрам строки: если у нас вторая цифра в тройке равна 1, то можно сразу прицеплять нужное слово. В стальных случаях мы должны анализировать последнюю цифру. Можно еще больше упростить функцию, если выделить в отдельную функцию совершенно однотипные действия в операторе switch, но оставим это на упражнения.
Протестировать нашу программу очень просто: надо в листинге 5.7 увеличить тестовый массив, задав уже и тысячи, и миллионы, и заменить первый параметр в вызове функции CharToOem
C++
1
CharToOem(Numeral(Number[i]).c_str(), s);
 
Текущее время: 15:26. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru