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

📄 wenjianbaocun.c

📁 自己写的简易学生信息管理系统,有很多不足,希望高手多多指教
💻 C
📖 第 1 页 / 共 3 页
字号:
{
	int i,width;
	char key;
	struct StudentNode *pStat=NULL;
	char menulist[9][80]=
	{	
			"1.   Stat Total Top Three",
			"2.   Stat Chinese Top Three",
			"3.   Stat English Top Three",
			"4.   Stat Math Top Three",
			"5.   Stat Phogric  Top Three",
			"6.   Stat Chemical Top Three",
			"7.   Stat Singal Course Avgscore",
			"0.   Return ",
			"Please Make a choices[0-7]:"
	};
	system("cls");
	UpdataTitle("Stat Data");
	width=(80-strlen(menulist[6]))/2;
	if(head==NULL)
	{
		GoToXY(0,20);
		ShowMessage("System have not data\n");
		ShowMessage("press any key to continue");
		getch();
		ClearMessage();
		return;
	}
	GoToXY(0,5);
	for(i=0;i<9;i++)
	{
		printf("\n%*s%s",width," ",menulist[i]);
	}
	do{
		
		key=getche();
		if(key>='0'&& key<='7')
		{
			break;
		}
		else
		{
			GoToXY(0,20);
			ShowMessage("Menu item error,allow[0-7]\n");
			ShowMessage("please press any key to continue");
			getch();
			ClearMessage();
			GoToXY(52,13);
			ProductSpace(1);
			GoToXY(52,13);
		}
		
	}while(1);
	switch(key)
	{
	case '0': return;
	case '1': StatTotal(pStat);break;
	case '2': StatChinese(pStat);break;
	case '3': StatEnglish(pStat);break;
	case '4': StatMath(pStat);break;
	case '5': StatPhogric(pStat);break;
	case '6': StatChemical(pStat);break;
	case '7': StatCourseAvg();
	}			
	GoToXY(0,20);
	ShowMessage("Stat Data Success");
	ShowMessage("Press any key to continue");
	getch();
	ClearMessage();
}

//======================================================================
/*
	function:统计各科成绩的平均分
	param: 
	return: 
*/

void StatCourseAvg(	)
{
	float avg[5];
	int total[5]={0};
	int i;
	struct StudentNode* p=NULL;
	p=(struct StudentNode*)malloc(sizeof(struct StudentNode));

	system("cls");
	UpdataTitle("Stat Course Avg");
	p=head;
	if(p!=NULL)//申请空间成功
	{
		
		for(i=0;i<5;i++)
		{	
			for(p=head;p!=NULL;p=p->next)
			{
				total[i]+=p->info.score[i];
			}	
			avg[i]=(float)total[i]/count;
		}
		
	}
	GoToXY(5,5);
	ShowMessage("   Chinese  English  Math  Phogric  Chemical");
	GoToXY(5,7);
	printf("   %-7.1f  %-7.1f  %-4.1f  %-7.1f  %-8.1f",avg[0],avg[1],avg[2],avg[3],avg[4]);

}
//======================================================================
/*
	function:显示化学成绩前三甲
	param: *pStat 学生临时链表
	return: 
*/
void StatChemical(struct StudentNode*pStat)
{
	int i,top3Count;
	pStat=head;
	system("cls");
	UpdataTitle("Chemical Top Three");

	SortAvgDesc(4);
	top3Count=StatScoreiTop3Count(4);
	GoToXY(0,4);
	i=0;
	PrintLine();
	putchar('\n');
	for(pStat=head;pStat!=NULL;pStat=pStat->next)
	{
		PrintOneStu(pStat);
		i++;
		if(i<top3Count)
		{
			continue;
		}
		break;
		
	}	
}
//======================================================================
/*
	function:显示物理成绩前三甲
	param: *pStat 学生临时链表
	return: 
*/
void StatPhogric(struct StudentNode*pStat)
{
	int i,top3Count;
	pStat=head;
	system("cls");
	UpdataTitle("Phogric Top Three");
	
	SortAvgDesc(3);
	top3Count=StatScoreiTop3Count(3);
	GoToXY(0,4);
	i=0;
	PrintLine();
	putchar('\n');
	for(pStat=head;pStat!=NULL;pStat=pStat->next)
	{
		PrintOneStu(pStat);
		i++;
		if(i<top3Count)
		{
			continue;
		}
		break;
		
	}	
	
}
//======================================================================
/*
	function:显示数学成绩前三甲
	param: *pStat 学生临时链表
	return: 
*/
void StatMath(struct StudentNode*pStat)
{
	int i,top3Count;
	pStat=head;
	system("cls");
	UpdataTitle("Math Top Three");
	
	SortAvgDesc(2);
	top3Count=StatScoreiTop3Count(2);
	GoToXY(0,4);
	i=0;
	PrintLine();
	putchar('\n');
	for(pStat=head;pStat!=NULL;pStat=pStat->next)
	{
		PrintOneStu(pStat);
		i++;
		if(i<top3Count)
		{
			continue;
		}
		break;
		
	}	

}
//======================================================================
/*
	function:显示英文成绩前三甲
	param: *pStat 学生临时链表
	return: 
*/
void StatEnglish(struct StudentNode*pStat)
{
	int i,top3Count;
	pStat=head;
	system("cls");
	UpdataTitle("English Top Three");
	
	
	SortAvgDesc(1);
	top3Count=StatScoreiTop3Count(1);
	GoToXY(0,4);
	i=0;
	PrintLine();
	putchar('\n');
	for(pStat=head;pStat!=NULL;pStat=pStat->next)
	{
		PrintOneStu(pStat);
		i++;
		if(i<top3Count)
		{
			continue;
		}
		break;
		
	}
	
}

//======================================================================
/*
	function:显示语文成绩前三甲
	param: *pStat 学生临时链表
	return: 
*/
void StatChinese(struct StudentNode*pStat)
{
	int i,top3Count;
	pStat=head;
	system("cls");
	UpdataTitle("Chinese Top Three");
	
	SortAvgDesc(0);
	top3Count=StatScoreiTop3Count(0);
	GoToXY(0,4);
	i=0;
	PrintLine();
	putchar('\n');
	for(pStat=head;pStat!=NULL;pStat=pStat->next)
	{
		PrintOneStu(pStat);
		i++;
		if(i<top3Count)
		{
			continue;
		}
		break;
		
	}
	
}

//======================================================================
/*
	function:显示总分前三甲
	param: *pStat 学生临时链表
	return: 
*/
void StatTotal(struct StudentNode*pStat)
{
	int i,top3Count;
	pStat=head;
	system("cls");
	UpdataTitle("Total Top Three");
	
	TotalScoreDesc();
	top3Count=StatTotalTop3Count();
	GoToXY(0,4);
	i=0;
	PrintLine();
	putchar('\n');
	for(pStat=head;pStat!=NULL;pStat=pStat->next)
	{
		PrintOneStu(pStat);
		i++;
		if(i<top3Count)
		{
			continue;
		}
		break;
		
	}	
}
//======================================================================
/*
	function:各科平均分降序排
	param: i 成绩的下标 0 chinese 1 English 2 Math 3Phogric 4 Chemical
	return: 
*/
void SortAvgDesc(int i)
{
	struct StudentData temp;
	struct StudentNode *p,*q,*k;
	p=(struct StudentNode*)malloc(sizeof (struct StudentNode));
	
	if(p!=NULL)
	{
		p=head;
		
		for(p=head->next;p!=NULL;p=p->next)
		{	
			for(q=head;q<p;q=q->next)
			{
				if(q->info.score[i] < p->info.score[i])
				{	
					temp=p->info;
					for(k=p;k>q;k=k->pre)
					{
						k->info=k->pre->info;
					}
					q->info=temp;
					break;
				}
			}
		}
	}
	free(p);
}
//======================================================================
/*
	function:统计每门学科前三的学生数
	param: 
	return: 返回top3count的值,即前三的总个数,至少为1
*/
int StatScoreiTop3Count(int k)
{
	int first=1,second=0,topCount=1;
	struct StudentNode *p=head;
	if(count<=3)
	{
		return count;
	}
	p=p->next;
	while(p!=NULL)
	{
		if(p->pre->info.score[k] == p->info.score[k])//统计第一名的个数
		{
			first++;
			topCount++;
			p=p->next;
			continue;
		}
		if(first<3)//第一名不满三个时,加第二名
		{
			second++;
			topCount++;
			p=p->next;
			while(p!=NULL)
			{
				if(p->pre->info.score[k] == p->info.score[k])//是否于第二名相等
				{
					second++;
					topCount++;
					p=p->next;
					continue;
				}
				if(first+second>=3)//如果第一加第三满3个,则跳出不在输入第三名
				{
					break;
				}
				//---------------------第一跟第二名各一个时,查找第三名--------------
				else
				{
					topCount++;
					while(p!=NULL)
					{
						if(p->pre->info.score[k] == p->info.score[k])
						{
							topCount++;
							p=p->next;
							continue;
						}
						else
						{
							break;
						}
					}break;
				}	
		}
	}break;
}
return topCount;
}


//======================================================================
/*
function:统计总分前三的学生数
param: 
return: 返回top3count的值,即前三的总个数,至少为1
*/
int StatTotalTop3Count()
{
	int first=1,second=0,topCount=1;
	struct StudentNode *p=head;
	if(count<=3)
	{
		return count;
	}
	p=p->next;
	while(p!=NULL)
	{
		if(p->pre->info.total == p->info.total)//统计第一名的个数
		{
			first++;
			topCount++;
			p=p->next;
			continue;
		}
		if(first<3)//第一名不满三个时,加第二名
		{
			second++;
			topCount++;
			p=p->next;
			while(p!=NULL)
			{
				if(p->pre->info.total == p->info.total)//是否于第二名相等
				{
					second++;
					topCount++;
					p=p->next;
					continue;
				}
				if(first+second>=3)//如果第一加第三满3个,则跳出不在输入第三名
				{
					break;
				}
				//---------------------第一跟第二名各一个时,查找第三名--------------
				else
				{
					topCount++;
					while(p!=NULL)
					{
						if(p->pre->info.total == p->info.total)
						{
							topCount++;
							p=p->next;
							continue;
						}
						else
						{
							break;
						}
					}break;
				}	
			}
		}break;
	}
	return topCount;
}

//------------------------删除记录------------------------
/*
	function:删除一个指定的学生
	param: *p 结构体指针
	return: 
*/
void DeleteData(struct StudentNode*p)
{	
	char key;
	system("cls");
	UpdataTitle("Stat Student Data");
	putchar('\n');
	if(p==NULL)
	{
		GoToXY(0,20);
		ShowMessage("Have no Record \n");
		ShowMessage("Press any key to continue");
		getch();
		return;
	}
	PrintLine();
	PrintOneStu(p);
	GoToXY(0,10);
	ShowMessage("Are you sure delete this record(Y/N):");
	do
	{
		key=getche();
		if(GetYN(key)==1)
		{
			if(key=='Y'||key=='y')
			{
				if(p == head)
				{
					head = p->next;
					head->pre = NULL;
				}
				else if(p == last)
				{
					p->pre->next=NULL;
				}
				else
				{
					p->pre->next=p->next;
					p->next->pre=p->pre;
				}
				free(p);
				break;
			}
			else
			{
				return;
			}
		}

		else
		{
			GoToXY(0,20);
			ShowMessage("Error:only allow input Y/y/N/n\n");
			ShowMessage("Press any key to continue");
			getch();
			ClearMessage();
			GoToXY(strlen("Are you sure delete this record(Y/N):"),10);
			ProductSpace(1);
			GoToXY(strlen("Are you sure delete this record(Y/N):"),10);
			continue;
		}
	}
	while(1);
	count --;
	USE++;
	saved=NOT_SAVED;
	GoToXY(0,20);
	ShowMessage("Delete Data Success!! \n");
	ShowMessage("Press any key to continue");
	getch();
}
/*
	function:对按姓名查找到的学生做处理(是否要删除)
	param: *q[]结构体指针数组,用来存放查找到的学生记录地址
		   *len  整型的指针标量,用来存放查找到的总记录数
	return: 
*/
void DoName(struct StudentNode *q[],int *len)

{
	int i=0;
	char key1;
	if(len==0)//指针数组长度为空,表示没有查到
	{
		system("cls");
		UpdataTitle("Search Student Info");
		GoToXY(0,20);
		ShowMessage("can not fine the record\n");
		ShowMessage("press any key to continue");
		getch();
		ClearMessage();
		return ;
	}
	else//查到数据,输出所有模糊查找到得学生
	{
		
		system("cls");
		UpdataTitle("Find the Students");//清屏,输出主标题
		putchar('\n');
		PrintLine();//输出列标题
		putchar('\n');	
		while(i<*len)//将查到得学生全部输出
		{
			if(i%CHPAGE==0 && i!=0)//简单分页
			{
				GoToXY(0,20);
				printf("This page is full %d record\n",CHPAGE);
				ShowMessage("Press any key to next Page");
				getch();
				system("cls");
				UpdataTitle("Search By Name");
				GoToXY(0,4);
				PrintLine();
			}
			PrintOneStu(q[i]);//打印学生
			i++;
			continue;
		}
		GoToXY(0,20);//输出查找到的记录数
		printf("Fine %d Record\n",*len);
		ShowMessage("Press any key to continu");
		getch();
		ClearMessage();
		GoToXY(0,16);//询问是否删除记录
		ShowMessage("Do you want to delete the record(Y/N):");
		do
		{
			key1=getche();
			if(GetYN(key1)==1)//输入合法
			{
				if(key1=='Y'||key1=='y')//要删除某条记录
				{
					char no[4];
					GoToXY(15,18);
					ShowMessage("Please Input Sno:");//选择要删除的学生学号
					do {
						GetString(no,3);
						if(JudgeSno(no)==1)//判断学号的合法性
						{	int j=0;
							while(j<*len)
							{
								if(atoi(q[j]->info.sno)==atoi(no)) //匹配学号
								{
									DeleteData(q[j]);//删除记录
									return;	
								}
								j++;
							}
							if(j=*len)//没找到输入的学号
							{
								GoToXY(0,20);
								ShowMessage("Error:This NO is not exist\n");
								ShowMessage("Press any key to continue");
								getch();
								ClearMessage();
								GoToXY(32,18);
								ProductSpace(3);
								GoToXY(32,18);
								continue;  //没在查找的记录中找到相应学号,则继续输入其他学号
							}
							break;
						}
						else//输入学号不合法,要求重新输入学号
						{
							GoToXY(0,20);
							ShowMessage("Sno only allow digit 0-3 bit\n");
							ShowMessage("Press any key to continue");
							getch();
							ClearMessage();
							GoToXY(32,18);
							ProductSpace(3);
							GoToXY(32,18);
						}
					} while(1);	
				}
				else  return;   //不删除记录返回主菜单
			}
			else//输入的判断不合法,跳回重新输入
			{
				GoToXY(0,20);
				ShowMessage("Error:only allow word Y/y/N/n\n");
				ShowMessage("Press any key to continue");
				getch();
				ClearMessage();
				GoToXY(strlen("Do you want to delete this record(Y/N)"),16);
				ProductSpace(1);
				GoToXY(strlen("Do you want to delete this record(Y/N)"),16);
			}
		}while(1);

	}
}
/*
	function:对按学号查找到的学生做处理(是否要删除)
	param: struct Student*q结构体指针,传递查找到的学生
	return: void (无类型)
*/
void DoNO(struct StudentNode *q)
{
	char key;
	if(q==NULL)				//没有找到指定学号的学生
	{
		system("cls");
		UpdataTitle("Search Student Info");
		GoToXY(0,20);
		ShowMessage("can not fine the record\n");
		ShowMessage("press any key to continue");
		getch();
		ClearMessage();
		return ;
	}
	else//找到指定学号的学生
	{	
		system("cls");
		UpdataTitle("Find the Students");
		putchar('\n');
		PrintLine();//输出列标题
		PrintOneStu(q);//打印出这个学生的信息
		GoToXY(0,15);
		ShowMessage("Do you want to Delet Data(Y/N)?");//询问是否要删除该学生:y删除,n返回主菜单
		do{
			key=getche();
			if(GetYN(key)==1)//输入字符合法
			{
				if(key=='Y'||key=='y')
				{
					DeleteData(q);break;// Y删除改学生
				}
				else   //N返回
					return;
			}
			else//输入字符不合法,提示出错,返回继续输入
			{
				GoToXY(0,20);
				ShowMessage("Error:only allow word Y/y/N/n\n");
				ShowMessage("Press any key to continue");
				getch();
				ClearMessage();
				GoToXY(strlen("Do you want to Delet Data(Y/N)?"),15);
				ProductSpace(1);
				GoToXY(strlen("Do you want to Delet Data(Y/N)?"),15);
			}
		}while(1);
	}
}

/*
	function:打印一个学生记录(8项数据)
	param: *q结构体指针,传进一个学生节点的地址
	return: 
*/
void PrintOneStu(struct StudentNode*q)
{
		int total;//存放总分
		float avg;//存放平均值
		total=AccountTotal(q);
		avg=AccountAvg(total);
		q->info.total=total;
		q->info.avg=avg;
		printf("  %3s %-20s %4d %4d %4d %4d %4d %4d %5d %5.1f\n",
			q->info.sno,q->info.name,q->info.age,
			q->info.score[0],q->info.score[1],
			q->info.score[2],q->info.score[3],q->info.score[4],q->info.total,q->info.avg);
}

/*
	function:按姓名查找学生记录
	param: struct Student*temp结构体指针数组,可存放查找到的多个学生的地址
	return: int 返回查找到的学生总数
*/
int SearchByName(struct StudentNode *temp[])
{
	struct StudentNode *p=NULL;
	int safe,i=0;
	char name1[21],name2[21];
	char *pdest;
	char *buffer1,*buffer2;
	system("cls");
	UpdataTitle("Search Student By Name");
	GoToXY(15,10);
	ShowMessage("Please Input Name:");
	do

⌨️ 快捷键说明

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