坚持不住就问问自己真的甘心放弃吗?

前言

书接上回,今天学校发了几道题,而这道题罕见的在CSDN里找不到,同时题本身对刚学结构体的同学,也有一定难度所以想和大家分享一下我的一点心得。

自动售货机内有多种商品(最多不超过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时表示所选商品结束,最后输出计算的总价格(保留2位小数)。

在主函数中:

  1. 首先读入该自动售货机的商品信息,先输入正整数n(n≤20),之后n行依次输入n个商品的编号、名称以及单价,例如输入样例中的前4行。

  2. 调用menu()函数,按[商品编号] 商品名称 商品单价形式输出主函数中数组p的各成员值,商品个数不同,菜单项数也会不同。

  3. 调用order()函数,分行输入所需购买商品的编号和数量,接着按商品名称 * 数量 = 价格形式输出购买该商品的金额,允许购买多种商品,当输入0时表示所选商品结束,最后按Total = 总价格形式输出计算的总价格(保留2位小数)。

裁判测试程序样例:

#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

代码长度限制16 KB

时间限制400 ms

内存限制64 MB

答案解析:

第一个函数:

一个简单的循环就能结束战斗了,不过注意这里的“name”是字符串,所以不用取地址

void menu(struct product p[], int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("[%d] %s %.1lf\n",p[i].id, p[i].name, p[i].price);
    }
}

第二个函数:

要点一;"0"的时候停止,我的方法是每次循环先取得每行第一个数字看是不是零,是的话循环结束,不是的话循环继续。

要点二:打印“商品名称 * 数量 = 价格形式输出购买该商品的金额”时可以直接在print函数里面写算式,当然在引入一个变量来接收计算“购买该商品的金额”的值也可以。

要点三:打印的格式问题,在上一篇博客我也提到了,最好是把样例复制粘贴过去然后把数值所在位置改为对应占位符即可,很多题也都最好这样,可以有效防止因为格式过不了。

 

void order(struct product p[], int n)
{
    int a, b = 0;
    double sum = 0;
    while (~scanf("%d", &a) && a != 0)//判断是不是0
    {
        int i=0;
        while (p[i++].id != a);
        scanf("%d", &b);
        sum += b * p[i - 1].price;
        printf("%s * %d = %.1lf\n", p[i - 1].name, b, b * p[i - 1].price);
    }
    printf("Total = %.1lf", sum);
}

上答案:

void menu(struct product p[], int n)
{
    for (int i = 0; i < n; i++)
    {
        printf("[%d] %s %.1lf\n",p[i].id, p[i].name, p[i].price);
    }
}
void order(struct product p[], int n)
{
    int a, b = 0;
    double sum = 0;
    while (~scanf("%d", &a) && a != 0)
    {
        int i=0;
        while (p[i++].id != a);
        scanf("%d", &b);
        sum += b * p[i - 1].price;
        printf("%s * %d = %.1lf\n", p[i - 1].name, b, b * p[i - 1].price);
    }
    printf("Total = %.1lf", sum);
}

总结

谢谢观看

觉得有用的话就点个免费的赞吧

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐