深圳大学-电信院-C程序设计实验-结构体编程

实验目的

一、进一步熟悉C 语言中函数的编程方法;
二、进一步掌握C 语言中函数定义和调用方法;
三、学习和掌握结构体的定义和使用方法。

实验内容

本次实验要求定义5个函数,编写主函数调用自定义函
数进行验证。

  1. 定义一个 student 结构体如下:

struct student {
char name[20]; /姓名/
float score[4]; /四门功课的成绩/
float average; /四门功课的平均成绩/
};

其中,name 中存放同学的姓名;score[4]数组中存放同学的英语、数学、物理、化学成绩;average中存放上述四门功课的平均成绩。

  1. 编写下面5个函数。函数的具体要求:

void inputFromKeyboard(struct student stu[], int num)

从键盘输入学生信息的函数。stu 为结构体数组,num 为数组中元素的个数。

void outputToScreen(struct student stu[], int num)

将学生信息输出到屏幕的函数。stu 为结构体数组,num 为数组中元素的个数。

void averageScore(struct student stu[], int num)

计算学生平均成绩的函数。stu 为结构体数组,num 为数组中元素的个数。

int compare(struct student stu1, struct student stu2)

对两个学生的平均成绩进行比较。若学生1的平均成绩高于学生2,返回值为1,否则返回值为0。stu1 和stu2为两个结构体变量,分别代表学生1和学生2。

void sortByAverageScore(struct student stu[], int num)

根据学生的平均成绩对学生信息整体排序的函数,其中两学生成绩比较要求调用函数compare。stu 为结构体数组,num 为数组中元素的个数。

提示:两学生信息的交换参见第11章PPT中的第16个幻灯片。

3)编写主函数对你所编写的上述4个函数进行调用验证。主函数应有以下功能:
①利用结构体类型struct student定义5 个学生的结构体数组student_info [5];
②调用函数inputFromKeyboard由键盘输入学生的信息( 姓名、英语、数学、物理、化学成绩 )。5名学生信息可能如下:
孙颖莎 88.0 76.0 78.0 77.0
王曼昱 98.0 67.0 79.0 65.0
王艺迪 89.0 79.0 85.0 79.0
陈梦 90.0 95.0 97.0 85.0
钱天一 86.0 83.0 82.0 75.0
函数inputFromKeyboard的2个输入参数分别为数组名student_info和5(实参)。
③调用函数averageScore 求出每位学生的平均成绩。函数averageScore的输入参数分别为数组名student_info和5。
④调用函数outputToScreen 将每个学生的信息显示到屏幕上。函数outputToScreen的输入参数分别为数组名student_info和5。
⑤调用函数sortByAverageScore 根据学生的平均成绩对学生信息进行排序。函数sortByAverageScore的输入参数分别为数组名student_info和5。
⑥调用函数outputToScreen 将排序后的学生完整信息显示到屏幕上。

实验代码

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

struct student {
    char name[20];
    float score[4];
    float average;
};

void inputFromKeyboard(struct student stu[], int num) {
    printf("请输入%d个学生的姓名和四门功课成绩:\n",num);
    int i;
    for (i = 0; i < num; i++) {
        scanf("%s%f%f%f%f", stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2], &stu[i].score[3]);
    }
}

void outputToScreen(struct student stu[], int num) {
    int i;
    printf("姓名\t英语\t数学\t物理\t化学\t平均成绩\n");
    for (i = 0; i < num; i++) {
        printf("%s\t%.1f\t%.1f\t%.1f\t%.1f\t%.1f\n", stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2], stu[i].score[3], stu[i].average);
    }
}

void averageScore(struct student stu[], int num) {
    int i;
    float sum;
    for (i = 0; i < num; i++) {
        sum = 0;
        for (int j = 0; j < 4; j++) {
            sum += stu[i].score[j];
        }
        stu[i].average = sum / 4.0;
    }
}

int compare(struct student stu1, struct student stu2) {
    if (stu1.average > stu2.average) return 1;
    return 0;
}

void sortByAverageScore(struct student stu[], int num) {
    struct student temp;
    int i, j;
    for (i = 0; i < num - 1; i++) {
        for (j = 0; j < num - i - 1; j++) {
            if (compare(stu[j + 1], stu[j])) {
                temp = stu[j];
                stu[j] = stu[j + 1];
                stu[j + 1] = temp;
            }
        }
    }
}
int main() {
    struct student student_info[5];
    inputFromKeyboard(student_info, 5);
    averageScore(student_info, 5);
    printf("\n");
    outputToScreen(student_info, 5);
    sortByAverageScore(student_info, 5);
    printf("\n排序后学生的信息:\n");
    outputToScreen(student_info, 5);
    return 0;
}

实验结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值