PAT甲级A1108 Finding Average (20分)/字符串

题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805360777347072

读几个数,不合法就报错,计算合法的数量和平均数。

构思这种题,一开始就要思考测试点都在哪,这样才能有的放矢嘛——最保险的思路就是题目有说的,都当测试点,没说的地方,对于这种20分的题,先不要管。

这道题的测试都是浅显的覆盖了以下情况:
1、(易错点)有没有分合法的数的数量是0、1、其他,其中0和其他的number带s,1的不带s;
2、带两个小数点以上的数
3、含有除了数字、符号、小数点以外的数,如aaa
4、小数位数超过两位的数
5、大小不在[-1000,1000]范围内的数
6、(易错点)输出的小数要是两位的

不需要考虑的点:
1、输入的数是1.000、2.000等,后面带0的小数超过了2位,合法不合法
2、输入带两个负号的,合法不合法

满分代码如下:

int main(){
    int n,num=0;
    double total=0.0;
    cin>>n;
    string s;
    for(int i=0;i<n;i++){
        cin>>s;
        bool f=true;
        int dot=0;
        int len=s.size();
        for(int j=0;j<len;j++){
            if(s[j]=='-'&&j>0){
                f=false;
            }
            if(s[j]!='-'&& s[j]!='.' && !isdigit(s[j])){
                f=false;
            }
            if(s[j]=='.'){
                dot++;
            }
        }
        if(f && dot>1){
            f=false;
        }
        
        if(f){
            int pos=s.find('.');
            if(pos!=-1){
                int zero=s.find_last_not_of('0');
                //int zero=s.size()-1;
                if(zero-pos>2){
                    f=false;
                }
            }
        }
        if(f && (stof(s)>1000.0 || stof(s)<-1000.0)){
            f=false;
        }
        if(!f){
            cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
        }else{
            num++;
            total+=stod(s);
        }
    }
    if(num==0){
        cout<<"The average of 0 numbers is Undefined";
    }else if(num==1){
        printf("The average of 1 number is %.02lf",total);
    }else{
        printf("The average of %d numbers is %.02lf",num,(double)total/num);
    }
    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值