鱼C论坛

 找回密码
 立即注册
查看: 1677|回复: 11

[已解决]请求大佬解答指针问题

[复制链接]
发表于 2019-6-5 22:47:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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[max] < ave_sco[j])
                {
                        max = j;
                }
        }
        ave_sco[max];
        printf("平均分最高的学生\n");
        printf("姓名:%s\n",student[max].name);
        printf("语文成绩:%d\n", student[max].language);
        printf("数学成绩:%d\n", student[max].math);
        printf("英语成绩:%d\n", student[max].english);
}


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

float *ave_sco = stu_ave_sco(student);   这行代码:因为 stu_ave_sco返回值是个浮点型的数组,所以用指针接收
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-6-5 22:54:09 | 显示全部楼层
可以提供完整的代码吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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[20];

}Student;

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

        }
}

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

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

        return language / 10;
}

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

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

        return math / 10;
}

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

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

        return english / 10;
}

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

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

        return student_allsocre;
}

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

        for (int i = 0; i < 10; i++)
        {
                student_avesocre[i] = *(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[max] < ave_sco[j])
                {
                        max = j;
                }
        }
        //ave_sco[max];
        printf("平均分最高的学生\n");
        printf("姓名:%s\n",student[max].name);
        printf("语文成绩:%d\n", student[max].language);
        printf("数学成绩:%d\n", student[max].math);
        printf("英语成绩:%d\n", student[max].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[i].language > language_ave)
                {
                        language_num++;
                }
                if (student[i].math > math_ave)
                {
                        math_num++;
                }
                if (student[i].english > english_ave)
                {
                        english_num++;
                }
        }

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

int main()
{
        Student student[10];

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

        system("pause");
        return 0;
}

我把目前的所有代码赋值上来了,不好意思,新手,写代码杂乱不规范,可能不利于阅读,主要看下返回学生的平均分那段代码就好了,其他的代码和问的问题不关联
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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$
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-5 23:15:22 | 显示全部楼层    本楼为最佳答案   
1.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-6-5 23:38:06 | 显示全部楼层

感谢,我明白了,不过我的编译器没有报错,不知道是编译器问题还是因为我是.cpp文件
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你用的是哪个编译器?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-5 23:39:28 | 显示全部楼层
人造人 发表于 2019-6-5 23:38
你用的是哪个编译器?

VS2017
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-5 23:41:12 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-5 23:48:32 | 显示全部楼层

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

在问一个问题  怎么发图片的  这边我点图片需要输入图片地址  怎么获取地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

在问一个问 ...

1.png
2.png
3.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-6-6 00:43:56 | 显示全部楼层

再次感谢您的慷慨回答,感谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 21:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表