C程序自动关闭

时间:2018-12-10 08:02:47

标签: c

我创建了一个C程序,它将接受用户的所有订单,然后生成订单的总计。

但是当我要点其他食物时,程序会自动关闭。

我不知道这是关于我的失误还是切换方法的中断。有时,它将继续出现另一个错误,但会自动输出“ INVALID FOOD”。

这是我的代码:

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

void menu();
void foods();
void main();
char food;
int quantity;
float price;
float total;
float grandtotal;
int choice;

void main()
{
    clrscr();
    menu();

    foods();
    getch();
}

void menu(){

    food = ' ';
    quantity = 0;
    price = 0;
    total = 0;
    choice = 0;
    printf("Please select food from the following:\n");
    printf(" B = Burger, F = French Fries, P = Pizza, S = Sandwiches \n");

    printf("Enter food:");
    scanf("%c", &food);
}

void foods(){
    switch(food)
    {
        case 'B':
            printf("You selected Burger!\n");
            printf("Enter quantity:");
            scanf("%d", &quantity);
            price = 95.50;

            printf("\n Do you want to order more? [1] Yes [2] No:");
            scanf("%d", &choice);

            total = price*quantity;

            if(choice == 1){
                menu();
                break;
            }
            else if (choice == 2){
                grandtotal = grandtotal + total;
                printf("\n Total Price is: %0.2f", grandtotal);
                break;
            }

        case 'F':
            printf("You selected French Fries!\n");
            printf("Enter quantity:");
            scanf("%d", &quantity);
            price = 47.75;

            printf("\n Do you want to order more? [1] Yes [2] No:");
            scanf("%d", &choice);

            total = price*quantity;
            if(choice == 1){
                menu();
                break;
            }
            else if (choice == 2){
                grandtotal = grandtotal + total;
                printf("\n Total Price is: %0.2f", grandtotal);
                break;
            }

        case 'P':
            printf("You selected French Pizza!\n");
            printf("Enter quantity:");
            scanf("%d", &quantity);
            price = 105.00;

            printf("\n Do you want to order more? [1] Yes [2] No:");
            scanf("%d", &choice);

            total = price*quantity;
            if(choice == 1){
                menu();
                break;
            }
            else if (choice == 2){
                grandtotal = grandtotal + total;
                printf("\n Total Price is: %0.2f", grandtotal);
                break;
            }

        case 'S':
            printf("You selected Sandwiches\n");
            printf("Enter quantity:");
            scanf("%d", &quantity);
            price = 75.50;

            printf("\n Do you want to order more? [1] Yes [2] No:");
            scanf("%d", &choice);

            total = price*quantity;
            if(choice == 1){
                main();
                break;
            }
            else if (choice == 2){
                grandtotal = grandtotal + total;
                printf("\n Total Price is: %0.2f", grandtotal);
                break;
            }

            default:
            printf("INVALID FOOD!");
            break;

    }
}

我希望有人可以帮助或指导我。预先感谢。

2 个答案:

答案 0 :(得分:3)

在您的代码中,您已经重复了多次:

...
if(choice == 1){
   menu();
   break;
} ...
...

因此,当您选择choice = 1时,会显示menu() get,然后代码会从foods()中跳出来。我认为您打算再次做“食物”部分:

...
if(choice == 1){
   menu();
   foods();
   break;
} ...
...

代码中的另一个问题是%c scanf修饰符。它不会占用前导空格,因此它将读取换行符(在最后一个scanf上输入)。在" %c"

中,使用前导空格scanf(" %c", &food);告诉scanf读取前导空格并忽略前导换行符。
  1. 缩进您的代码。
  2. 不要重复声明。整个scanf(... &choice); if (choice == 1) ... else if (choice == 2)可以放在while开关的外部,不会重复4次。
  3. 使用递归调用的嵌套函数会使堆栈耗尽。最好只使用while循环。
  4. 尽量不要使用全局变量。它们具有误导性,并导致可维护的代码。

您的代码经过稍微修改后带有一点缩进,添加了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;
}

答案 1 :(得分:2)

在用户输入后调用菜单时,[1]是。使用menu()函数显示菜单,然后在菜单之后显示调用food()函数。

您想做什么

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>

void menu();
void foods();
void main();
char food;
int quantity;
float price;
float total;
float grandtotal;
int choice;

void main()
{


    clrscr();
    do {
        menu();
        foods();

        printf("\n Do you want to order more? [1] Yes [2] No:");
        scanf("%d", &choice);
        getchar();  // <== remove newline
        grandtotal = grandtotal + total;
    } while (choice == 1);

        printf("\n Total Price is: %0.2f", grandtotal);
    getch();
}

void menu() {

    food = ' ';
    quantity = 0;
    price = 0;
    total = 0;
    choice = 0;
    printf("Please select food from the following:\n");
    printf(" B = Burger, F = French Fries, P = Pizza, S = Sandwiches \n");

    printf("Enter food:");
    scanf("%c", &food);
}

void foods() {
    switch (food)
    {
    case 'B':
        printf("You selected Burger!\n");
        printf("Enter quantity:");
        scanf("%d", &quantity);
        price = 95.50;

        //printf("\n Do you want to order more? [1] Yes [2] No:");
        //scanf("%d", &choice);
        //getchar();  // <== remove newline

        total = price*quantity;
        break;

        //if (choice == 1) {

        //  menu();
        //  break;
        //}
        //else if (choice == 2) {
        //  grandtotal = grandtotal + total;
        //  printf("\n Total Price is: %0.2f", grandtotal);
        //  break;
        //}

    case 'F':
        printf("You selected French Fries!\n");
        printf("Enter quantity:");
        scanf("%d", &quantity);
        price = 47.75;

        //printf("\n Do you want to order more? [1] Yes [2] No:");
        //scanf("%d", &choice);

        total = price*quantity;
        break;
        //if (choice == 1) {
        //  menu();
        //  break;
        //}
        //else if (choice == 2) {
        //  grandtotal = grandtotal + total;
        //  printf("\n Total Price is: %0.2f", grandtotal);
        //  break;
        //}

    case 'P':
        printf("You selected French Pizza!\n");
        printf("Enter quantity:");
        scanf("%d", &quantity);
        price = 105.00;

        //printf("\n Do you want to order more? [1] Yes [2] No:");
        //scanf("%d", &choice);

        total = price*quantity;
        break;
        //if (choice == 1) {
        //  menu();
        //  break;
        //}
        //else if (choice == 2) {
        //  grandtotal = grandtotal + total;
        //  printf("\n Total Price is: %0.2f", grandtotal);
        //  break;
        //}

    case 'S':
        printf("You selected Sandwiches\n");
        printf("Enter quantity:");
        scanf("%d", &quantity);
        price = 75.50;

        //printf("\n Do you want to order more? [1] Yes [2] No:");
        //scanf("%d", &choice);

        total = price*quantity;
        break;
        //if (choice == 1) {
        //  main();
        //  break;
        //}
        //else if (choice == 2) {
        //  grandtotal = grandtotal + total;
        //  printf("\n Total Price is: %0.2f", grandtotal);
        //  break;
        //}

    default:
        printf("INVALID FOOD!");
        break;

    }
}