1. 程式人生 > 實用技巧 >習題9-4 查詢書籍

習題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()的情況。

希望大家認真分析問題,解決問題。