实验9-5 查找书籍 (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

错误的例子:

#include<stdio.h>
struct book{
	char name[31];
	double price;
};
int main()
{
	struct book a[10];
	int n;
	scanf("%d\n",&n);   //后面用gets()函数接收字符串,所以这里必须用\n来处理掉输入的回车,否则会让gets()接收到第一个字符为'\n'
	int min_index=0,max_index=0;
	for(int i=0;i<n;i++){
		gets(a[i].name);
		scanf("%lf\n",&a[i].price);//\n的原因同第一个scanf
		if(a[min_index].price>a[i].price) min_index=i;//边输入边比较,记录价格最高和最低的书对应的下标
		if(a[max_index].price<a[i].price) max_index=i;
	}
	printf("%.2f, %s\n",a[max_index].price,a[max_index].name);
	printf("%.2f, %s\n",a[min_index].price,a[min_index].name);
	return 0;
}

我的理解:
这道题最难的部分就是要注意对回车的处理,
因为例如 scanf("%d",&a);scanf读入一个整数,遇到空格或回车停止,但是后面的空格或者回车还在缓冲区等待着下一个函数来读它,此时如果有gets()或者getchar,就会把空格或者回车读入字符串或者字符变量中,造成结果错误。
如果理解有误,请大佬们指正,自学C语言入门中,感谢!

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

感谢评论区的伙伴帮忙指出了不能输出的错误
不能输出的原因是
我以为scanf(“%d\n”);可以直接把缓冲区的\n像别的符号一样消除掉,实际上不是简单的能把\n消除掉的,scanf()中加\n的含义是消除空白字符(回车,空格,tab),而且需要读到一个非空字符才能结束scanf,所以造成了需要再输入一个非空的数据程序才能有输出。

例如,scanf("%d\n",&a),我输入一个1然后回车,scanf并不会结束,还得输入一个非空的数或者字符才能顺利结束,但是多输入的这个数或者字符不会被读进去,而是还在缓冲区,

改正:在scanf后用getchar();读掉那个‘\n’就可以,或者用scanf("%c",&ch);将\n存在临时的ch当中,不对ch进行任何操作即可

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值