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

📄 studinfomanagerview.cpp

📁 一个学生信息管理系统,使用了多中数值算法,有HASH查找,归并排序,堆排序,快速排序,界面也不错
💻 CPP
字号:
// StudInfoManagerView.cpp : implementation of the CStudInfoManagerView class
//

#include "stdafx.h"
#include "StudInfoManager.h"

#include "StudInfoManagerDoc.h"
#include "StudInfoManagerView.h"
#include "MainFrm.h"
#include "PropertyDlg.h"
#include "Taxis.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView

IMPLEMENT_DYNCREATE(CStudInfoManagerView, CListView)

BEGIN_MESSAGE_MAP(CStudInfoManagerView, CListView)
	//{{AFX_MSG_MAP(CStudInfoManagerView)
	ON_COMMAND(IDM_DELITEM, OnDelitem)
	ON_COMMAND(IDM_CLEARLIST, OnClearlist)
	ON_NOTIFY_REFLECT(NM_CLICK, OnClick)
	ON_NOTIFY_REFLECT(NM_DBLCLK, OnDblclk)
	ON_COMMAND(IDM_PROPERTY, OnProperty)
	ON_NOTIFY_REFLECT(LVN_COLUMNCLICK, OnColumnclick)
	ON_COMMAND(IDM_FILEOPEN, OnFileopen)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CListView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CListView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CListView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView construction/destruction

int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort);

CStudInfoManagerView::CStudInfoManagerView()
{
	// TODO: add construction code here
	UINT i;

	m_pList =&GetListCtrl();	

	for(i=0;i<10;i++)
		pStudInfo[i].uiStudNum=0;
}

CStudInfoManagerView::~CStudInfoManagerView()
{
}

BOOL CStudInfoManagerView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	return CListView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView drawing

void CStudInfoManagerView::OnDraw(CDC* pDC)
{
	CStudInfoManagerDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

void CStudInfoManagerView::OnInitialUpdate()
{
	CListView::OnInitialUpdate();

	// TODO: You may populate your ListView with items by directly accessing
	//  its list control through a call to GetListCtrl().
	m_pList->ModifyStyle(NULL, LVS_REPORT);

	m_pList->SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_FLATSB | LVS_EX_INFOTIP 
		| LVS_EX_TWOCLICKACTIVATE);
	m_pList->InsertColumn(0,"序号");

	m_pList->InsertColumn(1,"姓名");
	m_pList->InsertColumn(2,"学号");	
	m_pList->InsertColumn(3,"年龄");
	m_pList->InsertColumn(4,"性别");

	m_pList->InsertColumn(5,"课程1");
	m_pList->InsertColumn(6,"成绩1");
	m_pList->InsertColumn(7,"教师1");

	m_pList->InsertColumn(8,"课程2");
	m_pList->InsertColumn(9,"成绩2");
	m_pList->InsertColumn(10,"教师2");

	m_pList->SetColumnWidth(0,60);   //序号

	m_pList->SetColumnWidth(1,60);   //姓名
	m_pList->SetColumnWidth(2,80);   //学号	
	m_pList->SetColumnWidth(3,40);   //年龄
	m_pList->SetColumnWidth(4,40);   //性别

	m_pList->SetColumnWidth(5,90);   //课程1
	m_pList->SetColumnWidth(6,50);   //成绩1
	m_pList->SetColumnWidth(7,60);   //教师1

	m_pList->SetColumnWidth(8,90);   //课程2
	m_pList->SetColumnWidth(9,50);   //成绩2
	m_pList->SetColumnWidth(10,60);  //教师2

	//显示学生信息
	GetStudInfo("学生信息\\StudInfo.txt");
	DispAllStudInfo();

	m_pMainFrame=(CMainFrame*)::AfxGetApp()->m_pMainWnd;
}

/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView printing

BOOL CStudInfoManagerView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default preparation
	return DoPreparePrinting(pInfo);
}

void CStudInfoManagerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add extra initialization before printing
}

void CStudInfoManagerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
	// TODO: add cleanup after printing
}

/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView diagnostics

#ifdef _DEBUG
void CStudInfoManagerView::AssertValid() const
{
	CListView::AssertValid();
}

void CStudInfoManagerView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}

CStudInfoManagerDoc* CStudInfoManagerView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CStudInfoManagerDoc)));
	return (CStudInfoManagerDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CStudInfoManagerView message handlers

void CStudInfoManagerView::GetStudInfo(File *pFile)
{
	CourseInfo* pCourseInfo;
	CourseInfo* pNext;
	FILE* fp;
	UINT i;
	UINT uiHashAddr;   //哈希地址
	char pName[10];    //姓名
	UINT uiStudNum;    //学号,规定为9位,如080210114
	UINT uiAge;        //年龄
	char pSex[2];      //性别
	char pCourse1[10]; //课程名
	UINT uiMark1;      //成绩
	char pTeacher1[10];//教师
	char pCourse2[10]; //课程名
	UINT uiMark2;      //成绩
	char pTeacher2[10];//教师

	fp=fopen(pFile,"r");
	for(i=0;i<10;i++)
	{
		fscanf(fp,"%9d%11s%3d%2s%11s%4d%11s%11s%4d%6s",&uiStudNum,pName,&uiAge,pSex,pCourse1,&uiMark1,pTeacher1,pCourse2,&uiMark2,pTeacher2);

		uiHashAddr=HashSelect(uiStudNum);

		pCourseInfo=(CourseInfo*)malloc(sizeof(CourseInfo));
		pNext=(CourseInfo*)malloc(sizeof(CourseInfo));
		pCourseInfo->pNext=pNext;

		strcpy(pStudInfo[uiHashAddr].pName,pName);
		pStudInfo[uiHashAddr].uiStudNum=uiStudNum;
		pStudInfo[uiHashAddr].uiAge=uiAge;
		strcpy(pStudInfo[uiHashAddr].pSex,pSex);

		strcpy(pCourseInfo->pCourse,pCourse1);
		strcpy(pCourseInfo->pTeacher,pTeacher1);
		pCourseInfo->uiMark=uiMark1;	

		strcpy(pNext->pCourse,pCourse2);
		strcpy(pNext->pTeacher,pTeacher2);	
		pNext->uiMark=uiMark2;	
			
		pStudInfo[uiHashAddr].pCourseInfo=pCourseInfo;	
	}

	fclose(fp);
}

void CStudInfoManagerView::InsertRecord(StudInfo studInfo)
{
	UINT uiIndex=m_pList->GetItemCount();
	CString str;

	//显示序号
	str.Format("%d",uiIndex);
	m_pList->InsertItem(uiIndex,str,-1);

	//显示姓名
	m_pList->SetItemText(uiIndex,1,studInfo.pName);

	//显示学号
	if(studInfo.uiStudNum/100000000==0)
		str.Format("0%d",studInfo.uiStudNum);
	else
		str.Format("%d",studInfo.uiStudNum);
	m_pList->SetItemText(uiIndex,2,str);

	//显示年龄
	str.Format("%d",studInfo.uiAge);
	m_pList->SetItemText(uiIndex,3,str);

	//显示性别
	m_pList->SetItemText(uiIndex,4,studInfo.pSex);

	//显示课程1
	m_pList->SetItemText(uiIndex,5,studInfo.pCourseInfo->pCourse);

	//显示成绩1
	str.Format("%d",studInfo.pCourseInfo->uiMark);
	m_pList->SetItemText(uiIndex,6,str);

	//显示教师1
	m_pList->SetItemText(uiIndex,7,studInfo.pCourseInfo->pTeacher);

	//显示课程2
	m_pList->SetItemText(uiIndex,8,studInfo.pCourseInfo->pNext->pCourse);

	//显示成绩2
	str.Format("%d",studInfo.pCourseInfo->pNext->uiMark);
	m_pList->SetItemText(uiIndex,9,str);

	//显示教师2
	m_pList->SetItemText(uiIndex,10,studInfo.pCourseInfo->pNext->pTeacher);
}

void CStudInfoManagerView::OnDelitem() 
{
	// TODO: Add your command handler code here
	
}

void CStudInfoManagerView::OnClearlist() 
{
	// TODO: Add your command handler code here
	
}

StudInfo* CStudInfoManagerView::GetStudInfo()
{
	return this->pStudInfo;
}

void CStudInfoManagerView::OnClick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	POSITION pos = m_pList->GetFirstSelectedItemPosition();
	do
	{
		if (NULL == pos)
			break;
		if (m_nCurSel == pos)
			break;
		m_nCurSel = pos;
		OnSelectionChanged();		
	}
	while (FALSE);

	*pResult = 0;
}

void CStudInfoManagerView::OnSelectionChanged()
{
	CString str;
	CString strIndex,strName,strStudNum,strAge,strSex,strCourse1,strMark1,strTeacher1,strCourse2,strMark2,strTeacher2;

	strIndex=m_pList->GetItemText((int)m_nCurSel-1,0);
	strName=m_pList->GetItemText((int)m_nCurSel-1,1);
	strStudNum=m_pList->GetItemText((int)m_nCurSel-1,2);
	strAge=m_pList->GetItemText((int)m_nCurSel-1,3);
	strSex=m_pList->GetItemText((int)m_nCurSel-1,4);
	strCourse1=m_pList->GetItemText((int)m_nCurSel-1,5);
	strMark1=m_pList->GetItemText((int)m_nCurSel-1,6);
	strTeacher1=m_pList->GetItemText((int)m_nCurSel-1,7);
	strCourse2=m_pList->GetItemText((int)m_nCurSel-1,8);
	strMark2=m_pList->GetItemText((int)m_nCurSel-1,9);
	strTeacher2=m_pList->GetItemText((int)m_nCurSel-1,10);

	str="                                        -------------------------------该学生信息-------------------------------\r\n"
		"                                                                     学号:    "+strIndex+"\r\n"
		"                                                                     姓名:    "+strName+"\r\n"
		"                                                                     学号:    "+strStudNum+"\r\n"
		"                                                                     年龄:    "+strAge+"\r\n"
		"                                                                     性别:    "+strSex+"\r\n"
		"                                                                     课程1:   "+strCourse1+"\r\n"
		"                                                                     成绩1:   "+strMark1+"\r\n"
		"                                                                     教师1:   "+strTeacher1+"\r\n"
		"                                                                     课程2:   "+strCourse2+"\r\n"
		"                                                                     成绩2:   "+strMark2+"\r\n"
		"                                                                     教师2:   "+strTeacher2;

	CMainFrame*	m_pMainFrame=(CMainFrame*)::AfxGetApp()->m_pMainWnd;
	m_pMainFrame->m_wndOutputBar.SetEditText(0,str);
	this->UpdateData(false);
}

UINT CStudInfoManagerView::HashSelect(UINT uiStudNum)
{
	UINT uiAddr=(uiStudNum-uiStudNum/1000*1000)%11;

	if(!pStudInfo[uiAddr].uiStudNum)
		return uiAddr;
	else
	{
		while(pStudInfo[uiAddr].uiStudNum)
			uiAddr=(uiAddr+1)%10;

		return uiAddr;
	}

}

void CStudInfoManagerView::OnDblclk(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	this->OnProperty();

	*pResult = 0;
}

void CStudInfoManagerView::OnProperty() 
{
	// TODO: Add your command handler code here
	UINT uiIndex;
	uiIndex=m_pList->GetItemCount();
	if(uiIndex==0)
		return;

	CString strNum,strName,strStudNum,strAge,strSex,strCourse1,strMark1,strTeacher1,strCourse2,strMark2,strTeacher2;

	strNum=m_pList->GetItemText((int)m_nCurSel-1,0);

	strName=m_pList->GetItemText((int)m_nCurSel-1,1);
	strStudNum=m_pList->GetItemText((int)m_nCurSel-1,2);
	strAge=m_pList->GetItemText((int)m_nCurSel-1,3);
	strSex=m_pList->GetItemText((int)m_nCurSel-1,4);

	strCourse1=m_pList->GetItemText((int)m_nCurSel-1,5);
	strMark1=m_pList->GetItemText((int)m_nCurSel-1,6);
	strTeacher1=m_pList->GetItemText((int)m_nCurSel-1,7);

	strCourse2=m_pList->GetItemText((int)m_nCurSel-1,8);
	strMark2=m_pList->GetItemText((int)m_nCurSel-1,9);
	strTeacher2=m_pList->GetItemText((int)m_nCurSel-1,10);

	CPropertyDlg dlg;
	dlg.DispData(strNum,strName,strStudNum,strAge,strSex,strCourse1,strMark1,strTeacher1,strCourse2,strMark2,strTeacher2);
	dlg.DoModal();	
}

int CALLBACK ListCompare(LPARAM lParam1, LPARAM lParam2, LPARAM lParamSort)
{
	return 1;
}

void CStudInfoManagerView::OnColumnclick(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_LISTVIEW* pNMListView = (NM_LISTVIEW*)pNMHDR;
	// TODO: Add your control notification handler code here
//	m_pList->SortItems(ListCompare,(DWORD)pStudInfo);

	switch(pNMListView->iSubItem)
	{
	case 2:
		TaxisByStudNum();
		break;

	case 3:
		TaxisByAge();
		break;

	case 6:
	case 9:
		TaxisByAllMark();
		break;

	default:
		break;
	}

	*pResult = 0;
}

void CStudInfoManagerView::OnFileopen() 
{
	// TODO: Add your command handler code here
	CString strStudInfoFile;
	char* pStudInfoFile;
	CFileDialog m_OpenDlg(TRUE,"asd","StudInfo.txt",0,"任何文件(*.*)|*.*||");
	
	if(m_OpenDlg.DoModal()==IDOK) 
	{
		strStudInfoFile=m_OpenDlg.GetPathName();
		pStudInfoFile=(LPSTR)(LPCTSTR)strStudInfoFile;
	}
	else
	{
		m_pMainFrame->m_wndStatusBar.SetPaneText(0,"你取消了打开文件",TRUE);
		return;
	}

	UINT i;

	for(i=0;i<10;i++)
		pStudInfo[i].uiStudNum=0;

	GetStudInfo(pStudInfoFile);

	m_pList->DeleteAllItems();
	for(i=0;i<10;i++)
		InsertRecord(pStudInfo[i]);

	m_pMainFrame->m_wndStatusBar.SetPaneText(0,"加载学生信息成功",TRUE);
}

void CStudInfoManagerView::TaxisByAge()
{
	//CTaxis taxis(pStudInfo,TAXISBYAGE);

	UINT i,j;
	StudInfo siTemp;

	for(i=0;i<10;i++)
		for(j=i;j<10;j++)
			if(pStudInfo[i].uiAge>pStudInfo[j].uiAge)
			{
				siTemp=pStudInfo[i];
				pStudInfo[i]=pStudInfo[j];
				pStudInfo[j]=siTemp;
			}

	DispAllStudInfo();
}

void CStudInfoManagerView::TaxisByAllMark()
{
	//CTaxis taxis(pStudInfo,TAXISBYALLMARK);

	UINT i,j;
	StudInfo siTemp;

	for(i=0;i<10;i++)
		for(j=i;j<10;j++)
			if((pStudInfo[i].pCourseInfo->uiMark+pStudInfo[i].pCourseInfo->pNext->uiMark)<
				(pStudInfo[j].pCourseInfo->uiMark+pStudInfo[j].pCourseInfo->pNext->uiMark))
			{
				siTemp=pStudInfo[i];
				pStudInfo[i]=pStudInfo[j];
				pStudInfo[j]=siTemp;
			}

	DispAllStudInfo();
}

void CStudInfoManagerView::TaxisByStudNum()
{
	CTaxis taxis(pStudInfo,TAXISBYSTUDNUM);

	DispAllStudInfo();
}

void CStudInfoManagerView::DispAllStudInfo()
{
	UINT i;

	m_pList->DeleteAllItems();
	for(i=0;i<10;i++)
		InsertRecord(pStudInfo[i]);
}

void CStudInfoManagerView::OnFileOpen() 
{
	// TODO: Add your command handler code here
	this->OnFileopen();
}

⌨️ 快捷键说明

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