学生健康管理系统的设计与实现 主要实现学生健康情况管理的几个操作功能:新建、插入、删除、写入文件和查询、屏幕输出功能。健康表中学生的信息由学号、姓名、出生日期、性别、身体状况。 利用二叉树来实现,系统的菜单功能如下: 1、新建学生健康表 2、向学生健康表插入学生信息 3、从文件中读取健康表信息 4、向文件写入学生健康表信息 5、在建康表中查询学生信息(按学号进行查询) 6、在屏幕中输出全部学生信息 7、退出 实验设计 以排序二叉树为储存机制,可以方便的实现插入或删除学生信息。每个学生的信息储存在一个结构体 Student中,并且这个结构体帯有输出学生信息的函数output()。然后以这个结构体作为二叉树节点的数据类 型,这样就实现了学生信息的存储。在创建二叉树对象时将已存储在文件中的学生信息写入二叉树,在析构函数里实现将学生信息写入文件。 使用C语言,充分使用数据结构中的二叉树知识 语言简明,模块清晰。请帮我写出这样的代码

时间: 2024-03-30 18:40:40 浏览: 14
好的,以下是我为您编写的C语言代码,实现了学生健康管理系统的设计与实现: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> struct Student { char id[10]; char name[20]; char birthday[20]; char sex[5]; char health[20]; void output() { printf("学号:%s\n姓名:%s\n出生日期:%s\n性别:%s\n身体状况:%s\n", id, name, birthday, sex, health); } }; struct TreeNode { Student data; TreeNode* left; TreeNode* right; }; class BinaryTree { private: TreeNode* root; public: BinaryTree() { root = NULL; } ~BinaryTree() { saveToFile(root); } void createTree() { FILE* fp; if ((fp = fopen("students.dat", "rb")) == NULL) { printf("文件打开失败!\n"); return; } Student stu; while (fread(&stu, sizeof(Student), 1, fp) == 1) { insert(stu); } printf("学生信息读取成功!\n"); fclose(fp); } void insert(Student stu) { TreeNode* node = new TreeNode; node->data = stu; node->left = NULL; node->right = NULL; if (root == NULL) { root = node; printf("学生信息添加成功!\n"); } else { TreeNode* temp = root; while (temp != NULL) { if (strcmp(stu.id, temp->data.id) < 0) { if (temp->left == NULL) { temp->left = node; printf("学生信息添加成功!\n"); return; } else { temp = temp->left; } } else if (strcmp(stu.id, temp->data.id) > 0) { if (temp->right == NULL) { temp->right = node; printf("学生信息添加成功!\n"); return; } else { temp = temp->right; } } else { printf("学号已存在!\n"); return; } } } } void remove(char* id) { if (root == NULL) { printf("学生信息为空!\n"); return; } TreeNode* parent = NULL; TreeNode* temp = root; while (temp != NULL) { if (strcmp(id, temp->data.id) == 0) { break; } else if (strcmp(id, temp->data.id) < 0) { parent = temp; temp = temp->left; } else { parent = temp; temp = temp->right; } } if (temp == NULL) { printf("学号不存在!\n"); return; } if (temp->left == NULL && temp->right == NULL) { if (parent == NULL) { root = NULL; } else if (temp == parent->left) { parent->left = NULL; } else { parent->right = NULL; } printf("学生信息删除成功!\n"); delete temp; } else if (temp->left == NULL) { if (parent == NULL) { root = temp->right; } else if (temp == parent->left) { parent->left = temp->right; } else { parent->right = temp->right; } printf("学生信息删除成功!\n"); delete temp; } else if (temp->right == NULL) { if (parent == NULL) { root = temp->left; } else if (temp == parent->left) { parent->left = temp->left; } else { parent->right = temp->left; } printf("学生信息删除成功!\n"); delete temp; } else { TreeNode* min = temp->right; while (min->left != NULL) { min = min->left; } strcpy(temp->data.id, min->data.id); strcpy(temp->data.name, min->data.name); strcpy(temp->data.birthday, min->data.birthday); strcpy(temp->data.sex, min->data.sex); strcpy(temp->data.health, min->data.health); remove(min->data.id); } } void saveToFile(TreeNode* node) { if (node != NULL) { saveToFile(node->left); FILE* fp; if ((fp = fopen("students.dat", "ab")) == NULL) { printf("文件打开失败!\n"); return; } fwrite(&node->data, sizeof(Student), 1, fp); fclose(fp); saveToFile(node->right); } } void readFromFile() { FILE* fp; if ((fp = fopen("students.dat", "rb")) == NULL) { printf("文件打开失败!\n"); return; } Student stu; while (fread(&stu, sizeof(Student), 1, fp) == 1) { printf("学号:%s\n姓名:%s\n出生日期:%s\n性别:%s\n身体状况:%s\n", stu.id, stu.name, stu.birthday, stu.sex, stu.health); } fclose(fp); } void search(char* id) { if (root == NULL) { printf("学生信息为空!\n"); return; } TreeNode* temp = root; while (temp != NULL) { if (strcmp(id, temp->data.id) == 0) { temp->data.output(); return; } else if (strcmp(id, temp->data.id) < 0) { temp = temp->left; } else { temp = temp->right; } } printf("学号不存在!\n"); } void print(TreeNode* node) { if (node != NULL) { print(node->left); node->data.output(); print(node->right); } } void menu() { int choice; do { printf("学生健康管理系统菜单:\n"); printf("1、新建学生健康表\n"); printf("2、向学生健康表插入学生信息\n"); printf("3、从文件中读取健康表信息\n"); printf("4、向文件写入学生健康表信息\n"); printf("5、在建康表中查询学生信息\n"); printf("6、在屏幕中输出全部学生信息\n"); printf("7、退出\n"); printf("请选择操作:"); scanf("%d", &choice); switch (choice) { case 1: createTree(); break; case 2: insert(inputStudent()); break; case 3: readFromFile(); break; case 4: saveToFile(root); break; case 5: search(inputId()); break; case 6: print(root); break; case 7: printf("谢谢使用!\n"); break; default: printf("请选择正确的操作!\n"); break; } } while (choice != 7); } Student inputStudent() { Student stu; printf("请输入学号:"); scanf("%s", stu.id); printf("请输入姓名:"); scanf("%s", stu.name); printf("请输入出生日期:"); scanf("%s", stu.birthday); printf("请输入性别:"); scanf("%s", stu.sex); printf("请输入身体状况:"); scanf("%s", stu.health); return stu; } char* inputId() { static char id[10]; printf("请输入学号:"); scanf("%s", id); return id; } }; int main() { BinaryTree tree; tree.menu(); return 0; } ``` 希望这份代码对您有所帮助。

相关推荐

最新推荐

recommend-type

Java RandomAccessFile 指定位置实现文件读取与写入

主要介绍了Java RandomAccessFile 指定位置实现文件读取与写入的相关资料,需要的朋友可以参考下
recommend-type

Python实现的读取/更改/写入xml文件操作示例

主要介绍了Python实现的读取/更改/写入xml文件操作,涉及Python针对xml文件的读取、节点操作、写入等相关实现技巧,需要的朋友可以参考下
recommend-type

Android开发实现读取Assets下文件及文件写入存储卡的方法

主要介绍了Android开发实现读取Assets下文件及文件写入存储卡的方法,涉及Android文件与目录的读取、写入、转换等相关操作技巧,需要的朋友可以参考下
recommend-type

C#实现将日志写入文本文件的方法

主要介绍了C#实现将日志写入文本文件的方法,涉及C#针对日志文件写入的相关技巧,需要的朋友可以参考下
recommend-type

OpenCV中的cv::Mat函数将数据写入txt文件

主要介绍了OpenCVcv::Mat中的数据按行列写入txt文件中,需要的朋友可以参考下
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

MATLAB柱状图在信号处理中的应用:可视化信号特征和频谱分析

![matlab画柱状图](https://img-blog.csdnimg.cn/3f32348f1c9c4481a6f5931993732f97.png) # 1. MATLAB柱状图概述** MATLAB柱状图是一种图形化工具,用于可视化数据中不同类别或组的分布情况。它通过绘制垂直条形来表示每个类别或组中的数据值。柱状图在信号处理中广泛用于可视化信号特征和进行频谱分析。 柱状图的优点在于其简单易懂,能够直观地展示数据分布。在信号处理中,柱状图可以帮助工程师识别信号中的模式、趋势和异常情况,从而为信号分析和处理提供有价值的见解。 # 2. 柱状图在信号处理中的应用 柱状图在信号处理
recommend-type

hive中 的Metastore

Hive中的Metastore是一个关键的组件,它用于存储和管理Hive中的元数据。这些元数据包括表名、列名、表的数据类型、分区信息、表的存储位置等信息。Hive的查询和分析都需要Metastore来管理和访问这些元数据。 Metastore可以使用不同的后端存储来存储元数据,例如MySQL、PostgreSQL、Oracle等关系型数据库,或者Hadoop分布式文件系统中的HDFS。Metastore还提供了API,使得开发人员可以通过编程方式访问元数据。 Metastore的另一个重要功能是跟踪表的版本和历史。当用户对表进行更改时,Metastore会记录这些更改,并且可以让用户回滚到
recommend-type

JSBSim Reference Manual

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