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

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

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

Не могу понять почему switch работает неверно. Когда переходит в case, если scanf() читает целое число обновляется переменная, затем break прерывает switch и printf() следующие за switch выполняются 2 раза, если при переходе в case scanf() читает a,b,c,q выполняются операторы printf() 1 раз и происходит переход в case A,B,C как будто записывается переменная n вместо i. Как это можно исправить?
#include <stdio.h>
#define ART    2.05   //price artichoke
#define BEET   1.15   //price beet
#define CARROT 1.09   //price carrot
#define RATE1  6.50   //delivery up to 5 pounds
#define RATE2 14.00   //delivery from 5 to 20 pounds
#define KOEF   0.50   //coefficient delivery over 20 pounds
#define DISC   0.05   //discount
#define BRAKE1 5
#define BRAKE2 20
#define A 'a'
#define B 'b'
#define C 'c'
#define Q 'q'
int main(void)
{
  char n;
  int i,quantity,art_q,beet_q,carrot_q;
  float sum,disc,del,result;
  art_q=0;
  beet_q=0;
  carrot_q=0;
  sum=0;
  printf("Select:\na)artichoke\nb)beet\nc)carrot\n");
  scanf("%c",&n);
  while(n!=Q)
  {
     switch(n)
    {
       case A:
         printf("Enter quantity artichoke in lb:");
         if(scanf("%d",&i)==1)
           art_q+=i;
         break;
       case B:
         printf("Enter quantity beet in lb:");
         if(scanf("%d",&i)==1)
           beet_q+=i;
         break;
       case C:
         printf("Enter quantity carrots in lb:");
         if(scanf("%d",&i)==1)
           carrot_q+=i;
         break;
       default:
         break;
    }
    printf("Select:\n");
    printf("a)artichoke\n");
    printf("b)beet\n");
    printf("c)carrot\n");
    scanf("%c",&n);
  }
  sum=art_q*ART+beet_q*BEET+carrot_q*CARROT;
  if(sum>=100)
    disc=sum*DISC;
  else
    disc=0;
  quantity=art_q+beet_q+carrot_q;
  if(quantity<=BRAKE1)
    del=RATE1;
  else if(quantity<=BRAKE2)
    del=RATE2;
  else
    del=RATE2+((quantity-BRAKE2)*KOEF);
  result=sum-disc+del;
  printf("Name        Price_p_lb  Quantity    Price     ");
  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",
         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);
  return 0;
}

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

textual
Листинг программы
#include <stdio.h>
#define ART    2.05   //price artichoke
#define BEET   1.15   //price beet
#define CARROT 1.09   //price carrot
#define RATE1  6.50   //delivery up to 5 pounds
#define RATE2 14.00   //delivery from 5 to 20 pounds
#define KOEF   0.50   //coefficient delivery over 20 pounds
#define DISC   0.05   //discount
#define BRAKE1 5
#define BRAKE2 20
#define A 'a'
#define B 'b'
#define C 'c'
#define Q 'q'
int main(void)
{
  char n;
  int i,quantity,art_q,beet_q,carrot_q;
  float sum,disc,del,result;
  art_q=0;
  beet_q=0;
  carrot_q=0;
  sum=0;
  printf("Select:\na)artichoke\nb)beet\nc)carrot\n");
  scanf("%c",&n);
  while(n!=Q)
  {
     switch(n)
    {
       case A:
         printf("Enter quantity artichoke in lb:");
         if(scanf("%d",&i)==1)
           art_q+=i;
         break;
       case B:
         printf("Enter quantity beet in lb:");
         if(scanf("%d",&i)==1)
           beet_q+=i;
         break;
       case C:
         printf("Enter quantity carrots in lb:");
         if(scanf("%d",&i)==1)
           carrot_q+=i;
         break;
       default:
         break;
    }
    printf("Select:\n");
    printf("a)artichoke\n");
    printf("b)beet\n");
    printf("c)carrot\n");
    fflush(stdin);                      /* !!! */
    scanf("%c",&n);
  }
  sum=art_q*ART+beet_q*BEET+carrot_q*CARROT;
  if(sum>=100)
    disc=sum*DISC;
  else
    disc=0;
  quantity=art_q+beet_q+carrot_q;
  if(quantity<=BRAKE1)
    del=RATE1;
  else if(quantity<=BRAKE2)
    del=RATE2;
  else
    del=RATE2+((quantity-BRAKE2)*KOEF);
  result=sum-disc+del;
  printf("Name        Price_p_lb  Quantity    Price     ");
  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",
         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);
  return 0;
}

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

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

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


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

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

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