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


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

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

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

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

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

    可表示如下

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

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

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

     

    🌟代码实现

    1. #include
    2. #define STUDENTS_NUMBER 3
    3. struct Student{
    4. long num;
    5. char name[20];
    6. float score[2];
    7. float aver;
    8. };
    9. struct Student* input(struct Student students[]);
    10. void output(struct Student *p1);
    11. void avg(struct Student *p1);
    12. void pass(struct Student *p1);
    13. void maxc(struct Student student[]);
    14. int main(void)
    15. {
    16. struct Student students[STUDENTS_NUMBER];
    17. struct Student *p = students, *p1;
    18. p1 = input(p);
    19. output(p1);
    20. avg(p1);
    21. pass(p1);
    22. maxc(students);
    23. return 0;
    24. }
    25. struct Student* input(struct Student students[])
    26. {
    27. int i;
    28. printf("输入学生信息(学号,姓名,数学,计算机成绩,不同信息用空格分隔)\n");
    29. printf("在此开始输入:");
    30. for (i = 0; i < STUDENTS_NUMBER; i++){
    31. scanf("%ld %s %f %f",
    32. &students[i].num, students[i].name, &students[i].score[0], &students[i].score[1]);
    33. students[i].aver = (students[i].score[0] + students[i].score[1]) / 2;
    34. }
    35. return students;
    36. }
    37. void output(struct Student *p1)
    38. {
    39. int i;
    40. for (i = 0; i < STUDENTS_NUMBER; i++){
    41. printf("==========第%d位学生成绩==========\n", i+1);
    42. printf("学号:%ld\n姓名:%s\n数学成绩:%f\n计算机成绩:%f\n", p1->num, p1->name, p1->score[0], p1->score[1]);
    43. }
    44. }
    45. void avg(struct Student *p1)
    46. {
    47. int i;
    48. for (i = 0; i < STUDENTS_NUMBER; i++){
    49. printf("==========第%d位学生的平均分==========\n", i+1);
    50. printf("学号:%ld\n姓名:%s\n平均分:%f\n", p1->num, p1->name, p1->aver);
    51. }
    52. }
    53. void pass(struct Student *p1)
    54. {
    55. int pass = 0, i;
    56. for (i = 0; i < STUDENTS_NUMBER; i++){
    57. if (p1->score[0] >= 60 && p1->score[1] >= 60) {
    58. pass++;
    59. }
    60. }
    61. printf("\n");
    62. printf("两门课都及格的人数有:%d人\n", pass);
    63. printf("两门课都不及格的人数有:%d人\n", STUDENTS_NUMBER - pass);
    64. printf("\n");
    65. }
    66. void maxc(struct Student students[])
    67. {
    68. int i, max = 0;
    69. for (i = 0; i < STUDENTS_NUMBER; i++) {
    70. if (students[i].aver > students[max].aver) {
    71. max = i;
    72. }
    73. }
    74. printf("*****计算机成绩最高学生*****\n");
    75. printf("学号:%ld\n姓名:%s\n计算机分数:%f\n", students[max].num, students[max].name, students[max].score[1]);
    76. }

    ✏代码注释

    1. #include
    2. #define STUDENTS_NUMBER 3 // 学生总人数
    3. struct Student{
    4. long num; // 学号(学号过长可以使用字符串表示)
    5. char name[20]; // 姓名
    6. float score[2]; // 数学计算机成绩
    7. float aver; // 平均成绩
    8. };
    9. // 构造函数声明
    10. struct Student* input(struct Student students[]); // input函数用于输入并返回学生信息
    11. void output(struct Student *p1); // output函数用于输出学生信息
    12. void avg(struct Student *p1); // avg函数用于输出学生平均成绩
    13. void pass(struct Student *p1); // pass函数用于统计及格学生人数
    14. void maxc(struct Student student[]); // maxc用于查找计算机成绩最高学生
    15. int main(void)
    16. {
    17. struct Student students[STUDENTS_NUMBER]; // 定义结构体数组
    18. struct Student *p = students, *p1; // 将指针p指向结构体数组
    19. p1 = input(p); // 调用input函数输入学生信息并返回获取到的学生信息p1(指针)
    20. output(p1); // output输出学生信息
    21. avg(p1); // 输出学生平均值
    22. pass(p1); // 输出及格学生人数
    23. maxc(students); // 查找计算机成绩最高学生
    24. return 0;
    25. }
    26. struct Student* input(struct Student students[])
    27. {
    28. int i;
    29. printf("输入学生信息(学号,姓名,数学,计算机成绩,不同信息用空格分隔)\n");
    30. printf("在此开始输入:");
    31. for (i = 0; i < STUDENTS_NUMBER; i++){ // 循环遍历结构体数组,依次输入每名学生成绩
    32. scanf("%ld %s %f %f", // 类似变量输入加上取地址符,&students[i].num,但是students[i].name不许要加因为name为数字students[i].name即为地址
    33. &students[i].num, students[i].name, &students[i].score[0], &students[i].score[1]);
    34. students[i].aver = (students[i].score[0] + students[i].score[1]) / 2; // 在学生数据输入时即计算学生成绩
    35. }
    36. return students; // 返回学生数据(结构体)
    37. }
    38. void output(struct Student *p1)
    39. {
    40. int i;
    41. for (i = 0; i < STUDENTS_NUMBER; i++){ // 遍历结构体数组即每位学生信息,输出对应信息
    42. printf("==========第%d位学生成绩==========\n", i+1);
    43. printf("学号:%ld\n姓名:%s\n数学成绩:%f\n计算机成绩:%f\n", p1->num, p1->name, p1->score[0], p1->score[1]);
    44. }
    45. }
    46. void avg(struct Student *p1)
    47. {
    48. int i;
    49. for (i = 0; i < STUDENTS_NUMBER; i++){ // 遍历结构体数组即每位学生信息,输出学生平均成绩
    50. printf("==========第%d位学生的平均分==========\n", i+1);
    51. printf("学号:%ld\n姓名:%s\n平均分:%f\n", p1->num, p1->name, p1->aver);
    52. }
    53. }
    54. void pass(struct Student *p1)
    55. {
    56. int pass = 0, i;
    57. for (i = 0; i < STUDENTS_NUMBER; i++){ // // 遍历结构体数组即每位学生信息,找出及格人数
    58. if (p1->score[0] >= 60 && p1->score[1] >= 60) {
    59. pass++;
    60. }
    61. }
    62. printf("\n");
    63. printf("两门课都及格的人数有:%d人\n", pass);
    64. printf("两门课都不及格的人数有:%d人\n", STUDENTS_NUMBER - pass);
    65. printf("\n");
    66. }
    67. void maxc(struct Student students[])
    68. {
    69. int i, max = 0;
    70. for (i = 0; i < STUDENTS_NUMBER; i++) { // 遍历结构体数组即每位学生信息,找出计算机成绩最高学生
    71. if (students[i].aver > students[max].aver) {
    72. max = i;
    73. }
    74. }
    75. printf("*****计算机成绩最高学生*****\n");
    76. printf("学号:%ld\n姓名:%s\n计算机分数:%f\n", students[max].num, students[max].name, students[max].score[1]);
    77. }

    输入:

     

    输出:

     

     

  • 相关阅读:
    Java毕业设计-快递物流管理系统
    Lepton 无损压缩原理及性能分析
    java调用python文件的几种方式【超细讲解!】
    Microsoft Edge浏览器:高效、简洁、个性化的网页浏览体验
    关于初始化page入参的设计思路
    重装系统后原git项目报错
    笔记本电脑远程控制jetson nano/nx桌面的三种方法
    阅读openfoam框图
    .Net 7 轻松上手Dapr之服务调用
    我的创作纪念日
  • 原文地址:https://blog.csdn.net/m0_61791601/article/details/126906664