C 打印大于平均值的数字之和

C 打印大于平均值的数字之和,c,sum,average,variable-assignment,C,Sum,Average,Variable Assignment,对于作业,我必须用C编写一个代码,打印大于平均值的数字 我已经写了一些代码,但当我插入一个数字或一个数字相同的数字(如555)时,它不会给我答案。如果是555-->5(和8->8,77->等),则应给出 我写的代码是: (我对我采取的每一步都发表了评论。) #包括 #包括 int main(int argc,char*v[]{ /*输入:1个介于1和2.000.000.000之间的数字*/ int n;/*存储该值*/ int ext,ext2;/*存储数字的副本*/ int rem;/*存储余

对于作业,我必须用C编写一个代码,打印大于平均值的数字

我已经写了一些代码,但当我插入一个数字或一个数字相同的数字(如555)时,它不会给我答案。如果是555-->5(和8->8,77->等),则应给出

我写的代码是:

(我对我采取的每一步都发表了评论。)

#包括
#包括
int main(int argc,char*v[]{
/*输入:1个介于1和2.000.000.000之间的数字*/
int n;/*存储该值*/
int ext,ext2;/*存储数字的副本*/
int rem;/*存储余数*/
int tot;/*存储数字总数*/
int avg;/*存储数字的平均值*/
int i;/*计算位数*/
int big;/*存储最大值和第二大值*/
scanf(“%d”和“&n”);
/*将数字分开并相加*/
ext=n;
ext2=n;
tot=0;
大=0;
平均值=0;
i=0;
while(ext!=0&&n=1){
rem=外部%10;
tot=tot+rem;
ext=ext/10;
i++;
};  
/*平均值*/
平均值=tot/i;
/*查找并打印更高的数字*/
而(ext2>0){
rem=ext2%10;
如果(rem>平均值){
大+=快速眼动;
};
ext2=ext2/10;
}
如果(n9){
printf(“%d\n”,大);
}否则如果(大==平均值){
printf(“%d\n”,0);
}否则如果(大>=平均值){
printf(“%d\n”,大);
};
返回0;
}

希望有人能帮助我

您忘记用0初始化变量
i
。我已经更正了你的代码,它给出了预期的结果。对于一个数字,答案是0,因为一个数字的平均值总是数字本身,所以这个数字永远不会大于平均值

#include <stdio.h>
#include <stdlib.h>

int main ()
{
    /* imput: 1 number between 1 and 2.000.000.000 */
    int n;          /*  stores the value                            */
    int ext, ext2;  /*  stores a copy of the number                 */
    int rem, rem2;  /*  stores the remainders                       */
    long tot;       /*  stores the total of the digits              */
    int avg;        /*  stores the average of the digits            */
    int i;          /*  counts the amount of digits                 */
    int big, big2;  /*  stores the biggest and second biggest value */
    int sum;        /*  stores sum of digits greater than average   */
    scanf("%d", &n);

    /* seperate digits and add them */
    ext=n;
    ext2=n;
    tot=0;
    big=0;
    big2=0;
    avg=0;
    i=0;
    sum=0;

    while(ext!=0 && n<2000000000 && n>=1)
    {
        rem=ext%10;
        tot=tot+rem;
        ext=ext/10;
        i++;
    };

    /* average value */
    avg=tot/i;

    /* find and print higher numbers */

    while(ext2>0)
    {
        rem2=ext2%10;
        if(rem2>avg)
        {
            sum+=rem2;
        };
        ext2=ext2/10;
    };

    printf("sum of digits greater than average: %d",sum);

    return 0;
}
#包括
#包括
int main()
{
/*输入:1个介于1和2.000.000.000之间的数字*/
int n;/*存储该值*/
int ext,ext2;/*存储数字的副本*/
int rem,rem2;/*存储余数*/
long tot;/*存储数字总数*/
int avg;/*存储数字的平均值*/
int i;/*计算位数*/
int big,big2;/*存储最大值和第二大值*/
int sum;/*存储大于平均值的数字之和*/
scanf(“%d”和“&n”);
/*将数字分开并相加*/
ext=n;
ext2=n;
tot=0;
大=0;
big2=0;
平均值=0;
i=0;
总和=0;
while(ext!=0&&n=1)
{
rem=外部%10;
tot=tot+rem;
ext=ext/10;
i++;
};
/*平均值*/
平均值=tot/i;
/*查找并打印更高的数字*/
而(ext2>0)
{
rem2=ext2%10;
如果(rem2>平均值)
{
总和+=rem2;
};
ext2=ext2/10;
};
printf(“大于平均值的位数总和:%d”,总和);
返回0;
}

除了未能初始化
i=0
i++之前
,您最大的问题是,大量不必要且难以描述的变量名让您感到困惑
ext、ext2、tot、big、big2、avg、rem、rem2
只是一个变量

虽然您需要
ext2
来保存变量的副本,您可以通过
%
(模)来查找
tot
avg
,但不需要
rem2
big2
(您可以简单地重用
rem
),您只需要一个
big
(假设该变量包含大于平均值的位数之和)

此外,您查找
big
(以及使用
big2
)的循环比需要的要复杂得多。您不关心
rem2
是否大于
big2
,然后设置
big2=rem2;
您关心的是数字是否大于
avg
(就是这样),您只需要:

    /* find and print higher numbers */
    while (ext2>0){
        rem = ext2 % 10;
        if (rem > avg){
            big += rem;
        };
        ext2 = ext2 / 10;
    }
现在
big
保存的数字总和大于平均值

重用变量和使用描述性变量名将大大有助于保持逻辑的简洁性,并防止不必要的变量扩展。编写函数时要记住一条正常的经验法则(最好始终记住),但如果您正在编写一个函数,并且发现自己使用的变量超过了4个,则可能需要重构程序。(这不是一条硬性规定,但关键是要防止您陷入的变量色拉)


为什么
long tot;
?最多
1+9+9+9+9+9+9+9+9=82
。使用
int
就像您在其余变量中使用一样是可以的。(考虑到
1≤你可能会得到一些否决票,因为它的格式看起来像是一个家庭作业转储。试着把它浓缩成一个特定的问题。你已经有了一个不起作用的测试用例的良好开端。我会用
fgets
阅读输入,然后你就有了(ASCII)一个很好的数组中的数字。我来看看。这些可能需要特殊情况。一位数,平均数是数字,所以没有什么可添加的。例如
5
avg=5/1
,然后是大于
5
的数字之和——没有任何数字大于
5
。就像我说的,让我看看,然后我再发表评论或编辑我的答案@BramKoop为什么你说用
777
结果应该是
7
?用
7+7+7=21
平均值是
21/3=7
——没有比
avg
更高的数字可以求和。你是说如果所有数字都相等,那么即使没有大的数字,你还有另一个特殊情况吗
#include <stdio.h>

int main (void)  {

    int n,          /*  stores the value                                */
        tmp,        /*  stores a copy of the number                     */
        rem,        /*  stores the remainders                           */
        tot = 0,    /*  stores the total of the digits                  */
        avg = 0,    /*  stores the average of the digits                */
        digits = 0, /*  counts the number of digits                     */
        big = 0;    /*  stores the sum of digits larger than avg        */

    /* imput: 1 number (1 <= n && n <= 2.000.000.000    */
    if (scanf("%d", &n) != 1) { /* read/validate number */
        fputs ("error: invalid integer input.\n", stderr);
        return 1;
    }
    if (n < 1 || 2000000000 < n) {  /* validate n in allowable range */
        fputs ("error: input outside allowable value.\n", stderr);
        return 1;
    }

    tmp = n;
    while (tmp) {           /* sum digits for average */
        rem = tmp % 10;
        tot += rem;
        tmp /= 10;
        digits++;
    }
    avg = tot / digits;     /* calculate average */

    tmp = n;
    while (tmp) {           /* sum numbers higher than avg */
        rem = tmp % 10;
        if (rem > avg)
            big += rem;
        tmp /= 10;
    }

    printf ("sum of digits greater than avg : %d\n", big);
}