本题要求编写程序,将输入的n个整数存入数组a中,然后计算这些数的平均值,再输出所有大于平均值的数。
输入格式:
输入在第1行中给出一个正整数n(1≤n≤10),第2行输入n个整数,其间以空格分隔。题目保证数据不超过长整型整数的范围。
输出格式:
输出在第1行给出平均值,保留2位小数。在第2行输出所有大于平均值的数,每个数的后面有一个空格;如果没有满足条件的数,则输出空行。
如果输入的n不在有效范围内,则在一行中输出"Invalid."。
输入样例1:
10
55 23 8 11 22 89 0 -1 78 186
输出样例1:
47.10
55 89 78 186
输入样例2:
0
输出样例2:
Invalid.
背景:
这是本c语言菜鸡在刚入门数组写的第一个数组题,也是本菜鸟第一次撰写的CSDN博文,如编写的代码或本人的观点说法有误,欢迎各位大佬指正!
一些注意点:
首先来看题目,该题要求运用数组来解题,在正式开始编写代码之前我们需要注意一些题目的细节:输入的n有效范围为[1,10],需要输出两个结果,分别为平均数和大于平均数的数,这两个结果需要分行!并且平均数要保留两位小数!接着我们需要考虑好需要用到的语句类型(笔者根据本人代码习惯使用if语句和for循环),最后我们就可以正式开始编写代码了。
接下来展示的是笔者第一次编写的代码:
#include <stdio.h>
int main()
{
int n;//定义输入的整数n
int i;//定义循环变量i
int a[n];//定义数组a
float sum=0;//定义输入的整数和sum
float average=0;//定义平均数average
scanf("%d",&n);//扫描输入的正整数n
/*运用if语句判断n是否在[1,10]内*/
if ( n<1 || n>10){
printf("Invalid.");//n不在[1,10]内的情况
}
else//n在[1,10]内的情况
{
/*运用for循环来将输入的n个正整数存入数组a中*/
for (i=0;i<n;i++){
scanf("%d",&a[i]); //将输入的第i+1个正整数储存在a[i]中
sum=sum+a[i];//计算输入的整数和sum
average=sum/n;//计算所输入的n个正整数的平均数 average
}
printf("%.2f\n",average);//输出平均数
/*再用一个for循环来将储存在数组a内的n个正整数从第1个到第n个一一与平均数average对比 */
for (i=0;i<n;i++){
/*运用if语句判断数组a中第i+1个数是否大于平均数average*/
if (a[i]>average){
printf("%d ",a[i]);//若结果为真,输出数组a中满足条件的数和空格
}
}
}
return 0;
}
在PTA上提交结果如下:
那么在测试点1出现了格式错误的问题
我们用这个程序做一个这样的事情
输入:
1
50
我们想要得到的结果为
输出:
50.00
试着在Dev-C++上编译运行一下这段代码:
我们解题到这里产生一个疑惑:在n=1的测试点1上做了相应的运行测试,想要得到的结果和最终代码运行的结果明明相同,但是在PTA平台上运行为什么还是得不到该测试点的分数呢?问题到底出在哪里?
我们再返回看题目,发现这样一个要求“如果没有满足条件的数,则输出空行”,而笔者在编写代码的时候是没有注意到的,那究竟为什么在前面的运行中还能歪打正着得到理想结果呢?
我们再返回看笔者前面编写的源代码,这里为了大家方便阅读,笔者再将前面的源代码复用过来:
#include <stdio.h>
int main()
{
int n;//定义输入的整数n
int i;//定义循环变量i
int a[n];//定义数组a
float sum=0;//定义输入的整数和sum
float average=0;//定义平均数average
scanf("%d",&n);//扫描输入的正整数n
/*运用if语句判断n是否在[1,10]内*/
if ( n<1 || n>10){
printf("Invalid.");//n不在[1,10]内的情况
}
else//n在[1,10]内的情况
{
/*运用for循环来将输入的n个正整数存入数组a中*/
for (i=0;i<n;i++){
scanf("%d",&a[i]); //将输入的第i+1个正整数储存在a[i]中
sum=sum+a[i];//计算输入的整数和sum
average=sum/n;//计算所输入的n个正整数的平均数 average
}
/*注意*/ printf("%.2f\n",average);//输出平均数
/*再用一个for循环来将储存在数组a内的n个正整数从第1个到第n个一一与平均数average对比 */
for (i=0;i<n;i++){
/*运用if语句判断数组a中第i+1个数是否大于平均数average*/
if (a[i]>average){
printf("%d ",a[i]);//若结果为真,输出数组a中满足条件的数和空格
}
}
}
return 0;
}
我们重点看一下笔者所标的/*注意*/后的那段printf代码:
printf("%.2f\n",average);
我们重新复习一下“\n”的意义:\n是普通字符中的换行符,表示输出后控制移到下一行的开头。
因此,答案也就水落石出了:
在笔者第一次编写的程序中,在测试点1所做的程序运行,在输出平均数后的那段换行,并非是输出了换行,而是输出后的控制移到下一行开头!!!
这样才导致了运行结果看着是对的但是实际上是错的这样的情况!
于是,找到问题之后,我们来试着解决问题。
这里笔者引入了一个整型变量result用来判断是否有大于平均数的数存在。
展示更改后的代码:
#include <stdio.h>
int main()
{
int n;//定义输入的整数n
int i;//定义循环变量i
int a[n];//定义数组a
float sum=0;//定义输入的整数和sum
float average=0;//定义平均数average
int result=0;//定义result用来判断是否有大于平均数的数存在,把0赋值给result,默认表示不存在
scanf("%d",&n);//扫描输入的正整数n
/*运用if语句判断n是否在[1,10]内*/
if ( n<1 || n>10){
printf("Invalid.");//n不在[1,10]内的情况
}
else//n在[1,10]内的情况
{
/*运用for循环来将输入的n个正整数存入数组a中*/
for (i=0;i<n;i++){
scanf("%d",&a[i]); //将输入的第i+1个正整数储存在a[i]中
sum=sum+a[i];//计算输入的整数和sum
average=sum/n;//计算所输入的n个正整数的平均数 average
}
printf("%.2f\n",average);//输出平均数
/*再用一个for循环来将储存在数组a内的n个正整数从第1个到第n个一一与平均数average对比 */
for (i=0;i<n;i++){
/*运用if语句判断数组a中第i+1个数是否大于平均数average*/
if (a[i]>average){
printf("%d ",a[i]);//若结果为真,输出数组a中满足条件的数和空格
result=1;//把1赋值给result表示平均数存在
}
}
}
if (result==0){
printf("\n");//当不存在比平均数大的数时输出换行
}
return 0;
}
那么问题就顺利解决了!