数据结构课程设计学生成绩管理系统结论_数据结构课程设计体会

数据结构课程设计学生成绩管理系统结论_数据结构课程设计体会学生成绩管理系统需求学生成绩管理系统应能实现对学生信息实现基本的增删改查,以及根据学生相关信息进行排序,并且对学生信息实现文件的读出和写入。设计思想程序结构主题架构:主函数当中先从文件当中读取学生信息,接着进入登录界面,,用户可以选择已学生身份登录或者管理员身份登录,在两种不同的角色登录成功后,都可以实现在菜单页面选择对于学生成绩信息进行不同的操作(学生身份对于成绩的操作是受限制的)。数据的持久性:在处理数据之前,要先从文件当中导入学生成绩,再进行修改,在修改完成过后,会保存信息至文件。算_数据结构学生成绩管理系统

数据结构课程设计学生成绩管理系统结论_数据结构课程设计体会"

学生成绩管理系统

需求
学生成绩管理系统应能实现对学生信息实现基本的增删改查,以及根据学生相关信息进行排序,并且对学生信息实现文件的读出和写入。
设计思想
程序结构
主题架构:主函数当中先从文件当中读取学生信息,接着进入登录界面,,用户可以选择已学生身份登录或者管理员身份登录,在两种不同的角色登录成功后,都可以实现在菜单页面选择对于学生成绩信息进行不同的操作(学生身份对于成绩的操作是受限制的)。
数据的持久性:在处理数据之前,要先从文件当中导入学生成绩,再进行修改,在修改完成过后,会保存信息至文件。
算法的实现思路:
创建链表:初始化一个空链表
登录:显示登录界面,提示用户选择
学生登录,学生菜单:显示学生登录界面,显示学生菜单
管理员登录,管理员菜单:显示管理员登录界面,显示管理员菜单
导入学生信息:接收用户输入的文件名,利用fopen打开文件,并创建一个与之相连流。若文件不存在,则以追加的方法创建一个文件。 若文件存在,则将文件内容读入并存放于链表中(后插法)。
显示学生信息:遍历链表,依次输出学生节点的各个信息
删除学生信息:可根据学生的姓名/学号进行删除,遍历链表找到需要删除的节点,然后用一个临时节点存放需要删除的节点,然后更改被删除的节点的前面一个指针的指向。
添加学生信息:前插法插入节点,可批量添加。
查询学生信息:遍历链表,根据对比学生姓名/学号来查询对应的节点,并输出该学生节点的信息,若未查到会提示用户。
查看学生总人数:输出总人数。
修改学生信息:遍历链表,根据ID来找到需要修改信息的学生(会对学号的存在性进行检测,也会对修改过后学号是否重复进行检查)再对节点的信息进行修改。
排序:用户可以选择按照学号排序/单科成绩排序。均为冒泡排序。
保存文件:将链表中的数据写入到文件中。
具体代码如下:
头文件部分

/************************链表实现学生成绩管理系统 (以文件读入形式)************************/ 
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<windows.h>
using namespace std; 

初始化定义数据

/***********************初始化定义数据******************************/ 
typedef struct{ 
   
	int id;			//学生学号 
	char name[10];	//学生姓名
	float g[3];		//用数组存储三科成绩(分别是数据结构、java、linux)
}Student;
//链表 
typedef struct Node
{ 
   
	Student data;
	struct Node *next;
}Node,*LinkList;
//链表初始化为空
LinkList L=NULL;
//创建文件指针 
FILE* fp;			//文件指针
char filename[10];	//文件名

函数声明

//函数声明
void CreateList();	//创建链表 
void Deng();		//登录 
void GDeng();		//管理员登陆 
void XDeng(); 		//学生登陆 
void Gmenu();		//管理员菜单 
void Xmenu();		//学生菜单 
void OpenFile();	//1.导入学生信息 
void PrintAll();	//2.显示学生信息 
void Delete();		//3.删除学生信息 
void Insert();		//4.添加学生信息 
void SearchMenu();	//5.查询学生信息 
void SearchName();	//5.1按名字查询 
void SearchID(); 	//5.2按学号查询 
void SearchCnt();	//5.3查看总人数 
void ModifyData() ;	//6.修改学生信息 
void Sort();		//7.排序 
void XHSort();		//7.1学号排序 
void CJSort(); 		//7.2单科成绩排序 
void sSort();		//7.2.1按数据结构成绩排序 
void jSort();		//7.2.2按java成绩排序 
void lSort(); 		//7.2.3按Linux成绩排序 
void SaveData();	//8.保存到文件中 

创建空链表

void CreateList() { 
   
	L = new Node;
	L->next = NULL;
}

主菜单函数以及登录要求

void Deng(){ 
   
	cout << endl << endl;
	cout << "\t\t\t ------------------------------\n";
	cout << "\t\t\t| 登录界面 |\n";
	cout << "\t\t\t|------------------------------|\n";
	cout << "\t\t\t| 请选择登陆方式! |\n";
	cout << "\t\t\t| |\n";
	cout << "\t\t\t| 1.学生登陆 |\n";
	cout << "\t\t\t| |\n";
	cout << "\t\t\t| 2.管理员登陆 |\n";
	cout << "\t\t\t| |\n";
	cout << "\t\t\t| 0.退出管理系统 |\n";
	cout << "\t\t\t ------------------------------\n";	
	int n;
	cout<<"\t\t\t";
	cin>>n;
	switch(n){ 
   
		case 1:
			XDeng();
			while(1){ 
   
			Xmenu();
			}
			break;
		case 2:
			GDeng();
			while(1){ 
   
			Gmenu();
			}
			break;
		case 0:
			exit(0);
			break;
	}
}
void XDeng(){ 
   
	char name[10];
	int id;
	int n=0;
	LinkList q = L->next;
	cout<<"\t\t\t请输入姓名和学号:"<<endl; 
	cout<<"\t\t\t姓名:";
	cin>>name;
	cout<<"\t\t\t学号:"; 
	cin>>id;
	while (q != NULL) { 
   
		if (strcmp(name, q->data.name) == 0) { 
   	    //名字相同
			if(n==0)
				cout << "\t\t\t登陆成功!" << endl;
			n++;
		}
		q = q->next;
	}
	if (n == 0){ 
   
		cout << "\t\t\t姓名或学号错误\n";
		XDeng();
}
	system("cls"); 
}
void GDeng(){ 
   
	string x;
	int y; 
	cout<<"\t\t\t请输入用户名和密码:"<<endl; 
	cout<<"\t\t\t用户名:";
	cin>>x;
	cout<<"\t\t\t密码:"; 
	cin>>y;
	if(x=="author"&&y==12345){ 
   
		cout<<"\t\t\t登陆成功!";
	}
	else{ 
   
		cout<<"\t\t\t用户名或密码有错"<<endl;
		GDeng();
	}
	system("cls");
}

管理员菜单

void Gmenu() { 
   
	cout << endl << endl;
	cout << "\t\t\t ------------------------------\n";
	cout << "\t\t\t| 学生成绩管理(G) |\n";
	cout << "\t\t\t|------------------------------|\n";
	cout << "\t\t\t| 1.显示学生信息 |\n";
	cout << "\t\t\t| 2.删除学生信息 |\n";
	cout << "\t\t\t| 3.增加学生信息 |\n";
	cout << "\t\t\t| 4.查询学生信息 |\n";
	cout << "\t\t\t| 5.修改学生信息 |\n";
	cout << "\t\t\t| 6.排序学生信息 |\n";
	cout << "\t\t\t| 7.保存学生信息 |\n";
	cout << "\t\t\t| 0.退出登录 |\n";
	cout << "\t\t\t ------------------------------\n";
	cout<<"\t\t\t请输入你的选择:";
	int choise;
	cin>>choise; 
	system("cls");
	switch(choise)
	{ 
   
		case 1:
			PrintAll();
			break;
		case 2:
			Delete();
			break;
		case 3:
			Insert();
			break;
		case 4:
			SearchMenu();
			break;
		case 5:
			ModifyData();
			break;
		case 6:
			Sort();
			break;
		case 7:
			SaveData();
			break;
		case 0:
			Deng();
			break;	
	}
}

学生菜单

void Xmenu() { 
   
	cout << endl << endl;
	cout << "\t\t\t ------------------------------\n";
	cout << "\t\t\t| 学生成绩管理(X) |\n";
	cout << "\t\t\t|------------------------------|\n";
	cout << "\t\t\t| 1.显示学生信息 |\n";
	cout << "\t\t\t| 2.查询学生信息 |\n";
	cout << "\t\t\t| 0.退出登录 |\n";
	cout << "\t\t\t ------------------------------\n";
	int a;
	cout<<"\t\t\t请输入你的选择:";
	cin>>a; 
	system("cls");
	switch(a)
	{ 
   
		case 1:
			PrintAll();
			break;
		case 2:
			SearchMenu();
			break;
		case 0:
			Deng();
			break;	
	}
}

文件导入学生信息

void OpenFile() { 
   
	CreateList();			//先初始化链表
	Node * p, *q;			//p是创建的新的结点
	q = L;					//q是指向头结点的指针,用于创建链表
	while (true) { 
   
		cout << "\n\n\t\t\t请输入文件名:";
		cin >> filename;
		if ((fp = fopen(filename, "r")) == NULL) { 
   				//没有该文件
			cout << "\t\t\t没有该文件信息,是否创建(y/n):";
			char ch; cin >> ch;
			if (ch == 'Y' || ch == 'y') { 
   											
				if ((fp = fopen(filename, "a+")) == NULL) { 
   		//创建文件失败
					cout << "\t\t\t创建失败!" << endl;
				}
				else break;
			}
			else continue;
		}
		else break;
	}
	while (true) { 
   
		p = new Node;				//为新创建的结点p分配空间
		if (fscanf(fp, "%d\t%s\t%f\t%f\t%f\n" , &p->data.id, p->data.name ,&(p->data.g[0]),&(p->data.g[1]),&(p->data.g[2])) == EOF){ 
   	//从文件读入信息
			free(p);									//没有读出来,需要释放掉该结点空间
			cout << "\t\t\t读入成功!";
			system("pause");
			break;
		}
		//尾插法创建链表:新创建的结点p指针域置为空,将头结点指向p ,q向右移一位
		p->next = NULL;
		q->next = p;
		q = q->next;
	}
	fclose(fp);											//关闭文件
	system("cls");
}

显示学生信息

void PrintAll() { 
   
	system("cls");
	cout << "\n\n\t\t\t-----已显示学生信息----\n";
	LinkList p;
	p = L->next;								//p指向第一个有数据的结点
	cout << "\t\t\t学号\t姓名\t数构\tjava\tlinux\n";
	if (p == NULL) { 
   
		cout << "\t\t\t没有数据!";
		return;
	}
	while (p!=NULL) { 
   
		printf("\t\t\t%d\t%s\t%.2f\t%.2f\t%.2f\n", p->data.id, p->data.name,p->data.g[0], p->data.g[1], p->data.g[2]);
		p = p->next;
	}
	cout << "\t\t\t-----------------------\n";
	cout << "\t\t\t";
	system("pause");
	system("cls"); 
}

删除学生信息

void Delete() { 
   
	cout << "\n\n\t\t\t删除学生信息"; 
	cout << "\n\n\t\t\t1.按照姓名删除" << endl;
	string Name;
	cout << "\n\n\t\t\t2.按照学号删除" << endl;
	double ID;
	int flag;
	cout<<"\n\n\t\t\t请输入你的选择:"; 
	cin >> flag;
	if (flag == 1) { 
   
		cout << "\n\t\t\t请输入你需要删除的学生的姓名:" ;
		cin >> Name;
		LinkList p = L;
		while(p->next->data.name != Name) { 
   
			p = p->next;
		} 
		LinkList q = p->next;
		p->next = q->next;
		delete q;
		cout<<"\n\t\t\t删除成功!";
	}
		
	else if (flag == 2) { 
   
		cout << "\n\t\t\t请输入你需要删除的学生的学号:" ;
		cin >> ID;
		LinkList p = L;
		while (p->next->data.id != ID) { 
   
			p = p->next;
		}
		LinkList q = p->next;
		p->next = q->next;
		delete q;
		cout<<"\n\t\t\t删除成功!";
	}
	else { 
   
		cout << "\n\t\t\terror!" << endl;
	}
	system("pause");
	system("cls");
}

添加学生信息

void Insert() { 
   
	cout << "\n\n\t\t\t请输入你需要添加的学生个数:";
	int n;
	cin >> n;
	if(n>0){ 
   
	for (int i = 0; i < n; i++) { 
   
		LinkList p = new Node;
		cout << "\n\t\t\t请输入第" << i + 1 << "个学生的姓名;学号;数据结构成绩;java成绩;linux成绩:" << endl;
		cout << "\t\t\t";
		cin >> p->data.name >> p->data.id >> p->data.g[0] >> p->data.g[1] >> p->data.g[2];
		p->next = L->next; L->next = p;
		cout<<"\n\t\t\t添加成功!"; 
	}
}else { 
   
		cout << "error" << endl;
	}
	system("pause");
	system("cls");
}

查询学生信息

void SearchMenu() { 
   
	int choise=-1;
	while (choise!=4) { 
   
		system("cls");
		cout << endl << endl;
		cout << "\t\t\t ------------------------- \n";
		cout << "\t\t\t| 查询学生信息 |\n";
		cout << "\t\t\t|-------------------------|\n";
		cout << "\t\t\t| 1.按姓名查找 |\n";
		cout << "\t\t\t| 2.按学号查找 |\n";
		cout << "\t\t\t| 3.查看总人数 |\n";
		cout << "\t\t\t| 4.返回主菜单 |\n";
		cout << "\t\t\t -------------------------\n";
		cout << "\t\t\t请选择:";
		cin >> choise;
		switch (choise)
		{ 
   
			case 1:
				SearchName();			
				break;
			case 2:
				SearchID();
				break;
			case 3:
				SearchCnt();
			default:
				break;
		}
	}
	
}
void SearchName() { 
   
	system("cls");
	cout << endl << endl;
	cout << "\t\t\t-------正在查询学生信息----- \n";
	cout << "\t\t\t请输入要查找的姓名:";
	char name[10]; cin >> name;
	LinkList q = L->next;				            // q是指向第一个元素的指针
	int n = 0;
	while (q != NULL) { 
   
		if (strcmp(name, q->data.name) == 0) { 
   	    //名字相同
			if(n==0)
				cout << "\t\t\t学号\t姓名\t数构\tjava\tlinux" << endl;
			printf("\t\t\t%d\t%s\t%.2f\t%.2f\t%.2f\n", q->data.id, q->data.name, q->data.g[0],q->data.g[1],q->data.g[2]);
			n++;
		}
		q = q->next;
	}
	cout << "\t\t\t----------------------------\n";
	if (n == 0)
		cout << "\t\t\t查无此人,\n";
	cout << "\t\t\t";
	system("pause");
}
void SearchID() { 
   
	system("cls");
	cout << endl << endl;
	cout << "\t\t\t-------正在查询学生信息----- \n";
	cout << "\t\t\t请输入学号:";
	int id; cin >> id;
	LinkList q = L->next;
	while (q != NULL) { 
   
		if (q->data.id == id) { 
   
			cout << "\t\t\t学号\t姓名\t数构\tjava\tlinux" << endl;
			printf("\t\t\t%d\t%s\t%.2f\t%.2f\t%.2f\n", q->data.id, q->data.name,  q->data.g[0],q->data.g[1],q->data.g[2]);
			cout << "\t\t\t----------------------------\n";
			cout << "\t\t\t";
			system("pause");
			return;
		}
		q = q->next;
	}
	cout << "\t\t\t----------------------------\n";
	cout << "\t\t\t查无此人,";
	system("pause");
}
void SearchCnt() { 
   
	system("cls");
	cout << endl << endl;
	cout << "\t\t\t-------正在查询学生信息----- \n";
	cout << "\n\t\t\t总人数为:";
	int cnt = 0;
	LinkList q = L->next;
	while (q != NULL) { 
   
		if(q!=NULL) cnt++;
		q = q->next;
	}
	cout << cnt << endl;
	cout << "\t\t\t----------------------------\n";
	cout << "\t\t\t";
	system("pause");
	system("cls");
}

修改学生信息

void ModifyData() { 
   
	system("cls");
	cout << endl << endl;
	cout << "\t\t\t-------正在修改学生信息----- \n";
	cout << "\t\t\t请输入需要修改学生的学号:";
	int id,n=0 ; cin >> id;
	LinkList q = L ;
	while (q != NULL) { 
   							//判断学号是否存在
		q = q->next;
		if (q->data.id == id) { 
   
			break;
		}	
		if (q->next == NULL) { 
   
			cout << "\t\t\t学号不存在,请重新输入:";
			cin >> id;
			q = L->next;
			continue;
		}
	}
	LinkList pnew = new Node;
	pnew->next = NULL;
	cout << "\t\t\t请输入修改后的学号:";	
	cin >> pnew->data.id;
	LinkList p = L->next;
	while (p != NULL) { 
   							//判断学号是否重复
		if (pnew->data.id == p->data.id) { 
   
			cout << "\t\t\t学号重复,请重新输入:";
			cin >> pnew->data.id;
			p = L->next;
			continue;
		}
		else p = p->next;
	}

	cout << "\t\t\t请输入修改后的姓名:";
	cin >> pnew->data.name;
	cout << "\t\t\t请输入修改后的三科成绩:";
	cin >> pnew->data.g[0];
	cin >> pnew->data.g[1];
	cin >> pnew->data.g[2]; 
	q->data.id=pnew->data.id;
	strcpy(q->data.name,pnew->data.name);
	q->data.g[0] = pnew->data.g[0];
	q->data.g[1] = pnew->data.g[1];
	q->data.g[2] = pnew->data.g[2];
	free(pnew);
	cout << "\t\t\t----------------------------\n";
	cout << "\t\t\t修改成功,";
	system("pause");
	system("cls");
}

排序

/**********************7.排序**********************/ 
void Sort() { 
   
	int n; 
	system("cls");
	cout<<"\n\t\t\t请选择排序方式"<<endl;
	cout<<"\t\t\t1.按学号排序\n"<<endl;
	cout<<"\t\t\t2.按成绩排序\n"<<endl;
	cout<<"\t\t\t";
	cin>>n;
	switch(n){ 
   
		case 1:
			XHSort();
			break;
		case 2:
			CJSort();
			break;
	}
}
/**********************7.1学号排序**********************/ 
void XHSort(){ 
   
	system("cls");
	cout << endl << endl;
	cout << "\t\t\t-------正在按学号进行排序----- \n";
	LinkList q = L->next;
	int len = 0;
	while (q != NULL) { 
   						//获取链表长度
		len++;
		q = q->next;
	}

	Node* p1, *p2;
	for (int i = 0; i < len; i++) { 
   			//冒泡排序
		q = L->next;
		for (int j = 0; j < len - i - 1; j++) { 
   
			p1 = q;
			p2 = q->next;
			if (p1->data.id> p2->data.id) { 
   
				Student temp = p1->data;
				p1->data = p2->data;
				p2->data = temp;
			}
			q = q->next;
		}
	}
	cout << "\t\t\t排序完成 " ;
	system("pause");
	system("cls"); 
}
/**********************7.2单科成绩排序**********************/ 
void CJSort(){ 
   
	int n;
	system("cls");
	cout<<"\n\t\t\t请选择成绩排序方式"<<endl;
	cout<<"\t\t\t1.按数据结构成绩排序\n"<<endl;
	cout<<"\t\t\t2.按Java成绩排序\n"<<endl;
	cout<<"\t\t\t3.按Linux成绩排序\n"<<endl;
	cout<<"\t\t\t输入你的选择:";
	cin>>n;
	switch(n){ 
   
		case 1:
			sSort();
			break;
		case 2:
			jSort();
			break;
		case 3:
			lSort();
			break;
		default:
			break;
			}
}
void sSort(){ 
   
	cout << endl << endl;
			cout << "\t\t\t-------正在按数据结构成绩进行排序----- \n";
			LinkList q = L->next;
			int len = 0;
			while (q != NULL) { 
   						//获取链表长度
				len++;
				q = q->next;
			}
			Node* p1, *p2;
			for (int i = 0; i < len; i++) { 
   	
				q = L->next;
				for (int j = 0; j < len - i - 1 ; j++) { 
   
					p1 = q;
					p2 = q->next;
					if (p1->data.g[0] < p2->data.g[0]) { 
   
						Student temp = p1->data;
						p1->data = p2->data;
						p2->data = temp;
					}
					q = q->next;
				}
			}
			cout << "\n\t\t\t排序完成 " ;
			system("pause");
			system("cls");
}
void jSort(){ 
   
	cout << endl << endl;
			cout << "\t\t\t-------正在按Java成绩进行排序----- \n";
			LinkList q = L->next;
			int len = 0;
			while (q != NULL) { 
   						//获取链表长度
				len++;
				q = q->next;
			}
			Node* p1, *p2;
			for (int i = 0; i < len; i++) { 
   	
				q = L->next;
				for (int j = 0; j < len - i - 1 ; j++) { 
   
					p1 = q;
					p2 = q->next;
					if (p1->data.g[1] < p2->data.g[1]) { 
   
						Student temp = p1->data;
						p1->data = p2->data;
						p2->data = temp;
					}
					q = q->next;
				}
			}
			cout << "\n\t\t\t排序完成 " ;
			system("pause");
			system("cls");
}
void lSort(){ 
   
	cout << endl << endl;
			cout << "\t\t\t-------正在按Linux成绩进行排序----- \n";
			LinkList q = L->next;
			int len = 0;
			while (q != NULL) { 
   						//获取链表长度
				len++;
				q = q->next;
			}
			Node* p1, *p2;
			for (int i = 0; i < len; i++) { 
   	
				q = L->next;
				for (int j = 0; j < len - i - 1 ; j++) { 
   
					p1 = q;
					p2 = q->next;
					if (p1->data.g[2] < p2->data.g[2]) { 
   
						Student temp = p1->data;
						p1->data = p2->data;
						p2->data = temp;
					}
					q = q->next;
				}
			}
			cout << "\n\t\t\t排序完成 " ;
			system("pause");
			system("cls");
}

保存到文件中

void SaveData() { 
   
	LinkList q = L->next;
	if ( (fp = fopen(filename, "w")) == NULL) { 
   
		cout << "\t\t\t打开文件失败,";
		system("pause");
		return;
	}
	else { 
   
		while (q != NULL) { 
   
			fprintf(fp, "%d\t%s\t%.2f\t%.2f\t%.2f\n", q->data.id, q->data.name, q->data.g[0], q->data.g[1], q->data.g[2]);
			q = q->next;
		}
	}
	fclose(fp);
	cout << "\n\n\t\t\t保存成功!";
	system("pause");
	system("cls");
}

主函数

int main() { 
   
	system("color 7D");
	OpenFile();
	Deng();
	return 0; 
}

2023/6/14更新
我看很多人在评论区和私聊问一些问题,在这里写个总结

第一:导入文件名:XX.txt,只要是txt就能导入成功
文件里面形式是学号 姓名 成绩1 成绩2 成绩3,中间空格相隔开就行
第二:运行工具是dev c++ ,这是c++代码,其他c++工具需要修改bug
第三:代码写于2022/1/4,应该不存在过时之类的代码报错问题
第四:很多人出现了bug,澄清一下,今天抽空将上面代码进行了运行操作,管理员管理和学生管理都进行了测试,没有任何问题
第五:提醒:文件编码形式需要改动,不然就是繁体字
第六,目前本人就读于Java方向,所以本次更新并没有更新代码,代码在刚刚接触c++时所写的课程设计,很多地方不足,望谅解
第六:关注我,不迷路,最近一年挺忙的,空下来后每日分享基本知识,带你过Java

今天的文章数据结构课程设计学生成绩管理系统结论_数据结构课程设计体会分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/59014.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注