zoukankan      html  css  js  c++  java
  • 1054 求平均值 (20 分)C语言

    本题的基本要求非常简单:给定 N 个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是 [−1000,1000] 区间内的实数,并且最多精确到小数点后 2 位。当你计算平均值的时候,不能把那些非法的数据算在内。

    输入格式:
    输入第一行给出正整数 N(≤100)。随后一行给出 N 个实数,数字间以一个空格分隔。

    输出格式:
    对每个非法输入,在一行中输出 ERROR: X is not a legal number,其中 X 是输入。最后在一行中输出结果:The average of K numbers is Y,其中 K 是合法输入的个数,Y 是它们的平均值,精确到小数点后 2 位。如果平均值无法计算,则用 Undefined 替换 Y。如果 K 为 1,则输出 The average of 1 number is Y。

    输入样例 1:

    7
    5 -3.2 aaa 9999 2.3.4 7.123 2.35
    

    输出样例 1:

    ERROR: aaa is not a legal number
    ERROR: 9999 is not a legal number
    ERROR: 2.3.4 is not a legal number
    ERROR: 7.123 is not a legal number
    The average of 3 numbers is 1.38
    

    输入样例 2:

    2
    aaa -9999
    

    输出样例 2:

    ERROR: aaa is not a legal number
    ERROR: -9999 is not a legal number
    The average of 0 numbers is Undefined
    

    思路

    1. 将字符转换成指定格式,判断是否为合法浮点数
    2. 判断完以后即可根据有效数的个数进行分类输出即可。
    #include <stdio.h>
    int main(){
    	int n,i,j,cnt=0;//cnt记录合法数目个数 
    	scanf("%d",&n);
    	char arr[50],sam[50];//存储输入的字符,存储格式化后的字符串 
    	double sum=0,tmp;//sum总和,实数tmp 
    	for(i=0;i<n;i++){
    		scanf("%s",&arr);
    		sscanf(arr,"%lf",&tmp);//从一个字符串中读进与指定格式相符的数据
    		//printf("1.arr=%s
    ", arr);
    		//printf("1.tmp=%d
    ", tmp);
    		sprintf(sam,"%.2lf",tmp);//字符串格式化命令,主要功能是把格式化的数据写入某个字符串中 
    		int flag=0;
    		for(j=0;j<strlen(arr);j++){//strlen()计算指定字符串arr的长度
    			if(arr[j]!= sam[j]) flag=1;
    		}
    		if(flag != 0|| tmp< -1000|| tmp> 1000){
    			printf("ERROR: %s is not a legal number
    ",arr);
    			continue;
    		}else{
    			sum += tmp;//求和 
    			cnt++;
    		}
    	}
    	if(cnt>1)	printf("The average of %d numbers is %.2lf",cnt,sum/cnt);
    	if(cnt==1)	printf("The average of 1 number is %.2lf",sum);
    	if(cnt==0)	printf("The average of 0 numbers is Undefined");
    	return 0;
    } 
    

    sprintf函数

    定义如下:

    int sprintf( char *buffer, const char *format [, argument] … );
    
    • 除了前两个参数类型固定外,后面可以接任意多个参数。而它的精华,显然就在第二个参数:格式化字符串上。
    • printf 和sprintf都使用格式化字符串来指 定串的格式,在格式串内部使用一些以“%”开头的格式说明符(format specifications)来占据一个位置,在后边的变参列表中提供相应的变量,最终函数就会用相应位置的变量来替代那个说明符,产生一个调用者想要 的字符串。
    1. 格式化数字字符串
      sprintf最常见的应用之一莫过于把整数打印到字符串中,所以,spritnf在大多数场合可以替代itoa。如:
    //把整数123打印成一个字符串保存在s中。
    sprintf(s,%d”, 123); //产生“123″
    
    1. 控制浮点数打印格式
      浮点数的打印和格式控制是sprintf的又一大常用功能,浮点数使用格式符”%f”控制,默认保留小数点后6位数字,比如:
    sprintf(s,%f”, 3.1415926); //产生“3.141593″
    

    但有时我们希望自己控制打印的宽度和小数位数,这时就应该使用:”%m.nf”格式,其中m表示打印的宽度,n表示小数点后的位数。比如:

    sprintf(s,%10.3f, 3.1415626); //产生:“ 3.142″
    sprintf(s,%-10.3f, 3.1415626); //产生:“3.142 ”
    sprintf(s,%.3f, 3.1415626); //不指定总宽度,产生:“3.142″
    

    sscanf函数

    sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。格式转换形式请参考scanf()。转换后的结果存于对应的参数内。

    #include<stdio.h>  
     
    int main(){  
        char str[100];  
        //用法一:取指定长度的字符串  
        sscanf("12345","%4s",str);  
        printf("用法一
    str = %s
    ",str);  
      
        //用法二:格式化时间  
        int year,month,day,hour,minute,second;  
        sscanf("2013/02/13 14:55:34","%d/%d/%d %d:%d:%d",&year,&month,&day,&hour,&minute,&second);  
        printf("用法二
    time = %d-%d-%d %d:%d:%d
    ",year,month,day,hour,minute,second);  
      
        //用法三:读入字符串  
        sscanf("12345","%s",str);  
        printf("用法三
    str = %s
    ",str);  
      
        //用法四:%*d 和 %*s 加了星号 (*) 表示跳过此数据不读入. (也就是不把此数据读入参数中)  
        sscanf("12345acc","%*d%s",str);  
        printf("用法四
    str = %s
    ",str);  
      
        //用法五:取到指定字符为止的字符串。如在下例中,取遇到'+'为止字符串。  
        sscanf("12345+acc","%[^+]",str);  
        printf("用法五
    str = %s
    ",str);  
      
        //用法六:取到指定字符集为止的字符串。如在下例中,取遇到小写字母为止的字符串。  
        sscanf("12345+acc121","%[^a-z]",str);  
        printf("用法六
    str = %s
    ",str);  
        return 0;  
    } 
    
    欢迎查阅
  • 相关阅读:
    c#爬虫-从内存中释放Selenium chromedriver.exe终极杀
    领域驱动设计-从贫血模型到充血模型
    推荐:.Net 5开源免费的内容管理系统
    Exceptionless服务端本地化部署
    Chrome扩展程序开发
    SqlSugar+SqlServer+NetCore3.1 入门案例
    Linux Qt5 一. 开发环境安装
    Boost Mutex详细解说
    Y7000 2020 安装ubuntu 16.04.3双系统后无法识别无线网卡问题
    《视觉SLAM十四讲》第三讲习题7
  • 原文地址:https://www.cnblogs.com/gh110/p/12158193.html
Copyright © 2011-2022 走看看