В вашем коде вы дублировались несколько раз:
...
if(choice == 1){
menu();
break;
} ...
...
Поэтому, когда вы выбираете choice = 1
, отображается menu()
get, а затем код выходит за пределы foods()
.Я думаю, что вы хотели сделать раздел продуктов снова:
...
if(choice == 1){
menu();
foods();
break;
} ...
...
Еще одна проблема в вашем коде - это модификатор %c
scanf.Он не будет поглощать начальные пробелы, поэтому будет читать новую строку (введенную на последнем scanf).Используйте начальный пробел " %c"
, чтобы сообщить scanf, что он читает начальные пробелы и игнорирует начальный символ новой строки, в scanf(" %c", &food);
- Отступ в своем коде.
- Не дублируйте операторы.Целое
scanf(... &choice); if (choice == 1) ... else if (choice == 2)
может быть размещено вне переключателя while
, не дублируясь 4 раза. - Вложенные функции с использованием рекурсивных вызовов могут привести к исчерпанию вашего стека.Лучше просто используйте цикл while.
- Старайтесь не использовать глобальные переменные.Они вводят в заблуждение и приводят к поддерживаемому коду.
Слегка измененная версия кода с небольшим отступом, добавленный цикл do ... while
и удаленные глобальные переменные и дублирование кода могут выглядеть следующим образом:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
char menu(void);
float foods(char food);
void main()
{
clrscr();
float grandtotal = 0;
int choice = 0;
do {
// print menu and choose the food
char food = menu();
// choose food quantity and get it's price
float total = foods(food);
// print the total price
grandtotal = grandtotal + total;
printf("\n Total Price is: %0.2f", grandtotal);
// do you want to continue?
printf("\n Do you want to order more? [1] Yes [2] No:");
if (scanf("%d", &choice) != 1) {
perror("scanf error");
abort();
}
// continue until choice is equal to 1
} while (choice != 1);
}
char menu(void)
{
char food;
printf("Please select food from the following:\n");
printf(" B = Burger, F = French Fries, P = Pizza, S = Sandwiches \n");
printf("Enter food:");
if (scanf(" %c", &food) != 1) {
perror("scanf error");
abort();
}
return food;
}
float foods(char food){
float price = 0;
switch (food) {
case 'B':
printf("You selected Burger!\n");
price = 95.50;
break;
case 'F':
printf("You selected French Fries!\n");
price = 47.75;
break;
case 'P':
printf("You selected French Pizza!\n");
price = 105.00;
break;
case 'S':
printf("You selected Sandwiches\n");
price = 75.50;
break;
default:
fprintf(stderr, "INVALID FOOD!\n");
abort();
}
printf("Enter quantity:");
int quantity;
if (scanf("%d", &quantity) != 1) {
perror("scanf error");
abort();
}
return (float)price * (float)quantity;
}