有的用的C,有的用了C++,用什么方便我就用了啥,当然这个应该用结构体比较简单,我用了类,其实差不多
StudentManager.h头文件中
#pragma once
#include<stdio.h>
#include<iostream>
//#include"StudentManager.h"
#include <fstream>
#include<Windows.h>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<conio.h>
#define WINDOW_WIDTH 100
#define WINDOW_HEIGTH 30
using namespace std;
/*
定义学生类,里面应该包含了姓名,性别,学号,专业,级别
同时每个学生中也包含了指向下一个学生的指针
*/
typedef class _CStudent {
public:
std::string Student_Name; //级别
std::string Student_Gender;//性别
std::string Student_Number;//学号
std::string Student_Major; //专业
std::string Student_Level; //级别
public:
_CStudent* p_Next_Student; //指向下一个学生
_CStudent() {
/*
Student_Name.resize(25);
Student_Gender.resize(25);
Student_Number.resize(25);
Student_Major.resize(25);
Student_Level.resize(25);
*/
p_Next_Student = NULL;
}
~_CStudent(){}
}CStudent;
//尾部学生
typedef class _StudentList {
public:
CStudent* headStudent;
CStudent* rearStudent;
}StudentList;
//重定义窗口的大小
void Window_Size(short int w_width,short int w_heigth);
//创建一条学生信息
CStudent* Create_Student(string c_name, string c_gender, string c_number,
string c_major, string c_level);
//创建链表
StudentList* CreateList();
//尾插法插入一条学生信息
void Rear_Insert_Student(StudentList* List_Student, CStudent* n_student);
void Display_StudentInfo();
void Inquire_StudentInfo();
void Insert_StudentInfo();
void Modify_StudentInfo();
void Delete_StudentInfo();
void Save_Student();
void Print_WelcomeInfo();
void System_Welcome();
void Load_Info();
StudentManager.cpp中
有很多的注释都是我在写的过程中不断的试错和修改的,很多代码块的注释都是多余的,我也懒得去修改了
#include"StudentManager.h"
/*
* 重新绘制窗口的大小
*/
void Window_Size(short int w_width, short int w_heigth) {
HANDLE h_OutHandle = GetStdHandle(STD_OUTPUT_HANDLE); //获取控制台标准输出句柄
COORD c_WindowSize = { w_width,w_heigth }; //重新设置窗口大小
SetConsoleScreenBufferSize(h_OutHandle, c_WindowSize); //设置窗口缓冲区的大小
_SMALL_RECT sr = { 0,0,w_width,w_heigth }; //重置窗口的位置和大小
SetConsoleWindowInfo(h_OutHandle, TRUE, &sr);
}
/*
实现创建一个学生的函数,即创建一个节点
类型为CStudent类型
参数为学生的各种信息
*/
CStudent* Create_Student(string c_name,string c_gender,string c_number,
string c_major,string c_level) {
CStudent* c_student=new CStudent;//动态分配一块内存
/*
c_name.resize(25);
c_gender.resize(25);
c_number.resize(25);
c_major.resize(25);
c_level.resize(25);
*/
c_student->Student_Name = c_name;
c_student->Student_Gender = c_gender;
c_student->Student_Number = c_number;
c_student->Student_Major = c_major;
c_student->Student_Level = c_level;
c_student->p_Next_Student = NULL;
return c_student;
}
/*
* 创建尾部,相当于创建一个链表
*/
StudentList* CreateList() {
StudentList* theList = new StudentList;
theList->headStudent = NULL;
theList->rearStudent = NULL;
return theList;
}
/*
* 全局变量尾部
*/
//StudentList* theList = CreateList();
StudentList* f_studentlist = CreateList(); //创建一个学生链表用来读取文件中的所有学生信息
/*
实现学生信息的插入函数,尾插法
将一条学生信息插入到一条学生信息的后面
*/
void Rear_Insert_Student(StudentList* List_Student,CStudent* n_student) {
if (List_Student->headStudent == NULL) { //如果不存在表头
/*
CStudent* newStudent =n_student;//传入的参数作为表头
newStudent->p_Next_Student = NULL;//下一跳指向空
List_Student->headStudent = newStudent; //头部指针指向新的节点
List_Student->rearStudent = newStudent; //尾部指针指向新的节点
*/
n_student->p_Next_Student = NULL;
List_Student->headStudent = n_student;
List_Student->rearStudent = n_student;
return;
}
//表头已经存在
//查找链表的尾部
//CStudent* newRear = n_student;//创建一个节点作为新的尾部
while (List_Student->rearStudent->p_Next_Student) {
List_Student->rearStudent = List_Student->rearStudent->p_Next_Student;//指针后移到最后的尾部
}
//此时尾部指针成功的指向了最后
List_Student->rearStudent->p_Next_Student = n_student;
n_student->p_Next_Student = NULL;
//newRear->p_Next_Student = NULL; //新的尾部指向空
//表头的下一跳指向新的尾部
//List_Student->headStudent->p_Next_Student = newRear;
//List_Student->rearStudent->p_Next_Student = newRear;//指向新的尾部
//List_Student->rearStudent = newRear;
/*
CStudent* newStudent = n_student;//创建一个节点
newStudent->p_Next_Student = NULL;//下一跳指向空
r_Student->rearStudent = newStudent; //尾部指针指向新的节点
*/
}
/*
* 查看学生信息
* 调用此函数将从文件中读取信息并打印出来
*/
void Display_StudentInfo() {
/*
FILE* p_FilePoint=fopen("student.txt", "r");
if (p_FilePoint) {
printf("文件打开成功!\n");
getch();
fclose(p_FilePoint);
}
printf("文件打开失败!\n");
getch();
*/
ifstream i_FileOS;
i_FileOS.open("student.data", ios::in);
if (i_FileOS.is_open()) {
printf("信息文件打开成功!读取信息如下:\n\n");
printf("----------------------------------------------\n");
printf("姓名\t性别\t学号\t专业\t\t级别\n");
string read_String;
while (getline(i_FileOS,read_String)) {
printf("----------------------------------------------\n");
cout << read_String.c_str() << endl;
}
printf("----------------------------------------------\n");
printf("\n学生信息读取完毕!\n");
getch();
return;
}
printf("文件打开失败!\n");
getch();
/*
ifstream i_FileOS;
i_FileOS.open("student.data", ios::in);
if (i_FileOS.is_open()) {
printf("信息文件打开成功!读取信息如下:\n\n");
string read_String1,read_String2;
//i_FileOS.seekg(4,ios::beg);
//getline(i_FileOS, read_String);
i_FileOS >> read_String1>>read_String2;
cout << read_String1<<endl<<read_String2<< endl;
printf("\n学生信息读取完毕!\n");
getch();
return;
}
printf("文件打开失败!\n");
getch();
*/
}
/*
* 查询学生信息
* 调用此函数来从文件中读取信息,并且通过对姓名或者学号的比较来进行查询
*/
void Inquire_StudentInfo() {
printf("请输入要查询的学生姓名或者学号:\n");
string f_info;
cin >> f_info;
//输入后开始读取文件中的信息,将信息写入链表中,并且进行比较
//StudentList* f_studentlist = CreateList(); //创建一个学生链表用来读取文件中的所有学生信息
/*
ifstream i_FileOS;
i_FileOS.open("student.data", ios::in);
if (i_FileOS.is_open()) {
while (i_FileOS.peek() != EOF) {//只要文件没有读到末尾
string f_name, f_gender, f_number, f_major, f_level;
i_FileOS >> f_name >> f_gender >> f_number >> f_major >> f_level;
//cout << f_name <<"\t" << f_gender << "\t" << f_number << "\t" << f_major << "\t" << f_level<< endl;
//创建一个节点
CStudent* f_student = Create_Student(f_name, f_gender, f_number, f_major, f_level);
f_student->p_Next_Student = NULL;
/*
f_studentlist->rearStudent = f_student;
f_studentlist->rearStudent = f_studentlist->rearStudent->p_Next_Student;
*/
//直接调用尾插法函数
/* Rear_Insert_Student(f_studentlist, f_student);
}
*/
//遍历链表,判断
CStudent* f_move = f_studentlist->headStudent;
if (f_move) {
while (f_move) {
if ((f_move->Student_Name == f_info) || (f_move->Student_Number == f_info)) {
//找到了学生
cout << endl;
cout << "查找到 " << f_move->Student_Name << " 的信息如下:" << endl << endl;
printf("----------------------------------------------\n");
printf("姓名\t性别\t学号\t专业\t\t\t级别\n");
printf("----------------------------------------------\n");
cout << f_move->Student_Name << "\t" << f_move->Student_Gender << "\t" << f_move->Student_Number << "\t"
<< f_move->Student_Major << "\t" << f_move->Student_Level << endl;
printf("----------------------------------------------\n");
getch();
return;
}
f_move = f_move->p_Next_Student;
/*
if (f_move->p_Next_Student == NULL) { //没有查找到
printf("未查找到该学生的相关信息!\n");
getch();
return;
}
*/
}
}
printf("未查找到该学生的相关信息!\n");
getch();
return;
/*
* 测试
CStudent* p_move = f_studentlist->headStudent;
while (p_move->p_Next_Student) {
cout << p_move->Student_Name<<endl;
p_move = p_move->p_Next_Student;
}
*/
//}
//printf("文件打开失败!\n");
//getch();
/*
ifstream i_FileOS;
i_FileOS.open("student.data", ios::in);
if (i_FileOS.is_open()) {
i_FileOS.seekg(sizeof(),ios::cur);
return;
}
printf("文件打开失败!\n");
getch();
*/
}
/*
* 调用此函数来插入一条学生信息
*/
void Insert_StudentInfo() {
printf("学生信息插入\n");
printf("请输入学生的 姓名 性别 学号 专业 级别 :\n");
//string r_name, r_gender, r_number, r_major, r_level;
string new_name, new_gender, new_number, new_major, new_level;
/*
new_name.resize(25);
new_gender.resize(25);
new_number.resize(25);
new_major.resize(25);
new_level.resize(25);
*/
cin >> new_name>> new_gender>> new_number>> new_major>> new_level;
CStudent* New_Student = Create_Student(new_name,new_gender,new_number,new_major,new_level);
Rear_Insert_Student(f_studentlist, New_Student); //将新的节点插入到尾部
printf("学生信息插入成功!\n");
getch();
//Rear_Insert_Student(, New_Student);
//以写的方式打开,若不存在文件就会创建一个
/*
FILE* p_FilePoint = fopen("student.txt", "w");
if (p_FilePoint) {
/*fprintf(p_FilePoint, "%s\t%s\t%s\t%s\t%s", New_Student->Student_Name, New_Student->Student_Gender,
New_Student->Student_Number, New_Student->Student_Major, New_Student->Student_Level);
fprintf(p_FilePoint, "%s", );
fclose(p_FilePoint);
printf("成功插入学生信息!\n");
getch();
return;
}
printf("打开文件失败!\n");
getch();
*/
/*
ofstream o_FileOS;
o_FileOS.open("student.data", ios::out|ios::app);
if (o_FileOS.is_open()) {
o_FileOS << New_Student->Student_Name<<"\t"<<New_Student->Student_Gender<<"\t"<<New_Student->Student_Number
<<"\t"<<New_Student->Student_Major << "\t"<<New_Student->Student_Level<<endl;
printf("学生信息插入成功!\n");
getch();
return;
}
printf("文件打开失败!\n");
*/
}
/*
* 修改学生的信息
* 调用此功能需要先查询学生的信息,然后在进行修改
*/
void Modify_StudentInfo() {
printf("请输入要修改信息的学生的姓名或学号:\n");
string mf_info;
cin >> mf_info;
//StudentList* f_studentlist = CreateList(); //创建一个学生链表用来读取文件中的所有学生信息
/*
* 先试用查找模块,和查询学生信息类似
*/
/*
ifstream i_FileOS;
i_FileOS.open("student.data", ios::in);
if (i_FileOS.is_open()) {
while (i_FileOS.peek() != EOF) {//只要文件没有读到末尾
string f_name, f_gender, f_number, f_major, f_level;
i_FileOS >> f_name >> f_gender >> f_number >> f_major >> f_level;
//cout << f_name <<"\t" << f_gender << "\t" << f_number << "\t" << f_major << "\t" << f_level<< endl;
//创建一个节点
CStudent* f_student = Create_Student(f_name, f_gender, f_number, f_major, f_level);
f_student->p_Next_Student = NULL;
/*
f_studentlist->rearStudent = f_student;
f_studentlist->rearStudent = f_studentlist->rearStudent->p_Next_Student;
*/
//直接调用尾插法函数
/* Rear_Insert_Student(f_studentlist, f_student);
}
//遍历链表,判断
*/
CStudent* f_move = f_studentlist->headStudent;
CStudent* l_move = f_move;
if (f_move) {
while (f_move) {
if ((f_move->Student_Name == mf_info) || (f_move->Student_Number == mf_info)) {
//找到了学生
cout << endl;
cout << "您要修改的学生为:" << endl << endl;
printf("----------------------------------------------\n");
printf("姓名\t性别\t学号\t专业\t\t\t级别\n");
printf("----------------------------------------------\n");
cout << f_move->Student_Name << "\t" << f_move->Student_Gender << "\t" << f_move->Student_Number << "\t"
<< f_move->Student_Major << "\t" << f_move->Student_Level << endl;
printf("----------------------------------------------\n\n");
printf("请输入修改后的 姓名 性别 学号 专业 级别 :\n");
string new_name, new_gender, new_number, new_major, new_level;
cin >> new_name >> new_gender >> new_number >> new_major >> new_level;
f_move->Student_Name = new_name;
f_move->Student_Gender = new_gender;
f_move->Student_Number = new_number;
f_move->Student_Major = new_major;
f_move->Student_Level = new_level;
printf("\n信息修改成功!\n");
l_move->p_Next_Student = f_move;
getch();
return;
}
l_move = f_move;
f_move = f_move->p_Next_Student;
/*
if (f_move->p_Next_Student == NULL) { //没有查找到
printf("未查找到该学生的相关信息!\n");
getch();
return;
}
*/
}
}
printf("未查找到该学生的相关信息!\n");
getch();
return;
/*
* 测试
CStudent* p_move = f_studentlist->headStudent;
while (p_move->p_Next_Student) {
cout << p_move->Student_Name<<endl;
p_move = p_move->p_Next_Student;
}
*/
//}
}
/*
* 删除学生信息
*/
void Delete_StudentInfo() {
printf("请输入要删除的学生姓名或者学号:\n");
string f_info;
cin >> f_info;
//输入后开始读取文件中的信息,将信息写入链表中,并且进行比较
//StudentList* f_studentlist = CreateList(); //创建一个学生链表用来读取文件中的所有学生信息
/*
ifstream i_FileOS;
i_FileOS.open("student.data", ios::in);
if (i_FileOS.is_open()) {
while (i_FileOS.peek() != EOF) {//只要文件没有读到末尾
string f_name, f_gender, f_number, f_major, f_level;
i_FileOS >> f_name >> f_gender >> f_number >> f_major >> f_level;
//cout << f_name <<"\t" << f_gender << "\t" << f_number << "\t" << f_major << "\t" << f_level<< endl;
//创建一个节点
CStudent* f_student = Create_Student(f_name, f_gender, f_number, f_major, f_level);
f_student->p_Next_Student = NULL;
/*
f_studentlist->rearStudent = f_student;
f_studentlist->rearStudent = f_studentlist->rearStudent->p_Next_Student;
*/
//直接调用尾插法函数
/* Rear_Insert_Student(f_studentlist, f_student);
}
*/
//遍历链表,判断
CStudent* f_move = f_studentlist->headStudent;
CStudent* l_move = f_move;
if (f_move) {
while (f_move) {
if ((f_move->Student_Name == f_info) || (f_move->Student_Number == f_info)) {
//找到了学生
cout << endl;
cout << "您要删除的学生信息如下:\n"<< endl << endl;
printf("----------------------------------------------\n");
printf("姓名\t性别\t学号\t专业\t\t\t级别\n");
printf("----------------------------------------------\n");
cout << f_move->Student_Name << "\t" << f_move->Student_Gender << "\t" << f_move->Student_Number << "\t"
<< f_move->Student_Major << "\t" << f_move->Student_Level << endl;
printf("----------------------------------------------\n");
printf("确认要删除吗?\n");
printf("Y.确认\tN.否认\n");
char ch = getch();
switch (ch)
{
case 'Y':
case 'y':
//是的该节点的上一个节点指向该节点的下一个节点
//l_move->p_Next_Student = f_move->p_Next_Student;
//如果删除的是头结点
if (f_move == f_studentlist->headStudent) {
f_studentlist->headStudent = f_move->p_Next_Student; //变成新的头结点
}
if (f_move->p_Next_Student) {
l_move->p_Next_Student = f_move->p_Next_Student;
}
l_move->p_Next_Student = NULL;
delete f_move;
printf("学生信息删除成功!\n");
getch();
return;
break;
case 'N':
case 'n':
return;
break;
default:
return;
break;
}
}
l_move = f_move;
f_move = f_move->p_Next_Student;
/*
if (f_move->p_Next_Student == NULL) { //没有查找到
printf("未查找到该学生的相关信息!\n");
getch();
return;
}
*/
}
}
printf("未查找到该学生的相关信息!\n");
getch();
return;
}
/*
* 文件操作来保存学生信息
* 将链表中的每一条信息都写入文件中
*/
void Save_Student() {
ofstream o_FileOS;
o_FileOS.open("student.data", ios::out);
if (o_FileOS.is_open()) {
//CStudent* c_move = theList->headStudent;
CStudent* s_move;
s_move = f_studentlist->headStudent;
while (s_move) { //只要没写到尾部
//从表头开始写
o_FileOS <<s_move->Student_Name <<"\t"<< s_move->Student_Gender<<"\t"<<
s_move->Student_Number<<"\t"<< s_move->Student_Major<<"\t"<<
s_move->Student_Level<<endl;
s_move = s_move->p_Next_Student;
}
printf("学生信息保存成功!\n");
getch();
return;
}
printf("文件打开失败!\n");
}
/*
* 读取全部的信息
*/
void Load_Info() {
//StudentList* f_studentlist = CreateList(); //创建一个学生链表用来读取文件中的所有学生信息
ifstream i_FileOS;
ofstream o_FileOS;
i_FileOS.open("student.data", ios::in);
if (i_FileOS.is_open()) {
while (i_FileOS.peek() != EOF) {//只要文件没有读到末尾
string f_name, f_gender, f_number, f_major, f_level;
i_FileOS >> f_name >> f_gender >> f_number >> f_major >> f_level;
//cout << f_name <<"\t" << f_gender << "\t" << f_number << "\t" << f_major << "\t" << f_level<< endl;
//创建一个节点
CStudent* f_student = Create_Student(f_name, f_gender, f_number, f_major, f_level);
f_student->p_Next_Student = NULL;
/*
f_studentlist->rearStudent = f_student;
f_studentlist->rearStudent = f_studentlist->rearStudent->p_Next_Student;
*/
//直接调用尾插法函数
Rear_Insert_Student(f_studentlist, f_student);
}
return;
}
o_FileOS.open("student.data", ios::out|ios::app);
}
/*
* 打印欢迎界面的信息
*/
void Print_WelcomeInfo() {
Window_Size(WINDOW_WIDTH, WINDOW_HEIGTH);
system("cls");
printf("\t-----------------------------------------------------------------------------------\n\n");
printf("\t\t\t\t\t 学生管理系统\n\n");
printf("\t-----------------------------------------------------------------------------------\n\n");
printf("\t\t\t\t\t1.查看学生信息\n\n");
printf("\t\t\t\t\t2.查询学生信息\n\n");
printf("\t\t\t\t\t3.插入学生信息\n\n");
printf("\t\t\t\t\t4.修改学生信息\n\n");
printf("\t\t\t\t\t5.删除学生信息\n\n");
printf("\t\t\t\t\t6.保存学生信息\n\n");
printf("\t\t\t\t\t7.退出管理系统\n\n");
printf("\t-----------------------------------------------------------------------------------\n\n");
}
/*
* 系统欢迎界面
*/
void System_Welcome() {
//Print_WelcomeInfo();
while (true) {
Print_WelcomeInfo();
char ch = _getch();
switch (ch)
{
case '1':
Display_StudentInfo();
break;
case '2':
Inquire_StudentInfo();
break;
case '3':
Insert_StudentInfo();
break;
case '4':
Modify_StudentInfo();
break;
case '5':
Delete_StudentInfo();
break;
case '6':
Save_Student();
break;
case '7':
exit(0);
break;
default:
break;
}
}
}
main.cpp中
/*
项目名称:学生管理系统
项目分析:
1.需要实现学生信息的插入
2.需要实现学生信息的查看
3.需要实现学生信息的查找
4.需要实现学生信息的删除
5.需要实现学生信息的修改
6.需要实现学生信息的保存
学生的信息:姓名、性别、学号、专业、级别
*/
#include"StudentManager.h"
int main() {
Load_Info();
System_Welcome();
return 0;
}