首页 > 其他分享 >PAT乙级 1054 求平均值 C语言

PAT乙级 1054 求平均值 C语言

时间:2024-03-23 14:00:13浏览次数:19  
标签:PAT int number legal C语言 char ERROR 1054 输入

本题的基本要求非常简单:给定 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

 解题思路:

最初想过用字符串来解决此题,但是比较麻烦,也就没有做出来,后来参考了大佬的方法,用sscanf和sprintf函数解决此题很轻松。用这两个函数也是输入一个解决一个,会很方便。

在做题之前,先学习一下sscanf和sprintf函数,这里我参考的是菜鸟教程

sscanf函数:int sscanf(const char *str, const char *format, ...) 从字符串读取格式化输入。我也是第一次遇到这个函数,没有看懂,但是没看懂没关系,看懂它给的例子就行。

int main()
{
   int day, year;
   char weekday[20], month[20], dtm[100];

   strcpy( dtm, "Saturday March 25 1989" );
   sscanf( dtm, "%s %s %d  %d", weekday, month, &day, &year );

   printf("%s %d, %d = %s\n", month, day, year, weekday );
    
   return(0);
}

//输出的结果为:
March 25, 1989 = Saturday

也就是说sscanf将dtm这个字符串的内容以 "%s %s %d  %d",分别写入了weekday, month, day,year。

sprintf函数:int sscanf(const char *str, const char *format, ...) 从字符串读取格式化输入。也是直接看例子。

#include <stdio.h>
#include <math.h>

int main()
{
   char str[80];

   sprintf(str, "Pi 的值 = %f", M_PI);
   puts(str);
   
   return(0);
}

//输出的结果为:
Pi 的值 = 3.141593

也就是说,sprintf的作用是把M_PI的值以“%f”的格式写入到str中。

有了这两个函数的基础,再看下面的代码应该没啥问题了。对了,fabs()这也是个函数,用来求绝对值的。

代码:

#include<stdio.h>
#include<string.h>

int cmp(char str1[],char str2[]);
int main() 
{
    int n;
    scanf("%d",&n);
    double sum=0.0;
    char str1[100],str2[100];
    int k=n;//用来记录合法的数
    double temp;//用来接收合法的数据 
    for(int i=0;i<n;i++){
    	scanf("%s",&str1);
    	sscanf(str1,"%lf",&temp);//将字符数组str1的内容以"%lf"的格式赋给temp
    	sprintf(str2,"%.2lf",temp);//把temp以"%.2lf"的格式写到str2字符数组中
    	if(fabs(temp)<=1000&&cmp(str1,str2)!=0){
    		sum+=temp;
		}
		else{
			k--;//表示不合法,并 输出 
			printf("ERROR: %s is not a legal number\n",str1); 
		}
	}
	if(k==0) printf("The average of 0 numbers is Undefined\n");
	else if(k==1) printf("The average of 1 number is %.2lf\n",sum);
	else printf("The average of %d numbers is %.2lf",k,sum/k);
	return 0;
	
}

int cmp(char str1[],char str2[]){
	for(int i=0;i<strlen(str1);i++){
		if(str1[i]!=str2[i]){
			return 0;
		}
	}
	return 1;
}

标签:PAT,int,number,legal,C语言,char,ERROR,1054,输入
From: https://blog.csdn.net/weixin_54641008/article/details/136921713

相关文章

  • 0基础学习C语言第一章:常量与变量详解
    一、常量定义:在程序运行过程中,其值不能被改变的量称为常量。常用常量有以下几类:1.整型常量十进制整数形式例如:234,-1232.实型(浮点型)常量十进制小数形式:由数字、小数点组成例如:2.345、-23.345指数形式:如:1.23e2(相当于1.23x10²)由于在计算机输入输出时,无法表示上角......
  • 0基础学习C语言第二章:运算符与表达式
    表达式:表达式是c语言的主体,在c语言中,表达式由操作符和操作数组成。简单的表达式可以只有一个操作数。根据操作符的个数,可以将表达式分为简单表达式和复杂表达式,简单的表达式只含有一个操作符(如:5+5),而复杂的表达式则含有两个或者两个以上的操作符(如5+5+6*4);表达式是本身什么事情也......
  • 杨辉三角C语言
    杨辉三角输出杨辉三角前10行#include<stdio.h>intmain(){ inta[10][10]; for(inti=0;i<10;i++){ a[i][0]=1; a[i][i]=1; } for(inti=2;i<10;i++) for(intj=1;j<i;j++) a[i][j]=a[i-1][j]+a[i-1][j-1]; for(inti=0;i<10;i++){ for(intj=0......
  • 输入8个整数放入一维数组w中,输出交换前的数组,找出其中的最大数和最小数并将他们分别与
    #include<stdio.h>intmain(){intw[8];inti,maxIndex=0,minIndex=0,temp;//用户输入8个整数printf("请输入8个整数:");for(i=0;i<8;i++){scanf("%d",&w[i]);}//假设第一个元素为最大和最小值......
  • C语言预编译#pragma宏的作用
    在嵌入式编程中,#pragma指令具有非常重要的作用,因为它允许开发者在不同的编译器之间传达特定的编译指令。由于嵌入式编程通常与硬件紧密相关,且资源有限,这些指令可以帮助开发者更有效地利用可用资源,优化程序,以及处理特定的硬件约束。以下是#pragma在嵌入式编程中的一些常见应用......
  • 掌握C语言结构体,开启编程新世界
    ✨✨欢迎......
  • 数据结构——单向链表(C语言版)
    在数据结构和算法中,链表是一种常见的数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。在C语言中,我们可以使用指针来实现单向链表。下面将详细介绍如何用C语言实现单向链表。目录1.定义节点结构体2.初始化链表3.插入节点4.删除节点5.遍历链......
  • C语言概述(理论)
    1.什么是c语言?1.1 c语言是一种用于和计算机交流的高级语言,它即具有高级语言的特点,又具有汇编语言特点非常接近自然语言程序的执行效率非常高1.2c语言是所有编程语言中的经典很多高级语言和著名的系统软件都是c语言繁衍与编写的高级语言列如:c++,c#,java,go,object-c等等......
  • 【C语言】空心正方形图案
    思路:1,两行两列打印*:第一行和最后一行,第一列和最后一列。2,其他地方打印空格。代码如下:#include<stdio.h>intmain(){  intn=0;  inti=0;  intj=0;  while(scanf("%d",&n)!=EOF)    for(i=0;i<n;i++)    {......
  • c语言编程题
    1.密码破译要将"China"译成密码,译码规律是:用原来字母后面的第4个字母代替原来的字母。例如,字母"A"后面第4个字母是"E"."E"代替"A"。因此,"China"应译为"Glmre"。请编一程序,用赋初值的方法使cl、c2、c3、c4、c5五个变量的值分别为,’C’、’h’、’i’、’n’、’a’,经过运算,使c1、......