6-2 自动售货机 分数 10 作者 XXX-LM 单位 武汉理工大学
自动售货机内有多种商品(最多不超过50种)供人购买,可以定义如下结构体类型来表示商品信息:
struct product {
int id; // 商品编号
char name[20]; // 商品名称
double price; // 商品单价
};
本题要求编写2个函数,分别用于显示售货机内的商品、计算所购买商品的总价格。
函数接口定义:
void menu(struct product p[],int n);
void order(struct product p[],int n);
其中:
- 函数menu()的功能是按
[商品编号] 商品名称 商品单价
形式显示菜单,分行输出各商品信息,包括商品编号、商品名称和商品单价。
- 在函数order()中,先输入要购买的商品编号以及数量,接着按
商品名称 * 数量 = 价格
形式输出购买该商品的金额,允许购买多种商品,当输入0时表示所选商品结束,最后输出计算的总价格(保留1位小数)。
在主函数中:
-
首先读入该自动售货机的商品信息,先输入正整数
n
(n≤20),之后n行依次输入n个商品的编号、名称以及单价,例如输入样例中的前4行。 -
调用menu()函数,按
[商品编号] 商品名称 商品单价
形式输出主函数中数组p的各成员值,商品个数不同,菜单项数也会不同。 -
调用order()函数,分行输入所需购买商品的编号和数量,接着按
商品名称 * 数量 = 价格
形式输出购买该商品的金额,允许购买多种商品,当输入0时表示所选商品结束,最后按Total = 总价格
形式输出计算的总价格(保留1位小数)。
裁判测试程序样例:
#include<stdio.h>
struct product {
int id;
char name[20];
double price;
};
void menu(struct product p[],int n);
void order(struct product p[],int n);
int main()
{
struct product p[20]; // 最多可有50个商品
int n;
scanf("%d",&n); // 商品数量
for(int i=0; i<n; i++) {
scanf("%d %s %lf",&p[i].id,p[i].name,&p[i].price); // 输入各商品的编号、名称和单价
}
menu(p,n); // 显示菜单
order(p,n); // 点单,输入所需商品,并按要求输出各商品的名称、数量及价格,以及最终的总价格
return 0;
}
/* 请在这里填写答案 */
输入样例:
3
1001 Water 2.0
1002 OrangeJuice 3.5
1003 GreenTea 3.0
1001 2
1003 1
0
输出样例:
[1001] Water 2.0
[1002] OrangeJuice 3.5
[1003] GreenTea 3.0
Water * 2 = 4.0
GreenTea * 1 = 3.0
Total = 7.0
答案
void menu(struct product p[],int n){ //函数一很简单
int i;
for(i=0;i<n;i++){
printf("[%d] %s %.1f\n",p[i].id,p[i].name,p[i].price);
}
}
void order(struct product *p,int n){
//定义两个数组 id[]用于存放输入的编号,qua[]存放输入的数量
int id[100],qua[100],i,j,count=0;
double sum=0,total=0;
while(1){
scanf("%d",&id[count]);
if(id[count]!=0) { //判断是否为0,为0结束,非0则继续输入数量
scanf("%d",&qua[count]);
count++;
}
else break;
}
for(j=0;j<count;j++){ //将id[]数组中的值与结构体数组中的值一一比较
for(i=0;i<n;i++){
if(p[i].id==id[j]){
sum=p[i].price*(1.0*qua[j]);
total+=sum;
printf("%s * %d = %.1f\n",p[i].name,qua[j],sum);
}
}
}
printf("Total = %.1f",total);
}
水平有限,代码很浅显,如有不当之处,真心希望大佬们指出错误~ ~谢谢阅读!