PAT1054_乙级_求平均值(测试点3情况归纳及inf问题)

这里出现错误结果inf是因为分母为0 

测试点2: number与numbes 

测试点3:

(1) 123.可以正常输出,但.123不行 

(2) 0001可以正常输出,-0.也可以,-0111.也可以

(3) 测试点3还测试了合法范围:别只判断整数,小数也不能超,即1000.01不可以被输出

感觉这题用c++模板函数会很好写,比如stod函数,substr函数等

#include<iostream>
using namespace std;
#include<algorithm>
#include<iomanip>
#include<cmath>
int main() {
	string num[101];
	//使用char类型,那么在find时,如果未找到,返回值很难确定
	//如果强制使用返回值为下标的方式,那么需要使用类模板,在c++中,字符串就是个默认类模板
	int n = 0;
	cin >> n;
	int poi_after = 0;
	int flag = 0;
	int pos = 0;
	double sum = 0;
	int brk = 0;  //经历过break,那么该值改变
	double avg = 0;
	int avg_down = 0;
	for (int i = 0; i < n; i++) {
		poi_after = 0;
		brk = 0;
		sum = 0;
		flag = 0;
		cin >> num[i];
		if (num[i][0] == '-') {
			//有负号,则从1开始进行转换的for循环
			flag = 1;
			if (num[i] == "-") {
				brk = 1;
				cout << "ERROR: " << num[i] << " is not a legal number" << endl;
			}
		}
		//找到第一个'.'的地址     
		pos = num[i].find('.');
		//注意 *pos是地址所对的数值,不是数值下标,像for循环i那种下标!!!
		//cout << *pos << endl;
		//以上是进入内循环的前提准备
		for (int j = flag; num[i][j] != '\0'; j++) {
			//注意各个if条件次序

			//如果j等于第一个小数点,直接跳出,进行下一次循环  (使用地址进行相等运算) 或者可以让两个地址相减,使其变成整型计数比较
			if (j == pos) {
				continue;
			}
			if (num[i][flag] == '.') {
				cout << "ERROR: " << num[i] << " is not a legal number" << endl;
				brk = 1;
				break;
			}
			//非数字字符判断
			//注意: 可能出现情况 一个数列内含多个小数点
			//这里排除了第一个小数点被误判的情况: j!=pos;
			if (num[i][j] < 48 || num[i][j] > 57) {
				cout << "ERROR: " << num[i] << " is not a legal number" << endl;
				brk = 1;
				break;
			}

			//接下来,将字符转化为整型   如果他是字符类型,那么直接被上一个if break掉;
			if (j < pos || pos == -1) {
				sum = sum * 10 + num[i][j] - '0';
			}

			//小数点后数字个数判断
			if (j > pos && pos != -1) {
				poi_after++;
				//将小数加入到sum中
				sum = sum + (num[i][j] - '0') * pow(0.1, poi_after);
				if (poi_after > 2) {
					cout << "ERROR: " << num[i] << " is not a legal number" << endl;
					brk = 1;
					break;
				}
			}

			//判断小数点前整数绝对值是否<=1000
			if (abs(sum) > 1000) {
				cout << "ERROR: " << num[i] << " is not a legal number" << endl;
				brk = 1;
				break;
			}
		}
		if (!brk) {
			if (flag) {
				sum = -sum;
			}
			avg += sum;
			avg_down++;
		}
	}
	if (avg_down)
		if (avg_down > 1)
			cout << fixed << showpoint << setprecision(2) << "The average of " <<
			avg_down << " numbers is " << avg / avg_down << endl;
		else
			cout << fixed << showpoint << setprecision(2) << "The average of " <<
			avg_down << " number is " << avg / avg_down << endl;
	else
		cout << "The average of 0 numbers is Undefined" << endl;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值