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

📄 studinfomanager.cpp

📁 一个DOS下的学生信息管理系统,使用了多中数值算法,有HASH查找,归并排序,快速排序,对排序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	char pSex[2];      //性别
	char pCourse1[10]; //课程名
	UINT uiMark1;      //成绩
	char pTeacher1[10];//教师
	char pCourse2[10]; //课程名
	UINT uiMark2;      //成绩
	char pTeacher2[10];//教师

	fp=fopen(pFile,"r");
	if(fp==NULL)
		return false;

	//学号全清零,以便哈希查找
	for(i=0;i<10;i++)
		pStudInfo[i].uiStudNum=0;

	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);
	return true;
}

void PrintStudInfo(STUDINFO studInfo,UINT uiSpecial)
{
	char* pName;       //姓名
	UINT uiStudNum;    //学号,规定为9位,如080210114
	UINT uiAge;        //年龄
	char* pSex;        //性别
	char* pCourse1;    //课程名
	UINT uiMark1;      //成绩
	char* pTeacher1;   //教师
	char* pCourse2;    //课程名
	UINT uiMark2;      //成绩
	char* pTeacher2;   //教师
	
	pName=studInfo.pName;
	uiStudNum=studInfo.uiStudNum;
	uiAge=studInfo.uiAge;
	pSex=studInfo.pSex;
	
	pCourse1=studInfo.pCourseInfo->pCourse;
	uiMark1=studInfo.pCourseInfo->uiMark;
	pTeacher1=studInfo.pCourseInfo->pTeacher;
	
	pCourse2=studInfo.pCourseInfo->pNext->pCourse;
	uiMark2=studInfo.pCourseInfo->pNext->uiMark;
	pTeacher2=studInfo.pCourseInfo->pNext->pTeacher;
	
	switch(uiSpecial)
	{
	case SPECIAL_NONE:
		if(uiStudNum/100000000==0)
			printf("%-10s0%-9d%-5d%-5s%-11s%-5d%-11s%-11s%-5d%-6s",pName,uiStudNum,uiAge,pSex,pCourse1,uiMark1,pTeacher1,pCourse2,uiMark2,pTeacher2);
		else
			printf("%-10s%-9d%-5d%-5s%-11s%-5d%-11s%-11s%-5d%-6s",pName,uiStudNum,uiAge,pSex,pCourse1,uiMark1,pTeacher1,pCourse2,uiMark2,pTeacher2);
		break;

	case SPECIAL_NAME:
		SetConsoleTextAttribute(hStdOut,0x0003);
		printf("%-10s",pName);
		SetConsoleTextAttribute(hStdOut,0x0005);

		if(uiStudNum/100000000==0)
			printf("0%-9d%-5d%-5s%-11s%-5d%-11s%-11s%-5d%-6s",uiStudNum,uiAge,pSex,pCourse1,uiMark1,pTeacher1,pCourse2,uiMark2,pTeacher2);
		else
			printf("%-9d%-5d%-5s%-11s%-5d%-11s%-11s%-5d%-6s",uiStudNum,uiAge,pSex,pCourse1,uiMark1,pTeacher1,pCourse2,uiMark2,pTeacher2);
		break;

	case SPECIAL_STUDNUM:		
		printf("%-10s",pName);
		
		SetConsoleTextAttribute(hStdOut,0x0003);
		if(uiStudNum/100000000==0)
			printf("0%-9d",uiStudNum);
		else
			printf("%-9d",uiStudNum);
		SetConsoleTextAttribute(hStdOut,0x0005);

		printf("%-5d%-5s%-11s%-5d%-11s%-11s%-5d%-6s",uiAge,pSex,pCourse1,uiMark1,pTeacher1,pCourse2,uiMark2,pTeacher2);
		break;

	case SPECIAL_AGE:
		if(uiStudNum/100000000==0)
			printf("%-10s0%-9d",pName,uiStudNum);
		else
			printf("%-10s%-9d",pName,uiStudNum);
		
		SetConsoleTextAttribute(hStdOut,0x0003);
		printf("%-5d",uiAge);
		SetConsoleTextAttribute(hStdOut,0x0005);

		printf("%-5s%-11s%-5d%-11s%-11s%-5d%-6s",pSex,pCourse1,uiMark1,pTeacher1,pCourse2,uiMark2,pTeacher2);
		break;

	case SPECIAL_SEX:
		if(uiStudNum/100000000==0)
			printf("%-10s0%-9d%-5d",pName,uiStudNum,uiAge);
		else
			printf("%-10s%-9d",pName,uiStudNum,uiAge);
		
		SetConsoleTextAttribute(hStdOut,0x0003);
		printf("%-5s",pSex);
		SetConsoleTextAttribute(hStdOut,0x0005);
		
		printf("%-11s%-5d%-11s%-11s%-5d%-6s",pCourse1,uiMark1,pTeacher1,pCourse2,uiMark2,pTeacher2);
		break;
		
	case SPECIAL_COURSE1:
		if(uiStudNum/100000000==0)
			printf("%-10s0%-9d%-5d%-5s",pName,uiStudNum,uiAge,pSex);
		else
			printf("%-10s%-9d%-5d%-5s",pName,uiStudNum,uiAge,pSex);
		
		SetConsoleTextAttribute(hStdOut,0x0003);
		printf("%-11s",pCourse1);
		SetConsoleTextAttribute(hStdOut,0x0005);
		
		printf("%-5d%-11s%-11s%-5d%-6s",uiMark1,pTeacher1,pCourse2,uiMark2,pTeacher2);
		break;
		
	case SPECIAL_TEACHER1:
		if(uiStudNum/100000000==0)
			printf("%-10s0%-9d%-5d%-5s%-11s%-5d",pName,uiStudNum,uiAge,pSex,pCourse1,uiMark1);
		else
			printf("%-10s%-9d%-5d%-5s%-11s%-5d",pName,uiStudNum,uiAge,pSex,pCourse1,uiMark1);
		
		SetConsoleTextAttribute(hStdOut,0x0003);
		printf("%-11s",pTeacher1);
		SetConsoleTextAttribute(hStdOut,0x0005);
		
		printf("%-11s%-5d%-6s",pCourse2,uiMark2,pTeacher2);
		break;
		
	case SPECIAL_COURSE2:
		if(uiStudNum/100000000==0)
			printf("%-10s0%-9d%-5d%-5s%-11s%-5d%-11s",pName,uiStudNum,uiAge,pSex,pCourse1,uiMark1,pTeacher1);
		else
			printf("%-10s%-9d%-5d%-5s%-11s%-5d%-11s",pName,uiStudNum,uiAge,pSex,pCourse1,uiMark1,pTeacher1);
		
		SetConsoleTextAttribute(hStdOut,0x0003);
		printf("%-11s",pCourse2);
		SetConsoleTextAttribute(hStdOut,0x0005);
		
		printf("%-5d%-6s",uiMark2,pTeacher2);
		break;
		
	case SPECIAL_TEACHER2:
		if(uiStudNum/100000000==0)
			printf("%-10s0%-9d%-5d%-5s%-11s%-5d%-11s%-11s%-5d",pName,uiStudNum,uiAge,pSex,pCourse1,uiMark1,pTeacher1,pCourse2,uiMark2);
		else
			printf("%-10s%-9d%-5d%-5s%-11s%-5d%-11s%-11s%-5d",pName,uiStudNum,uiAge,pSex,pCourse1,uiMark1,pTeacher1,pCourse2,uiMark2);
		
		SetConsoleTextAttribute(hStdOut,0x0003);
		printf("%-6s",pTeacher2);
		SetConsoleTextAttribute(hStdOut,0x0005);
		break;
		
	case SPECIAL_MARK:
		if(uiStudNum/100000000==0)
			printf("%-10s0%-9d%-5d%-5s%-11s",pName,uiStudNum,uiAge,pSex,pCourse1);
		else
			printf("%-10s%-9d%-5d%-5s%-11s",pName,uiStudNum,uiAge,pSex,pCourse1);
		
		SetConsoleTextAttribute(hStdOut,0x0003);
		printf("%-5d",uiMark1);
		SetConsoleTextAttribute(hStdOut,0x0005);
		
		printf("%-11s%-11s",pTeacher1,pCourse2);

		SetConsoleTextAttribute(hStdOut,0x0003);
		printf("%-5d",uiMark2);
		SetConsoleTextAttribute(hStdOut,0x0005);

		printf("%-6s",pTeacher2);
		break;
		
	default:
		break;
	}

	cout<<endl;
}

//退出系统
void Exit()
{
	if(MessageBox(NULL,"你真的要退出吗?","退出系统",MB_ICONQUESTION | MB_YESNO | MB_DEFBUTTON2)==IDYES)
	{
		MessageBox(NULL,"谢谢使用本系统!","谢谢使用",MB_ICONINFORMATION);
		exit(0);
	}
	
	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl<<endl<<"你取消了退出!"<<endl;
}

void PressAnyKey()
{
	cout<<endl<<"请按任意键继续...";
	getch();
	cout<<endl<<endl;
}

//关于我
void AboutMe()       
{
	char pAuthorInfo[]="作者:陶善文\n学号:080210114\nEMail:ahei080210114@hotmail.com\n个人主页:http://earth.prohosting.com/ahei\n";

	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl<<endl;
	AnimatePrint(pAuthorInfo);
	CoolBeep(CB_OK);
	PressAnyKey();
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
}

//显示帮助信息
void DispHelpInfo()
{
	char pHelpInfo[]="\n\n本系统启动后,会显示如下信息:\n                         学生信息管理系统\n                    1-----------------学生信息加载系统\n                    2-----------------学生信息查询系统\n                    3-----------------学生信息排序系统\n                    4-----------------学生信息统计系统\n                    5-----------------帮助主题\n                    6-----------------关于作者\n                    7-----------------退出系统\n请选择:\n";

	SetConsoleTextAttribute(hStdOut,0x0005);
	AnimatePrint(pHelpInfo);
	SetConsoleTextAttribute(hStdOut,0x0005);
	CoolBeep(CB_OK);
	PressAnyKey();
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);
}

void DispAllStudInfo(UINT uiSpecial)
{
	UINT i;

	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl<<endl;
	printf("%-10s%-10s%-5s%-5s%-11s%-5s%-11s%-11s%-5s%-6s","姓名","学号","年龄","性别","课程","成绩","教师","课程","成绩","教师");
	cout<<endl;
	for(i=0;i<10;i++)
		PrintStudInfo(pStudInfo[i],uiSpecial);
}

void SearchByStudNum()
{
	UINT uiStudNum;

	cout<<endl<<endl<<"请输入你要查找的学号:";
	SetConsoleTextAttribute(hStdOut,FOREGROUND_RED);
	cin>>uiStudNum;
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	UINT uiAddr=(uiStudNum-uiStudNum/1000*1000)%11;
	UINT uiAddrBkUp=uiAddr;
	bool bIsFind=true;

	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl;
	if(pStudInfo[uiAddr].uiStudNum==uiStudNum)
	{
		PrintStudInfo(pStudInfo[uiAddr],SPECIAL_STUDNUM);
		CoolBeep(CB_OK);
		return;
	}
	else
		while(pStudInfo[uiAddr].uiStudNum!=uiStudNum)
		{
			uiAddr=(uiAddr+1)%10;
			if(uiAddr==uiAddrBkUp)
			{
				bIsFind=false;
				break;
			}
		}

	if(!bIsFind)
	{
		cout<<"查无此人!"<<endl;
		CoolBeep(CB_ERROR);
		return;	
	}

	PrintStudInfo(pStudInfo[uiAddr],SPECIAL_STUDNUM);
	CoolBeep(CB_OK);
}

void SearchByName()
{
	UINT i;
	char pInName[10];
	char pNameTemp[10];
	bool bIsFind=false;
	
	cout<<endl<<endl<<"请输入你要查找的学生姓名:";
	SetConsoleTextAttribute(hStdOut,FOREGROUND_RED);
	cin>>pInName;
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl;
	for(i=0;i<10;i++)
	{
		strcpy(pNameTemp,pStudInfo[i].pName);

		if(!strcmp(strupr(pNameTemp),strupr(pInName)))
		{
			bIsFind=true;
			PrintStudInfo(pStudInfo[i],SPECIAL_NAME);			
		}
	}

	if(!bIsFind)
	{
		cout<<"查无此人!"<<endl;
		CoolBeep(CB_ERROR);
	}
	else
		CoolBeep(CB_OK);
}

void SearchBySex()
{
	char pInSex[2];
	char pSexTemp[2];
	UINT i;
	bool bIsFind=false;

	cout<<endl<<endl<<"请输入你要查找的性别:";
	SetConsoleTextAttribute(hStdOut,FOREGROUND_RED);
	cin>>pInSex;
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	SetConsoleTextAttribute(hStdOut,0x0005);
	if(!strcmp(pInSex,"男") || !strcmp(strupr(pInSex),"M"))
		strcpy(pInSex,"M");
	else
		if(!strcmp(pInSex,"女") || !strcmp(strupr(pInSex),"F"))
			strcpy(pInSex,"F");
		else
		{
			cout<<endl<<"好像世界上没有这种性别的人吧!"<<endl;
			CoolBeep(CB_ERROR);
			return;
		}

	cout<<endl;
	for(i=0;i<10;i++)
	{
		strcpy(pSexTemp,pStudInfo[i].pSex);
		if(!strcmp(strupr(pSexTemp),pInSex))
		{
			bIsFind=true;
			PrintStudInfo(pStudInfo[i],SPECIAL_SEX);			
		}
	}
	CoolBeep(CB_OK);

	if(!bIsFind)
	{
		cout<<endl<<"没有找到此种性别的学生!"<<endl;
		CoolBeep(CB_ERROR);
	}
}

void SearchByGradeCourse()
{
	UINT i,j;
	UINT uiGrade;			 //要查找的年级
	char* pCourse[20]={NULL};//该年级课程
	bool bIsFind1,bIsFind2;
	UINT uiCount=0;
	UINT uiPos=0;
	bool bIsFind=false;
	
	cout<<endl<<endl<<"请输入你要查找的年级:";
	SetConsoleTextAttribute(hStdOut,FOREGROUND_RED);
	cin>>uiGrade;
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	SetConsoleTextAttribute(hStdOut,0x0005);
	for(i=0;i<10;i++)
	{
		bIsFind1=false;
		bIsFind2=false;

		if(GetGrade(pStudInfo[i].uiStudNum)!=uiGrade)
			continue;

		//----------该学生符合所输入的年级----------
		bIsFind=true;
		for(j=0;j<20;j++)
			if(pCourse[j]!=NULL)
				if(!strcmp(pStudInfo[i].pCourseInfo->pCourse,pCourse[j]))
				{
					bIsFind1=true;
					break;
				}

		if(!bIsFind1)
		{
			pCourse[uiPos]=pStudInfo[i].pCourseInfo->pCourse;
			uiPos++;
		}

		for(j=0;j<20;j++)
			if(pCourse[j]!=NULL)
				if(!strcmp(pStudInfo[i].pCourseInfo->pNext->pCourse,pCourse[j]))
				{
					bIsFind2=true;
					break;
				}

		if(!bIsFind2)
		{
			pCourse[uiPos]=pStudInfo[i].pCourseInfo->pNext->pCourse;
			uiPos++;
		}
		//------------------------------------------
	}

	if(!bIsFind)
	{
		cout<<endl<<"没有该年级的学生!"<<endl;
		CoolBeep(CB_ERROR);
		return;
	}

	cout<<endl<<"该年级课程有:"<<endl;
	for(i=0;i<uiPos;i++)
		cout<<pCourse[i]<<endl;
	CoolBeep(CB_OK);
}

void SearchByCourse()
{
	char pInCourse[10];
	char pCourseTemp1[10];
	char pCourseTemp2[10];
	UINT i;
	bool bIsFind=false;

	cout<<endl<<endl<<"请输入你要查找的课程:";
	SetConsoleTextAttribute(hStdOut,FOREGROUND_RED);
	cin>>pInCourse;
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl;
	for(i=0;i<10;i++)
	{
		strcpy(pCourseTemp1,pStudInfo[i].pCourseInfo->pCourse);
		strcpy(pCourseTemp2,pStudInfo[i].pCourseInfo->pNext->pCourse);

		if(!strcmp(strupr(pCourseTemp1),strupr(pInCourse)))
		{
			bIsFind=true;
			PrintStudInfo(pStudInfo[i],SPECIAL_COURSE1);		
		}

		if(!strcmp(strupr(pCourseTemp2),strupr(pInCourse)))
		{
			bIsFind=true;
			PrintStudInfo(pStudInfo[i],SPECIAL_COURSE2);
		}
	}

	if(!bIsFind)
	{
		cout<<"没有学生选修该门课程!"<<endl;
		CoolBeep(CB_ERROR);
	}
	else
		CoolBeep(CB_OK);
}

void SearchByTeacher()
{
	UINT i;
	bool bIsFind=false;
	char pTeacher[10];
	char pTeacherTemp1[10];
	char pTeacherTemp2[10];

	cout<<endl<<endl<<"请输入教师姓名:";
	SetConsoleTextAttribute(hStdOut,FOREGROUND_RED);
	cin>>pTeacher;
	SetConsoleTextAttribute(hStdOut,FOREGROUND_GREEN);

	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl;
	for(i=0;i<10;i++)
	{
		strcpy(pTeacherTemp1,pStudInfo[i].pCourseInfo->pTeacher);
		strcpy(pTeacherTemp2,pStudInfo[i].pCourseInfo->pNext->pTeacher);

		if(!strcmp(strupr(pTeacherTemp1),strupr(pTeacher))) 
		{
			bIsFind=true;
			PrintStudInfo(pStudInfo[i],SPECIAL_TEACHER1);
		}

		if(!strcmp(strupr(pTeacherTemp2),strupr(pTeacher))) 
		{
			bIsFind=true;
			PrintStudInfo(pStudInfo[i],SPECIAL_TEACHER2);			
		}
	}

	if(!bIsFind)
	{
		cout<<"没有学生听该教师的课!"<<endl;
		CoolBeep(CB_ERROR);
	}
	else
		CoolBeep(CB_OK);
}

UINT GetGrade(UINT uiStudNum)
{
	return (uiStudNum/100000)%100;
}

UINT 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 SelectError()
{
	SetConsoleTextAttribute(hStdOut,0x0005);
	cout<<endl<<endl<<"选择错误!"<<endl;
	CoolBeep(CB_ERROR);
}

void CoolBeep(UINT uiCbSort)
{
	switch(uiCbSort)
	{
	case CB_ERROR:
		Beep(410,150);
		break;
		
	case CB_OK:
		//声音1
		Beep(2000,30);
		Sleep(100);
		Beep(2000,30);
		Sleep(100);
		Beep(2000,30);
		
		//声音2
		/*	Beep(3000,150);
		Sleep(50);
		Beep(3000,150);*/
		break;

	default:
		break;
	}
	
}

void AnimatePrint(char* pStr)
{
	UINT i;

	for(i=0;i<strlen(pStr);i++)
	{
		cout<<pStr[i];
		Sleep(20);
	}
}

⌨️ 快捷键说明

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