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

📄 student.cpp

📁 用链表来实现的一个学生成绩管理管理系统
💻 CPP
字号:
#include"Student.h"
///////////////////////////////////////////////////////////////////
Student::Student() {  
	head = NULL;
}
///////////////////////////////////////////////////////////////////
bool Student::empty()const {
	return size()==0;
}
///////////////////////////////////////////////////////////////////
int Student::size()const {                    //统计链表的记录总数
	if(head==NULL) return 0;                          
	Node *p=head;                               
	int count=0;                                      //变量count存储当前链表中的记录总数
	while(p!=NULL) {                                     
		count++;                                         
		p=p->next;                                   //p指向下一个结点
	}                                  
	return count; 
}                    
////////////////////////////////////////////////////////////////////////////
void Student::clear() {     //清空链表
	Node *p, *q;
	for (p=head;p!=NULL;p=q) {
		q=p->next;
		delete p;
	}
	head = NULL;
}   
////////////////////////////////////////////////////////////////////////////
Student::~Student() {
	clear();
}            
//////////////////////////////////////////////////////////////////
void Student::addItem(int num, string name,Subject subject,int term) { //添加一条记录到表尾
	if(head==NULL){                               
		head=new Node;                               //新建结点
		head->num=num;                              //学号
		head->name=name;                           //姓名
		head->subject=subject;                    //科目
		head->term=term;                         //学期
		head->next=NULL;                             
		return;
	}                                     

	Node *temp=head;                              
	while(temp!=NULL && temp->num!=num)                       //学号是唯一的
		temp=temp->next;                                     //指向下一个结点
		if(temp!=NULL){                                        
			cout<<"学号为"<<num<<"的学生记录已经存在!添加失败!\n"; //提示操作结果
			return;
		}         
                          
	Node *p=head;                               //p指针从头结点开始遍历
	while(p->next!=NULL) p=p->next;            
		temp=new Node;                        //新建结点
		temp->num=num;                       //插入学号
		temp->name=name;                    //插入姓名
		temp->subject=subject;		       //插入科目
		temp->term=term;                  //插入学期
		temp->next=NULL;                                
		p->next=temp;                                   
		return;
}                                     
/////////////////////////////////////////////////////////////////////////////////
void Student::deleteItem(int num) {           //删除一条指定的记录
	Node *temp=findItem(num);                //根据学号查找
	if(temp==NULL)  return;                 //找不到此学号所对应的记录
	Node *p=head;                          
	if(head==temp) {                      //如果用户输入的编号存在,执行if后的代码块
		head=head->next;                 //要删除的是头结点
		delete p;                       //执行删除
		cout <<"成功删除学号为 "<<num<<" 的记录!\n\n";  //输出提示
		return;
	}                                    
	while(p->next!=temp) p=p->next;                    //指针p移动,直到找到相当记录
	Node *t=p->next;                                 
	p->next=t->next;                                
	delete t;                                      //执行删除
	cout <<"成功删除学号为 "<<num<<" 的记录!\n\n"; //输出提示
	return;                                        
}
/////////////////////////////////////////////////////////////////////////////////
void Student::printItem(Node *p) {              
	cout<<p->num<<"\t";                          
	cout<<p->name<<"\t";                        
	cout<<p->subject.chinese<<"\t";
	cout<<p->subject.math<<"\t";
	cout<<p->subject.english<<"\t";
	cout<<p->subject.politic<<"\t";
	cout<<p->subject.history<<"\t"; 
	cout<<p->term<<endl;                                    
	return;                                         
}
/////////////////////////////////////////////////////////////////////////////////
void Student::showList() {                              //列出当前链表中的所有记录
	if (empty()) {                           
		cout <<"当前的列表为空!\n";             //提示查询结果
		return;
	}                                      
	Node *p=head;                                    //将头结点存储在Node结构类型指针*p中
	cout<<"共有记录:"<<size()<<endl;                //输入记录总数
	cout<<"学号\t姓名\t语文\t数学\t英语\t政治\t历史\t学期\n";   //输出标题
	while(p!=NULL) {                                       
		printItem(p);                                          //输出p的值
		p=p->next;
	}                                                           
    return;
}                                        
////////////////////////////////////////////////////////////////////////////////
void Student::searchItem(int num) {                 //在当前链表查找指定记录并输出
	Node *p=findItem(num);                         //查找该学号对应的记录,将查找结果存储在指针p中
	if(p!=NULL) {                                         
		cout<<"学号\t姓名\t语文\t数学\t英语\t政治\t历史\t学期\n";   //输出标题
		printItem(p);                                              //打印p中的内容
	}
}
////////////////////////////////////////////////////////////////////////////////
void Student::searchItem(string name) {
	Node *p=findItem(name);                                //查找该编号对应的记录,将查找结果存储在指针p中
	if(p!=NULL) {                                          
		cout<<"学号\t姓名\t语文\t数学\t英语\t政治\t历史\t学期\n";   
		printItem(p);                                              
	}   
}
////////////////////////////////////////////////////////////////////////////////
Node *Student::findItem(int num) {                    //调用查找函数
	if (empty()) {                         
		cout <<"当前的列表为空!\n";           
		return NULL;                                
	}
	Node *p=head;                                 
	while(p!=NULL) {                            
	if(p->num==num) break;                      //找到学号所对应的记录
		p=p->next;                             //尚没有找到,则指针P往下移动
	}
	if(p==NULL) {                             
		cout <<"找不到该记录!\n";      
		return NULL;                        
	}
	return p;                            
}
////////////////////////////////////////////////////////////////////////////////
Node *Student::findItem(string name) {
	if (empty()) {                                   
		cout <<"当前的列表为空!\n";             
		return NULL;                                
	}
	Node *p=head;                                   
	while(p!=NULL) {                              
		if(p->name==name) break;                  //找到学生姓名所对应的记录
		p=p->next;                               //尚没有找到,则指针P往下移动
	}
	if(p==NULL) {                               
		cout <<"找不到该记录!\n";       
		return NULL;                          
	}
	return p;                                       
}
////////////////////////////////////////////////////////////////////////////////
void Student::readFile() {
	ifstream infile;   
	infile.open("student.txt",ios::in);  
	if(!infile) {
		cout<<"没有student.txt这个文件!!!"<<endl;	
	} 		
	int num=0;
	string name;
	Subject subject;
	int term=0;
	int count=0;                     //定义一个变量count,用来存放从student.txt中读取第一行的数,表文件中的总记录数
	infile>>count;                   //读取到count中
	while(count>0) {		
		infile>>num>>name>>subject.chinese>>subject.math>>subject.english>>subject.politic>>subject.history>>term;
		addItem(num,name,subject,term);              //调用
		count--;
	}
	infile.close(); 
}
////////////////////////////////////////////////////////////////////////////////
void Student::writeFile() {
    ofstream outfile;   
	outfile.open("student.txt",ios::out|ios::app);  //追加信息到student.txt中	
	if (empty()) {                           
		cout <<"当前的列表为空,无法写入文件!\n"; 
		outfile.close();
		return;
	}                                      
	Node *p=head;                                    //将头结点存储在Node结构类型指针*p中
	outfile<<size()<<endl;                                 //将链表的记录总数写入student.txt的第一行
	while(p!=NULL) {                                       
		outfile<<p->num<<"\t"<<p->name<<"\t"<<p->subject.chinese<<"\t"<<p->subject.math<<"\t"<<p->subject.english
			   <<"\t"<<p->subject.politic<<"\t"<<p->subject.history<<"\t"<<p->term<<endl;
		p=p->next;
	}    
	cout<<"文件保存成功!"<<endl;
	outfile.close(); 	
}
////////////////////////////////////////////////////////////////////////////////
void Student::average(string name) {
	Node *p=findItem(name);                                //查找该编号对应的记录,将查找结果存储在指针p中
	int sum=0;
	int count=sizeof(Subject)/sizeof(int);
	double average=0.0;
	if(p!=NULL) {                                          
		sum=p->subject.chinese+p->subject.english+p->subject.history+p->subject.math+p->subject.politic;
		average=sum/count;
		cout<<"学号\t姓名\t总分\t平均分\n";
		cout<<p->num<<"\t"<<p->name<<"\t"<<sum<<"\t"<<average<<endl;		                                              
	}   
}
////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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