Главная  Коды и программы   Статьи   Юмор   Картинки   Карта сайта   Гостевая книга 
  Коды и программы -> Сумма прописью Си ->

 
 Генератор поздравлений (Palm OS)
 Отмазка (Palm OS)
 Летающие снежинки
 Сумма прописью PHP
 Сумма прописью Си
 Netmonitor в телефонах Siemens

 
Виртуальный дневник
Виртуальный дневник



 

Все это Я
 

Андрюха

Aikido in Minsk
Aikido

  Сумма прописью

Исходные коды для самой востребованной функции в коммерческих программах!
Автор неизвестен.




#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <math.h>

#pragma warning(disable:4514)

static double vseg[] = { 1e9, 1e6, 1e3, 1};
static char dsot[][11] =
{ "",          "сто ",       "двести ",   "триста ",     "четыреста ",
   "пятьсот ",  "шестьсот ",  "семьсот ",  "восемьсот ",  "девятьсот "};
static char ddec[][13] =
{ "",          "десять ",    "двадцать ", "тридцать ",   "сорок ",
   "пятьдесят ","шестьдесят ","семьдесят ","восемьдесят ","девяносто "};
static char dde [][14] =
{ "одиннадцать ", "двенадцать ",  "тринадцать ",
   "четырнадцать ","пятнадцать ",  "шестнадцать ",
   "семнадцать ",  "восемнадцать ","девятнадцать " };
static char ded [][8] =
{ "",          "один ",      "два ",      "три ",        "четыре ",
   "пять ",     "шесть ",     "семь ",     "восемь ",     "девять "};
static char dedt[][6]    = { "одна ", "две " };
static char dseg[][9]    = { "миллиард", "миллион", "тысяч", "рубл" };
static char dsem[][3][5] = {{ " ",  "а ", "ов " },  // миллиард
                             { " ",  "а ", "ов " },  // миллион
                             { "а ", "и ", " "   },  // тысяч
                             { "ь ", "я ", "ей " },  // рублей
                             { "йка","йки","ек"  }}; // копеек

static int
HowTell (long n)
{
   n %= 100;
   if (n >= 10  &&  n <= 20) return  3;
   n %= 10;
   return  n == 1? 1: n <= 4  &&  n > 0? 2: 3;
}

static double
Round (double op)
{
   return  floor(op + 0.5);
}

static double
Round (double op,double pow)
{
   if (pow <= 0.)  return  op;
   if (op>0. && op<pow || op<0. && op>pow) return 0.;
   op = floor(op/pow + 0.5) * pow;
   return  op>0. && op<pow || op<0. && op>pow? 0.: op;
}

char*
WriteSum (double v,char *buf,bool kop,bool up)
{
   buf[0] = 0;
   if (v >= 1e12  ||  v <= 0.009) return buf;
   v = Round(v,0.01);
   for (int seg=0; seg<4; seg++) {
     int vt = int(v / vseg[seg]);
     v -= vseg[seg] * vt;
     if (vt  ||  seg == 3) {
       int how = HowTell(vt);
           // 1 - миллиард   миллион   тысяча рубль  копейка
           // 2 - миллиарда  миллиона  тысячи рубля  копейки
           // 3 - миллиардов миллионов тысяч  рублей копеек
       if (vt) {
         strcat(buf,dsot[vt/100]);  vt %= 100;
         if (vt >= 20  ||  vt <= 10) {
           strcat(buf,ddec[vt/10]);  vt %= 10;
           if (seg == 2  &&  (vt == 1  ||  vt == 2))
                 strcat(buf,dedt[vt-1]);
           else  strcat(buf,ded[vt]);
         } else  strcat(buf,dde[vt-11]);
       } else if (buf[0] == 0)  strcat(buf,"ноль ");
       strcat(buf,dseg[seg]);
       strcat(buf,dsem[seg][how-1]);
     }
   }
   if (kop)
       sprintf(buf+strlen(buf),"%02.0lf копе%s",
                               v*100,
                               dsem[4][HowTell((long)Round(v*100))-1]);

   if (up) CharUpper(buf);
   else    CharUpperBuff(buf,1);
   return  buf;
}


 
 Главная  Коды и программы   Статьи   Юмор   Картинки   Карта сайта   Гостевая книга 
Яндекс цитирования
©копировано верно Виталий Марченко.2002-2010
X