oh470 2023-06-18 00:35 采纳率: 55.6%
浏览 27
已结题

学生成绩查询统计系统

设计一个学生成绩查询统计系统,要求如下:
(1)分析数据的逻辑结构,(2)设计数据的存储结构,
(3)可以根据学生姓名进行字典排序,(4)可以根据成绩进行由高到低排序,(5)可以根据学号或姓名查找学生成绩,
(6)统计及格、中、良、优秀和不及格学生人数及其所占比例,
(7)编写主要的C语言代码,尤其是对函数头部涉及的主要参数要进行注释说明

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-18 02:04
    关注
    • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/731918
    • 这篇博客你也可以参考下:算法设计-用选择排序按从小到大的顺序排列数 C代码
    • 除此之外, 这篇博客: C语言中主函数调用另外一个函数,汇编代码理解中的 调用被调函数 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
    • call    proc@PLT
      

      调用被调函数前,会把调用代码的的下一条执行指令压栈,方便从被调函数中返回到主函数时候,还能往下执行。
      在这里插入图片描述

    • 您还可以看一下 朱有鹏老师的宏定义与预处理、函数和函数库-C语言专题第6部分课程中的 4.6.2.C语言预处理代码实战小节, 巩固相关知识点
    • 以下回答由chatgpt基于相关博客总结生成:
      1. 数据逻辑结构: 学生成绩系统应包含学生信息和学生成绩两部分。学生信息包括学号、姓名、班级等,学生成绩包括每个学生每门课程的成绩。因此,可以采用关系型数据库的方式,将学生信息和学生成绩两个部分以表格的形式进行存储。其中学生信息可以作为两个表的主键进行关联,形成一个一对多的关系,具体而言,应分别建立学生和成绩两张表,且成绩表的每个学生应当对应一条或多条记录,反之亦然。 数据的存储结构: 可以采用关系型数据库或文件存储的方式。采用文件存储的方式需用一定的存储格式规范,例如采用逗号、制表符或json格式等进行存储。

      2. 根据学生姓名进行字典排序可以采用快速排序或归并排序等,具体方法如下:

      快速排序:

      /*
      @param  s[]   待排序的学生信息
              l     序列起始位置
              r     序列终止位置
      */
      void QuickSort(Student s[], int l, int r) {
          if (l < r) {
              int i = l, j = r;
              Student x = s[l];
              while (i < j) {
                  while (i < j && strcmp(s[j].name,x.name) >= 0)
                      j--; 
                  if (i < j) 
                      s[i++] = s[j]; 
                  while (i < j && strcmp(s[i].name,x.name) < 0)
                      i++; 
                  if (i < j) 
                      s[j--] = s[i]; 
              }
              s[i] = x;
              QuickSort(s, l, i - 1);
              QuickSort(s, i + 1, r);
          }
      }
      

      根据成绩进行由高到低排序同样也可以采用快速排序或归并排序等,具体方法如下:

      快速排序:

      /*
      @param  s[]   待排序的学生信息
              l     序列起始位置
              r     序列终止位置
      */
      void QuickSort(Student s[], int l, int r) {
          if (l < r) {
              int i = l, j = r;
              Student x = s[l];
              while (i < j) {
                  while (i < j && s[j].score >= x.score)
                      j--; 
                  if (i < j) 
                      s[i++] = s[j]; 
                  while (i < j && s[i].score < x.score)
                      i++; 
                  if (i < j) 
                      s[j--] = s[i]; 
              }
              s[i] = x;
              QuickSort(s, l, i - 1);
              QuickSort(s, i + 1, r);
          }
      }
      
      1. 根据学号或姓名查找学生成绩,输入参数应当包括学生信息或成绩表以及学生的姓名或学号,如:
      typedef struct Student {
          int num;
          char name[20];
          float score;
      } Student;
      /*
      @param  s[]   待查找的学生信息/成绩
              len   学生信息/成绩的数量
              x     待查找学生姓名或学号
      */
      void find(Student s[], int len, char* x) {
          for (int i = 0; i < len; i++) {
              if (strcmp(s[i].name, x) == 0 || s[i].num == atoi(x)) {
                  printf("%d %s %.2f\n", s[i].num, s[i].name, s[i].score);
                  return;
              }
          }
          printf("Not Found\n");
      }
      

      其中 atoi 可以将输入的字符串转换为相应的整数。

      1. 统计及格、中、良、优秀和不及格学生的人数以及其所占比例,可以先设置五个计数器,分别记录及格、中、良、优秀和不及格的人数,遍历成绩表,对每个学生的成绩进行分类,最后计算比例,具体实现如下:
      void statistic(Student s[], int len, int *pass, int *average, int *good, int *excellent, int *fail) {
          *pass = *average = *good = *excellent = *fail = 0;
          for (int i = 0; i < len; i++) {
              if (s[i].score >= 60 && s[i].score < 70) {
                  (*pass)++;
              }else if (s[i].score >= 70 && s[i].score < 80) {
                  (*average)++;
              }else if (s[i].score >= 80 && s[i].score < 90) {
                  (*good)++;
              }else if (s[i].score >= 90) {
                  (*excellent)++;
              }else {
                  (*fail)++;
              }
          }
          printf("及格人数:%d,占比%f%%\n", *pass, (float)*pass / len * 100);
          printf("中等人数:%d,占比%f%%\n", *average, (float)*average / len * 100);
          printf("良好人数:%d,占比%f%%\n", *good, (float)*good / len * 100);
          printf("优秀人数:%d,占比%f%%\n", *excellent, (float)*excellent / len * 100);
          printf("不及格人数:%d,占比%f%%\n", *fail, (float)*fail / len * 100);
      }
      
      1. 编写主要的C语言代码:

      ```c

      include

      include

      include

      / 定义学生结构体 / typedef struct Student { int num; char name[20]; float score[5]; float avg;//平均成绩 } Student;

      / 输入学生信息,包括学号、姓名和成绩 / void input(Student* s, int n) { printf("请按以下格式输入学生信息:学号 姓名 成绩1 成绩2 成绩3 成绩4 成绩5\n"); for (int i = 0; i < n; i++) { scanf("%d %s %f %f %f %f %f", &s[i].num, s[i].name, &s[i].score[0], &s[i].score[1], &s[i].score[2], &s[i].score[3], &s[i].score[4]); s[i].avg = (s[i].score[0] + s[i].score[1] + s[i].score[2] + s[i].score[3] + s[i].score[4]) / 5; } }

      / 根据姓名进行字典排序 / void QuickSortByName(Student* s, int l, int r) { if (l < r) { int i = l, j = r; Student x = s[l]; while (i < j) { while (i < j && strcmp(s[j].name, x.name) >= 0) j--; if (i < j) s[i++] = s[j]; while (i < j && strcmp(s[i].name, x.name) < 0) i++; if (i < j) s[j--] = s[i]; } s[i] = x; QuickSortByName(s, l, i - 1); QuickSortByName(s, i + 1, r); } }

      / 根据平均成绩进行排序,由高到低 / void QuickSortByScore(Student* s, int l, int r) { if (l < r) { int i = l, j = r; Student x = s[l]; while (i < j) { while (i < j && s[j].avg >= x.avg) j--; if (i < j) s[i++] = s[j]; while (i < j && s[i].avg < x.avg) i++; if (i < j) s[j--] = s[i]; } s[i] = x; QuickSortByScore(s, l, i - 1); QuickSortByScore(s, i + 1, r); } }

      / 根据学号或姓名查找学生成绩 / void search(Student s, int n, char name_or_num) { int flag = 0;//查找标志 for (int i = 0; i < n; i++) { if (strcmp(s[i].name, name_or_num) == 0 || s[i].num == atoi(name_or_num)) { printf("%d\t%s\t%.2f\t%.2f\t%.2f\t%.2f\t%.2f\n", s[i].num, s[i].name, s[i].score[0], s[i].score[1], s[i].score[2], s[i].score[3], s[i].score[4]); flag = 1; } } if (!flag) printf("没有找到该学生信息\n"); }

      / 统计及格、中、良、优秀和不及格学生的人数以及其所占比例 / void statistic(Student s, int n, int pass, int general_pass, int good, int excellent, int fail) { pass = general_pass = good = excellent = fail = 0; for (int i = 0; i < n; i++) { float sum = 0; for (int j = 0; j < 5; j++) { sum += s[i].score[j]; } s[i].avg = sum / 5; if (s[i].avg >= 90) { (excellent)++; }else if (s[i].avg >= 80) { (good)++; }else if (s[i].avg >= 70) { (general_pass)++; }else if (s[i].avg >= 60) { (pass)++; }else { (fail)++; } } printf("及格人数:%d,占比%.2f%%\n", pass, (float)pass / n * 100); printf("中等人数:%d,占比%.2f%%\n", general_pass, (float)general_pass / n * 100); printf("良好人数:%d,占比%.2f%%\n", good, (float)good / n * 100); printf("优秀人数:%d,占比%.2f%%\n", excellent, (float)excellent / n

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月26日
  • 已采纳回答 6月18日
  • 创建了问题 6月18日

悬赏问题

  • ¥15 程序实在不会写,要秃了
  • ¥15 pycharm导入不了自己的包
  • ¥15 C#.net通过内网url地址获取文件并下载问题,浏览器postman可以正常下载,用程序不行
  • ¥15 本人本科机械,目前研一。没有深度学习基础,目前对研究生课题一片迷茫,请教各位!
  • ¥15 关于R语言单因素与多因素线性回归的平均值
  • ¥15 服务器清除BIOS之后引导不了
  • ¥15 CPLEX用OPL编写的混合整数线性优化问题。
  • ¥15 可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?
  • ¥15 前端预览docx文件,文件从后端传送过来。
  • ¥15 层次聚类和蛋白质相似度