2016-02-16 2 views
-6

Я нахожусь в курсе начинающего CS, и я пытаюсь написать программу на C, которая запрашивает двухзначное число и возвращает выписанную форму этого числа. Я написал весь код, и он работает, когда я пробую цифры 10-19, но не другие. Составлено с использованием стандарта C89, если это имеет значениеПочему логические операторы работают не так, как ожидалось?

#include <stdio.h> 

int main(void) 
{ 

printf("\n Number to Word Conversion Program"); 
printf("\n\n This program takes a two-digit number and outputs the English word for the number"); 

int number = 0; 
int numberH1 = 0; 
int numberH2 = 0; 

printf("\n\n Please enter a two-digit number: "); 
scanf("%d", &number); 

numberH1 = number/10; 
numberH2 = number % 10; 

if (number == 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 ||18 || 19) 
{ 
    switch (number) 
    { 
     case 10: 
     { 
      printf("\n\n The number entered was Ten.\n\n"); 
     }   
     break; 
     case 11: 
     { 
      printf("\n\n The number entered was Eleven.\n\n"); 
     }   
     break; 
     case 12: 
     { 
      printf("\n\n The number entered was Twelve.\n\n"); 
     }   
     break; 
     case 13: 
     { 
      printf("\n\n The number entered was Thirteen.\n\n"); 
     }   
     break; 
     case 14: 
     { 
      printf("\n\n The number entered was Fourteen.\n\n"); 
     }   
     break; 
     case 15: 
     { 
      printf("\n\n The number entered was Fifteen.\n\n"); 
     }   
     break; 
     case 16: 
     { 
      printf("\n\n The number entered was Sixteen.\n\n"); 
     }   
     break; 
     case 17: 
     { 
      printf("\n\n The number entered was Seventeen.\n\n"); 
     }   
     break; 
     case 18: 
     { 
      printf("\n\n The number entered was Eighteen.\n\n"); 
     }   
     break; 
     case 19: 
     { 
      printf("\n\n The number entered was Nineteen.\n\n"); 
     }   
     break; 
    } 
} 
else 
{ 

switch (numberH1) 
{ 
    case 2: 
    { 
     printf("\n\n The numer entered was Twenty");  
    } 
    break; 
    case 3: 
    { 
     printf("\n\n The numer entered was Thirty");  
    } 
    break; 
    case 4: 
    { 
     printf("\n\n The numer entered was Forty"); 
    } 
    break; 
    case 5: 
    { 
     printf("\n\n The numer entered was Fifty"); 
    } 
    break; 
    case 6: 
    { 
     printf("\n\n The numer entered was Sixty"); 
    } 
    break; 
    case 7: 
    { 
     printf("\n\n The numer entered was Seventy"); 
    } 
    break; 
    case 8: 
    { 
     printf("\n\n The numer entered was Eighty");  
    } 
    break; 
    case 9: 
    { 
     printf("\n\n The numer entered was Ninety");  
    } 
    break; 
} 



switch (numberH2) 
{ 
    case 0: 
    { 
     printf(".\n\n"); 
    } 
    break; 
    case 1: 
    { 
     printf("-one.\n\n"); 
    } 
    break; 
    case 2: 
    { 
     printf("-two.\n\n"); 
    } 
    break; 
    case 3: 
    { 
     printf("-three.\n\n"); 
    } 
    break; 
    case 4: 
    { 
     printf("-four.\n\n"); 
    } 
    break; 
    case 5: 
    { 
     printf("-five.\n\n"); 
    } 
    break; 
    case 6: 
    { 
     printf("-six.\n\n"); 
    } 
    break; 
    case 7: 
    { 
     printf("-seven.\n\n"); 
    } 
    break; 
    case 8: 
    { 
     printf("-eight.\n\n"); 
    } 
    break; 
    case 9: 
    { 
     printf("-nine.\n\n"); 
    } 
    break; 
} 
} 

return 0; 

} 
+5

'if (number == 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 || 18 || 19) '->' if (9 BLUEPIXY

+2

Это код спагетти. Используйте массив строк, пожалуйста ... –

ответ

2

В вашем коде,

if (number == 10 || 11 || 12 || 13 || 14 || 15 || 16 || 17 ||18 || 19) 

неправильный подход. Вы не можете связать логический оператор так.

В настоящее время, из-за operator precedence, ваш код, по существу

if ((number == 10) || 11 || 12 || 13 || 14 || 15 || 16 || 17 ||18 || 19) 

который оценивает либо

  • if (1 || 11 || 12 || 13 || 14 || 15 || 16 || 17 ||18 || 19)

или

  • if (0 || 11 || 12 || 13 || 14 || 15 || 16 || 17 ||18 || 19)

оба из которых дадут ИСТИННОЕ значение.

Вы должны использовать его как

if ((number == 10) || (number == 11)||(number == 12)..... 

Как я понимаю, вы уже используете switch заявление, поэтому if проверка может быть удалена полностью. Вам необходимо добавить кейс default для обработки других номеров. Вы можете добавить вложенный switch, чтобы все было сделано.

0

Первый ответ был правильным, но решение может быть проще, если вы пытаетесь использовать условие ниже:

if((number > 9) || (number < 20)) 
    { ... 
    } 

отметить, что в этом случае, вы можете просто использовать:

if(number < 20) 

, потому что вы уже запросили «двузначное число»

+0

просить пользователя что-то не гарантирует его получение, лучше проверить в любом случае – Vasfed

Смежные вопросы