作品得分问题,想试着用指针解决可是得不到期望结果,还请各位指正

作品得分问题,想试着用指针解决可是得不到期望结果,还请各位指点一下

img

#include
int main ()
{
    int n,*p,t;
    int i,j;
    int sum=0;
    double average;
    scanf("%d",&n);
    int grade[n];
    for(i=0; i<n; i++)
    {
        scanf("%d",&grade[i]);
        sum+=grade[i];
    }
    p=grade;
    int max=*p,min=*(p+n-1);
    for(i=0; i<n;i++,p++)
    {
        if(min>*(p+i))
        {
            min=*(p+i);
        }
        
        if(max<*(p+i))
        {
            max=*(p+i);
        }
    }
    average=(sum-max-min)*1.0/n;
    printf("%.2lf\n",average);
    return 0;
}

错误太多了 大部分是数据类型的错误


#include<stdio.h>
int main ()
{
    int n,t;
    double *p;
    int i,j;
    double sum=0;
    double average;
    scanf("%d",&n);
    double grade[n];
    for(i=0; i<n; i++)
    {
        scanf("%lf",&grade[i]);
        sum+=grade[i];
    }
    p=grade;
    double max=*p,min=*p;
    for(i=0; i<n;i++)
    {
        if(min>*(p+i))
        {
            min=*(p+i);
        }
        
        if(max<*(p+i))
        {
            max=*(p+i);
        }
    }
    average=(sum-max-min)/(n-2);
    printf("%.2lf\n",average);
    return 0;
}
 

其实你写的大体是对的,主要错误在循环哪里,不需要p++,因为对数组取值你是通过*(p+i)来完成的,只要移动i就够了。

另外,算平均值时人数要-2(因为去掉了最高分最低分)

我把常规写法和你的指针写法都贴在下面,供你参考。如果对你有帮助,请采纳。

常规写法

#include <limits.h>
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    double sum = 0;
    double c;
    double max = 0;
    double min = LONG_MAX;
    for (int i = 0; i < n; i++) {
        scanf("%lf", &c);
        sum += c;
        if (c > max)
            max = c;
        if (c < min)
            min = c;
    }
    double avg = (sum - max - min) / (n - 2);
    printf("%.2lf\n", avg);

    return 0;
}

指针写法

#include <stdio.h>

int main () {
    int n, *p, t;
    int i, j;
    int sum = 0;
    double average;
    scanf("%d", &n);
    int grade[n];
    for (i = 0; i < n; i++) {
        scanf("%d", &grade[i]);
        sum += grade[i];
    }
    p = grade;
    int max = *p, min = *(p + n - 1);
    for (i = 0; i < n; i++) {
        if (min > *(p + i)) {
            min = *(p + i);
        }

        if (max < * (p + i)) {
            max = *(p + i);
        }
    }
    average = (sum - max - min) * 1.0 / (n - 2);
    printf("%.2lf\n", average);
    return 0;
}


average=(sum-max-min)*1.0/n;错了啊,最高分最低分去掉,就少了2个人啊
average=(sum-max-min)*1.0/(n-2);