PTA 7-4 查找书籍 (20 分)

给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价。

输入格式:

输入第一行给出正整数n(<10),随后给出n本书的信息。每本书在一行中给出书名,即长度不超过30的字符串,随后一行中给出正实数价格。题目保证没有同样价格的书。

输出格式:

在一行中按照“价格, 书名”的格式先后输出价格最高和最低的书。价格保留2位小数。

输入样例:

3
Programming in C
21.5
Programming in VB
18.5
Programming in Delphi
25.0

输出样例:

25.00, Programming in Delphi
18.50, Programming in VB

 

我认为的难点:

关于scanf,getchar和gets,百度搜索结合我的理解如下↓

1.scanf读入自动跳过前导空白符,但scanf遇到所有空白符就停止读入,且并不会吸收空白符
2.gets并不会跳过前导空白符,gets遇到回车停止读入,于是如果缓冲区剩下了一个\n(前面的回车没有被吸收掉)时,就会停止读入,且字符串的内容就是回车        
        所以当两个gets连用的时候,中间一定要处理掉回车,毕竟gets只有遇到回车才能停,所以前一个gets一定要用回车停止读入,但是要用回车的话,缓冲区就会留下一个回车...gets,真是麻烦啊
3.getchar常常在这种情况下用来吸收回车
        我们(萌新)的题读入两个数据,一般都是两个scanf连用,scanf跳过前导空白符,于是什么都不会发生
        回到正题,由于要输入的书名中间含空格,于是我们这道题只能用gets函数读书名(scanf读到空格就结束了)
        于是就遇到了这道题的这种情况:scanf和gets连用,并且输入样例读入书本的数量时,scanf是用回车结束的
        并且,在每本书的价格读入后,同样是回车结束,然后使用gets读下一本书的名字,所以getchar()要放在for循环里面
        以上就是为什么这道题用gets以及为什么要使用getchar的原因


测试点提示结果分数耗时内存
0sample等价

答案正确

123 ms348 KB
1最大n和最长字符串

答案正确

43 ms316 KB
2最小n

答案正确

42 ms188 KB

我的答案1:

#include<stdio.h>
struct findbooks
{
    char name[31];
    double price;
};
int main()
{
    int n;
    scanf("%d",&n);
    struct findbooks b[n];
    for(int i=0;i<n;i++)
    {
        getchar();
        gets(b[i].name);
        scanf("%lf",&b[i].price);
    }
    double max=b[0].price,min=b[0].price;
    int x=0,y=0;//最开始没有初始化存入max和min下标的x和y,导致测试点1,2段错误
    for(int i=0;i<n;i++)
    {
        if(max<b[i].price)
        {
            max=b[i].price;
            x=i;
        }
    }
    for(int j=0;j<n;j++)
    {
        if(min>b[j].price)
        {
            min=b[j].price;
            y=j;
        }
    }
    printf("%.2lf, %s\n",max,b[x].name);
    printf("%.2lf, %s\n",min,b[y].name);
    return 0;
}

我的答案2:

#include<stdio.h>
struct book
{
    char name[31];
    double price;
};
int main()
{
    int n;
    scanf("%d",&n);
    struct book bk[n];
    for(int i=0;i<n;i++)
    {
        getchar();
        gets(bk[i].name);
        scanf("%lf",&bk[i].price);
    }
    double max=bk[0].price,min=bk[0].price;
    for(int i=0;i<n;i++)
    {
        if(max<bk[i].price)max=bk[i].price;
        if(min>bk[i].price)min=bk[i].price;
    }
    for(int i=0;i<n;i++)
    {
        if(bk[i].price==max)
        {printf("%.2lf, %s\n",max,bk[i].name);break;}
    }
    for(int i=0;i<n;i++)
    {
        if(bk[i].price==min)
        {printf("%.2lf, %s\n",min,bk[i].name);break;}
    }
    return 0;
}

其实好像没啥区别,只是第二个是先找出最大值最小值,再去搜索并输出而已

如有错误,请指正

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值