PTA |1054 求平均值 分数 20

116 阅读2分钟

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;
}

image.png

image.png

#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语言的特殊读入读出:


image.png

#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;
    
}