C语言结构体实战---处理学生信息

C语言结构体实战---处理学生信息,第1张

 结构体是C语言中一种重要的数据类型,该数据类型由一组称为成员(或称为域,或称为元素)的不同数据组成,其中每个成员可以具有不同的类型。结构体通常用来表示类型不同但是又相关的若干数据。

结构体类型不是由系统定义好的,而是需要程序设计者自己定义的,这就为表示一体不同类型数据提供了很大便利。

题目要求:利用结构体表示学生信息,(学生人数不定可自定义为n,n为整数)其中学生信息有学号、姓名、计算机成绩、数学成绩。

要求构造input函数 输入学生信息,output函数输出学生信息,avg函数输出学生平均成绩,pass函数统计及格和不及格学生人数,maxc函数查找计算机成绩最高的学生。

因为学生人数不定那么我们可以利用结构体数组来表示学生信息,每一个结构体数组的元素即为一个学生信息。

可表示如下

struct Student{
    long num;   // 学号(学号过长可以使用字符串表示)
    char name[20];  // 姓名
    float score[2];  // 数学计算机成绩
    float aver;     // 平均成绩
};

这里用long来定义学生学号主要是防止学号过长导致数据溢出问题,如果学号超过9223372036854775807 (long长整型表示最大的数)可以使用char型数组来表示学号

接下来就是像遍历常规数组一样对数组的元素进行 *** 作,只不过这个数组元素是一个结构体罢了,为了更直观理解,函数实现部分写在了注释里。

 

🌟代码实现
#include 
#define STUDENTS_NUMBER 3

struct Student{
    long num;
    char name[20];
    float score[2];
    float aver;
};


struct Student* input(struct Student students[]);
void output(struct Student *p1);
void avg(struct Student *p1);
void pass(struct Student *p1);
void maxc(struct Student student[]);

int main(void)
{
    struct Student students[STUDENTS_NUMBER];
    struct Student *p = students, *p1;

    p1 = input(p);
    output(p1);
    avg(p1);
    pass(p1);
    maxc(students);

    return 0;
}

struct Student* input(struct Student students[])
{
    int i;
    printf("输入学生信息(学号,姓名,数学,计算机成绩,不同信息用空格分隔)\n");
    printf("在此开始输入:");
    for (i = 0; i < STUDENTS_NUMBER; i++){
        scanf("%ld %s %f %f",
              &students[i].num, students[i].name, &students[i].score[0], &students[i].score[1]);
        students[i].aver = (students[i].score[0] + students[i].score[1]) / 2;
    }
    return students;
}

void output(struct Student *p1)
{
    int i;
    for (i = 0; i < STUDENTS_NUMBER; i++){
        printf("==========第%d位学生成绩==========\n", i+1);
        printf("学号:%ld\n姓名:%s\n数学成绩:%f\n计算机成绩:%f\n", p1->num, p1->name, p1->score[0], p1->score[1]);
    }
}

void avg(struct Student *p1)
{
    int i;
    for (i = 0; i < STUDENTS_NUMBER; i++){
        printf("==========第%d位学生的平均分==========\n", i+1);
        printf("学号:%ld\n姓名:%s\n平均分:%f\n", p1->num, p1->name, p1->aver);
    }
}

void pass(struct Student *p1)
{
    int pass = 0, i;
    for (i = 0; i < STUDENTS_NUMBER; i++){   
        if (p1->score[0] >= 60 && p1->score[1] >= 60) {
            pass++;
        }
    }
    printf("\n");
    printf("两门课都及格的人数有:%d人\n", pass);
    printf("两门课都不及格的人数有:%d人\n", STUDENTS_NUMBER - pass);
    printf("\n");
}

void maxc(struct Student students[])
{
    int i, max = 0;

    for (i = 0; i < STUDENTS_NUMBER; i++) {
        if (students[i].aver > students[max].aver) {
            max = i;
        }
    }
    printf("*****计算机成绩最高学生*****\n");
    printf("学号:%ld\n姓名:%s\n计算机分数:%f\n", students[max].num, students[max].name, students[max].score[1]);
}
✏代码注释

#include 
#define STUDENTS_NUMBER 3   // 学生总人数

struct Student{
    long num;   // 学号(学号过长可以使用字符串表示)
    char name[20];  // 姓名
    float score[2];  // 数学计算机成绩
    float aver;     // 平均成绩
};

// 构造函数声明
struct Student* input(struct Student students[]);  // input函数用于输入并返回学生信息
void output(struct Student *p1);     // output函数用于输出学生信息
void avg(struct Student *p1);       // avg函数用于输出学生平均成绩
void pass(struct Student *p1);      // pass函数用于统计及格学生人数
void maxc(struct Student student[]);  // maxc用于查找计算机成绩最高学生

int main(void)
{
    struct Student students[STUDENTS_NUMBER];   // 定义结构体数组
    struct Student *p = students, *p1;      // 将指针p指向结构体数组

    p1 = input(p);   // 调用input函数输入学生信息并返回获取到的学生信息p1(指针)
    output(p1);     // output输出学生信息
    avg(p1);      //   输出学生平均值
    pass(p1);     // 输出及格学生人数
    maxc(students);   // 查找计算机成绩最高学生

    return 0;
}

struct Student* input(struct Student students[])
{
    int i;
    printf("输入学生信息(学号,姓名,数学,计算机成绩,不同信息用空格分隔)\n");
    printf("在此开始输入:");
    for (i = 0; i < STUDENTS_NUMBER; i++){   // 循环遍历结构体数组,依次输入每名学生成绩
        scanf("%ld %s %f %f",       //  类似变量输入加上取地址符,&students[i].num,但是students[i].name不许要加因为name为数字students[i].name即为地址
              &students[i].num, students[i].name, &students[i].score[0], &students[i].score[1]);
        students[i].aver = (students[i].score[0] + students[i].score[1]) / 2;    // 在学生数据输入时即计算学生成绩
    }
    return students;    // 返回学生数据(结构体)
}

void output(struct Student *p1)
{
    int i;
    for (i = 0; i < STUDENTS_NUMBER; i++){    // 遍历结构体数组即每位学生信息,输出对应信息
        printf("==========第%d位学生成绩==========\n", i+1);
        printf("学号:%ld\n姓名:%s\n数学成绩:%f\n计算机成绩:%f\n", p1->num, p1->name, p1->score[0], p1->score[1]);
    }
}

void avg(struct Student *p1)
{
    int i;
    for (i = 0; i < STUDENTS_NUMBER; i++){    // 遍历结构体数组即每位学生信息,输出学生平均成绩
        printf("==========第%d位学生的平均分==========\n", i+1);
        printf("学号:%ld\n姓名:%s\n平均分:%f\n", p1->num, p1->name, p1->aver);
    }
}

void pass(struct Student *p1)
{
    int pass = 0, i;
    for (i = 0; i < STUDENTS_NUMBER; i++){   // // 遍历结构体数组即每位学生信息,找出及格人数
        if (p1->score[0] >= 60 && p1->score[1] >= 60) {
            pass++;
        }
    }
    printf("\n");
    printf("两门课都及格的人数有:%d人\n", pass);
    printf("两门课都不及格的人数有:%d人\n", STUDENTS_NUMBER - pass);
    printf("\n");
}

void maxc(struct Student students[])
{
    int i, max = 0;

    for (i = 0; i < STUDENTS_NUMBER; i++) {     // 遍历结构体数组即每位学生信息,找出计算机成绩最高学生
        if (students[i].aver > students[max].aver) {
            max = i;
        }
    }
    printf("*****计算机成绩最高学生*****\n");
    printf("学号:%ld\n姓名:%s\n计算机分数:%f\n", students[max].num, students[max].name, students[max].score[1]);
}

输入:

 

输出:

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/2991356.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-09-23
下一篇 2022-09-23

发表评论

登录后才能评论

评论列表(0条)

保存