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

📄 david.cpp

📁 学 生 成 绩 管 理 系 统
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include <iostream.h>                   // cin 及 cout
#include <malloc.h>                     // 用到申请内存函数 malloc() 和释放内存函数 free()
#include <string.h>		                // 字符串处理
#include <stdio.h>		                // 文件操作(读文件)
#include <stdlib.h>		                // system("cls")

struct data					            //个人档案
{  
	    char birthday[12];              //出生年月
		char sex[10] ;                  //性别 		
		char JD[15];                    //家庭电话
		char SJ[15];                    //手机号码
		char address[20];               //家庭住址
		char XL[19];		        	//学历
};	

struct score					      	//成绩
{
		char english[20];
		char computer[20];
		char maths[20];
		char physics[20];
};

struct room				                //宿舍信息
{
		char room_addr[20];			    //宿舍地址
		char room_num[15];			    //宿舍号码
		char room_tel[15];			    //宿舍电话
};

typedef struct Node			            //定义节点的类型
{
	    char name[20];                  //名字
		char number[20];		        //学号
		struct score sc;		        //成绩
		struct data da;	    	        //个人档案
		struct room ro;	                //宿舍信息
		struct Node* next;
}LinkList;

class List                             //定义一个List类
{
private:
	LinkList* head;
public:
	List();
	~List();
	Node* creatlist(int);				    //创建链表
	int listlen();							//返回链表长度
	LinkList* findnode(int);				//通过查找序号返回节点的指针
	LinkList* find(char c[]);				//通过查找姓名返回节点的指针
	int find2(char c[]);					//通过查找姓名返回节点的序号
	LinkList* find3(char c[]);				//通过查找学号返回节点的指针
	LinkList* insnode(int);					//插入节点
	void delnode(int);						//删除节点
	LinkList* load();						//初始化:从外部读入数据
	void readstr(FILE *f,char *string);		//读行函数
	bool check(char *a, char *b);			//对比两个字符串是否相等
	void menu();							//显示主菜单
	void editdata(LinkList*);				//编辑个人档案
	void editscore(LinkList*);				//编辑学科成绩
	void editroom(LinkList*);		     	//编辑宿舍信息
	void dispname();						//显示所有学生姓名
	void dispnode(LinkList*);				//显示一个学生的所有信息
	void dispdata(LinkList*);				//显示一个学生的个人档案
	void dispscore(LinkList*);				//显示一个学生的学科成绩
	void disproom(LinkList*);		    	//显示一个学生的宿舍信息
};

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

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

LinkList * List::creatlist (int n)           //创建链表
{
	LinkList *h=NULL, *p, *q;
	int i=1;
	for(int j=0; j<n; j++)
	{
		if(i==1)                            //创建第一个节点
		{
			h=(LinkList*)malloc(sizeof(LinkList));
			h->next=NULL;
			q=h;
		}
		else                                //创建其余节点
		{
			p=(LinkList*)malloc(sizeof(LinkList));
			p->next=NULL;
			q->next=p;
			q=p;                            //q 始终指向生成的单链表的最后一个节点
		}
		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;
}

LinkList* List::load()
{
	FILE *fp;
	LinkList *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->name, c);
		readstr(fp, c);
		strcpy(p->number, c);

		readstr(fp, c);
		strcpy(p->da.birthday, c);
		readstr(fp, c);
		strcpy(p->da.sex, c);
		readstr(fp, c);
		strcpy(p->da.JD, c);
		readstr(fp, c);
		strcpy(p->da.SJ, c);
		readstr(fp, c);
		strcpy(p->da.address, c);
		readstr(fp, c);
		strcpy(p->da.XL, c);

		readstr(fp, c);
		strcpy(p->sc.english, c);
		readstr(fp, c);
		strcpy(p->sc.computer, c);
		readstr(fp, c);
		strcpy(p->sc.maths, c);
		readstr(fp, c);
		strcpy(p->sc.physics, c);

		readstr(fp, c);
		strcpy(p->ro.room_addr, c);
		readstr(fp, c);
		strcpy(p->ro.room_num, c);
		readstr(fp, c);
		strcpy(p->ro.room_tel, c);
		p=p->next;
	}
	fclose(fp);
	return p;
}

void List::dispnode(LinkList* p)	            	//显示一个学生的所有信息
{
	if(p!=NULL)
	{
		dispdata(p);
		dispscore(p);
		disproom(p);
	}
}

void List::dispname()	                        	//显示所有学生姓名
{
	LinkList* p=head;
	cout<<"现有的学生:  "<<endl;
	if(p==NULL)
		cout<<"没有任何学生数据"<<endl;
	while(p!=NULL)
	{
		cout<<"姓名:	"<<p->name;
		p=p->next;
	}
}

int List::listlen()                                //返回链表长度
{
	int i=0;
	LinkList* p=head;
	while(p!=NULL)
	{
		p=p->next;
		i++;
	}
	return i;
}

LinkList* List::findnode (int i)                 //通过查找序号返回节点的指针
{
	LinkList* 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;
	}
}

LinkList* List::find(char c[])                  //通过查找姓名返回节点的指针
{
	LinkList* p=head;
	strcat(c, "\n");				            //从外部读入的字符串末尾都带了一个换行符
	while( p!=NULL &&  !(check(c, p->name)))    //查找第 i 个节点并由 p 指向该节点		
		p=p->next;
	return p;
}

int List::find2(char c[])                       //通过查找姓名返回节点的序号
{
	LinkList* p=head;
	int j=1;
	strcat(c, "\n");				            //从外部读入的字符串末尾都带了一个换行符
	while( p!=NULL &&  !(check(c, p->name)))    //查找第 i 个节点并由 p 指向该节点	
	{	
		j++;
		p=p->next;
	}
	return j;
}

LinkList* List::find3(char c[])                  //通过查找学号返回节点的指针
{
	LinkList* p=head;
	strcat(c, "\n");				            //从外部读入的字符串末尾都带了一个换行符
	while( p!=NULL &&  !(check(c, p->number)))    //查找第 i 个节点并由 p 指向该节点		
		p=p->next;
	return p;
}

LinkList* List::insnode(int i)
{
	LinkList *h=head, *p, *s;
	s=(LinkList*)malloc(sizeof(LinkList));       //创建节点 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 个节点
{
	LinkList *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::editdata(LinkList* p)                 //编辑学生档案
{
	char c[20];
	cout<<"请输入姓名: "<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->name, c);

	cout<<"请输入学号: "<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->number, c);

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

	cout<<"请输入性别:"<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->da.sex, c);

	cout<<"请输入家庭电话:"<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->da.JD, c);

	cout<<"请输入手机号码:"<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->da.SJ, c);

	cout<<"请输入家庭住址(例如:江苏省通州市青年路22号)"<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->da.address, c);

	cout<<"请输入学历:"<<endl;
	cin>>c;
	strcat(c, "\n");
	strcpy(p->da.XL, c);

	cout<<"编辑个人档案完成!"<<endl;

	dispdata(p);
}

void List::editscore(LinkList* p)                    //编辑学生成绩
{
	char a[20];

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


	cout<<"请输入计算机成绩: "<<endl;
	cin>>a;

⌨️ 快捷键说明

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