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

📄 studinfomanager.cpp

📁 一个DOS下的学生信息管理系统,使用了多中数值算法,有HASH查找,归并排序,快速排序,对排序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// StudInfoManager.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "StudInfoManager.h"
#include "TypeDef.h"
#include "conio.h"
#include "Taxis.h"

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

/////////////////////////////////////////////////////////////////////////////
// The one and only application object

CWinApp theApp;
using namespace std;
HANDLE	hStdOut=GetStdHandle(STD_OUTPUT_HANDLE);
STUDINFO pStudInfo[10];				//学生信息
bool bIsLoaded=false;				//是否已加载学生信息

bool GetStudInfo(FILENAME* pFile);	//从文件中得到学生信息
void PrintStudInfo(STUDINFO studInfo,UINT uiSpecial); 
									//打印学生信息
UINT GetGrade(UINT uiStudNum);      //从学号中得到年级
UINT HashSelect(UINT uiStudNum);    //选择哈希地址
void SelectError();                 //选择错误
void CoolBeep(UINT uiCbSort);       //非常酷的蜂鸣声
void AnimatePrint(char* pStr);      //动态显示

void LoadStudInfo();                //加载学生信息
void SearchStudInfo();              //查询学生信息
void TaxisStudInfo();               //排序学生信息
void StatisticsStudInfo();          //统计学生信息
void DispHelpInfo();
void AboutMe(); 
void Exit();					    //退出系统
void PressAnyKey();                 //按任意键继续

void DispAllStudInfo(UINT uiSpecial);           
									//显示所有学生信息
void SearchByStudNum();             //按学号查找
void SearchByName();                //按姓名查找
void SearchBySex();                 //按性别查找
void SearchByGradeCourse();         //按年级课程查找
void SearchByTeacher();             //按教师查找
void SearchByCourse();              //按课程查找

void TaxisByStudNum();              //按学号排序
void TaxisByAge();                  //按年龄排序
void TaxisByAllMark();              //按总成绩排序

void StatisticsBoyGirlCount();      //男女生人数
void StatisticsPersonAverageMark(); //个人平均成绩
void StatisticsGradeAverageAge();   //年级平均年龄
void StatisticsCourseAverageMark(); //各门课得平均成绩

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// initialize MFC and print and error on failure
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: change error code to suit your needs
		cerr << _T("Fatal Error: MFC initialization failed") << endl;
		nRetCode = 1;
	}

	UCHAR ucSelection;//选择号

	SetConsoleTitle("学生信息管理系统");//设置标题
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
	MessageBox(NULL,"学生信息管理系统!!!","热烈欢迎",MB_ICONINFORMATION);

Select:
	cout<<"                         学生信息管理系统"<<endl;
	cout<<"                    1-----------------学生信息加载系统"<<endl;
	cout<<"                    2-----------------学生信息查询系统"<<endl;
	cout<<"                    3-----------------学生信息排序系统"<<endl;
	cout<<"                    4-----------------学生信息统计系统"<<endl;
	cout<<"                    5-----------------帮助主题"<<endl;
	cout<<"                    6-----------------关于作者"<<endl;
	cout<<"                    7-----------------退出系统"<<endl;
	cout<<"请选择:";
	SetConsoleTextAttribute(hStdOut,FOREGROUND_RED);

Input:
	ucSelection=getch();
	if(ucSelection<'1' || ucSelection>'7')
		goto Input;

	putchar(ucSelection);
	getch();
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	switch(ucSelection)
	{
	case '1':
		LoadStudInfo();
		break;

	case '2':
		SearchStudInfo();
		break;

	case '3':
		TaxisStudInfo();
		break;

	case '4':
		StatisticsStudInfo();
		break;

	case '5':
		DispHelpInfo();
		break;

	case '6':
		AboutMe();
		break;

	case '7':
		Exit();
		CoolBeep(CB_OK);
		PressAnyKey();
		SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
		break;

	default:
		SelectError();
		PressAnyKey();	
		SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
		break;
	}	

	goto Select;

	return nRetCode;
}

//加载学生信息
void LoadStudInfo()
{
	CString strStudInfoFile;
	char* pStudInfoFile;
	CFileDialog m_OpenDlg(TRUE,NULL,"学生信息\\StudInfo.txt",0,"任何文件(*.*)|*.*||");
	
	if(m_OpenDlg.DoModal()==IDOK) 
	{
		strStudInfoFile=m_OpenDlg.GetPathName();
		pStudInfoFile=(LPSTR)(LPCTSTR)strStudInfoFile;
	}
	else
	{
		SetConsoleTextAttribute(hStdOut,0x0005);
		cout<<endl<<endl<<"你取消了打开文件!"<<endl;		
		PressAnyKey();
		SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
		return;
	}

	if(!GetStudInfo(pStudInfoFile))
	{
		SetConsoleTextAttribute(hStdOut,0x0005);
		cout<<endl<<endl<<"打开文件失败!"<<endl;
		CoolBeep(CB_ERROR);
		PressAnyKey();
		SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
		return;
	}

	bIsLoaded=true;

	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl<<endl<<"学生信息加载成功!"<<endl;
	CoolBeep(CB_OK);
	PressAnyKey();
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);		
}

void SearchStudInfo()
{
	SetConsoleTextAttribute(hStdOut,0x0005);
	if(!bIsLoaded)
	{
		cout<<endl<<endl<<"请先加载学生信息!"<<endl;
		CoolBeep(CB_ERROR);
		PressAnyKey();
		SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
		return;
	}	
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	system("cls");
	UCHAR ucSelection;//选择号

Select:
	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<<"请选择:";
	SetConsoleTextAttribute(hStdOut,FOREGROUND_RED);

Input:
	ucSelection=getch();
	if(ucSelection<'1' || ucSelection>'9')
		goto Input;

	putchar(ucSelection);
	getch();
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	switch(ucSelection)
	{
	case '1':
		SetConsoleTextAttribute(hStdOut,0x0005);
		DispAllStudInfo(SPECIAL_NONE);
		CoolBeep(CB_OK);
		break;

	case '2':
		SearchByStudNum();
		break;

	case '3':
		SearchByName();
		break;

	case '4':
		SearchBySex();
		break;

	case '5':
		SearchByGradeCourse();
		break;

	case '6':
		SearchByTeacher();
		break;

	case '7':
		SearchByCourse();
		break;

	case '8':
		system("cls");
		return;
		break;

	case '9':
		Exit();
		CoolBeep(CB_OK);
		break;

	default:
		SelectError();
		break;
	}
	PressAnyKey();
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	goto Select;
}

//学生信息排序系统
void TaxisStudInfo()
{
	SetConsoleTextAttribute(hStdOut,0x0005);
	if(!bIsLoaded)
	{
		cout<<endl<<endl<<"请先加载学生信息!"<<endl;
		CoolBeep(CB_ERROR);
		PressAnyKey();
		SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
		return;
	}
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	system("cls");
	UCHAR ucSelection;//选择号

Select:
	cout<<"                         学生信息排序系统"<<endl;
	cout<<"                    1-----------------按学号排序"<<endl;
	cout<<"                    2-----------------按年龄排序"<<endl;
	cout<<"                    3-----------------按总成绩排序"<<endl;
	cout<<"                    4-----------------返回主菜单"<<endl;
	cout<<"                    5-----------------退出系统"<<endl;
	cout<<"请选择:";

	SetConsoleTextAttribute(hStdOut,FOREGROUND_RED);

Input:
	ucSelection=getch();
	if(ucSelection<'1' || ucSelection>'5')
		goto Input;

	putchar(ucSelection);
	getch();
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	switch(ucSelection)
	{
	case '1':
		TaxisByStudNum();
		break;

	case '2':
		TaxisByAge();
		break;

	case '3':
		TaxisByAllMark();
		break;

	case '4':
		system("cls");
		return;
		break;

	case '5':
		Exit();
		break;

	default:
		SelectError();
		break;
	}
	CoolBeep(CB_OK);
	PressAnyKey();
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
	goto Select;
}

void TaxisByStudNum()
{
	CTaxis taxis(pStudInfo,TAXISBY_STUDNUM);

	DispAllStudInfo(SPECIAL_STUDNUM);
}

void TaxisByAge()
{
	CTaxis taxis(pStudInfo,TAXISBY_AGE);

	DispAllStudInfo(SPECIAL_AGE);
}

void TaxisByAllMark()
{
	CTaxis taxis(pStudInfo,TAXISBY_ALLMARK);

	DispAllStudInfo(SPECIAL_MARK);
}

void StatisticsStudInfo()
{
	SetConsoleTextAttribute(hStdOut,0x0005);
	if(!bIsLoaded)
	{
		cout<<endl<<endl<<"请先加载学生信息!"<<endl;
		CoolBeep(CB_ERROR);
		PressAnyKey();
		SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
		return;
	}
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
	
	system("cls");
	UCHAR ucSelection;//选择号

Select:
	cout<<"                         学生信息统计系统"<<endl;
	cout<<"                    1-----------------男女生人数"<<endl;
	cout<<"                    2-----------------各人平均成绩"<<endl;
	cout<<"                    3-----------------年级平均年龄"<<endl;
	cout<<"                    4-----------------各门课平均成绩"<<endl;
	cout<<"                    5-----------------返回主菜单"<<endl;
	cout<<"                    6-----------------退出系统"<<endl;
	cout<<"请选择:";
	SetConsoleTextAttribute(hStdOut,FOREGROUND_RED);

Input:
	ucSelection=getch();
	if(ucSelection<'1' || ucSelection>'6')
		goto Input;

	putchar(ucSelection);
	getch();
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	switch(ucSelection)
	{
	case '1':
		StatisticsBoyGirlCount();
		break;

	case '2':
		StatisticsPersonAverageMark();
		break;

	case '3':
		StatisticsGradeAverageAge();
		break;

	case '4':
		StatisticsCourseAverageMark();
		break;

	case '5':
		system("cls");
		return;
		break;

	case '6':
		Exit();
		break;

	default:
		SelectError();
		break;
	}
	CoolBeep(CB_OK);
	PressAnyKey();
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	goto Select;
}

void StatisticsBoyGirlCount()
{
	UINT i;
	UINT uiBoyCount=0,uiGirlCount=0;

	for(i=0;i<10;i++)
		if(!strcmp(pStudInfo[i].pSex,"男") || !strcmp(pStudInfo[i].pSex,"M") || !strcmp(pStudInfo[i].pSex,"m"))
			uiBoyCount++;
		else
			uiGirlCount++;

	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl<<endl;
	cout<<"男生数:"<<uiBoyCount<<endl;
	cout<<"女生数:"<<uiGirlCount<<endl;
}

void StatisticsPersonAverageMark()
{
	UINT i;
	float uiTemp;

	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl<<endl;
	printf("%-10s%-8s\n","姓名","平均成绩");	
	for(i=0;i<10;i++)
	{
		uiTemp=(pStudInfo[i].pCourseInfo->uiMark+pStudInfo[i].pCourseInfo->pNext->uiMark)*1.0/2;
		printf("%-10s%-8f\n",pStudInfo[i].pName,uiTemp);
	}
}

void StatisticsGradeAverageAge()
{
	int pGrade[10];			   //年级数组
	UINT pGradeAllAge[10]={0}; //各年级总年龄
	UINT pStudCount[10]={0};   //各年级人数
	float pGradeAverageAge[10];//各年级平均年龄
	UINT i,j,uiPos=0;
	bool bIsFind;
	UINT uiCount=0;
	
	//初始化
	for(i=0;i<10;i++)
		pGrade[i]=-1;

	for(i=0;i<10;i++)
	{
		bIsFind=false;

		//分析该学生所在年级是否已在年级数组
		for(j=0;j<10;j++)
			if(GetGrade(pStudInfo[i].uiStudNum)==pGrade[j])
			{
				bIsFind=true;
				break;
			}

		if(!bIsFind)
		{
			pGrade[uiPos]=GetGrade(pStudInfo[i].uiStudNum);
			pGradeAllAge[uiPos]=pStudInfo[i].uiAge;
			pStudCount[uiPos]=1;
			uiPos++;			
		}
		else
		{
			pStudCount[j]++;
			pGradeAllAge[j]+=pStudInfo[i].uiAge;
		}
	}

	for(i=0;i<uiPos;i++)
		pGradeAverageAge[i]=pGradeAllAge[i]*1.0/pStudCount[i];

	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl<<endl;
	printf("%-8s%-8s\n","年级","平均年龄");
	for(i=0;i<uiPos;i++)
		if(pGrade[i]>9)
			printf("%-8d%-8f\n",pGrade[i],pGradeAverageAge[i]);
		else
			printf("0%-7d%-8f\n",pGrade[i],pGradeAverageAge[i]);
}

void StatisticsCourseAverageMark()
{
	UINT pCourseAllMark[20]={0}; //各门课总分
	float pCourseAverageMark[20];//各门课平均分
	UINT pStudCount[10]={0};     //各门课人数
	char* pCourse[20]={NULL};    //各门课数组
	UINT i,j;
	bool bIsFind1,bIsFind2;
	UINT uiPos=0;

	for(i=0;i<10;i++)
	{
		bIsFind1=false;
		bIsFind2=false;

		//分析该学生的课程1是否已在课程数组
		for(j=0;j<20;j++)
			if(pCourse[j]!=NULL)
				if(!strcmp(pCourse[j],pStudInfo[i].pCourseInfo->pCourse))
			{
				bIsFind1=true;
				break;
			}
				
		if(!bIsFind1)
		{
			pCourse[uiPos]=pStudInfo[i].pCourseInfo->pCourse;
			pCourseAllMark[uiPos]=pStudInfo[i].pCourseInfo->uiMark;
			pStudCount[uiPos]=1;
			uiPos++;
		}
		else
		{
			pStudCount[j]++;
			pCourseAllMark[j]+=pStudInfo[i].pCourseInfo->uiMark;
		}

		//分析该学生的课程2是否已在课程数组
		for(j=0;j<20;j++)
			if(pCourse[j]!=NULL)
				if(!strcmp(pCourse[j],pStudInfo[i].pCourseInfo->pNext->pCourse))
			{
				bIsFind2=true;
				break;
			}
				
		if(!bIsFind2)
		{
			pCourse[uiPos]=pStudInfo[i].pCourseInfo->pNext->pCourse;
			pCourseAllMark[uiPos]=pStudInfo[i].pCourseInfo->pNext->uiMark;
			pStudCount[uiPos]=1;
			uiPos++;
		}
		else
		{
			pStudCount[j]++;
			pCourseAllMark[j]+=pStudInfo[i].pCourseInfo->pNext->uiMark;
		}
	}

	for(i=0;i<uiPos;i++)
		pCourseAverageMark[i]=pCourseAllMark[i]*1.0/pStudCount[i];

	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl<<endl;
	printf("%-8s%-8s\n","课程","平均成绩");
	for(i=0;i<uiPos;i++)
		printf("%-8s%-8f\n",pCourse[i],pCourseAverageMark[i]);
}

bool GetStudInfo(FILENAME* pFile)
{
	COURSEINFO* pCourseInfo;
	COURSEINFO* pNext;
	FILE* fp;
	UINT i;
	UINT uiHashAddr;   //哈希地址
	char pName[10];    //姓名
	UINT uiStudNum;    //学号,规定为9位,如080210114
	UINT uiAge;        //年龄

⌨️ 快捷键说明

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