C программа закрывается автоматически - PullRequest
0 голосов
/ 10 декабря 2018

Я создал C-программу, которая примет весь заказ пользователя, затем сгенерирует общий итог заказов.

Но когда я закажу другую еду, программа автоматически закроется.

Я не знаю, касается ли это моего getch или перерывов в моем методе переключения.Иногда он продолжит принимать другую ошибку, но автоматически выведет «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 голосов
/ 10 декабря 2018

При вызове меню после ввода пользователем [1] да.с помощью функции menu () отобразите меню, а после меню вы должны отобразить функцию call 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;

    }
}
0 голосов
/ 10 декабря 2018

В вашем коде вы дублировались несколько раз:

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

Поэтому, когда вы выбираете choice = 1, отображается menu() get, а затем код выходит за пределы foods().Я думаю, что вы хотели сделать раздел продуктов снова:

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

Еще одна проблема в вашем коде - это модификатор %c scanf.Он не будет поглощать начальные пробелы, поэтому будет читать новую строку (введенную на последнем scanf).Используйте начальный пробел " %c", чтобы сообщить scanf, что он читает начальные пробелы и игнорирует начальный символ новой строки, в scanf(" %c", &food);

  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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...