Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 сентября!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.

Запись числа прописью

Алгоритм довольно ясен из исходника на Си++ by 'Graph'

 #include <stdio.h>
 #include <string.h>
 
 #define DG_POWER 6              // Энто допустимая степень числа 1000 для __int64:
                                 // При необходимости его легко увеличить,
 struct s_POWER {                // дополнив массив 'a_power' и заменив
   int sex;                      // тип __int64 на более серьезный
   char *one;
   char *four;
   char *many;
 } a_power[]= {
   {0,NULL          ,NULL           ,NULL            },  // 1
   {1,"тысяча "     ,"тысячи "      ,"тысяч "        },  // 2
   {0,"миллион "    ,"миллиона "    ,"миллионов "    },  // 3
   {0,"миллиард "   ,"миллиарда "   ,"миллиардов "   },  // 4
   {0,"триллион "   ,"триллиона "   ,"триллионов "   },  // 5
   {0,"квадриллион ","квадриллиона ","квадриллионов "},  // 6
   {0,"квинтиллион ","квинтиллиона ","квинтиллионов "}   // 7
 };
 
 struct s_UNIT {
   char *one[2];
   char *two;
   char *dec;
   char *hun;
 } digit[10]= {
   {{""       ,""       },"десять "      ,""            ,""          },
   {{"один "  ,"одна "  },"одиннадцать " ,"десять "     ,"сто "      },
   {{"два "   ,"две "   },"двенадцать "  ,"двадцать "   ,"двести "   },
   {{"три "   ,"три "   },"тринадцать "  ,"тридцать "   ,"триста "   },
   {{"четыре ","четыре "},"четырнадцать ","сорок "      ,"четыреста "},
   {{"пять "  ,"пять "  },"пятнадцать "  ,"пятьдесят "  ,"пятьсот "  },
   {{"шесть " ,"шесть " },"шестнадцать " ,"шестьдесят " ,"шестьсот " },
   {{"семь "  ,"семь "  },"семнадцать "  ,"семьдесят "  ,"семьсот "  },
   {{"восемь ","восемь "},"восемнадцать ","восемьдесят ","восемьсот "},
   {{"девять ","девять "},"девятнадцать ","девяносто "  ,"девятьсот "}
 };
 
 string dig2str (__int64 p_summa, int p_sex, char *p_one, char *p_four, char *p_many)
 {
   int    i,mny;
   string str,result="";
   __int64 divisor; //делитель
 
   a_power[0].sex  = p_sex;
   a_power[0].one  = p_one;
   a_power[0].four = p_four;
   a_power[0].many = p_many;
 
   if(p_summa == (__int64)0) return string("ноль ")+p_many;
   if(p_summa <  (__int64)0) {result="минус "; p_summa = -p_summa;}
 
   for(i=0,divisor=(__int64)1; i<DG_POWER; i++)
     divisor *= (__int64)1000;
   for(i=DG_POWER-1; i>=0; i--){
     divisor /= 1000;
     mny = (int)(p_summa / divisor);
     p_summa %= divisor;
     str="";
     if(mny==0){
       if(i>0) continue;
       str += a_power[i].one;
     }else{
       if(mny>=100){str += digit[mny/100].hun; mny%=100;}
       if(mny>=20 ){str += digit[mny/10 ].dec; mny%=10; }
       if(mny>=10 ) str += digit[mny-10 ].two; else
       if(mny>=1  ) str += digit[mny].one[a_power[i].sex];
       switch(mny){
         case 1: str += a_power[i].one; break;
         case 2: case 3:
         case 4: str += a_power[i].four; break;
        default: str += a_power[i].many; break;
       };
     }
     result += str;
   }
   return result;
 }
 


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS