学生成绩查询统计系统

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

  • 这有个类似的问题, 你可以参考下: 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

大学C语言结课设计 学生成绩统计系统_课程成绩统计系统c语言_DY木子羊的博客-CSDN博客 学生成绩统计系统题目要求:学期考试结束,统计有每班每个人的平均成绩,每门课的平均成绩,并按照个人平均成绩从高到低的顺序输出成绩,输出不及格人名单。输入输出格式自定假设某班有30人考试课程自定将所有同学的成绩保留在文件中,对文件中的数据处理,输入所要求的内容,程序的功能主要包括以下方面1.输入成绩到文件中2.输出成绩3.输出不及格学生名单4.成绩排序5.删除记录6.插入记录7.修改记录主函数中对以上功能选择,调用对应的函数完成注意事项1.文件打开方式r 只读 文件必须存在,否 https://blog.csdn.net/qianxunand/article/details/107400536