作为总复习的作业题,为了包含更多更完整的内容,也为了巩固大家的编程知识,以及动手解决实际问题的能力,使用C语言来设计一个简单的成绩管理系统。管理系统包含以下功能: 1.建立一张学生成绩表,每个学生包含 学号、姓名、性别、语文、数学、英语、总分、平均分。 2.将表中所有信息按总分降序排列。 3.按学号查找某学生所有成绩。 4.能够实现某学生的成绩插入和删除。 5.实现文件操作,程序退出时将学生成绩保存在studen_grad.txt文件中;程序开始时,能够从student_grad.txt文件中加载已有的学生成绩信息。 要求:所有功能均使用独立的函数来实现,使用结构体来存储学生信息,使用malloc动态创建,假设学生的总数是固定的(即你只需要开辟一次内存,使用一个整数n来存储学生数量,删除某学生的信息时只需要将后面所有的学生往前挪一位并将n-1)

时间: 2024-01-21 11:20:17 浏览: 29
以下是一个简单的成绩管理系统的实现: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_STUDENT_NUM 100 // 假设最多有100个学生 // 学生信息结构体 typedef struct { int id; // 学号 char name[20]; // 姓名 char gender[5]; // 性别 int chinese; // 语文成绩 int math; // 数学成绩 int english; // 英语成绩 int total; // 总分 float average; // 平均分 } Student; // 学生信息表结构体 typedef struct { Student *students; // 学生信息表 int num; // 学生数量 } StudentTable; // 函数声明 void initTable(StudentTable *table); void addStudent(StudentTable *table); void deleteStudent(StudentTable *table); void searchStudent(StudentTable *table); void sortTable(StudentTable *table); void saveTable(StudentTable *table); void loadTable(StudentTable *table); void printTable(StudentTable *table); void destroyTable(StudentTable *table); int main() { StudentTable table; initTable(&table); // 初始化学生信息表 loadTable(&table); // 从文件中加载学生信息 int choice = 0; while (1) { printf("请选择操作:\n"); printf("1. 添加学生信息\n"); printf("2. 删除学生信息\n"); printf("3. 查找学生信息\n"); printf("4. 排序学生信息\n"); printf("5. 打印学生信息\n"); printf("6. 保存学生信息\n"); printf("7. 退出程序\n"); scanf("%d", &choice); switch (choice) { case 1: addStudent(&table); break; case 2: deleteStudent(&table); break; case 3: searchStudent(&table); break; case 4: sortTable(&table); break; case 5: printTable(&table); break; case 6: saveTable(&table); break; case 7: destroyTable(&table); return 0; default: printf("输入不合法,请重新输入。\n"); break; } } } // 初始化学生信息表 void initTable(StudentTable *table) { table->students = (Student *) malloc(MAX_STUDENT_NUM * sizeof(Student)); table->num = 0; } // 添加学生信息 void addStudent(StudentTable *table) { if (table->num == MAX_STUDENT_NUM) { printf("学生信息表已满,添加失败。\n"); return; } printf("请输入学生信息:\n"); Student student; printf("学号:"); scanf("%d", &student.id); printf("姓名:"); scanf("%s", student.name); printf("性别:"); scanf("%s", student.gender); printf("语文成绩:"); scanf("%d", &student.chinese); printf("数学成绩:"); scanf("%d", &student.math); printf("英语成绩:"); scanf("%d", &student.english); student.total = student.chinese + student.math + student.english; student.average = (float) student.total / 3; table->students[table->num] = student; table->num++; printf("添加成功。\n"); } // 删除学生信息 void deleteStudent(StudentTable *table) { if (table->num == 0) { printf("学生信息表为空,删除失败。\n"); return; } int id; printf("请输入要删除的学生学号:"); scanf("%d", &id); for (int i = 0; i < table->num; i++) { if (table->students[i].id == id) { for (int j = i; j < table->num - 1; j++) { table->students[j] = table->students[j + 1]; } table->num--; printf("删除成功。\n"); return; } } printf("未找到该学生。\n"); } // 查找学生信息 void searchStudent(StudentTable *table) { if (table->num == 0) { printf("学生信息表为空,查找失败。\n"); return; } int id; printf("请输入要查找的学生学号:"); scanf("%d", &id); for (int i = 0; i < table->num; i++) { if (table->students[i].id == id) { printf("找到学生信息如下:\n"); printf("学号\t姓名\t性别\t语文\t数学\t英语\t总分\t平均分\n"); printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%.2f\n", table->students[i].id, table->students[i].name, table->students[i].gender, table->students[i].chinese, table->students[i].math, table->students[i].english, table->students[i].total, table->students[i].average); return; } } printf("未找到该学生。\n"); } // 排序学生信息 void sortTable(StudentTable *table) { if (table->num == 0) { printf("学生信息表为空,排序失败。\n"); return; } for (int i = 0; i < table->num - 1; i++) { for (int j = 0; j < table->num - i - 1; j++) { if (table->students[j].total < table->students[j + 1].total) { Student temp = table->students[j]; table->students[j] = table->students[j + 1]; table->students[j + 1] = temp; } } } printf("排序成功。\n"); } // 保存学生信息 void saveTable(StudentTable *table) { FILE *fp = fopen("student_grad.txt", "w"); if (fp == NULL) { printf("文件打开失败,保存失败。\n"); return; } fprintf(fp, "学号\t姓名\t性别\t语文\t数学\t英语\t总分\t平均分\n"); for (int i = 0; i < table->num; i++) { fprintf(fp, "%d\t%s\t%s\t%d\t%d\t%d\t%d\t%.2f\n", table->students[i].id, table->students[i].name, table->students[i].gender, table->students[i].chinese, table->students[i].math, table->students[i].english, table->students[i].total, table->students[i].average); } fclose(fp); printf("保存成功。\n"); } // 从文件中加载学生信息 void loadTable(StudentTable *table) { FILE *fp = fopen("student_grad.txt", "r"); if (fp == NULL) { printf("文件打开失败,加载失败。\n"); return; } char buf[1024]; fgets(buf, sizeof(buf), fp); // 跳过第一行表头 while (fgets(buf, sizeof(buf), fp) != NULL) { Student student; sscanf(buf, "%d\t%s\t%s\t%d\t%d\t%d\t%d\t%f", &student.id, student.name, student.gender, &student.chinese, &student.math, &student.english, &student.total, &student.average); table->students[table->num] = student; table->num++; } fclose(fp); printf("加载成功。\n"); } // 打印学生信息 void printTable(StudentTable *table) { if (table->num == 0) { printf("学生信息表为空,打印失败。\n"); return; } printf("学号\t姓名\t性别\t语文\t数学\t英语\t总分\t平均分\n"); for (int i = 0; i < table->num; i++) { printf("%d\t%s\t%s\t%d\t%d\t%d\t%d\t%.2f\n", table->students[i].id, table->students[i].name, table->students[i].gender, table->students[i].chinese, table->students[i].math, table->students[i].english, table->students[i].total, table->students[i].average); } } // 销毁学生信息表 void destroyTable(StudentTable *table) { free(table->students); table->num = 0; } ``` 上述代码中,我们使用了两个结构体 `Student` 和 `StudentTable` 来存储学生信息。其中 `Student` 结构体用来存储单个学生的信息,包括学号、姓名、性别、语文、数学、英语、总分和平均分;`StudentTable` 结构体用来存储学生信息表,包括一个指向学生信息数组的指针 `students` 和一个整数 `num` 表示当前学生数量。 除了结构体之外,我们还使用了多个独立的函数来实现各种操作。具体来说: - `initTable` 函数用来初始化学生信息表,即动态分配一块内存作为学生信息数组,并将学生数量设为0。 - `addStudent` 函数用来添加学生信息。在函数内部,我们首先判断学生信息表是否已满(即学生数量是否达到最大值),如果是则添加失败;否则,让用户输入学生信息,并计算总分和平均分,然后将学生信息添加到学生信息表中,并将学生数量加1。 - `deleteStudent` 函数用来删除某个学生的信息。在函数内部,我们首先判断学生信息表是否为空,如果是则删除失败;否则,让用户输入要删除的学生学号,然后在学生信息表中查找该学生,如果找到则将其删除,并将后面的学生信息往前挪一位。 - `searchStudent` 函数用来查找某个学生的信息。在函数内部,我们首先判断学生信息表是否为空,如果是则查找失败;否则,让用户输入要查找的学生学号,然后在学生信息表中查找该学生,如果找到则输出其信息。 - `sortTable` 函数用来按照学生总分降序排列学生信息。在函数内部,我们使用冒泡排序算法来实现,即对于学生信息表中的每个学生,比较其总分与后一个学生的总分大小,如果前者小于后者,则交换两个学生的位置。 - `saveTable` 函数用来将学生信息保存到文件中。在函数内部,我们首先打开一个文件,然后将学生信息表中的每个学生信息都输出到文件中。 - `loadTable` 函数用来从文件中加载学生信息。在函数内部,我们首先打开一个文件,然后逐行读取文件内容并解析,将每个学生信息添加到学生信息表中。 - `printTable` 函数用来打印学生信息表中的所有学生信息。 - `destroyTable` 函数用来销毁学生信息表,即释放动态分配的内存,并将学生数量设为0。 最后,在 `main` 函数中,我们使用一个无限循环来让用户选择要执行的操作,然后调用相应的函数来实现。在程序退出前,我们使用 `saveTable` 函数将学生信息保存到文件中,并使用 `destroyTable` 函数释放动态分配的内存。

相关推荐

最新推荐

recommend-type

【数据库作业14】第五章: 数据库完整性 习题 + 存储过程

他这个语句好像也不是标准SQL,应该是MYSQL还是Oracle吧。希望老师解答~ (1)统计离散数学成绩分布 CREATE TABLE SCC( Grades CHAR(5), Num INT ) --存人数 INSERT INTO SCC(Grades,Num) VALUES('&gt;90...
recommend-type

英文科技论文写作与学术报告(2020春)总题库包括作业与期末考答案

英文科技论文写作与学术报告(2020春)慕课的总题库包括作业与期末考答案,下载文件后直接用ctrl+F查询题目。
recommend-type

工控系统面临的安全问题及解决方案

随着工业化与信息化进程的不断交叉融合,越来越多的信息技术应用到了工业领域。目前,超过80%的涉及国计民生的关键基础设施依靠工业控制系统来实现自动化作业。工业控制系统已经成为国家关键基础设施的重要组成部分...
recommend-type

OS大作业生产者消费者同步问题的实现

操作系统实践大作业:使用POSIX条件变量和互斥锁实现生产者、消费者同步问题,缓冲区空时消费者不能消费,当有生产者生产产品后唤醒阻塞的消费者;缓冲区满时生产者不能生产,当有消费者消费产品后唤醒阻塞的生产者...
recommend-type

信号完整性分析大作业.docx

目录 一、基本概念和软件介绍………………………………………………… 3 二、终端开、短路的信号反射……………………………………………4 三、短串联传输线的反射 ………………………………………………… 6 ...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

list根据id查询pid 然后依次获取到所有的子节点数据

可以使用递归的方式来实现根据id查询pid并获取所有子节点数据。具体实现可以参考以下代码: ``` def get_children_nodes(nodes, parent_id): children = [] for node in nodes: if node['pid'] == parent_id: node['children'] = get_children_nodes(nodes, node['id']) children.append(node) return children # 测试数
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。