c语言,我的这个mmave的函数好像有问题,是不是指针用得不对?


#include<stdio.h>
struct score{
    double chinese;
    double math;
    double eng;
    double total;
    double average;
}; 
struct std{
    int num;
    char name[20];
    struct score cj;
};

void printfscore(int n,struct std s[]/*,struct score*/);
int Searchid(int xh,int n,struct std s[]/*,struct score*/);
void totalscore(int y,struct std s[]/*,struct score*/);
void mmave(int y,struct std s[]/*,struct score*/,double *MAX,double *MIN);

int main(){
    struct std s[50];
    int i=0;
    int choice;
    int n,j,xh;
    int num_students = 0; // 记录学生数量
    double *MAX,*MIN;
 
    printf("**************************************\n");
    printf("***********    欢迎进入    ***********\n");
    printf("*******某某小学学生信息管理系统*******\n");
    printf("|------------------------------------|\n");
    printf("|          1.录入学生信息            |\n");
    printf("|          2.显示学生信息            |\n");
    printf("|          3.查询学生信息            |\n");
    printf("|          4.显示总成绩              |\n");
    printf("|          5.显示平均分              |\n");
    printf("|          6.显示成绩最大最小值      |\n");
    printf("|          7.退出信息系统            |\n");
    printf("**************************************\n");
 
    do {
        printf("请输入您的选择:");
        scanf("%d",&choice);
 
        switch (choice) {
            case 1://录入学生信息 
                printf("请输入学生的总人数(不能超过2000人):");
                scanf("%d",&n);
 
                for (i=0;i<n;i++) {
                    printf("请输入第%d个学生的学号、姓名、语文成绩:", i + 1);
                    scanf("%d%s%lf",&s[i].num,s[i].name,&s[i].cj.chinese,&s[i].cj.math,&s[i].cj.eng);
                }
 
                num_students=n; // 更新学生数量
                printf("学生信息已成功添加!\n");
                break;
 
            case 2://显示学生信息 
                if (num_students==0) {
                    printf("没有学生信息可以显示,请选择1录入信息\n");
                    break;
                }
                 printf("请输入您想查询多少人:\n");
                 scanf("%d",&j);
                printf("学生信息如下:\n");
                for (i=0;i<j;i++) {
                    printf("学号:%d,姓名:%s,成绩:%.2lf\n",s[i].num,s[i].name,s[i].cj.chinese,s[i].cj.math,s[i].cj.eng);
                }
                break;
 
            case 3:
                // 查询学生信息
                printf("请输入您想查找的学生的学号:\n");
                scanf("%d",&xh);
                if(Searchid(xh,n,s)==1)
                printf("找到了!");
                else
                printf("没有找到该信息,请重新输入"); 
                break;
            case 4:
                //显示总成绩 
                printf("请输入您想查询多少人:\n");
                 scanf("%d",&j);
                 totalscore(j,s/*,struct score*/);
                 break; 
            case 5:
                //显示平均分
                printf("请输入您想查询多少人:\n");
                 scanf("%d",&j);
                 for(i=0;i<j;i++)
                {    
                     printf("第%d个人的平均分是%lf",i+1,s[i].cj.average);
                }
                 break;
            case 6:
                // 显示平均分最大最小及对应的人 
                /*if (num_students==0) {
                    printf("没有成绩信息可以显示,请选择1录入信息\n");
                    break;
                }
                printf("以下是成绩信息:\n");
                printfscore(n,s);*/
                mmave(j,s/*,struct score*/,*MAX,*MIN);
                printf("%s的平均分最大,是:%.2lf\n",s[i].name,*MAX);
                printf("%s的平均分最小值是:%.2lf\n",s[i].name,*MIN);
                break;
            case 7:
                printf("感谢使用学生信息管理系统!\n");
                break;
 
            default:
                printf("无效的选择,请重新输入\n");
                break;
        }
 
    } while (choice!=7);
 
    return 0;
}
int Searchid(int xh,int n,struct std s[]/*,struct score*/)
{

    int i;
    for (i=0;i<n;i++)
    {
        if (xh==s[i].num)
        {
            printf("num:%d\n",s[i].num);
            printf("name:%s\n",s[i].name);
            printf("chinese:%.2lf math:%.2lf eng:%.2lf\n",s[i].cj.chinese,s[i].cj.math,s[i].cj.eng);

        }
        return 1;
    }
    return 0;    
}
void printfscore(int n,struct std s[]/*,struct score*/)
{    int i;

    for(i=0;i<n;i++){
        printf("chinese:%.2lf math:%.2lf eng:%.2lf\n",s[i].cj.chinese,s[i].cj.math,s[i].cj.eng);
    }
    printf("显示结束"); 

}

void totalscore(int j,struct std s[]/*,struct score*/)
{    int i;
    for(i=0;i<j;j++){
        s[i].cj.total=s[i].cj.chinese+s[i].cj.math+s[i].cj.eng;
        printf("第%d个学生的总成绩如下%lf:\n",i+1,s[i].cj.total);
    }
}
void mmave(int j,struct std s[]/*,struct score*/,double *MAX,double *MIN)
{    int i;
    double max=0;
    double min=0;
    MAX=&max;
    MIN=&min;
    for(i=0;i<j;j++){
        s[i].cj.average=(s[i].cj.chinese+s[i].cj.math+s[i].cj.eng)/3;
        printf("第%d个学生的总成绩如下%lf:\n",i+1,s[i].cj.average);
    }
    for(i=0;i<j;i++){
        if(s[i].cj.average>=max){
            max=s[i].cj.average;
        }
        if(s[i].cj.average<=min){
            min=s[i].cj.average;
        }
        
    }
 
}


```这个是显示的错误,我感觉可能是我形参指针的形式用错了吗?不知道怎么改,可以帮我看下吗

![img](https://img-mid.csdnimg.cn/release/static/image/mid/ask/046929005496113.png "#left")

img


这个是错误

试看

void mmave(int j,struct std s[]/*,struct score*/,double *MAX,double *MIN)
{    int i;

    for(i=0;i<j;j++){
        s[i].cj.average=(s[i].cj.chinese+s[i].cj.math+s[i].cj.eng)/3;
        printf("第%d个学生的总成绩如下%lf:\n",i+1,s[i].cj.average);
    }
    for(i=0;i<j;i++){
        if(s[i].cj.average>=*MAX){
            *MAX=s[i].cj.average;
        }
        if(s[i].cj.average<=*MIN){
            *MIN=s[i].cj.average;
        }
        
    }
 
}


该回答通过自己思路及引用到GPTᴼᴾᴱᴺᴬᴵ搜索,得到内容具体如下:
根据您提供的代码和错误信息,我注意到在mmave函数中存在一些问题。以下是需要更正的地方:

  1. 函数声明和定义中的指针参数类型不匹配:在mmave函数的声明和定义中,指针参数*MAX*MIN的类型应为double *,而不是double * *。将函数的声明和定义中的参数类型更正为double *MAX, double *MIN

  2. mmave函数中的循环条件错误:在mmave函数中的循环条件中,您使用了j作为循环条件,但应该是i。将j改为i,以正确循环遍历学生。

  3. mmave函数中的指针赋值问题:在mmave函数中,您尝试将maxmin的地址分别赋值给MAXMIN指针,但这样的赋值是无效的,因为maxmin是自动变量,其地址是不可预测的。您可以直接使用maxmin变量,并在需要时更新*MAX*MIN的值。

修正后的mmave函数代码如下所示:

void mmave(int j, struct std s[], double *MAX, double *MIN) {
    int i;
    double max = 0;
    double min = 0;

    for (i = 0; i < j; i++) {
        s[i].cj.average = (s[i].cj.chinese + s[i].cj.math + s[i].cj.eng) / 3;
        printf("第%d个学生的平均分如下%lf:\n", i + 1, s[i].cj.average);
    }

    for (i = 0; i < j; i++) {
        if (s[i].cj.average >= max) {
            max = s[i].cj.average;
        }
        if (s[i].cj.average <= min) {
            min = s[i].cj.average;
        }
    }

    *MAX = max;
    *MIN = min;
}

请注意,此处只针对您提供的代码进行了修正,但仍需检查其他部分是否存在其他错误。此外,请确保在函数调用时传递正确的参数。


如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

【以下回答由 GPT 生成】

问题的描述不够具体,无法提供具体解决方案。请提供更多的细节或者具体的错误信息,以便我能够更好地帮助您解决问题。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^