Неверно работает switch - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Не могу понять почему switch работает неверно. Когда переходит в case, если scanf() читает целое число обновляется переменная, затем break прерывает switch и printf() следующие за switch выполняются 2 раза, если при переходе в case scanf() читает a,b,c,q выполняются операторы printf() 1 раз и происходит переход в case A,B,C как будто записывается переменная n вместо i. Как это можно исправить?
Листинг программы
  1. #include <stdio.h>
  2. #define ART 2.05 //price artichoke
  3. #define BEET 1.15 //price beet
  4. #define CARROT 1.09 //price carrot
  5. #define RATE1 6.50 //delivery up to 5 pounds
  6. #define RATE2 14.00 //delivery from 5 to 20 pounds
  7. #define KOEF 0.50 //coefficient delivery over 20 pounds
  8. #define DISC 0.05 //discount
  9. #define BRAKE1 5
  10. #define BRAKE2 20
  11. #define A 'a'
  12. #define B 'b'
  13. #define C 'c'
  14. #define Q 'q'
  15. int main(void)
  16. {
  17. char n;
  18. int i,quantity,art_q,beet_q,carrot_q;
  19. float sum,disc,del,result;
  20. art_q=0;
  21. beet_q=0;
  22. carrot_q=0;
  23. sum=0;
  24. printf("Select:\na)artichoke\nb)beet\nc)carrot\n");
  25. scanf("%c",&n);
  26. while(n!=Q)
  27. {
  28. switch(n)
  29. {
  30. case A:
  31. printf("Enter quantity artichoke in lb:");
  32. if(scanf("%d",&i)==1)
  33. art_q+=i;
  34. break;
  35. case B:
  36. printf("Enter quantity beet in lb:");
  37. if(scanf("%d",&i)==1)
  38. beet_q+=i;
  39. break;
  40. case C:
  41. printf("Enter quantity carrots in lb:");
  42. if(scanf("%d",&i)==1)
  43. carrot_q+=i;
  44. break;
  45. default:
  46. break;
  47. }
  48. printf("Select:\n");
  49. printf("a)artichoke\n");
  50. printf("b)beet\n");
  51. printf("c)carrot\n");
  52. scanf("%c",&n);
  53. }
  54. sum=art_q*ART+beet_q*BEET+carrot_q*CARROT;
  55. if(sum>=100)
  56. disc=sum*DISC;
  57. else
  58. disc=0;
  59. quantity=art_q+beet_q+carrot_q;
  60. if(quantity<=BRAKE1)
  61. del=RATE1;
  62. else if(quantity<=BRAKE2)
  63. del=RATE2;
  64. else
  65. del=RATE2+((quantity-BRAKE2)*KOEF);
  66. result=sum-disc+del;
  67. printf("Name Price_p_lb Quantity Price ");
  68. printf("\nartichoke %-10.2f %-10d %-10.2f\nbeet %-10.2f %-10d %-10.2f\ncarrot %-10.2f %-10d %-10.2f\nResult\nTotal cost:%.2f Discount:%.2f Delivery price:%.2f Total:%.2f\n",
  69. ART,art_q,(float)art_q*ART,BEET,beet_q,(float)beet_q*BEET,CARROT,carrot_q,(float)carrot_q*CARROT,sum,disc,del,result);
  70. return 0;
  71. }

Решение задачи: «Неверно работает switch»

textual
Листинг программы
  1. #include <stdio.h>
  2. #define ART    2.05   //price artichoke
  3. #define BEET   1.15   //price beet
  4. #define CARROT 1.09   //price carrot
  5. #define RATE1  6.50   //delivery up to 5 pounds
  6. #define RATE2 14.00   //delivery from 5 to 20 pounds
  7. #define KOEF   0.50   //coefficient delivery over 20 pounds
  8. #define DISC   0.05   //discount
  9. #define BRAKE1 5
  10. #define BRAKE2 20
  11. #define A 'a'
  12. #define B 'b'
  13. #define C 'c'
  14. #define Q 'q'
  15. int main(void)
  16. {
  17.   char n;
  18.   int i,quantity,art_q,beet_q,carrot_q;
  19.   float sum,disc,del,result;
  20.   art_q=0;
  21.   beet_q=0;
  22.   carrot_q=0;
  23.   sum=0;
  24.   printf("Select:\na)artichoke\nb)beet\nc)carrot\n");
  25.   scanf("%c",&n);
  26.   while(n!=Q)
  27.   {
  28.      switch(n)
  29.     {
  30.        case A:
  31.          printf("Enter quantity artichoke in lb:");
  32.          if(scanf("%d",&i)==1)
  33.            art_q+=i;
  34.          break;
  35.        case B:
  36.          printf("Enter quantity beet in lb:");
  37.          if(scanf("%d",&i)==1)
  38.            beet_q+=i;
  39.          break;
  40.        case C:
  41.          printf("Enter quantity carrots in lb:");
  42.          if(scanf("%d",&i)==1)
  43.            carrot_q+=i;
  44.          break;
  45.        default:
  46.          break;
  47.     }
  48.     printf("Select:\n");
  49.     printf("a)artichoke\n");
  50.     printf("b)beet\n");
  51.     printf("c)carrot\n");
  52.     fflush(stdin);                      /* !!! */
  53.     scanf("%c",&n);
  54.   }
  55.   sum=art_q*ART+beet_q*BEET+carrot_q*CARROT;
  56.   if(sum>=100)
  57.     disc=sum*DISC;
  58.   else
  59.     disc=0;
  60.   quantity=art_q+beet_q+carrot_q;
  61.   if(quantity<=BRAKE1)
  62.     del=RATE1;
  63.   else if(quantity<=BRAKE2)
  64.     del=RATE2;
  65.   else
  66.     del=RATE2+((quantity-BRAKE2)*KOEF);
  67.   result=sum-disc+del;
  68.   printf("Name        Price_p_lb  Quantity    Price     ");
  69.   printf("\nartichoke   %-10.2f  %-10d  %-10.2f\nbeet        %-10.2f  %-10d  %-10.2f\ncarrot      %-10.2f  %-10d  %-10.2f\nResult\nTotal cost:%.2f  Discount:%.2f  Delivery price:%.2f  Total:%.2f\n",
  70.          ART,art_q,(float)art_q*ART,BEET,beet_q,(float)beet_q*BEET,CARROT,carrot_q,(float)carrot_q*CARROT,sum,disc,del,result);
  71.   return 0;
  72. }

Объяснение кода листинга программы

  1. Включаем заголовочный файл stdio.h для использования функций ввода-вывода
  2. Определяем константы для цен и количества продуктов
  3. Объявляем переменные для хранения количества продуктов и общей суммы
  4. Запускаем цикл while, который продолжается до тех пор, пока пользователь не введет 'q'
  5. Внутри цикла while используем оператор switch для выбора продукта, введенного пользователем
  6. В каждом случае case добавляем введенное количество к общей сумме
  7. После завершения цикла while вычисляем итоговую сумму, применяем скидку и вычисляем стоимость доставки
  8. Выводим результаты на экран

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 4.125 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут