PTA 数组 输出所有大于平均值的数 做题心得体会

本题要求编写程序,将输入的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;
}

 那么问题就顺利解决了!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幼年程序猿王柠檬

谢谢老板

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值