Неверно работает 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;
- }
Объяснение кода листинга программы
- Включаем заголовочный файл stdio.h для использования функций ввода-вывода
- Определяем константы для цен и количества продуктов
- Объявляем переменные для хранения количества продуктов и общей суммы
- Запускаем цикл while, который продолжается до тех пор, пока пользователь не введет 'q'
- Внутри цикла while используем оператор switch для выбора продукта, введенного пользователем
- В каждом случае case добавляем введенное количество к общей сумме
- После завершения цикла while вычисляем итоговую сумму, применяем скидку и вычисляем стоимость доставки
- Выводим результаты на экран
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д