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

📄 stu_manager.cpp

📁 基于控制台的学生个人成绩管理系统
💻 CPP
字号:
//stu_manager.cpp
#include "stu_manager.h"
#include <iostream.h>
#include <string.h>

List::List()
{
	head = NULL;
}

nodetype * List::creatlist (int n)       //创建链表,n为列表数
{
	nodetype * h=NULL, *s, *t;
	int i=1;

	for(int j=0; j<n; j++)
	{
		if(i==1)            //创建第一个节点
		{
			h=new nodetype;
			h->next=NULL;
			t=h;
		}
		else                 //创建其余节点
		{
			s=new nodetype;
			s->next=NULL;
			t->next=s;
			t=s;            //t 始终指向生成的单链表的最后一个节点
		}

		i++;
	}

	head=h;
	return h;
}
int List::listlen()                    //返回链表长度,以1,2,3,4……记
{nodetype * p=head;
 int i;
 for(i=1;p->next!=NULL;i++)p=p->next; 
 return i;
}

nodetype * List::findnode (int i)      //通过查找序号返回节点的指针
{
	nodetype * p=head;
	int j=1;                          //j用来计数,从第1个开始
	if( i>listlen()||i<=0 )          // i的值不在查询范围内
		return NULL;
	else
	{
		while( j<i && p->next!=NULL  )    //查找第 i 个节点并由 p 指向该节点
		{
			j++;
			p=p->next;
		}
		if(j<=i)return p;         //确定跳出循环的原因是找到了i,而非是循环到了链表末被迫结束
		else {cout<<"无此号!";return NULL;}
	}
}

nodetype* List::findname1(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::findname2(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=new nodetype;    //创建节点 s
	s->next=NULL;
	if(i==0)           //i=0 时 s 作为第一个节点
	{
		s->next = h;
		h=s;           	}
	else
	{
		p=findnode(i);       //查找第 i 个节点,并由 s 指向该节点,是向后插(即插在原来i与i+1之间)
		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;
	if(i==1)       //删除第一个节点
	{
		h=h->next;
		cout<<endl<<p->pe.name<<"....."<<"已被成功删除!"<<endl;
		delete p;
		
	}
	else
	{
		p=findnode(i-1);     //查找第 i-1 个节点,并由 p 指向这个节点
		if(p!=NULL/*要找的到节点*/ && p->next!=NULL/*这个i-1的节点不能是最后一个*/)
		{
			s=p->next;      // s 指向要删除的节点
			p->next=s->next;
			cout<<endl<<s->pe.name<<"....."<<"已被成功删除!"<<endl;
			delete s;
		}
		else
			cout<<"输入的 i 值不正确"<<endl;
	}
	head=h;
}

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::load()///////从外面stu_info.txt中载入数据
{
	FILE *fp;
	nodetype *p;
	char c[200];////用来暂时存放从文件中读来的数据
	int num;
	if((fp=fopen("stu_info.txt", "a+"))==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);////从fp所指的文件中读取一字符串给c
		strcpy(p->address, c);////把c再复制给address
		readstr(fp, c);
		strcpy(p->birthday, c);

		readstr(fp, c);
		strcpy(p->sc.num, c);
		readstr(fp, c);
		strcpy(p->sc.chinese, c);
		readstr(fp, c);
		strcpy(p->sc.english, c);
		readstr(fp, c);
		strcpy(p->sc.math, c);
		readstr(fp, c);
		strcpy(p->sc.physics, c);

		readstr(fp, c);
		strcpy(p->pe.name, c);
		readstr(fp, c);
		strcpy(p->pe.sex, c);
		readstr(fp, c);
		strcpy(p->pe.GJ, c);
		readstr(fp, c);
		strcpy(p->pe.MZ, c);
		readstr(fp, c);
		strcpy(p->pe.XL, c);

		readstr(fp, c);
		strcpy(p->te.SJ, c);
		readstr(fp, c);
		strcpy(p->te.JD, c);
		readstr(fp, c);
		strcpy(p->te.XD, c);

		p=p->next;
	}

	fclose(fp);

	return p;
}

void List::readstr(FILE *f,char *string)
{	
	do
	{
     fgets(string, 255, f);  // 从f所指的文件中读出255-1个字符,然后加上"\0"送入字符数组string中
	} while ((string[0] == '/') || (string[0] == '\n'));

return;
}

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;
}

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->pe.sex, c);

	cout<<"请输入生日: (格式举例:19990101)"<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->birthday, c);

	cout<<"请输入民族:"<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->pe.MZ, c);

	cout<<"请输入国籍:"<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->pe.GJ, c);

	cout<<"请输入学历:"<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->pe.XL, 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.chinese, a);

	cout<<"请输入英语成绩: "<<endl;
	cin>>a;
	strcat(a, "\n");
	strcpy(p->sc.english, a);

	cout<<"请输入数学成绩: "<<endl;
	cin>>a;
	strcat(a, "\n");
	strcpy(p->sc.math, a);

	cout<<"请输入物理成绩: "<<endl;
	cin>>a;
	strcat(a, "\n");
	strcpy(p->sc.physics, 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;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->te.JD, c);

	cout<<"请输入学校电话号码: "<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->te.XD, c);

	cout<<"编辑联系方式完成!"<<endl;

	disptelephone(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;
	}
}

void List::dispperson(nodetype* p)
{
	cout<<"姓名:		"<<p->pe.name;
	cout<<"性别:		"<<p->pe.sex;
	cout<<"民族:		"<<p->pe.MZ;
	cout<<"国籍:		"<<p->pe.GJ;
	cout<<"学历:		"<<p->pe.XL;
	cout<<"出生日期:	"<<p->birthday;
	cout<<"家庭住址:	"<<p->address;
}

void List::dispscore(nodetype* p)
{
	cout<<"学号:		"<<p->sc.num;
	cout<<"大学语文成绩:	"<<p->sc.chinese;
	cout<<"英语成绩:	"<<p->sc.english;
	cout<<"数学成绩:	"<<p->sc.math;
	cout<<"物理成绩:	"<<p->sc.physics;
}

void List::disptelephone(nodetype* p)
{
	cout<<"手机号码是:	"<<p->te.SJ;
	cout<<"家庭电话是:	"<<p->te.JD;
	cout<<"学校电话是:	"<<p->te.XD;
}


List::~List()
{
	nodetype *p1=head, *p2;
	if(p1!=NULL)
	{
		p2=p1->next;
		if(p2==NULL)
			delete p1;
		else
		{
			while(p2!=NULL)
			{
				delete p1;
				p1=p2;
				p2=p2->next;
			}
			delete p1;
		}
	}
}

⌨️ 快捷键说明

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