学生信息管理系统 Visual C++ MFC入门 || C++类 || 序列化 || 链表

本内容基于C++、MFC,将详细的介绍学生信息管理系统的编程,适合掌握C++类的基本知识,想学习MFC的学员。学生信息管理系统是学习MFC编程的一个基础练习,对于学习对话框界面的编程、类的使用继承、串行化、文件存储、链表查询等具有重要帮助。此次设计是基于VS2017平台的一个编程软件,在MFC工程下基于对话框编写的简单学生信息管理系统,具体的功能有增加、查询、修改和删除信息,打开和保存文件,以及直接寻找链表中的上一条和下一条信息。

目录

1.封装学生信息类,包括父类,子类

2.对话框界面设计

2.1学生界面

2.2本科生和研究生缴费界面

2.3学生信息查询界面和学生信息列表显示界面

2.4修改学生信息界面

3.各个功能代码的实现。

3.1增加功能代码

3.2删除功能

3.3保存功能

3.4打开功能

3.5修改功能

3.6上一条、下一条信息功能


1.封装学生信息类,包括父类,子类

为了方便,我自己把基类和父类都包含在一个h和cpp文件中,基类继承于MFC中的CObject类,stud.h文件如下


//**************************定义学生类**********************
class CStud : public CObject  
{

public:
	CStud();
	virtual ~CStud();
//构造函数
	CStud(CString strStudName,int nStudId,CString strStudDepartment,CString strStudMinority,
	       BOOL bStudSex,CString strStudType,BOOL bStudStay,CString strStudTuition,CString strStudBookPay,
		   CString strStudStayPay,int nStudAllPay);
//序列化
	void Serialize(CArchive& ar);
    DECLARE_SERIAL(CStud)
//接口函数
	CString GetStudName();
	int     GetStudId();
	CString GetStudDepartment();
	CString GetStudMinority();
	BOOL    GetStudSex();
	CString GetStudType();
	BOOL    GetStudStay();
	CString GetStudTuition();
	CString GetStudBookPay();
	CString GetStudStayPay();
//虚函数,学习类的多态性
	virtual int GetStudAllPay();
protected:
	CString m_StudName;
	int     m_StudId;
	CString m_StudDepartment;
	CString m_StudMinority;
	BOOL    m_StudSex;
	CString m_StudType;
	BOOL    m_StudStay;
	CString m_StudTuition;
	CString m_StudBookPay;
	CString m_StudStayPay;
	int     m_StudAllPay;
	
};
//**************************定义本科类**********************
class CUndergraduate:public CStud
{
public:
	int GetStudAllPay(CString strStudTuition,CString strStudBookPay,
		   CString strStudStayPay);

};
//**************************定义研究生类**********************
class CPostgraduate:public CStud
{
public:
	int GetStudAllPay(CString strStudTuition,CString strStudBookPay,
		   CString strStudStayPay);
};

stud.cpp文件如下,在源文件中要声明IMPLEMENT_SERIAL(CStud, CObject,0),否住会串行化失败。

CStud::CStud()
{
	m_StudName="";
	m_StudId=0;
	m_StudDepartment="";
	m_StudMinority="";
	m_StudSex=FALSE;
	m_StudType="";
	m_StudStay=FALSE;
	m_StudTuition="";
	m_StudBookPay="";
	m_StudStayPay="";
	m_StudAllPay=0;

}
int CStud::StudInterfacejudge=0;

CStud::~CStud()
{

}
CStud::CStud(CString strStudName,int nStudId,CString strStudDepartment,CString strStudMinority,
	       BOOL bStudSex,CString strStudType,BOOL bStudStay,CString strStudTuition,CString strStudBookPay,
		   CString strStudStayPay,int nStudAllPay)
{
	m_StudName=strStudName;
	m_StudId=nStudId;
	m_StudDepartment=strStudDepartment;
	m_StudMinority=strStudMinority;
	m_StudSex=bStudSex;
	m_StudType=strStudType;
	m_StudStay=bStudStay;
	m_StudTuition=strStudTuition;
	m_StudBookPay=strStudBookPay;
	m_StudStayPay=strStudStayPay;
	m_StudAllPay=nStudAllPay;
}

CString CStud::GetStudName()
{
	return m_StudName;
}

int     CStud::GetStudId()
{
	return m_StudId;
}

CString CStud::GetStudDepartment()
{	
	return m_StudDepartment;
}

CString CStud::GetStudMinority()
{
	return m_StudMinority;
}

BOOL    CStud::GetStudSex()
{
	return m_StudSex;
}

CString CStud::GetStudType()
{
	return m_StudType;
}

BOOL    CStud::GetStudStay()
{
	return m_StudStay;
}

CString CStud::GetStudTuition()
{
	return m_StudTuition;
}

CString CStud::GetStudBookPay()
{
	return m_StudBookPay;
}

CString CStud::GetStudStayPay()
{
	return m_StudStayPay;
}

int     CStud::GetStudAllPay()
{
	return m_StudAllPay;
}

void CStud::Serialize(CArchive& ar)
{
	CObject::Serialize(ar);
	if(ar.IsStoring())
	{
		ar<<m_StudName;
		ar<<m_StudId;
		ar<<m_StudDepartment;
		ar<<m_StudMinority;
		ar<<m_StudSex;
		ar<<m_StudType;
		ar<<m_StudStay;
		ar<<m_StudTuition;
		ar<<m_StudBookPay;
		ar<<m_StudStayPay;
		ar<<m_StudAllPay;
	}
	else
	{
	    ar>>m_StudName;
		ar>>m_StudId;
		ar>>m_StudDepartment;
		ar>>m_StudMinority;
		ar>>m_StudSex;
		ar>>m_StudType;
		ar>>m_StudStay;
		ar>>m_StudTuition;
		ar>>m_StudBookPay;
		ar>>m_StudStayPay;
		ar>>m_StudAllPay;
	}

}
//**************************本科类函数*****************
int  CUndergraduate::GetStudAllPay(CString strStudTuition,CString strStudBookPay,
		   CString strStudStayPay)
{
	CString str1,str2,str3;
	int num1,num2,num3,fee;
	if(strStudTuition=="全免 定向生")
	{
		str1="2000";
	}
	else if(strStudTuition=="生源地/高校 贷款")
	{
		str1="5800";
	}
	else
	{
		str1="5000";
	}
	if(strStudBookPay=="自费")
	{
		str2="0";
	}
	else
	{
		str2="600";
	}
	str3=strStudBookPay;
    num1=atoi(str1);
	num2=atoi(str2);
	num3=atoi(str3);
	fee=num1+num2+num3;

	return fee;
}
//**************************研究生类函数*****************
int  CPostgraduate::GetStudAllPay(CString strStudTuition,CString strStudBookPay,
		   CString strStudStayPay)
{
	int num1,num2,num3,fee;

    num1=atoi(strStudTuition);
	num2=atoi(strStudBookPay);
	num3=atoi(strStudStayPay);
	fee=num1+num2+num3;
	return fee;
}

 

2.对话框界面设计

vs2017中工程项目中,在资源视图窗口下的Dialog中新建对话框,每个对话框ID及控件ID命名最好根据英文名命名,有利于区别各个控件。新插入的对话框都需要新建自己的类,新建自己的类后,只要在每个对话框编辑界面双击相应的按钮就会在自己的类中建立消息响应函数,在函数中设计代码即可。

2.1学生界面

在学生界面中包含子控件较多,主要包括四类:静态文本(statictext)、编辑控件(edit box)、组合控件(group box)和按钮(button)。其中包含的功能较多,有增加、查询、修改和删除信息(修改和删除只有管理员才能使用),打开和保存文件,以及直接寻找链表中的上一条和下一条信息,如图所示。

2.2本科生和研究生缴费界面

根据学生界面学生类型以及住宿情况为判断条件,点击选择缴费情况打开对应的本科生和研究生缴费界面,分别如下图所示。

2.3学生信息查询界面和学生信息列表显示界面

学生信息查询界面是根据手动输入的学号和学生类型在链表中来查找学生信息的,在学生信息列表显示界面中也有查询按钮,但是这个按钮是根据不同的组合来寻找满足特定要求的信息。

 

2.4修改学生信息界面

在修改界面中,自己加了一些限定,就是不能修改名字、学号和学生类型。点击确定按钮会弹出是否确认修改,选择确认则修改并退出当前对话框。

 3.各个功能代码的实现。

在介绍各个功能代码之前先学习一下MFC消息映射机制COblist类、CFileDialog类:

MFC消息映射机制其实就是一消息一函数,

在对话框头文件中有afx_msg void OnStudAdd();

在相应的.cpp中ON_BN_CLICKED(IDC_StudAdd, OnStudAdd)负责关联,函数void CStudControlDlg::OnStudAdd() {}负责处理,代码就在OnStudAdd() {}函数里。

COblist其实是一个链表类(容器类),可以用来储存继承于CObject类类型的指针,其详细介绍可以参考网址

https://docs.microsoft.com/zh-cn/cpp/mfc/reference/coblist-class?f1url=https%3A%2F%2Fmsdn.microsoft.com%2Fquery%2Fdev15.query%3FappId%3DDev15IDEF1%26l%3DZH-CN%26k%3Dk(CObList);k(DevLang-C%2B%2B);k(TargetOS-Windows)%26rd%3Dtrue&view=vs-2019

具体用到COblist的各个功能如下表:

GetTail

返回链表的尾数据

GetHead

返回链表的头数据

RemoveTail

移除链表尾数据,链表数据个数减1,返回缩减前的尾数据

RemoveHead

移除链表头数据,链表数据个数减1,返回缩减前的头数据

AddTail

在链表尾处插入新数据,链表数据个数加1,返回新的链表尾位置

GetHeadPosition

返回链表头的位置;

GetTailPosition

返回链表尾的位置;

GetNext

返回当前位置的数据,之后位置后移一位;

GetPrev

返回当前位置的数据,之后位置前移一位;

SetAt

修改指定位置处的数据;

RemoveAt

清除指定位置处的数据;同时数据个数减1;

IsEmpty

判定链表是否为空;

GetCount

返回链表的数据个数

 

COblist成员函数对数据进行修改、删除和操作提供了很大的帮助,我们只要通过GetHeadPositionGetTailPositionGetNextGetPrev找到数据的POSITION就能对数据进行我们想要的操作。

CFileDialog,打开保存文件目录使用到CFileDialog类,操作文件的流程如下:

1)、构造一个CFileDialog对象;

2)、调用CFile::Open()函数创建、打开指定的文件。其中用CFile::Read()和CFile::Write ()进行文件操作;

3)、构造一个CArchive,链表进行序列化操作(链表会自动用IsStoring判断是读取还是储存数据);

4)、调用ar.Close()、CFile::Close()关闭文件。

学生费用选择界面代码

//******************学生费用选择界面代码**********************************
void CStudControlDlg::OnStudFeeStation() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	//**************判断信息是否为空******************************
	if(m_m_StudType.IsEmpty())
	{
		MessageBox("请选择学生类型");
		return;
	}
	if(m_m_StudStay==-1)
	{
		MessageBox("请选择住宿类型");
		return;
	}
	//***********************界面选择******************************
	if(m_m_StudType=="本科生")
	{
		CUndergradPayDlg dlg1;
		dlg1.pUndergradFee=this;
		dlg1.m_m_UndergradTuition=m_m_StudTuition;
		dlg1.m_m_UndergradBookPay=m_m_StudBookPay;
       	dlg1.m_m_UndergradStayPay=m_m_StudStayPay;
		dlg1.DoModal();
		CUndergraduate dlg2;
		m_m_StudAllFee=dlg2.GetStudAllPay(m_m_StudTuition,m_m_StudBookPay,m_m_StudStayPay);
		UpdateData(FALSE);
		return;
	}
	else
	{
		CPostgradPayDlg dlg1;
		dlg1.pPostgradFee=this;
		dlg1.m_m_PostgradTuition=m_m_StudTuition;
		dlg1.m_m_PostgradBookPay=m_m_StudBookPay;
		dlg1.m_m_PostgradStayPay=m_m_StudStayPay;
		dlg1.DoModal();
		CPostgraduate dlg2;
		m_m_StudAllFee=dlg2.GetStudAllPay(m_m_StudTuition,m_m_StudBookPay,m_m_StudStayPay);
		UpdateData(FALSE);
		return;
	}


}

打开查询界面

把this指针传递给即将打开的对话框类,通过this指针传值。

//*************************打开查询界面***********************
void CStudControlDlg::OnStudLook() 
{
	// TODO: Add your control notification handler code here
	CStudLookDlg dlg;
	dlg.pListLook=this;
	dlg.DoModal();
}

列表显示

//***************************列表显示*******************************
void CStudControlDlg::OnStudListShow() 
{
	// TODO: Add your control notification handler code here
	CStudListDlg dlg;
	dlg.m_StudListShow=this;
	dlg.DoModal();
}

3.1增加功能代码

在增加学生信息之前先获取个控件的信息再判断信息是否正确,当各种信息都正确的话,根据学生类型调用构造函数,在堆上构造,再用COblist中AddTail储存其指针在末尾。

//*********************增加学生信息***************************************
void CStudControlDlg::OnStudAdd() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	int  IdNumber;
	IdNumber=strlen(m_m_StudId);
	//*********************判断学生信息是否完整**********************
	if(m_m_StudName.IsEmpty())
	{
		MessageBox("请把姓名信息填完整","温馨提示");
		return;
	
	}
	if(m_m_StudId.IsEmpty())
	{
		MessageBox("请把学号信息填完整","温馨提示");
		return;
	
	}
	if(m_m_StudDepartment.IsEmpty())
	{
		MessageBox("请把院系信息填完整","温馨提示");
		return;
	
	}
	if(m_m_StudMinority.IsEmpty())
	{
		MessageBox("请把名族信息填完整","温馨提示");
		return;
	
	}
	if(m_m_StudSex==-1)
	{
		MessageBox("请把性别信息填完整","温馨提示");
		return;
	
	}
	if(m_m_StudType.IsEmpty())
	{
		MessageBox("请把学生类型信息填完整","温馨提示");
		return;
	}
	if((m_m_StudType=="研究生 全日制"||m_m_StudType=="研究生 非全日制")&&(IdNumber<6||IdNumber>6))
	{
		MessageBox("学号请输入六位数","温馨提示");
		return;
	}
	 if(m_m_StudType=="本科生"&&(IdNumber<8||IdNumber>8))
	{
		MessageBox("学号请输入八位数","温馨提示");
		return;
	}
	if(m_m_StudStay==-1)
	{
		MessageBox("请把住宿信息填完整","温馨提示");
		return;
	}
	if(m_m_StudTuition.IsEmpty())
	{
		MessageBox("请选择缴费情况","温馨提示");
		return;
	}
    
	//*******************查询学号是否重复*******************
	POSITION pos=StudList.GetHeadPosition();
	while(pos!=NULL)
	{
		CStud* pStr=(CStud*)StudList.GetNext(pos);
		if(pStr->GetStudId()==atoi(m_m_StudId))
		{
			MessageBox("改学号已存在,请重新输入","温馨提示");
			return;
		}
	}
	//**************判断信息是否相符*************
    if( (m_m_StudType=="研究生 全日制"||m_m_StudType=="研究生 非全日制")
		&&(m_m_StudTuition=="全免 定向生"||m_m_StudTuition=="生源地/高校 贷款"||m_m_StudTuition=="全额 5000"))
	{
		MessageBox("学生类型与学费信息不符合,请重新选择","温馨提示");
		return;
	}
	if(m_m_StudType=="本科生"&&(m_m_StudTuition=="8000"||m_m_StudTuition=="16000"))
	{
		MessageBox("学生类型与学费信息不符合,请重新选择","温馨提示");
		return;
	}
	//********************信息完整且符合*******增加信息*************
	if(m_m_StudType=="本科生")
	{
	   CUndergraduate dlg;
	   m_m_StudAllFee=dlg.GetStudAllPay(m_m_StudTuition,m_m_StudBookPay,m_m_StudStayPay);
      
	}
	else
	{
	   CPostgraduate dlg;
	   m_m_StudAllFee=dlg.GetStudAllPay(m_m_StudTuition,m_m_StudBookPay,m_m_StudStayPay);
	}
	int id=atoi(m_m_StudId);
     CStud *pAdd=new CStud(m_m_StudName,id,m_m_StudDepartment,m_m_StudMinority,m_m_StudSex,m_m_StudType,
		              m_m_StudStay,m_m_StudTuition,m_m_StudBookPay,m_m_StudStayPay,m_m_StudAllFee);
	if(IDYES==MessageBox("是否增加该生信息","温馨提示",MB_YESNO))
	{
		StudList.AddTail(pAdd);
    	UpdateData(FALSE);
     	MessageBox("添加成功","温馨提示");
	}
	else
		return;
	//********************************************************************
}

3.2删除功能

 删除一条信息,就显示下一条信息,这段代码稍微有点缺陷,没有在堆上删除内存,造成内存泄漏,正确的应该是在链表中移除指针前应先delete掉堆上的内存。

//*****************************删除功能************************************
void CStudControlDlg::OnStudDelete() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	int Index=StudList.GetCount();
	if(0==Index)
	{
		MessageBox("当前数据库为空,请打开文件","温馨提示");
		return;
	}
	if(m_m_StudId=="")
	{
		MessageBox("学号信息为空,请输入学号","温馨提示");
		return;
	}
	//**************************************************
	POSITION pos1=StudList.GetHeadPosition(),pos;
	CStud* pStr;
	int num1=0;
	while(pos1!=NULL)
	{
		CStud* pStr1=(CStud*)StudList.GetNext(pos1);
		if(atoi(m_m_StudId)==pStr1->GetStudId())
		{
    	    num1=1;
			pStr=pStr1;
	    	pos=pos1;
		}		
	}
	if(0==num1)
	{
		MessageBox("学号不存在,请输入正确的学号","温馨提示");
		return ;
	}
	else
	{
		if(pos!=NULL)
		{
	     	while(atoi(m_m_StudId)==pStr->GetStudId())
		     	pStr=(CStud*)StudList.GetPrev(pos);//pStr为下一条信息的指针地址
	     	if(IDYES==MessageBox("是否删除该生信息","温馨提示",MB_YESNO))
			{
		    	StudList.RemoveAt(pos);
     	     	MessageBox("删除成功","温馨提示");
				m_m_StudName=pStr->GetStudName();
				m_m_StudId.Format("%d",pStr->GetStudId());/
				m_m_StudDepartment=pStr->GetStudDepartment();
				m_m_StudMinority=pStr->GetStudMinority();
				m_m_StudSex=pStr->GetStudSex();
				m_m_StudType=pStr->GetStudType();
				m_m_StudStay=pStr->GetStudStay();
				m_m_StudTuition=pStr->GetStudTuition();
				m_m_StudBookPay=pStr->GetStudBookPay();
				m_m_StudStayPay=pStr->GetStudStayPay();
				m_m_StudAllFee=pStr->GetStudAllPay();
				UpdateData(FALSE);
			}
	    	else
		    	return;
		}
		else
		{
			pos=StudList.GetTailPosition();
			POSITION pos2=pos;
			int i;
			for(i=0;i<2;i++)
		     	pStr=(CStud*)StudList.GetPrev(pos2);
			if(IDYES==MessageBox("是否删除该生信息","温馨提示",MB_YESNO))
			{
		    	StudList.RemoveAt(pos);
     	     	MessageBox("删除成功","温馨提示");
				m_m_StudName=pStr->GetStudName();
		    	m_m_StudId.Format("%d",pStr->GetStudId());/
				m_m_StudDepartment=pStr->GetStudDepartment();
				m_m_StudMinority=pStr->GetStudMinority();
				m_m_StudSex=pStr->GetStudSex();
				m_m_StudType=pStr->GetStudType();
				m_m_StudStay=pStr->GetStudStay();
				m_m_StudTuition=pStr->GetStudTuition();
				m_m_StudBookPay=pStr->GetStudBookPay();
				m_m_StudStayPay=pStr->GetStudStayPay();
				m_m_StudAllFee=pStr->GetStudAllPay();
				UpdateData(FALSE);
			}
	    	else
		    	return;


		}
	}
	
}

3.3保存功能

通过链表序列化,可以将堆上的内容保存为txt文件。

void CStudControlDlg::OnStudTextSave() 
{
	// TODO: Add your control notification handler code here
//调用CFileDialog类构造对象,来打开或新建文件
    CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
    "All Files(*.TXT)|*.TXT||",this);
     CString strPath;
    if(dlg.DoModal()==IDOK)
	{
     strPath = dlg.GetPathName()+".txt";//获取打开文件的路径
     CFile file(_T(strPath),CFile::modeCreate|CFile::modeWrite);
     CArchive ar(&file, CArchive::store);
     StudList.Serialize(ar);
     ar.Close();
     file.Close();
	}
}

3.4打开功能

打开会覆盖已有信息,通过链表序列化,可以把Txt文件加载到链表中的指针,通过指针来访问相应的数据,但是在把链表指针移除前,应该删除已有信息的堆内存。

void CStudControlDlg::OnStudTextOpen() 
{
	// TODO: Add your control notification handler code here

	CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
    "All Files(*.TXT)|*.TXT||",this);
	CString strPath;
	if(dlg.DoModal()==IDOK)
	{
		 strPath= dlg.GetPathName();
		 if(StudList.IsEmpty())
		 {}
		 else
		 {
	         if(IDYES==MessageBox("是否覆盖已有信息","警告",MB_YESNO ))
//把指针删除前,在这里释放堆上的内存,这里没写
        	 StudList.RemoveAll();
		 }

	}
    else
	{
	     return;
	}
	CFile file(_T(strPath),CFile::modeRead);
    CArchive ar(&file, CArchive::load);
    StudList.Serialize(ar);
	ar.Close();
    file.Close();
    ************************************************
	CStud* pStr = (CStud* )StudList.GetHead();
	m_m_StudName=pStr->GetStudName();
	m_m_StudId.Format("%d",pStr->GetStudId());
	m_m_StudDepartment=pStr->GetStudDepartment();
	m_m_StudMinority=pStr->GetStudMinority();
	m_m_StudType=pStr->GetStudType();
	m_m_StudSex=pStr->GetStudSex();
	m_m_StudStay=pStr->GetStudStay();
	m_m_StudTuition=pStr->GetStudTuition();
	m_m_StudBookPay=pStr->GetStudBookPay();
	m_m_StudStayPay=pStr->GetStudStayPay();
	m_m_StudAllFee=pStr->GetStudAllPay();
	UpdateData(FALSE);	
}

3.5修改功能

void CStudControlDlg::OnStudModify() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	POSITION pos=StudList.GetHeadPosition();
	int num1=0;
	while(pos!=NULL)
	{
		CStud* pStr=(CStud*)StudList.GetNext(pos);
		if(pStr->GetStudId()==atoi(m_m_StudId)&&pStr->GetStudName()==m_m_StudName&&pStr->GetStudType()==m_m_StudType)
			num1=1;
	}
	if(num1==0)
	{
		MessageBox("该信息不存在,请确认姓名/学号/学生类型信息是否符合你需要修改学生的信息","温馨提示");
		return;
	}

	UpdateData(TRUE);
    CStudModifyDlg dlg;
	dlg.pStudModify=this;
	dlg.DoModal();
	UpdateData(FALSE);
}

3.6上一条、下一条信息功能

根据学号来查找当前学生信息在链表中的位置,通过该位置来查找上一条、下一条信息。

//********************查找上一条信息***************************
void CStudControlDlg::OnStudLookLast() 
{
	// TODO: Add your control notification handler code here
    UpdateData(TRUE);
	//*******************判断链表是否为空********************
	int num1;
	num1=StudList.GetCount();
	if(num1==0)
	{
		MessageBox("信息为空,请打开或者增加信息","温馨提示");
		return;
	}
	//************************判断信息是否被更改************************
	int num2=0;
	POSITION pos1=StudList.GetTailPosition();
	while(pos1!=NULL)
	{
		CStud* pStr1=(CStud*)StudList.GetPrev(pos1);
		if(pStr1->GetStudId()==atoi(m_m_StudId))
			num2=1;
	}
	if(num2==0)
	{
		MessageBox("该信息不存在,如果你更改了学号,请确认学号在数据库中存在","温馨提示");
		return;
	}
	//*******************************************
	POSITION pos=StudList.GetTailPosition();
	CStud* pStr=(CStud*)StudList.GetTail();
	//*********************************信息是为链表最后一条****************************
	if(atoi(m_m_StudId)==pStr->GetStudId())
	{
		while(atoi(m_m_StudId)==pStr->GetStudId())
			pStr=(CStud*)StudList.GetPrev(pos);//pos前移两次
		//pStr=(CStud*)StudList.GetPrev(pos);
		m_m_StudName=pStr->GetStudName();
    	m_m_StudId.Format("%d",pStr->GetStudId());
    	m_m_StudDepartment=pStr->GetStudDepartment();
    	m_m_StudMinority=pStr->GetStudMinority();
    	m_m_StudType=pStr->GetStudType();
    	m_m_StudSex=pStr->GetStudSex();
    	m_m_StudStay=pStr->GetStudStay();
    	m_m_StudTuition=pStr->GetStudTuition();
    	m_m_StudBookPay=pStr->GetStudBookPay();
    	m_m_StudStayPay=pStr->GetStudStayPay();
    	m_m_StudAllFee=pStr->GetStudAllPay();
    	UpdateData(FALSE);
		return;
	}
	//*********************************信息是为链表中间一条****************************
	while(atoi(m_m_StudId)!=pStr->GetStudId())
		pStr=(CStud*)StudList.GetPrev(pos);
	if(pos!=NULL)
	{
		pStr=(CStud*)StudList.GetPrev(pos);
		m_m_StudName=pStr->GetStudName();
    	m_m_StudId.Format("%d",pStr->GetStudId());
    	m_m_StudDepartment=pStr->GetStudDepartment();
    	m_m_StudMinority=pStr->GetStudMinority();
    	m_m_StudType=pStr->GetStudType();
    	m_m_StudSex=pStr->GetStudSex();
    	m_m_StudStay=pStr->GetStudStay();
    	m_m_StudTuition=pStr->GetStudTuition();
    	m_m_StudBookPay=pStr->GetStudBookPay();
    	m_m_StudStayPay=pStr->GetStudStayPay();
    	m_m_StudAllFee=pStr->GetStudAllPay();
    	UpdateData(FALSE);
		return;

	}
	else
	{
		MessageBox("当前信息为第一条","温馨提示");
		return;
	}
}
//********************查找下一条信息***************************
void CStudControlDlg::OnStudLookNext() 
{
	// TODO: Add your control notification handler code here
	 UpdateData(TRUE);
	//*******************判断链表是否为空********************
	int num1;
	num1=StudList.GetCount();
	if(num1==0)
	{
		MessageBox("信息为空,请打开或者增加信息","温馨提示");
		return;
	}
	//************************判断信息是否被更改************************
	int num2=0;
	POSITION pos1=StudList.GetHeadPosition();
	while(pos1!=NULL)
	{
		CStud* pStr1=(CStud*)StudList.GetNext(pos1);
		if(pStr1->GetStudId()==atoi(m_m_StudId))
			num2=1;
	}
	if(num2==0)
	{
		MessageBox("该信息不存在,如果你更改了学号,请确认学号在数据库中存在","温馨提示");
		return;
	}
	//*******************************************
	POSITION pos=StudList.GetHeadPosition();
	CStud* pStr=(CStud*)StudList.GetNext(pos);
	//*********************************信息是为链表最后一条****************************
	if(atoi(m_m_StudId)==pStr->GetStudId())
	{
		pStr=(CStud*)StudList.GetNext(pos);//前移一次
		m_m_StudName=pStr->GetStudName();
    	m_m_StudId.Format("%d",pStr->GetStudId());
    	m_m_StudDepartment=pStr->GetStudDepartment();
    	m_m_StudMinority=pStr->GetStudMinority();
    	m_m_StudType=pStr->GetStudType();
    	m_m_StudSex=pStr->GetStudSex();
    	m_m_StudStay=pStr->GetStudStay();
    	m_m_StudTuition=pStr->GetStudTuition();
    	m_m_StudBookPay=pStr->GetStudBookPay();
    	m_m_StudStayPay=pStr->GetStudStayPay();
    	m_m_StudAllFee=pStr->GetStudAllPay();
    	UpdateData(FALSE);
		return;
	}
	//*********************************信息是为链表中间一条****************************
	while(atoi(m_m_StudId)!=pStr->GetStudId())
		pStr=(CStud*)StudList.GetNext(pos);
	if(pos!=NULL)
	{
		pStr=(CStud*)StudList.GetNext(pos);
		m_m_StudName=pStr->GetStudName();
    	m_m_StudId.Format("%d",pStr->GetStudId());
    	m_m_StudDepartment=pStr->GetStudDepartment();
    	m_m_StudMinority=pStr->GetStudMinority();
    	m_m_StudType=pStr->GetStudType();
    	m_m_StudSex=pStr->GetStudSex();
    	m_m_StudStay=pStr->GetStudStay();
    	m_m_StudTuition=pStr->GetStudTuition();
    	m_m_StudBookPay=pStr->GetStudBookPay();
    	m_m_StudStayPay=pStr->GetStudStayPay();
    	m_m_StudAllFee=pStr->GetStudAllPay();
    	UpdateData(FALSE);
		return;

	}
	else
	{
		MessageBox("当前信息为最后一条","温馨提示");
		return;
	}
}

学生信息列表显示功能查询功能代码过长,这里不再展示。

整个设计过程到此结束,若其中存在不足,请在评论区指出。

本人编写 的学生信息管理系统代码链接如下:

//download.csdn.net/download/qq_42136233/12128811

  • 5
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(一). 实现简单地使用用户名和密码来进入登陆界面,以加强DOS运行窗口的可视化效果。如果输入的用户名和密码有一项为空或者是输入的用户名和密码是错误的,则不能进入系统。 (二). 实现任意添加学生信息,包括添加学生的个人学号,姓名,性别,专业,年级出生日期。输入不允许为空,并且有提示功能,如果输入的时候有一项为空则提示输入相关的信息。 (三). 实现删除学生信息,包括删除学生的个人学号,姓名,性别,专业,年出生日期。根据编号进行用户权限检查,在数据库中进行查找相符和的记录,如果编号在数据库中不存在相应记录,则提示不能删除,否则可以删除该记录。输入不允许为空,并且有提示功能,如果输入的时候为空则提示输入相关的信息。 (四). 实现编辑学生信息,包括编辑学生的个人学号,姓名,性别,专业,年级,出生日期。输入不允许为空,并且有提示功能,如果输入的时候有一项为空则提示输入相关的信息。 (五). 实现查询学生信息,包括编辑查询学生的个学号,姓名,性别,专业,年级,出生日期。输入不允许为空,并且有提示功能,如果输入的时候为空则提示输入相关的信息。 (六). 实现保存学生信息,包括保存学生的个人学号,姓名,性别,专业,年级,出生日期。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值