习题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
", a[i], b[i]);
30     }
31     printf("



");*/
32     char t[31];
33     strcpy(t, a[lmax]);
34     printf("%.2lf, %s
", 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()的情况。

希望大家认真分析问题,解决问题。

原文地址:https://www.cnblogs.com/KeithTee/p/13852642.html