как заставить эту программу пропустить функции переключения, чтобы она не выводила ноль (и) перед меньшим вводом - PullRequest
0 голосов
/ 19 мая 2019

Не могу понять, как пропустить ненужные переключатели.

если попытка замены продолжается с перерывами, и если еще операторы, которые, к сожалению, просто остановят ее на первом номере вместо пропуска переключателей.

            if ( number > 0 && number < 10000 ) {
                switch ( thou_place ) {
                case ( 0 ):
                    printf("zero ");

                    break;
                    case ( 1 ):
                    printf("one ");

                    break;
                    case ( 2 ):
                    printf ("two ");

                    break;
                    case ( 3 ):
                    printf ("three ");

                    break;
                    case ( 4 ):
                    printf ("four ");

                    break;
                    case ( 5 ):
                    printf ("five ");

                    break;
                    case ( 6 ):
                    printf("six ");

                    break;
                    case ( 7 ):
                    printf ("seven ");

                    break;
                    case ( 8 ):
                    printf ("eight ");

                    break;
                    case ( 9 ):
                    printf ("nine ");

                    break;
                }   


                switch ( hun_place ) {
                case ( 0 ):
                    printf("zero ");

                    break;
                    case ( 1 ):
                    printf("one ");

                    break;
                    case ( 2 ):
                    printf ("two ");

                    break;
                    case ( 3 ):
                    printf ("three ");

                    break;
                    case ( 4 ):
                    printf ("four ");

                    break;
                    case ( 5 ):
                    printf ("five ");

                    break;
                    case ( 6 ):
                    printf("six ");

                    break;
                    case ( 7 ):
                    printf ("seven ");

                    break;
                    case ( 8 ):
                    printf ("eight ");

                    break;
                    case ( 9 ):
                    printf ("nine ");

                    break;
                }       


                switch ( ten_place ) {
                case ( 0 ):
                    printf("zero ");

                    break;
                    case ( 1 ):
                    printf("one ");

                    break;
                    case ( 2 ):
                    printf ("two ");

                    break;
                    case ( 3 ):
                    printf ("three ");

                    break;
                    case ( 4 ):
                    printf ("four ");

                    break;
                    case ( 5 ):
                    printf ("five ");

                    break;
                    case ( 6 ):
                    printf("six ");

                    break;
                    case ( 7 ):
                    printf ("seven ");

                    break;
                    case ( 8 ):
                    printf ("eight ");

                    break;
                    case ( 9 ):
                    printf ("nine ");

                    break;
                }           

Я не могу понять, как пропустить ненужные переключатели. Выходные данные скажут «ноль один два три» вместо желаемого «один два три» для входа 123, «ноль ноль один два» вместо желаемого вывод «один два» для входа 12 и т. д. и т. п.

Ответы [ 4 ]

0 голосов
/ 19 мая 2019
if (number > 0 && number < 10000)
    {
        switch (thou_place)
        {
        case (1) :
            printf("one ");
            break;
        case (2) :
            printf("two ");
            break;
        case (3) :
            printf("three ");
            break;
        case (4) :
            printf("four ");
            break;
        case (5) :
            printf("five ");
            break;
        case (6) :
            printf("six ");
            break;
        case (7) :
            printf("seven ");
            break;
        case (8) :
            printf("eight ");
            break;
        case (9) :
            printf("nine ");
            break;
        }
        switch (hun_place)
        {
        case (0) :
            if (thou_place != 0)
                printf("zero ");
                break;
        case (1) :
            printf("one ");
            break;
        case (2) :
            printf("two ");
            break;
        case (3) :
            printf("three ");
            break;
        case (4) :
            printf("four ");
            break;
        case (5) :
            printf("five ");
            break; 
        case (6) :
            printf("six ");
            break;
        case (7) :
            printf("seven ");
            break; 
        case (8) :
                printf("eight ");
                break; 
        case (9) :
                printf("nine ");
                break;
       }
       switch (ten_place)
       {
           case (0) :
           {

                 if ((thou_place == 0) && (hun_place == 0))  {

                 }
                 else if (thou_place == 0 && hun_place != 0){
                     printf("zero ");
                     break;
                 }
                 else {
                     printf("zero ");
                     break;
                 }
            }

            case (1) :
               printf("one ");
               break;
           case (2) :
               printf("two ");
               break;
           case (3) :
              printf("three ");
              break;
           case (4) :
              printf("four ");
              break;
          case (5) :
              printf("five ");
              break;
          case (6) :
              printf("six ");
              break;
         case (7) :
             printf("seven ");
             break;
         case (8) :
             printf("eight ");
             break;
         case (9) :
             printf("nine ");
             break;
         }
    }
0 голосов
/ 19 мая 2019

Концептуально, вам нужна программа для вывода слова for каждой цифры десятичного представления числа.Заметили репликацию, которая есть в вашем коде?Вы не должны повторяться , и язык C (наряду с большинством других) предоставляет конструкцию, которая делает именно это: loops.

Вместо if ( number > 0 && number < 10000 ) вы можете выполнить цикл (которыйтакже делает проверку) и для каждого шага ( т.е. в теле цикла) используйте свой switch.

Псевдокод:

for digit in get_decimal_digits(number):
    switch (digit):
        case 0: print 'zero'
        case 1: print 'one'
        // ...

Чтобы улучшить четкость, вы можете даже сделать switch функцией.Кроме того, чтобы узнать об этом (это немного сложнее), вы можете рассмотреть возможность использования char **digit_words, позволяющего заменить весь switch на printf("%s", digit_words[digit]) (но будьте осторожны при проверке диапазона!).

Это решает вашу проблему;фактическая реализация C оставлена ​​в качестве упражнения.

0 голосов
/ 19 мая 2019

@ PiCTo уже упомянул принцип DRY.

Я бы предложил другое решение для общей проблемы:

#include <stdlib.h>  // EXIT_FAILURE
#include <stdio.h>   // scanf(), printf(), puts()

void tell(int value)
{
    static char const * const digit[] = {
        "zero", "one", "two", "three", "four", "five",
        "six", "seven", "eight", "nine", "ten"
    };

    if (value < 0) {  // handle the sign and make value positive
        printf("minus ");
        value *= -1;
    }

    if (value / 10)
        tell(value / 10);

    printf("%s ", digit[value % 10]);
}

int main(void)
{
    int value;
    if (scanf("%d", &value) != 1) {
        fputs("Input error. :(\n\n", stderr);
        return EXIT_FAILURE;
    }

    tell(value);
    puts("\n");
}

Процедура:

Ввод: -1234567890

tell(-1234567890)  --> "minus "
tell(123456789)
tell(12345678)
tell(1234567)
tell(123456)
tell(12345)
tell(1234)
tell(123)
tell(12)
tell(1) ... recursion ends because 1 / 10 == 0
printf("%s ", digit[1 % 10])  --> "one "
printf("%s ", digit[12 % 10])  --> "two "
printf("%s ", digit[123 % 10])  --> "three "
printf("%s ", digit[1234 % 10])  --> "four "
printf("%s ", digit[12345 % 10])  --> "five "
printf("%s ", digit[123456 % 10])  --> "six "
printf("%s ", digit[1234567 % 10])  --> "seven "
printf("%s ", digit[12345678 % 10])  --> "eight "
printf("%s ", digit[123456789 % 10])  --> "nine "
printf("%s ", digit[1234567890 % 10])  --> "zero "
0 голосов
/ 19 мая 2019

Проблема в вашей логике.Например, вам нужно вывести «ноль» вместо тысячи, только если само число больше 1000.

Простое исправление для этого в case 0:

switch(thou_place) {
    case ( 0 ):
        if(number > 1000)
            printf("zero ");

        break;

    ...
}

Подобные модификациинужно в сотнях и десятках мест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...