1. 程式人生 > >PAT乙級1054. 求平均值(C語言)

PAT乙級1054. 求平均值(C語言)

AC

/*
 * 1. 合法的輸入最長為8(-1000.00);
 * 2. 嚴謹解法:
 *      2.1 scanf("%8s", str); 讀取 最多前8個字元
 *      2.2 利用 ungetc(getchar(), stdin); 讀取之後的字元,並推回(避免不必要的誤讀);
 *      2.3 isspace(c); 判斷是否讀取了空白字元 來判斷讀入是否完整; 
 * 3. 非法的情況:
 *      3.1 輸入長度 > 8;
 *      3.2 輸入數字大小 > 1000 或 < -1000;
 *      3.3 不是數字 或 小數點的位數不對;
 *          - 利用 sscanf( string str, string fmt, mixed var);
 *  和 sprintf(char *str, char * format, argument); 與原輸入進行比較。
 * 4. 輸出:
 *      - 只有當合法輸入的個數為1時,輸出內容 The average of 1 number is Y 中, 
 *    number才為單數,個數為0依然是numbers。
 */
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <ctype.h> int main() { int N, K = 0; //輸入的數量,合法輸入的個數 double sum = 0.0, temp = 0.0; // 合法輸入實數的和,臨時儲存的實數 char num[9], str[9], c; // 合法輸入最長為 8;c用於讀取多餘字元 scanf("%d", &N); for (int i = 0; i < N; i++) { scanf
("%8s", str); //讀取 最多前8個字元 c = ungetc(getchar(), stdin); //讀取下一個字元 並 將其推回 int len = strlen(str), isLegal = 0; //讀取的字串長度 判斷是否合法 if (isspace(c)) { //之後是空白字元(空格、回車),即字元讀取完全 isLegal = 1; sscanf(str, "%lf", &temp); //將字串轉為浮點數型別 sprintf(num, "%.2f"
, temp); //將浮點數精確到小數點後兩位 轉為字串; for (int j = 0; j < len; j++) { if (num[j] != str[j]) { //如果處理前後的字串不一致,就是非法輸入 isLegal = 0; break; } } } if (!isLegal || temp > 1000 || temp < -1000) {//如果是非法輸入 printf("ERROR: %s", str); while (!isspace(c = getchar())) {//將字串完全輸出 putchar(c); } printf(" is not a legal number\n"); } else { sum += temp; K++; } } if (K == 0) { //平均值無法計算 即 分母為0 printf("The average of 0 numbers is Undefined\n"); } else if (K == 1) { printf("The average of 1 number is %.2f\n", sum); } else { printf("The average of %d numbers is %.2f\n", K, sum / K); } return 0; }