Программирование на C и C++

Онлайн справочник программиста на C и C++

перевод чисел в текст

Аватар пользователя merkul40
пн, 04/30/2018 - 21:57 -- merkul40

Данная программа принимает числа (до 6 знаков) в цифровом виде и переводит их в текстовый вид. Не написан обработчик чисел типа Х00ХХХ (если два вторых знака или второй или третий знаки равны 0) - будет выдавать ошибку. Писать не буду - не хочу. Кому надо - сложного ничего нет.
Собственно текст.

//#include <QCoreApplication>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

char printing (const char*[], const unsigned int);
unsigned int counting(const char*[], float wLsum);

int main()
{
    const char * number[] = {"one", "two", "three", "four", "five", "six",
                             "seven",
                      "eight", "nine", "ten", "eleven",/*10*/ "twelve", "thirteen",
                      "fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
                      "nineteen", "twenty"/*19*/, "thirty", "fourty", "fifty", "sixty",
                      "seventy", "eighty", "ninety", "hundred", "thousand",/*28*/ "/n"};//30
    //int size = 27;
    char sum[10];
    fgets (sum, 10, stdin);
    if (ferror(stdin))          //ОБРАБОТЧИК ОШИБОК
        {
         printf("File error\n");
             }
    printf("%s\n", sum);
    //printing(number, size);
    float lsum = atof(sum);
    //printf("%f\n", lsum);
    counting(number, lsum);
    //printf("%d\n", counting(lsum, ));
}

unsigned int counting(const char *wNumber[], float wLsum)
{
    void *if2(const char *wwNumber[], const float wNum);
    void *if3(const char *wwNumber[], const float wNum);
    void *if4(const char *wwNumber[], const float wNum);
    void *if5(const char *wwNumber[], const float wNum);
    void *if6(const char *wwNumber[], const float wNum);

    int  num = wLsum;
    int counter = 0;//количество знаков до запятой

    while (wLsum >= 1)//блок считает количество знаков до запятой
        //РАБОТАЕТ ПРАВИЛЬНО!!!!!!!!!!!!!!!!!
    {
        wLsum /= 10;
        counter++;
        }

    if (num == 0)
    {
        printf("zero\n");
        }  
    //printf("%d\n", counter);

   while (counter > 0)
    {
           if (counter == 6)
           {
               if6(wNumber, num);
               counter--;
               num = num - (int(num / 100000) * 100000);
                }

           if (counter == 5)
              {
                if5(wNumber, num);

                if (int (num/10000) == 1)
                {
                    counter -= 2;
                    num -= (int(num / 10000) * 10000);
                    num -=(int(num / 1000) * 1000);
                    }
                else
                {
                    counter--;
                    num = num - (int(num / 10000) * 10000);
                    }                
                }

            if (counter == 4)
            {
                if4(wNumber, num);
                num = num - (int(num / 1000) * 1000);
                counter--;
                }

            if (counter == 3)
            {                
                if3(wNumber, num);
                num = num - (int(num / 100) * 100);
                counter--;                
                }

            if (counter == 2 || counter == 1)
            {
                if2(wNumber, num);
                 break;
                }          
            }

   return counter;
}

//ЕСЛИ 6 ---- ФУНКЦИЯ ОБРАБАТЫВАЕТ И ПЕЧАТАЕТ 6-ЗНАЧНЫЕ ЧИСЛА
void *if6(const char *wwNumber[], const float wNum)
{
    float num = wNum;
    switch (int (num / 100000))
    {
    case 1:
        printf("%s %s ", wwNumber[0], wwNumber[27]);
        break;

    case 2:
        printf("%s %s ", wwNumber[1], wwNumber[27]);
        break;

    case 3:
        printf("%s %s ", wwNumber[2], wwNumber[27]);
        break;

    case 4:
        printf("%s %s ", wwNumber[3], wwNumber[27]);
        break;

    case 5:
        printf("%s %s ", wwNumber[4], wwNumber[27]);
        break;

    case 6:
        printf("%s %s ", wwNumber[5], wwNumber[27]);
        break;

    case 7:
        printf("%s %s ", wwNumber[6], wwNumber[27]);
        break;

    case 8:
        printf("%s %s ", wwNumber[7], wwNumber[27]);
        break;

    case 9:
        printf("%s %s ", wwNumber[8], wwNumber[27]);
        break;

    default:
        printf("Error6\n");
        break;
            }
    }

//ЕСЛИ 5 ---- ФУНКЦИЯ ОБРАБАТЫВАЕТ И ПЕЧАТАЕТ 5-ЗНАЧНЫЕ ЧИСЛА
void *if5(const char *wwNumber[], const float wNum)
{
    float num = wNum;
    switch (int (num / 10000))
    {
    case 1://НАДО СДЕЛАТЬ ОБРАБОТЧИК ЧИСЕЛ ОТ 10 ДО 19
        switch(int (num / 1000))
        {
            case 10:
                printf("%s %s ", wwNumber[9], wwNumber[28]);
                break;

            case 11:
                printf("%s %s ", wwNumber[10], wwNumber[28]);
                break;

            case 12:
                 printf("%s %s ", wwNumber[11], wwNumber[28]);
                 break;

            case 13:
                printf("%s %s ", wwNumber[12], wwNumber[28]);
                break;

            case 14:
                printf("%s %s ", wwNumber[13], wwNumber[28]);
                break;

            case 15:
                printf("%s %s ", wwNumber[14], wwNumber[28]);
                break;

            case 16:
                printf("%s %s ", wwNumber[15], wwNumber[28]);
                break;

            case 17:
                printf("%s %s ", wwNumber[16], wwNumber[28]);
                break;

            case 18:
                printf("%s %s ", wwNumber[17], wwNumber[28]);
                break;

            case 19:
                printf("%s %s ", wwNumber[18], wwNumber[28]);
                break;

            default:
                printf("Error51\n");
                break;
            }
        break;
    case 2:
        printf("%s ", wwNumber[19]);
        break;

    case 3:
        printf("%s ", wwNumber[20]);
        break;

    case 4:
        printf("%s ", wwNumber[21]);
        break;

    case 5:
        printf("%s ", wwNumber[22]);
        break;

    case 6:
        printf("%s ", wwNumber[23]);
        break;

    case 7:
        printf("%s ", wwNumber[24]);
        break;

    case 8:
        printf("%s ", wwNumber[25]);
        break;

    case 9:
        printf("%s ", wwNumber[26]);
        break;

    default:
        printf("Error5\n");
        break;
            }
    }

//ЕСЛИ 4 ---- ФУНКЦИЯ ОБРАБАТЫВАЕТ И ПЕЧАТАЕТ 4-ЗНАЧНЫЕ ЧИСЛА
void *if4(const char *wwNumber[], const float wNum)
{
    float num = wNum;
    switch (int (num / 1000))
    {
    case 1:
        printf("%s %s ", wwNumber[0], wwNumber[28]);
        break;

    case 2:
        printf("%s %s ", wwNumber[1], wwNumber[28]);
        break;

    case 3:
        printf("%s %s ", wwNumber[2], wwNumber[28]);
        break;

    case 4:
        printf("%s %s ", wwNumber[3], wwNumber[28]);
        break;

    case 5:
        printf("%s %s ", wwNumber[4], wwNumber[28]);
        break;

    case 6:
        printf("%s %s ", wwNumber[5], wwNumber[28]);
        break;

    case 7:
        printf("%s %s ", wwNumber[6], wwNumber[28]);
        break;

    case 8:
        printf("%s %s ", wwNumber[7], wwNumber[28]);
        break;

    case 9:
        printf("%s %s ", wwNumber[8], wwNumber[28]);
        break;

    default:
        printf("Error4\n");
        break;
            }
    }

//ЕСЛИ 3 ---- ФУНКЦИЯ ОБРАБАТЫВАЕТ И ПЕЧАТАЕТ 3-ЗНАЧНЫЕ ЧИСЛА
void *if3(const char *wwNumber[], const float wNum)
{
    float num = wNum;
    switch (int (num / 100))
    {
    case 1:
        printf("%s %s ", wwNumber[0], wwNumber[27]);
        break;

    case 2:
        printf("%s %s ", wwNumber[1], wwNumber[27]);
        break;

    case 3:
        printf("%s %s ", wwNumber[2], wwNumber[27]);
        break;

    case 4:
        printf("%s %s ", wwNumber[3], wwNumber[27]);
        break;

    case 5:
        printf("%s %s ", wwNumber[4], wwNumber[27]);
        break;

    case 6:
        printf("%s %s ", wwNumber[5], wwNumber[27]);
        break;

    case 7:
        printf("%s %s ", wwNumber[6], wwNumber[27]);
        break;

    case 8:
        printf("%s %s ", wwNumber[7], wwNumber[27]);
        break;

    case 9:
        printf("%s %s ", wwNumber[8], wwNumber[27]);
        break;

    default:
        printf("Error3\n");
        break;
            }
    }

//ЕСЛИ 2 ---- ФУНКЦИЯ ОБРАБАТЫВАЕТ И ПЕЧАТАЕТ 1 И 2-ЗНАЧНЫЕ ЧИСЛА
void *if2(const char *wwNumber[], const float wNum)
{
    float num = wNum;
    switch (int(num / 10))
    {
    case 0:     //ОТРАБОТКА ЧИСЛА ДО 9

          printf("%s\n", wwNumber[int(num - int(num /10) * 10) - 1]);
        break;

    case 1:     //ОТРАБОТКА ЧИСЛА ДО 19
        printf("%s\n", wwNumber[9 + int(num - int(num /10) * 10)]);
        break;

    case 2:     //ОТРАБОТКА ЧИСЛА ОТ 20 ДО 29
        printf("%s ", wwNumber[19]);
        if(int(num - int(num /10) * 10) > 0)
         {
            printf("%s\n", wwNumber[int(num - int(num /10) * 10) - 1]);
            }
        break;
     case 3:        //ОТРАБОТКА ЧИСЛА ОТ 30 ДО 39
        printf("%s ", wwNumber[20]);
        if(int(num - int(num /10) * 10) > 0)
         {
            printf("%s\n", wwNumber[int(num - int(num /10) * 10) - 1]);
            }
        break;

    case 4:        //ОТРАБОТКА ЧИСЛА ОТ 40 ДО 49
       printf("%s ", wwNumber[21]);
       if(int(num - int(num /10) * 10) > 0)
        {
           printf("%s\n", wwNumber[int(num - int(num /10) * 10) - 1]);
           }
       break;

     case 5:        //ОТРАБОТКА ЧИСЛА ОТ 50 ДО 59
       printf("%s ", wwNumber[22]);
       if(int(num - int(num /10) * 10) > 0)
        {
           printf("%s\n", wwNumber[int(num - int(num /10) * 10) - 1]);
           }
       break;

    case 6:        //ОТРАБОТКА ЧИСЛА ОТ 60 ДО 69
       printf("%s ", wwNumber[23]);
       if(int(num - int(num /10) * 10) > 0)
        {
           printf("%s\n", wwNumber[int(num - int(num /10) * 10) - 1]);
           }
       break;

    case 7:        //ОТРАБОТКА ЧИСЛА ОТ 70 ДО 79
       printf("%s ", wwNumber[24]);
       if(int(num - int(num /10) * 10) > 0)
        {
           printf("%s\n", wwNumber[int(num - int(num /10) * 10) - 1]);
           }
       break;

    case 8:        //ОТРАБОТКА ЧИСЛА ОТ 80 ДО 89
       printf("%s ", wwNumber[25]);
       if(int(num - int(num /10) * 10) > 0)
        {
           printf("%s\n", wwNumber[int(num - int(num /10) * 10) - 1]);
           }
       break;

    case 9:        //ОТРАБОТКА ЧИСЛА ОТ 90 ДО 99
       printf("%s ", wwNumber[26]);
       if(int(num - int(num /10) * 10) > 0)
        {
           printf("%s\n", wwNumber[int(num - int(num /10) * 10) - 1]);
           }
       break;

    default:
        printf("\nError2\n");
        break;
         }
    }

char printing (const char *num[], const unsigned int wSize)
{
    for (unsigned int i = 0; i <= wSize; i++)
    {
        printf("%s\n", num[i]);

        }
    return 0;
}