初之星雨 2024-03-16 23:37 采纳率: 0%
浏览 7
已结题

C语言不同源文件传参错误

student_system.c 文件下

#include <stdio.h>
#include <string.h>

#include "input_output.c"               // 用文件包含连接各程序文件模块
#include "computing.c"
#include "update.c"
#include "search.c"

#define MaxSize 50

int Count = 0;                          // 全局变景,记录当前学生总数

typedef struct                          // 学生信息结构定义
{
    int num;                            // 学号
    char name[10];                      // 姓名
    int computer, english, math;        // 3门课程成绩、计算机、英语、数学
    double average;                     // 个人平均成绩
} student;



int main(void)
{
    student students[MaxSize];          // 定义学生信息结构数组

    new_student(students);              // 输入学生信息结构数组
    output_student(students);           // 显示输入的学生信息结构数组
    average(students);                  // 计算每一个学生的平均成绩
    sort(students);                     // 按学生的平均成绩排序
    output_student(students);           // 显示排序后的结构数组
    modify(students);                   // 修改指定输人的学生信息
    output_student(students);           // 显示修改后的结构数组

    return 0;
}

input_output.c 文件下

#include <stdio.h>

#include "student_system.c"

// 输入输出程序文件 input_output.c 

extern int Count;       // 外部变量声明
// extern struct student students[MaxSize];

void new_student(struct student students[])    // 新建学生信息的函数
{
    printf("Input Count:"); // 输入总人数
    scanf("%d", &Count);
    printf("Input the student's number, name and course scores\n");    // 输入学生的编号、姓名和课程分数
    for (int i = 0; i < Count; i++)
    {
        printf("No.%d:", i + 1);
        scanf("%d %9s %d %d %d", &students[i].num, &students[i].name, &students[i].computer, &students[i].english, &students[i].math);
    }
}
 
void output_student(struct student students[]) // 输出学生信息的函数
{
    printf("num\t name\t computer\t english\t math\t average\n");   // 学号、姓名、计算机成绩、英语成绩、数学成绩、平均分
    for(int i = 0; i < Count; i++)
    {
        printf("%d\t%s\t%d\t%d\t%d\t%.2lf\n", students[i].num, students[i].name, students[i].computer, students[i].english, students[i].math, students[i].average);
    }
}

在computing.c下

// 计算程序文件 computing.c 

extern int Count;   // 外部变量声明
// extern struct student students[MaxSize];

void average(struct student students[])    // 计算个人平均成绩的函数
{
    int i;

    for (i = 0; i < Count; i++)
    {
        students[i].average = (students[i].math, students[i].english, students[i].computer) / 3.0;
    }
}

在computing.c下

#include <stdio.h>

#include "student_system.c"

// 修改排序程序文件 update.c 

extern int Count;   // 外部变量声明
// extern struct student students[MaxSize];

void modify(struct student *p)  // 修改学生成绩的函数
{
    int i; 
    int num, course, score; // 学号、科目、新的分数

    printf("Input the number of the students to be updated:");  // 输入要更新的学生学号
    scanf("%d", &num);
    printf("Choice the course: 1.math 2.english 3.computer:");  // 选择课程:1、数学 2、英语 3、计算机
    scanf("%d", &course);
    printf("Input the new score:"); // 输入新分数
    scanf("%d", &score);
    
    for(i = 0; i < Count; i++, p++) // 按学号查找
    {
        if (p -> num == num)
            break;
    }
    if (i < Count)
    {
        switch (course) // 找到,修改成绩
        {
            case 1:
            p -> math = score;
            break;
            case 2:
            p -> english = score;
            break;
            case 3:
            p -> computer = score;
            break;
        }
    }
    else
    {
        printf("-1\n"); // 无此学号
    }
}   

void sort(struct student students[])    // 平均成绩排序的函数
{
    int i, j, index;
    struct student temp;    // 用于数据的交换
    
    // 结构数组排序,选择排序法
    for( i = 0; i < Count - 1; i++)
    {
        index = i;

        for(j = i + 1; j < Count; j++)
        {
            if(students[j].average > students[index].average)   // 比较平均成绩
            {
                index = j;
            }
        }
        temp = students[index]; // 交换数组元素
        students[index] = students[i];
        students[i] = temp;
    }
} 

在search.下

#include <stdio.h>

#include "student_system.c"

// 查询程序文件 search.c

extern int Count;   // 外部变量声明

void search_student(struct student students[])  // 查询学生信息的函数
{
    int i, num; 

    printf("input students num:");
    scanf("%d",num);
    
    for(i = 0; i < Count; i++) // 按学号查找
    {
        if (students[i].num == num)
            break;
    }

    printf("%d\t%s\t%d\t%d\t%d\t%.2lf\n", students[i].num, students[i].name, students[i].computer, students[i].english, students[i].math, students[i].average);

}

问题展示:

img

img

求解决方案方法

  • 写回答

2条回答 默认 最新

  • 关注

    初之星雨 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    根据你提供的代码,问题出现在新建学生信息函数new_student中的输入和输出语句中。具体来说,问题出现在scanfprintf函数中对&students[i].name的引用上。在scanf函数中,&students[i].name应该改为students[i].name;在printf函数中,students[i].name应该改为&students[i].name[0]。此外,在函数定义和声明中,还需要添加结构体的定义。

    解决方案:

    1. main.c中,将结构体的定义放在main函数的上方,确保结构体定义在所有函数中都可见。

    修改后的代码:

    #include <stdio.h>
    #include <string.h>
    
    #define MaxSize 50
    
    typedef struct                      // 学生信息结构定义
    {
        int num;                        // 学号
        char name[10];                  // 姓名
        int computer, english, math;    // 3门课程成绩、计算机、英语、数学
        double average;                 // 个人平均成绩
    } student;
    
    #include "input_output.c" // 用文件包含连接各程序文件模块
    #include "computing.c"
    #include "update.c"
    #include "search.c"
    
    int Count = 0;  // 全局变景,记录当前学生总数
    
    int main(void) {
        student students[MaxSize];   // 定义学生信息结构数组
    
        new_student(students);              // 输入学生信息结构数组
        output_student(students);           // 显示输入的学生信息结构数组
        average(students);                  // 计算每一个学生的平均成绩
        sort(students);                     // 按学生的平均成绩排序
        output_student(students);           // 显示排序后的结构数组
        modify(students);                   // 修改指定输人的学生信息
        output_student(students);           // 显示修改后的结构数组
    
        return 0;
    }
    
    1. input_output.c中,修改new_student函数中的scanfprintf语句中的引用部分。

    修改后的代码:

    extern int Count;   // 外部变量声明
    
    void new_student(struct student students[]) // 新建学生信息的函数 {
        printf("Input Count:"); // 输入总人数
        scanf("%d", &Count);
        printf("Input the student's number, name and course scores\n");    // 输入学生的编号、姓名和课程分数
        for (int i = 0; i < Count; i++)
        {
            printf("No.%d:", i + 1);
            scanf("%d%s%d%d%d", &students[i].num, students[i].name, &students[i].computer, &students[i].english, &students[i].math);
        }
    }
     
    void output_student(struct student students[]) // 输出学生信息的函数 {
        printf("num\t name\t computer\t english\t math\t average\n");   // 学号、姓名、计算机成绩、英语成绩、数学成绩、平均分
        for(int i = 0; i < Count; i++)
        {
            printf("%d\t %s\t %d\t %d\t %d\t %.2lf\n", students[i].num, &students[i].name[0], students[i].computer, students[i].english, students[i].math, students[i].average);
        }
    }
    

    注意事项:

    • 在使用数组元素的地址时,对于字符数组,我们只需要使用数组名即可,因为数组名代表一个字符数组的首地址。
    • printf函数中使用%s来输出字符串时,必须指定字符串的起始地址,即&students[i].name[0]
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月21日
  • 修改了问题 3月17日
  • 创建了问题 3月16日

悬赏问题

  • ¥50 关于在matlab上对曲柄摇杆机构上一点的运动学仿真
  • ¥15 jetson nano
  • ¥15 :app:debugCompileClasspath'.
  • ¥15 windows c++内嵌qt出现数据转换问题。
  • ¥20 公众号如何实现点击超链接后自动发送文字
  • ¥15 用php隐藏类名和增加类名
  • ¥15 算法设计与分析课程的提问
  • ¥15 用MATLAB汇总拟合图
  • ¥15 智能除草机器人方案设计
  • ¥15 对接wps协作接口实现消息发送