PAT乙级1054. 求平均值(C语言)

本文详细解析PAT乙级真题中关于合法输入验证的问题,包括如何通过字符串操作和字符处理来确保输入的有效性,并提供了完整的C语言实现代码。

AC

PAT乙级真题题解目录


/*
 * 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值