我叫MD 发表于 2019-6-5 22:47:55

请求大佬解答指针问题

void max_ave_sco(Student *student)
{
        float *ave_sco = stu_ave_sco(student);

        int max = 0;
        for (int j = 1; j < 10; j++)
        {
                if (ave_sco < ave_sco)
                {
                        max = j;
                }
        }
        ave_sco;
        printf("平均分最高的学生\n");
        printf("姓名:%s\n",student.name);
        printf("语文成绩:%d\n", student.language);
        printf("数学成绩:%d\n", student.math);
        printf("英语成绩:%d\n", student.english);
}


有如上代码:经过调试,在for循环中ave_sco(也就是第8行)的值正常,但是一旦出了for循环,ave_sco(第13行)的值立马就变为负数了,请问什么情况;

float *ave_sco = stu_ave_sco(student);   这行代码:因为 stu_ave_sco返回值是个浮点型的数组,所以用指针接收

人造人 发表于 2019-6-5 22:54:09

可以提供完整的代码吗?

我叫MD 发表于 2019-6-5 22:55:50

本帖最后由 我叫MD 于 2019-6-5 22:58 编辑

人造人 发表于 2019-6-5 22:54
可以提供完整的代码吗?

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

/*
12.编写程序,用一个数组存放学生信息,每个学生信息包括学号,姓名,三门课程的成绩。从键盘输入10个数据,要求:
1.输出每门课程的平均成绩
2.输出每个学生的总分和平均成绩
3.输出平均分最高的学生数据
4.输出每门课程高于平均成绩的学生人数
                5.输出每个学生第一门课程与平均成绩的分差
                6.输出所有课程分数最高的学生
                7.输出每门课程分数最高的学生
                8.输出第一门课程不及格的学生

*/

//先创建学生的结构体
typedef struct Student
{
        unsigned int stu_num;
        int language;
        int math;
        int english;
        char name;

}Student;

//先录入10个学生的信息
void inputinfo(Student *student)
{
        for (int i = 0; i < 10; i++)
        {
                printf("请输入第%d个学生的信息:\n", i + 1);
                printf("学号:");
                scanf("%d", &student.stu_num);
                printf("姓名:");
                scanf("%s", student.name);
                printf("语文成绩:");
                scanf("%d", &student.language);
                printf("数学成绩:");
                scanf("%d", &student.math);
                printf("外语成绩:");
                scanf("%d", &student.english);

        }
}

//返回语文课程的平均成绩
float language_sco(Student *student)
{
        float language = 0;

        for (int i = 0; i < 10; i++)
        {
                language += student.language;
        }

        return language / 10;
}

//返回数学课程的平均成绩
float math_sco(Student *student)
{
        float math = 0;

        for (int i = 0; i < 10; i++)
        {
                math += student.math;
        }

        return math / 10;
}

//返回英语课程的平均成绩
float english_sco(Student *student)
{
        float english = 0;

        for (int i = 0; i < 10; i++)
        {
                english += student.english;
        }

        return english / 10;
}

//返回学生的总分
float* stu_all_soc(Student *student)
{
        float student_allsocre = { 0 };

        for (int i = 0; i < 10; i++)
        {
                student_allsocre = student.language + student.math + student.english;
        }

        return student_allsocre;
}

//返回学生的平均分
float* stu_ave_sco(Student *student)
{
        float student_avesocre = { 0 };
        float *student_avesoc = stu_all_soc(student);

        for (int i = 0; i < 10; i++)
        {
                student_avesocre = *(student_avesoc + i) / 3;
        }

        return student_avesocre;
}

//3.输出平均分最高的学生数据
void max_ave_sco(Student *student)
{
        float *ave_sco = stu_ave_sco(student);

        int max = 0;
        for (int j = 1; j < 10; j++)
        {
                if (ave_sco < ave_sco)
                {
                        max = j;
                }
        }
        //ave_sco;
        printf("平均分最高的学生\n");
        printf("姓名:%s\n",student.name);
        printf("语文成绩:%d\n", student.language);
        printf("数学成绩:%d\n", student.math);
        printf("英语成绩:%d\n", student.english);
}

//4.输出每门课程高于平均成绩的学生人数
void four(Student *student)
{
        int language_ave = language_sco(student);
        int math_ave = math_sco(student);
        int english_ave = english_sco(student);

        int language_num = 0, math_num = 0, english_num = 0;

        for (int i = 0; i < 10; i++)
        {
                if (student.language > language_ave)
                {
                        language_num++;
                }
                if (student.math > math_ave)
                {
                        math_num++;
                }
                if (student.english > english_ave)
                {
                        english_num++;
                }
        }

        printf("语文高于平均成绩的学生人数是:%d\n", language_num);
        printf("数学高于平均成绩的学生人数是:%d\n", math_num);
        printf("英语高于平均成绩的学生人数是:%d\n", english_num);
}

int main()
{
        Student student;

        inputinfo(student);
        max_ave_sco(student);
        four(student);

        system("pause");
        return 0;
}

我把目前的所有代码赋值上来了,不好意思,新手,写代码杂乱不规范,可能不利于阅读,主要看下返回学生的平均分那段代码就好了,其他的代码和问的问题不关联

人造人 发表于 2019-6-5 23:14:42

sh-4.4$ gcc -g -Wall -o main main.c
main.c: In function 'stu_all_soc':
main.c:97:16: warning: function returns address of local variable [-Wreturn-local-addr]
         return student_allsocre;
                ^~~~~~~~~~~~~~~~
main.c: In function 'stu_ave_sco':
main.c:111:16: warning: function returns address of local variable [-Wreturn-local-addr]
         return student_avesocre;
                ^~~~~~~~~~~~~~~~
sh-4.4$

人造人 发表于 2019-6-5 23:15:22

我叫MD 发表于 2019-6-5 23:38:06

人造人 发表于 2019-6-5 23:15


感谢,我明白了,不过我的编译器没有报错,不知道是编译器问题还是因为我是.cpp文件

人造人 发表于 2019-6-5 23:38:52

我叫MD 发表于 2019-6-5 23:38
感谢,我明白了,不过我的编译器没有报错,不知道是编译器问题还是因为我是.cpp文件

你用的是哪个编译器?

我叫MD 发表于 2019-6-5 23:39:28

人造人 发表于 2019-6-5 23:38
你用的是哪个编译器?

VS2017

人造人 发表于 2019-6-5 23:41:12

我叫MD 发表于 2019-6-5 23:39
VS2017

我叫MD 发表于 2019-6-5 23:48:32

人造人 发表于 2019-6-5 23:15


我刚才又看了一下,果真报警告了   但是一般我只关心是否生成成功,所以就没注意那个警告

在问一个问题怎么发图片的这边我点图片需要输入图片地址怎么获取地址

人造人 发表于 2019-6-5 23:53:12

我叫MD 发表于 2019-6-5 23:48
我刚才又看了一下,果真报警告了   但是一般我只关心是否生成成功,所以就没注意那个警告

在问一个问 ...




我叫MD 发表于 2019-6-6 00:43:56

人造人 发表于 2019-6-5 23:53


再次感谢您的慷慨回答,感谢
页: [1]
查看完整版本: 请求大佬解答指针问题