C:快餐项目订单系统

C: Ordersystem for Fastfood Project

我必须为一家快餐店做一个订单系统(它只是一个学校项目)。 我已经完成了这个工具。

但是老师让我们用getch代替scanf

但是我不明白,如何实现它.. 我可以用 getch 替换代码中的 scanf 吗?我不需要来自 Scanf 的 Echo,也不需要使用 ENTER 键确认。

任务是:

用编程语言 C 创建一个 CMD 工具。没有 GUI! 解决方案必须包括命令“malloc”、“realloc”、“getch”和 free。 CMD 工具是一个想象中的快餐店的订购流程。 菜单如下所示:

一个“大汉堡”4,90€

B“小汉堡”1,90€

C“包裹”4,90€

D“礼拜”2,90€

E “炸薯条” 1,90€

F “Softdrink” 1,90€

G“水”1,20€

H“番茄酱”0,30€

收银员可以用键盘输入订单。如果有人点餐 A 和餐 C。他输入字母 a 或 A 和 C 或 c。大小写字母无所谓。

每个订单都应显示在一行中。

订单完成后,工具应显示订单摘要。订购的所有餐点和价格摘要。应按字母 X 完成订单。

使用字母 Z 可以撤消订单。

我的 Scanf 工具:

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


int main() 
{ 

char *order; 
char *Total_Order; 
int end = 1; 


start: //Festlegung goto Label, bei Bestellabbruch.

order=(char*)malloc(1*sizeof(char));
Total_Order = (char*)calloc(1, sizeof(char));

// float für Kommazahl, Variable entspricht Preis vom Essen.
float A=4.90 ,B=1.90 ,C=4.90 ,D=2.90 ,E=1.90 ,F=1.90 ,G=1.20 , H=0.30;


printf("Order:\n");
printf(" A Big Burger 4.90EUR \n B Little Burger 1.90EUR \n C Wrap  4.90EUR \n D Salat 2.90EUR \n E Frites 1.90EUR \n F Softdrink 1.90EUR \n G Water 1.20EUR \n H Ketchup 0.30EUR \n"); 
int n=1;



do {
 scanf(" %c",order);
 //printf("%c\n",*order);
 if(n==1){
 printf("Enter Order:\n");
 }
 
 char temp=*order;
 temp=tolower(temp);
    switch (temp) {
            case 'a':
                printf("A Big Burge  4.90EUR \n");
                Total_Order[n-1]='a';
                break;
            case 'b':
                printf("B Little Burger 1.90EUR \n");
                Total_Order[n-1]='b';
                break;
            case 'c':
                printf("C Wrap  4.90EUR \n");
                Total_Order[n-1]='c';
    break;
            case 'd':
                printf("D Salat 2.90EUR \n");
                Total_Order[n-1]='d';
    break;
            case 'e':
                printf("E Frites 1.90EUR \n");
                Total_Order[n-1]='e';
                break;
            case 'f':
                printf("F Softdrink 1.90EUR \n");
                Total_Order[n-1]='f';
    break;
            case 'g':
             Total_Order[n-1]='g';
                printf("G Watter 1.20EUR \n");
                break;
            case 'h':
             Total_Order[n-1]='h';
                printf("H Ketchup 0.30EUR \n");
                break;
            default:
                printf(" ");
                break;
        }
    if(*order == 'x' || *order == 'X'){
     end=0;
 }
 if(*order == 'z' || *order == 'Z'){
     system ("CLS");
     free(Total_Order);
  free(order);
     goto start;  // Sprung zu start:
 }
      
    n++;
    Total_Order = (char*)realloc(Total_Order, n * sizeof(char));
    
}while (end== 1);


float t=0.0;
int  i=0;
printf("Finished Order:\n");
for (i = 0; i < n; ++i) {  
 switch (Total_Order[i]) {
            case 'a':
                printf("A ,,Big Burge  4.90EUR \n");
                Total_Order[n-1]='A';
                t = t + A;
    break;
            case 'b':
                printf("B ,,Little Burger 1.90EUR \n");
                Total_Order[n-1]='B';
                t = t + B;
                break;
            case 'c':
                printf("C Wrap  4.90EUR \n");
                Total_Order[n-1]='C';
                t = t + C;
    break;
            case 'd':
                printf("D Salat 2.90EUR \n");
                Total_Order[n-1]='D';
    t = t + D;
    break;
            case 'e':
                printf("E Frites 1.90EUR \n");
                Total_Order[n-1]='E';
                t = t + E;
    break;
            case 'f':
                printf("F Softdrink 1.90EUR \n");
                Total_Order[n-1]='F';
    t = t + F;
    break;
            case 'g':
             Total_Order[n-1]='G';
                printf("G Watter 1.20EUR \n");
                t = t + G;
    break;
            case 'h':
             Total_Order[n-1]='H';
                printf("H Ketchup 0.30EUR \n");
                t = t + H;
    break;
            default:
                printf(" ");
                t = t + 0.0;
    break;
        }
 
 } 
 
 printf("Summe %f",t);
 free(Total_Order);
 free(order);
 


return 0; 
} 

#include <stdio.h> // Standard Input / Output
#include <stdlib.h> //Zur Umwandlung von Zahlen, für Speicherverwaltung und ähnliche Aufgaben
#include <ctype.h> //Einzelne Zeichen überprüfen und umwandeln
#include <conio.h> // Konsole Input / Output getch


int main() 
{ 

char *order; //Zeiger-Deklaration Bestellungen 
char *Total_Order; //Zeiger-Deklaration Bestellungen Gesamt
int end = 1; 


// goto = schlecht für Performance!!! Ersatz dafür?
start: //Festlegung goto Label, bei Bestellabbruch.

order=(char*)malloc(1*sizeof(char));
Total_Order = (char*)calloc(1, sizeof(char));

// float für Kommazahl, Variable entspricht Preis vom Essen.
float A=4.90 ,B=1.90 ,C=4.90 ,D=2.90 ,E=1.90 ,F=1.90 ,G=1.20 , H=0.30;


//Fragen: Euro-Zeichen als € Symbol


printf("Kundenbestellung:\n");
printf(" A Big Burger 4.90EUR \n B Little Burger 1.90EUR \n C Wrap  4.90EUR \n D Salat 2.90EUR \n E Frites 1.90EUR \n F Softdrink 1.90EUR \n G Water 1.20EUR \n H Ketchup 0.30EUR \n"); 
int n=1;



do {
    scanf(" %c",order);
    //printf("%c\n",*order);
    if(n==1){
    printf("Bestelleingabe:\n");
    }

    char temp=*order;
    temp=tolower(temp);
    switch (temp) {
            case 'a':
                printf("A Big Burge  4.90EUR \n");
                Total_Order[n-1]='a';
                break;
            case 'b':
                printf("B Little Burger 1.90EUR \n");
                Total_Order[n-1]='b';
                break;
            case 'c':
                printf("C Wrap  4.90EUR \n");
                Total_Order[n-1]='c';
                break;
            case 'd':
                printf("D Salat 2.90EUR \n");
                Total_Order[n-1]='d';
                break;
            case 'e':
                printf("E Frites 1.90EUR \n");
                Total_Order[n-1]='e';
                break;
            case 'f':
                printf("F Softdrink 1.90EUR \n");
                Total_Order[n-1]='f';
                break;
            case 'g':
                Total_Order[n-1]='g';
                printf("G Watter 1.20EUR \n");
                break;
            case 'h':
                Total_Order[n-1]='h';
                printf("H Ketchup 0.30EUR \n");
                break;
            default:
                printf(" ");
                break;
        }
    if(*order == 'x' || *order == 'X'){
        end=0;
    }
    if(*order == 'z' || *order == 'Z'){
        system ("CLS");
        free(Total_Order);
        free(order);
        goto start;  // Sprung zu start:
    }

    n++;
    Total_Order = (char*)realloc(Total_Order, n * sizeof(char));

}while (end== 1);


float t=0.0;
int  i=0;
printf("Abgeschlossene Bestellung:\n");
for (i = 0; i < n; ++i) {  
    switch (Total_Order[i]) {
            case 'a':
                printf("A ,,Big Burge  4.90EUR \n");
                Total_Order[n-1]='A';
                t = t + A;
                break;
            case 'b':
                printf("B ,,Little Burger 1.90EUR \n");
                Total_Order[n-1]='B';
                t = t + B;
                break;
            case 'c':
                printf("C Wrap  4.90EUR \n");
                Total_Order[n-1]='C';
                t = t + C;
                break;
            case 'd':
                printf("D Salat 2.90EUR \n");
                Total_Order[n-1]='D';
                t = t + D;
                break;
            case 'e':
                printf("E Frites 1.90EUR \n");
                Total_Order[n-1]='E';
                t = t + E;
                break;
            case 'f':
                printf("F Softdrink 1.90EUR \n");
                Total_Order[n-1]='F';
                t = t + F;
                break;
            case 'g':
                Total_Order[n-1]='G';
                printf("G Watter 1.20EUR \n");
                t = t + G;
                break;
            case 'h':
                Total_Order[n-1]='H';
                printf("H Ketchup 0.30EUR \n");
                t = t + H;
                break;
            default:
                printf(" ");
                t = t + 0.0;
                break;
        }

    } 

    printf("Summe %f",t);
    free(Total_Order);
    free(order);



return 0; 
} 

希望你能给我一些建议。谢谢。

**我的工具是否有更简单、更清洁的方法? **我怎样才能让食物名称和价格更容易更改?****

您可以使用 struct 数组 来描述食物。

我已经为 getch 添加了一个示例 [using fgetc]。为此使用 -DUSEGET=1 进行编译,或者不使用 scanf

此外,从不使用goto

不需要 order 成为 char *order 并做到 malloc。一个简单的 int order 就足够了。

n 的原点为 0 [而不是 1] 可以简化一些事情。

我对你的程序进行了大量重构:

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

typedef struct {
    float price;                        // food price
    char *name;                         // type of food
} food_t;

food_t foodlist[] = {
    { .price = 4.90, .name = "Big Burger" },
    { .price = 1.90, .name = "Little Burger" },
    { .price = 4.90, .name = "Wrap" },
    { .price = 2.90, .name = "Salat" },
    { .price = 1.90, .name = "Frites" },
    { .price = 1.90, .name = "Softdrink" },
    { .price = 1.20, .name = "Water" },
    { .price = 0.30, .name = "Ketchup" },
};

#define FOOD_COUNT      (sizeof(foodlist) / sizeof(foodlist[0]))

#define ALLFOOD(_food,_list) \
    _food = &_list[0];  _food < &_list[FOOD_COUNT];  ++_food

int
scanchar(void)
{
    int temp;

    while (1) {
        temp = fgetc(stdin);
        if (temp == EOF)
            break;

        if (temp == ' ')
            continue;
        if (temp != '\n')
            break;
    }

    return temp;
}

int
main(void)
{
    food_t *food;
    int order;
    char *Total_Order = NULL;
    int end;
    int temp;
    int start = 1;
    int n;

    // Festlegung goto Label, bei Bestellabbruch.
    while (start) {
        start = 0;

        n = 0;
        end = 1;

        printf("Order:\n");
        for (order = 0, ALLFOOD(food,foodlist), order += 1)
            printf(" %c %s %.2fEUR\n",order + 'A',food->name,food->price);

        while (end == 1) {
            if (n == 0) {
                printf("Enter Order:\n");
            }

#if USEGET
            order = scanchar();
            if (order == EOF)
                break;
#else
            scanf(" %c", &order);
#endif

            temp = order;
            temp = toupper(temp);
            temp -= 'A';

            if ((temp >= 0) && (temp < FOOD_COUNT)) {
                Total_Order = realloc(Total_Order,n + 1);
                Total_Order[n] = temp + 'A';
                ++n;
                continue;
            }

            switch (order) {
            case 'x':
            case 'X':
                end = 0;
                break;

            case 'z':
            case 'Z':
                system("CLS");
                free(Total_Order);
                Total_Order = NULL;
                start = 1;
                end = 0;
                break;
            }
        }
    }

    float t = 0.0;

    printf("Finished Order:\n");
    for (int i = 0; i < n; ++i) {
        order = Total_Order[i];
        food = &foodlist[order - 'A'];
        printf("%c ,,%s %.2fEUR\n",order,food->name,food->price);
        t += food->price;
    }

    printf("Summe %f\n", t);
    free(Total_Order);
    Total_Order = NULL;

    return 0;
}