2016-02-17 2 views
0

// Этот код должен добавлять или вычитать и отслеживать четыре разных марки пива с индивидуальными идентификаторами. Использование -1 завершает работу, но с использованием любого из идентификационных номеров 1-4 заставляет программу выполнять дело defualt.Оператор Switch продолжает использовать случай по умолчанию независимо от того, что - C beginner

#include <stdio.h> 

int main(){ 
int inv1; 
int inv2; 
int inv3; 
int inv4; 

printf("Pleas enter the beginning inventory of Piels. \n"); 
scanf("%d", &inv1); 
printf("Pleas enter the beginning inventory of Coors. \n"); 
scanf("%d", &inv2); 
printf("Pleas enter the beginning inventory of Bud. \n"); 
scanf("%d", &inv3); 
printf("Pleas enter the beginning inventory of Iron City. \n"); 
scanf("%d", &inv4); 

printf("Please enter the ID number. \n Piels - 1 \n Coors - 2 \n Bud - 3 \n Iron City - 4 \n Enter -1 to exit \n"); 

int id; 

scanf("%d", &id); 
while(id != -1){ 

int amount; 

    switch (id) { 
    case '1': 
     printf("Enter the change in amount. It will be a negative if the amount is sold, or positive if the amount is purchased \n"); 
     scanf("%d", &amount); 
     inv1 += amount; 
     break; 
    case '2': 
     printf("Enter the change in amount. It will be a negative if the amount is sold, or positive if the amount is purchased \n"); 
     scanf("%d", &amount); 
     inv2 += amount; 
     break; 
    case '3': 
     printf("Enter the change in amount. It will be a negative if the amount is sold, or positive if the amount is purchased \n"); 
     scanf("%d", &amount); 
     inv3 += amount; 
     break; 
    case '4': 
     printf("Enter the change in amount. It will be a negative if the amount is sold, or positive if the amount is purchased \n"); 
     scanf("%d", &amount); 
     inv4 += amount; 
     break; 
    default: 
     printf("Error: That ID Number is not an option. \n"); 
     break; 
        } 


printf("Please enter the ID number. \n Piels - 1 \n Coors - 2 \n Bud - 3 \n Iron City - 4 \n Enter -1 to exit \n"); 
    scanf("%d", &id); 
} 
    return 0; 

} 
+1

Я не хорошо разбираюсь в C, но не 'id' должен быть' int'? ваши 'case' заключены в одинарные кавычки – jmcg

+0

для удобства понимания и удобочитаемости нами людей: 1) последовательно отступать от кода (никогда не используйте вкладки для отступов, так как каждый текстовый процессор/редактор имеет ширину табуляции/ширину закладки по-разному.) Отступ после каждой открытой скобки '{'. Un-indent перед каждой закрывающей скобкой '}'. Предложите использовать 4 пробела для каждого уровня отступа, поскольку 4 пространства достаточно широки, чтобы быть видимыми даже с изменяемыми ширинами шрифтов. 2) следовать аксиоме: * только один оператор в строке и (самое большее) одно объявление переменной для каждого оператора. * 3) отдельные блоки кода (для if, else, while. Do ... while, switch, case, default) по пустой строке. – user3629249

+0

маленькая вещь: слово «просьбы» неизвестно, подозревая, что вы имели в виду «пожалуйста». – user3629249

ответ

4

Удалить цитаты и попробуйте из переключателя состояния

switch (id) { 
     case 1: 
      printf("Enter the change in amount. It will be a negative if the amount is sold, or positive if the amount is purchased \n"); 
      scanf("%d", &amount); 
      inv1 += amount; 
      break; 
     case 2: 
      printf("Enter the change in amount. It will be a negative if the amount is sold, or positive if the amount is purchased \n"); 
      scanf("%d", &amount); 
      inv2 += amount; 
      break; 
     case 3: 
      printf("Enter the change in amount. It will be a negative if the amount is sold, or positive if the amount is purchased \n"); 
      scanf("%d", &amount); 
      inv3 += amount; 
      break; 
     case 4: 
      printf("Enter the change in amount. It will be a negative if the amount is sold, or positive if the amount is purchased \n"); 
      scanf("%d", &amount); 
      inv4 += amount; 
      break; 
     default: 
      printf("Error: That ID Number is not an option. \n"); 
      break; 
         } 
+0

О, дух. В качестве примера я использовал инструкцию switch о символах. Я тупой. Спасибо чувак! – Wearin

1

Поскольку вы читаете ввод в виде целого числа:

scanf("%d", &id); //note the %d 

Тогда id будет иметь значение целого числа, преобразованный из string, который вы вводите в свою консоль.

Example: 
Input: 41 //this is char '4' and '1', having value of 0x34 (52) and 0x31 (49) respectively 
Result: id = 41 //(not resulting in char* but value of 41) 

Если вы хотите использовать символ, то вы должны сделать это вместо:

char id; 
scanf(" %c", &id); //note the %c, might also be better if used with early space to avoid \n from the input buffer 

Такое, что он будет читать ввод как характер

Example: 
Input: 4 //this is char '4' (having value of 0x34 (52)) 
Result: id = '4' or id = 52 //not resulting in actual value of 4, but char '4' or value of 52 (0x34) 

Затем коммутатор:

switch(id){ 
    case '4': //this has actual value of 52 (or 0x34), check ASCII table 
     break; 
    // and so on, 
} 

wil Хорошо.

Обратите внимание, что это ограничит вашу опцию от '0'-'9', хотя они являются единственными доступными символами ASCII.

Таким образом, это еще лучше использовать

Просто удалите ' в вашем switch:

int id; 
scanf("%d, &id); 
switch(id){ 
    case 1: //this has actual integer value of 1, not ASCII '1' = 0x31 (or 49) 
     break; 
    // and so on, will be fine 
} 

Тогда он также будет работать.

+1

@ user3386109 true ... :) возможно, мой ответ просто добавит объяснение, почему он не работает должным образом. Лучший выбор был бы все же приемлемым ответом. – Ian

1

Кажется, что неправильное понимание, как показано в коде, между значением символа и целым значением.

символ, как '1', имеет значение 0x31.

в то время как целочисленное значение, подобное 1, имеет значение 0x00000001.

Для коммутатора/случая значения case должны быть целыми числами, поэтому не обтекайте эти значения в одинарных кавычках, поскольку эти одинарные кавычки указывают символьные литералы, а не целые литералы.

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