习题9-4 查找书籍
给定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
1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<math.h> 5 int main() { 6 int n = 0; 7 char a[10][31]; //二维数组存放书名 8 double b[10]; //存放价格,浮点型 9 int lmax = 0, lmin = 0; //最大值和最小值在数组中的位置 10 double max = 0.0, min = 9999.0; 11 scanf("%d", &n); 12 getchar(); 13 for (int i = 0; i < n; i++) { 14 gets(a[i]); 15 scanf("%lf", &b[i]); 16 getchar(); 17 if (max < b[i]) { 18 max = b[i]; 19 lmax = i; 20 } 21 if (min > b[i]) { 22 min = b[i]; 23 lmin = i; 24 } 25 } 26 27 28 /*for (int i = 0; i < n; i++) { 29 printf("%s , %.2lf\n", a[i], b[i]); 30 } 31 printf("\n\n\n\n");*/ 32 char t[31]; 33 strcpy(t, a[lmax]); 34 printf("%.2lf, %s\n", b[lmax], t); 35 strcpy(t, a[lmin]); 36 printf("%.2lf, %s", b[lmin], t); 37 //system("pause"); 38 return 0; 39 }
说说我写这个题目的思路。
先定义好n,数组(我这里用的是2维数组),还有最大值最小值,,以及最大值最小值的位置(其实可以省略,我比较偷懒,没有做到最简)。然后输入n,输入书名,输入价格,循环,比较,最后输出。
需要非常注意的点是:如果输入书名的时候用的是gets()函数,然后用scanf()函数输入价格,一定要注意,这里scanf()后面要加上getchar(),为什么要加呢?
gets()它的机制是,你键盘随便输入,我(gets)只看一个键,有没有回车,如果有回车了,好,我就不接受你了,你回车之前的所有的输入都存在我这里。
scanf(%d)呢,如果是单独的一个它,问题不大,输入一个数,然后空格回车都行,它就会读进去。
如果scanf()后面还有gets(),问题就来了:大家可以试一试,如果把上述代码的getchar()去掉会发生什么。
中间空了4行是我为了区分清楚故意空的。大家可以看到, 原本应该是输入6个的,结果输入了4个就输出了。
并且输出的元素中,第一行和第三行是完全正确的,第二行是乱码。
我们接下来分析问题:我写了手稿,大家觉得哪个字看不懂给我说,我字太烂啦。
上述,即是没有getchar()的情况。
希望大家认真分析问题,解决问题。