⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 源程序_j05503.cpp

📁 一个数据结构的课程设计文件,VC++编写.内容为:学生信息管理系统
💻 CPP
字号:
#include <iostream.h>  // cin 及 cout
#include <stdlib.h>	   
#include <malloc.h>       // 用到申请内存函数 malloc() 和释放内存函数 free()
#include <string.h>		  // 字符串处理
#include <stdio.h>		  // 文件操作(读文件)
struct address				   /*家庭地址*/
{ 
		char city[10];		   /*城市*/
		char town[10];	   	   /*县城*/
		char village[10];	   /*乡镇*/
};
struct telephone				   /*联系方式*/
{
		char SJ[50];			   /*手机*/
};
struct person					/*个人信息*/
{  
		char name[20];          /*名字*/  
};	
struct score						//成绩
{
		char num[20];				//学号
		char grade[20];              //成绩
};
typedef struct linknode			//定义节点的类型
{
		char address[100];		//地址
		struct score sc;		//成绩
		struct person pe;		//个人信息
		struct telephone te;	//联系方式
		bool flag;
		struct linknode* next;
}nodetype;
class List
{
	nodetype* head;
public:
	List();
	List::~List();
	linknode* creatlist(int);				//创建链表
	int listlen();							//返回链表长度
	nodetype* findnode(int);				//通过查找序号返回节点的指针
	nodetype* find(char c[]);				//通过查找姓名返回节点的指针
	int find2(char c[]);					//通过查找姓名返回节点的序号
	nodetype* insnode(int);					//插入节点
	void delnode(int);						//删除节点
	nodetype* load();						//初始化:从外部读入数据
	void readstr(FILE *f,char *string);		//读行函数
	bool check(char *a, char *b);			//对比两个字符串是否相等
	void help();							//显示帮助菜单
	void editperson(nodetype*);				//编辑个人说明
	void editscore(nodetype*);				//编辑学科成绩
	void edittelephone(nodetype*);			//编辑联系方式
	void dispname();						//显示所有学生姓名
	void dispnode(nodetype* p);				//显示一个学生的所有信息
	void dispperson(nodetype*);				//显示一个学生的个人说明
	void dispscore(nodetype*);				//显示一个学生的学科成绩
	void disptelephone(nodetype*);			//显示一个学生的联系方式
};
bool List::check(char *a, char *b)		//对比两个字符串是否相等
{
	int i;
	int j=strlen(b);
	for(i=0; i<j; i++)
	{
		if(*a==*b)
		{
			a++;
			b++;
		}
		else
			return 0;
	}
	return 1;
}
nodetype* List::creatlist (int n)       //创建链表
{
	nodetype *h=NULL, *s, *t;
	int i=1;
	for(int j=0; j<n; j++)
	{
		if(i==1)            //创建第一个节点
		{
			h=(nodetype*)malloc(sizeof(nodetype));
			h->next=NULL;
			t=h;
		}
		else                 //创建其余节点
		{
			s=(nodetype*)malloc(sizeof(nodetype));
			s->next=NULL;
			t->next=s;
			t=s;            //t 始终指向生成的单链表的最后一个节点
		}
		i++;
	}
	head=h;
	return h;
}
void List::readstr(FILE *f,char *string)
{	
	do
	{
						   //①: 先读入一行文本
		fgets(string, 255, f);  //fgets(): 从文件 f 读入长度为 255-1 的字符串
						   //		  并存入到 string 中
	} while ((string[0] == '/') || (string[0] == '\n'));
	return;
}
nodetype* List::load()
{
	FILE *fp;
	nodetype *p;
	char c[255];
	int num;
	if((fp=fopen("student.txt", "r"))==NULL)
	{
		cout<<"打开文件失败"<<endl;
		return 0;
	}
	readstr(fp, c);
	sscanf(c, "The Length Of Link: %d", &num);		//获取链表长度
	p=creatlist(num);								//创建链表
	for(int i=0; i<num; i++)
	{
		readstr(fp, c);
		strcpy(p->address, c);
		readstr(fp, c);
		strcpy(p->sc.num, c);
		readstr(fp, c);
		strcpy(p->sc.grade, c);
		readstr(fp, c);
		strcpy(p->pe.name, c);
		readstr(fp, c);
		strcpy(p->te.SJ, c);
		p=p->next;
	}
	fclose(fp);
	return p;
}
void List::dispnode(nodetype* p)		//显示一个学生的所有信息
{
	if(p!=NULL)
	{
		dispperson(p);
		dispscore(p);
		disptelephone(p);
	}
}
void List::dispname()		//显示所有学生姓名
{
	nodetype* p=head;
	cout<<"现有的学生:  "<<endl;
	if(p==NULL)
		cout<<"没有任何学生数据"<<endl;
	while(p!=NULL)
	{
		cout<<"姓名:	"<<p->pe.name;
		p=p->next;
	}
}
int List::listlen()       //返回链表长度
{
	int i=0;
	nodetype* p=head;
	while(p!=NULL)
	{
		p=p->next;
		i++;
	}
	return i;
}
nodetype* List::findnode (int i)      //通过查找序号返回节点的指针
{
	nodetype* p=head;
	int j=1;
	if( i>listlen()||i<=0 )          // i 上溢或下溢
		return NULL;
	else
	{
		while( p!=NULL &&  j<i )    //查找第 i 个节点并由 p 指向该节点
		{
			j++;
			p=p->next;
		}
		return p;
	}
}
nodetype* List::find(char c[])      //通过查找姓名返回节点的指针
{
	nodetype* p=head;
	int j=1;
	strcat(c, "\n");				//从外部读入的字符串末尾都带了一个换行符
	while( p!=NULL &&  !(check(c, p->pe.name)))    //查找第 i 个节点并由 p 指向该节点	
	{	
		j++;	
		p=p->next;
	}
	return p;
}
int List::find2(char c[])      //通过查找姓名返回节点的序号
{
	nodetype* p=head;
	int j=1;
	strcat(c, "\n");				//从外部读入的字符串末尾都带了一个换行符
	while( p!=NULL &&  !(check(c, p->pe.name)))    //查找第 i 个节点并由 p 指向该节点	
	{	
		j++;
		p=p->next;
	}
	return j;
}
nodetype* List::insnode(int i)
{
	nodetype *h=head, *p, *s;
	s=(nodetype*)malloc(sizeof(nodetype));    //创建节点 s
	s->next=NULL;
	if(i==0)           //i=0 时 s 作为该单链表的第一个节点
	{
		s->next = h;
		h=s;           //重新定义头节点
	}
	else
	{
		p=findnode(i);       //查找第 i 个节点,并由 p 指向该节点
		if(p!=NULL)
		{
			s->next=p->next;
			p->next=s;
		}
		else cout<<"输入的 i 值不正确"<<endl;
	}
	head=h;
	return s;
}
void List::delnode(int i)			//删除第 i 个节点
{
	nodetype *h=head, *p=head, *s;
	int j=1;
	if(i==1)       //删除第一个节点
	{
		h=h->next;
		free(p);
	}
	else
	{
		p=findnode(i-1);     //查找第 i-1 个节点,并由 p 指向这个节点
		if(p!=NULL && p->next!=NULL)
		{
			s=p->next;      // s 指向要删除的节点
			p->next=s->next;
			free(s);
		}
		else
			cout<<"输入的 i 值不正确"<<endl;
	}
	head=h;
}
void List::editperson(nodetype* p)
{
	char c[100];
	cout<<"请输入姓名: "<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->pe.name, c);
	cout<<"请输入家庭住址"<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->address, c);
	cout<<"编辑个人信息完成!"<<endl;
	dispperson(p);
}

void List::editscore(nodetype* p)
{
	char a[50];
	cout<<"请输入学号: "<<endl;
	cin>>a;
	strcat(a, "\n");
	strcpy(p->sc.num, a);
	cout<<"请输入学生成绩: "<<endl;
	cin>>a;
	strcat(a, "\n");
	strcpy(p->sc.grade, a);
	cout<<"编辑学科成绩完成!"<<endl;
	dispscore(p);
}
void List::edittelephone(nodetype* p)
{
	char c[50];
	cout<<"请输入手机号码: "<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->te.SJ, c);
	cout<<"编辑联系方式完成!"<<endl;
	disptelephone(p);
}
void List::dispperson(nodetype* p)
{
	cout<<"姓名:		"<<p->pe.name;
	cout<<"家庭住址:	"<<p->address;
}
void List::dispscore(nodetype* p)
{
	cout<<"学号:		"<<p->sc.num;
	cout<<"学生成绩:	"<<p->sc.grade;
}
void List::disptelephone(nodetype* p)
{
	cout<<"手机号码是:	"<<p->te.SJ<<endl;
}
void List::help()
{
	cout<<endl<<endl;
	cout<<"*********************************************************"<<endl;
	cout<<"1:			编辑个人信息"<<endl;
	cout<<"2:			编辑学科成绩"<<endl;
	cout<<"3:			编辑联系方式"<<endl;
	cout<<"4:			显示个人信息"<<endl;
	cout<<"5:			显示学科成绩"<<endl;
	cout<<"6:			显示联系方式"<<endl;
	cout<<"7:			显示该学生所有信息"<<endl;
	cout<<"8:			帮助菜单"<<endl;
	cout<<"9:			返回上一级菜单"<<endl;
	cout<<"*********************************************************"<<endl;
}
List::~List()
{
	nodetype *pa=head, *pb;
	if(pa!=NULL)
	{
		pb=pa->next;
		if(pb==NULL)
			free(pa);
		else
		{
			while(pb!=NULL)
			{
				free(pa);
				pa=pb;
				pb=pb->next;
			}
			free(pa);
		}
	}
}
class Operater
{
	List L1;
public:				
	void Loop();							//主循环			
	void display();							//显示菜单	
};
List::List()
{
	head = NULL;
}
void Operater::display()
{
   cout<<endl<<endl;
   cout<<" Welcom  to ★=========☆=========★=========☆=======★\n";
          cout<<"  ******************************\n";
          cout<<"  *    ┏━━━━━━━━┓    *\n";
          cout<<"  *★★┃学生成绩管理系统┃★★*\n";
          cout<<"  *    ┗━━━━━━━━┛    *\n";
          cout<<"  * ☆ 版主:计055班 陈平  ☆  *\n";
	      cout<<"  *                            *\n";
          cout<<"  ******************************\n";
    cout<<"┏━━━━━━━━━━━━━━━━━━━━┓\n";      
    cout<<"§1. 添加一个学生信息                    §\n";
    cout<<"§2. 删除一个学生信息                    §\n";
    cout<<"§3. 显示所有学生的姓名                  §\n";
    cout<<"§4. 根据姓名显示单个学生所有信息        §\n";
    cout<<"§5. 根据姓名对单个学生进行编辑          §\n";
    cout<<"§6. 帮助菜单                            §\n";
    cout<<"§7. 保存数据                            §\n";
    cout<<"§8. 退出系统                            §\n";
   cout<<" ┗━━━━━━━━━━━━━━━━━━━━┛\n";
   
}
void Operater::Loop()
{
	List L1;        //List 对象
	char ch[20];
	nodetype *p, *head;   
	int i;		    //存放节点序号
	p=L1.load();	//初始化:从外部读入数据创建链表
	head=p;
	display();
	while(1)
	{
		cout<<endl<<endl;
		cout<<"请输入选择(帮助选项--> 6 ): "<<endl;
		cin>>ch;
		////system("cls");
		if(L1.check(ch, "1"))
		{
			p=L1.insnode(0);
			head=p;
			//system("cls");
			cout<<endl;
			cout<<"************** 添加一个学生信息 ******************"<<endl;
			cout<<"下面输入个人信息: "<<endl;
			L1.editperson(p);
			cout<<"下面输入学科成绩: "<<endl;
			L1.editscore(p);
			cout<<"下面输入联系方式: "<<endl;
			L1.edittelephone(p);
		}
		if(L1.check(ch, "2"))
		{
			//system("cls");
			cout<<endl;
			cout<<"************** 删除一个学生信息 ******************"<<endl;
			L1.dispname();
			cout<<"请输入学生姓名: "<<endl;
			cin>>ch;
			i=L1.find2(ch);
			L1.delnode(i);
                        cout<<"删除学生信息成功!"<<endl;
		}
		if(L1.check(ch, "3"))
		{
			//system("cls");
			cout<<endl;
			cout<<"************** 显示所有学生姓名 ******************"<<endl;
			L1.dispname();
		}
		if(L1.check(ch, "4"))
		{
			//system("cls");
			cout<<endl;
			cout<<"************** 根据姓名显示单个学生所有信息 ******************"<<endl;
			L1.dispname();
			cout<<"请输入学生姓名: "<<endl;
			cin>>ch;
			p=L1.find(ch);
			L1.dispnode(p);
		}
		if(L1.check(ch, "6"))
		{
			display();
		}
		if(L1.check(ch, "7"))		//保存数据
		{
			FILE *fp;
			if((fp=fopen("student.txt", "w"))==NULL)
			{
				cout<<"打开文件失败"<<endl;
				return;
			}
			int i;
			char t[255];
			//将 L1.listlen() 赋予字符串中的数字
			sprintf(t, "The Length Of Link: %d\n", L1.listlen());	
			fputs(t, fp);
			strcpy(t, "\n");
			fputs(t, fp);
			p=L1.findnode(1);				//将链表头指针赋予 p
			for(i=0; i<L1.listlen(); i++)
			{
				fputs(p->address, fp);		//输出地址
				fputs(p->sc.num, fp);		//输出学号
				fputs(p->sc.grade, fp);	        //输出成绩
				fputs(p->pe.name, fp);		//输出姓名
				fputs(p->te.SJ, fp);		//输出手机
				fputs(t, fp);
				p=p->next;
                                cout<<"保存数据成功!"<<endl;
			}
			p=head;
			fclose(fp);
		}
		if(L1.check(ch, "5"))
		{
			char c[20];
			//system("cls");
			cout<<endl;
			cout<<"************** 根据姓名对单个学生进行编辑 ******************"<<endl;
			L1.dispname();
			cout<<"请输入学生姓名: "<<endl;
			cin>>c;
			p=L1.find(c);
			//system("cls");
			cout<<endl<<endl;
			cout<<"*********************************************************"<<endl;
			cout<<"1:			编辑个人信息"<<endl;
			cout<<"2:			编辑学科成绩"<<endl;
			cout<<"3:			编辑联系方式"<<endl;
			cout<<"4:			显示个人信息"<<endl;
			cout<<"5:			显示学科成绩"<<endl;
			cout<<"6:			显示联系方式"<<endl;
			cout<<"7:			显示该学生所有信息"<<endl;
			cout<<"8:			帮助菜单"<<endl;
			cout<<"9:			返回上一级菜单"<<endl;
			cout<<"*********************************************************"<<endl;
			while(1)
			{
				cout<<endl<<endl;
				cout<<"请输入选择(帮助选项--> 8 ): "<<endl;
				cin>>c;
				//system("cls");
				if(L1.check(c, "1"))
				{
					//system("cls");
					cout<<endl;
					cout<<"************** 编辑个人信息 ******************"<<endl;
					L1.editperson(p);
				}
				else if(L1.check(c, "2"))
				{
					//system("cls");
					cout<<endl;
					cout<<"************** 编辑学科成绩 ******************"<<endl;
					L1.editscore(p);
				}
				else if(L1.check(c, "3"))
				{
					//system("cls");
					cout<<endl;
					cout<<"************** 编辑联系方式 ******************"<<endl;
					L1.edittelephone(p);
				}
				else if(L1.check(c, "4"))
				{
					//system("cls");
					cout<<endl;
					cout<<"************** 显示个人信息 ******************"<<endl;
					L1.dispperson(p);
		     	}
				else if(L1.check(c, "5"))
				{
					//system("cls");
					cout<<endl;
					cout<<"************** 显示学科成绩 ******************"<<endl;
					L1.dispscore(p);
				}
				else if(L1.check(c, "6"))
				{
					//system("cls");
					cout<<endl;
					cout<<"************** 显示联系方式 ******************"<<endl;
					L1.disptelephone(p);
				}
				else if(L1.check(c, "7"))
				{
					//system("cls");
					L1.dispnode(p);
				}
				else if(L1.check(c, "8"))
				{
					//system("cls");
					L1.help();
				}
				else if(L1.check(c, "9"))
				{
					display();
					break;	//用 break 跳出本循环,不要用 return ,return 是退出程序
				}
			}
		}
		else if(L1.check(ch, "8"))
			return;
	}
	return;
}
int main()
{
	system("color   0A");     //改变运行时界面的颜色
	Operater chp;
	chp.Loop();
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -