给定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的原因
测试点 | 提示 | 结果 | 分数 | 耗时 | 内存 |
---|---|---|---|---|---|
0 | sample等价 | 答案正确 | 12 | 3 ms | 348 KB |
1 | 最大n和最长字符串 | 答案正确 | 4 | 3 ms | 316 KB |
2 | 最小n | 答案正确 | 4 | 2 ms | 188 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;
}
其实好像没啥区别,只是第二个是先找出最大值最小值,再去搜索并输出而已
如有错误,请指正