PTA | 程序设计类实验辅助教学平台 (pintia.cn)
我刚开始这样写的,其实就是欠考虑:
#include<iostream>
using namespace std;
int main()
{
int n=0;cin>>n;
string s;
cin>>s;
double sum;
int cnt;
for(int i=0;i<s.size();++i)
{
if(s[i]-'0'>=-1000&&s[i]-'0'<=1000)
{
cnt++;
sum+=(s[i]-'0');
}
else
{
printf("ERROR: %s is not a legal number",s[i]);
}
}
printf("The average of %d numbers is %s",cnt,sum/cnt);
return 0;
}
#include<bits/stdc++.h>
using namespace std;
bool check(string s)
{
int pnum = 0, ppos = 0;
//枚举所有的非法情况
for (int i = 0; i < s.size(); ++i)
{
//但凡输入的数据不是数字或者不是负号或者小数点,就是非法情况
if (!isdigit(s[i]) && (s[i] != '-' && s[i] != '.'))return false;
//当负号出现在首位时是非法情况
if (s[i] == '-' && i != 0)return false;
//统计一下有多少个小数点,小数点大于1的情况是非法的
if (s[i] == '.')
{
pnum++;
if (pnum > 1)return false; //小数点个数大于非法
ppos = i; //ppos代表小数点的下标
}
}
//当有小数点存在的时候,并且小数点前面最多只有三位 :“1000”
if (pnum > 0 && ppos < s.size() - 3)return false;
//越界是非法情况
if (stod(s) > 1000.0 || stod(s) < -1000.0)return false; //注意这里是||不是&& 只有有一个越界了就是违法情况
else return true;
}
int main()
{
int n = 0, cnt = 0; cin >> n;
string s; double sum = 0.0;
for (int i = 0; i < n; ++i)
{
cin >> s;
if (!check(s))cout << "ERROR: " << s << " is not a legal number" << endl;
else
{
cnt++; //统计合法元素的个数
sum += stod(s); //求合法元素值的和
//最后用sum/cnt就是合法元素的平均值
}
}
if (cnt == 0)printf("The average of 0 numbers is Undefined");
else if (cnt == 1)printf("The average of %d number is %.2lf", cnt, sum);
else printf("The average of %d numbers is %.2lf", cnt, sum / cnt);
return 0;
}
第二种方法:
不用一一枚举所有情况,利用c语言的特殊读入读出:
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int main()
{
int n=0,cnt=0;cin>>n;
char a[50],b[50];
double temp=0.0,sum=0.0;
for(int i=0;i<n;i++)
{ scanf("%s",a);
sscanf(a, "%lf", &temp);
sprintf(b, "%.2f",temp);
int flag=0;
for(int j=0;j<strlen(a);j++)
if(a[j]!=b[j])flag=1;
if(flag || temp < -1000 || temp > 1000)
{
printf("ERROR: %s is not a legal number\n",a);
continue;
}
else
{
sum+=temp;
cnt++;
}
}
if(cnt==1)printf("The average of 1 number is %.2f\n",sum);
else if(cnt>1)printf("The average of %d numbers is %.2f\n",cnt,sum/cnt);
else printf("The average of 0 numbers is Undefined\n");
return 0;
}