给定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进行任何操作即可