PAT乙級1054. 求平均值(C語言)
阿新 • • 發佈:2018-12-24
/*
* 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;
}