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;
}
我必须为一家快餐店做一个订单系统(它只是一个学校项目)。 我已经完成了这个工具。
但是老师让我们用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;
}