C/C++学生管理系统

有的用的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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值