这里出现错误结果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;
}