学生学籍管理系统(带面板)

发布于:2023-07-04 ⋅ 阅读:(91) ⋅ 点赞:(0)

学生学籍管理系统(带面板)【结尾有源码链接】

C语言大作业 学生学籍管理系统,带面板

[外链图片转存中…(img-SUhm4QifnCLAcCL-1627633442038)]在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

0.功能要求

WOBmjK.png

1.结构安排

WOBdHg.png

2.结构体介绍

typedef struct Scores{     //定义分数,包含语数英,以及班级和总分,均为int类型
	int CLASS;			
	int YUWEN;			
	int	MATH;			
	int ENG;			
	int Total; 
}Scores;

typedef struct Students{	//定义学生学籍信息
	char ID[SIZE];			//学号(ID)
	char NAME[SIZE];		//姓名	
	char SEX[SIZE];			//	性别
	char TEL[SIZE];			//号码
	 
	Scores scores;			//分结构数
	
	struct Students * NEXT;	//因为要用链表(单链)储存,此处为指针
	
}Students; 

3.界面介绍

void MAINPAGE()
{
	system("cls");//终端(黑框)清屏
	char c;
	int key = 1,x = 43,y = 7;
	//下面打印最初的主界面
	printf("     --------------------------------------------------------------------------------------------------------------\n");
	printf("     |                                          学生学籍管理系统                                                  |\n");
	printf("     --------------------------------------------------------------------------------------------------------------\n");
	printf("     |           请选择身份:                                                                                      |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                               1.管理员                                                     |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                               2.教师                                                       |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                               3.学生                                                       |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                               4.退出程序                                                   |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                       W S 控制   ENTER  确认               |\n");
	printf("     --------------------------------------------------------------------------------------------------------------\n");
	
    //下面实现选取框操作,通过key来判断用户执行的操作
    
	PrintK(x,y,1);		//默认白框在管理员 
	c = getch();			//读取一个输入 
	c = Change(c);
	
	while(c != 13)	  //'\r'的 ASCII码值 
	{
		
		if(c == 's'&& key <= 4)      		//下移 
		{
			if(key == 4)		//key=4此时框在最下面,应消去,在管理员处打印 
			{
				key=1;
				PrintK(x,y,0);
				y = 7;
				PrintK(x,y,1);
				
			}
			else
			{
				key++;
				PrintK(x,y,0);
				y += 3;
				PrintK(x,y,1);
			}					//框可继续往下移
			 
			
		} 
		
		if(c == 'w'&& key >= 1)      		//上移 
		{
			if(key == 1)		//key=1此时框在最上面,应消去,在退出程序处打印 
			{
				key=4;
				PrintK(x,y,0);
				y = 16;
				PrintK(x,y,1);
				
			}
			else				//框可继续往上移
			{
				key--;
				PrintK(x,y,0);
				y -= 3;
				PrintK(x,y,1);
			}					
		} 	
		c= getch();
		c = Change(c);
	}
    
	//前面读取到用户的操作,加载相应的操作界面
	switch(key)
	{
		case 1: 	Load1();
			break;
		case 2:		Load2();
			break;
		case 3:		S();
			break;
		default :	gotoxy(0,80,0); exit(0); 
			
		
	}	
	
}

4.部分代码说明

4.0)光标和控制台函数

void Color(int c){					//设置颜色
	SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),c);
}

void gotoxy(int x,int y,int flag)			//光标操作 
{
	COORD p;					
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	p.X = x;
	p.Y = y;
	SetConsoleCursorPosition(handle,p);		//移动光标 
	
	if(flag)
	{
		CONSOLE_CURSOR_INFO cursor;		
		cursor.bVisible = TRUE;		//隐藏光标 
		cursor.dwSize = sizeof(cursor);
		SetConsoleCursorInfo(handle,&cursor);		
	}
	else
	{
		CONSOLE_CURSOR_INFO cursor;		
		cursor.bVisible = FALSE;		//隐藏光标 
		cursor.dwSize = sizeof(cursor);
		SetConsoleCursorInfo(handle,&cursor);
	}
}

4.1) 限定用户输入字符个数

void GetS(int x,int y,char s[]) //x,y为光标的左标,s为保存 输入的数组
{
	int i=0,j,t=0;
	
	char ch;
	
	while(i<SIZE-2)
	{
		ch=getch();			//读取输入
		if(ch != '\n' && ch != '\r')	//判断是否输入结束
		{
			if(!i && ch == '\b')
			{
				continue;		//重新获得下一个输入 ,防止删过头 
			}
			else
			{
				if(ch == '\b')	//如果是Backspace则光标回移
				{
					i--;
					gotoxy(x+i,y,1);
					printf(" ");	//原来有字符的位置用空格代替,实现删除的效果
					gotoxy(x+i,y,1); 
					s[i]='\0';		//直接在现在对应光标位置加\0达到从s数组中删除字符的效果
				}
				else
				{
					gotoxy(x+i,y,1);
					s[i]=ch;		//成功读入字符
					printf("%c",ch);	//打印出输入的字符
					i++;		//i表示读取的位置,成功读取后加一
					gotoxy(x+i,y,1);	//移动光标
				}
			}
		}
		else		//输入结束跳出循环
		{
			break;
		}
		
	}
	
	if(i == SIZE-2)	//判断是否超出个数上限,SIZE为宏定义的个数限制
	{
		if(s[i-1] == '\n')
			s[i-1] = '\0';
		PRINT_(x+SIZE+10,y);
		gotoxy(x+SIZE+12,y,0);
		Color(2);			//自定义的颜色函数,设置字体颜色
		printf("超出上限");
		PRINT_(x,y);		//自定义打印函数
		s[0]='\0';
		gotoxy(0,0,0);
		Color(7);			//自定义的颜色函数,设置字体颜色
	}
	else
	{
		s[i]='\0';
		
	}
		
}

4.2)读取密码显示*号

大致与限定用户输入字符串相同,无非输出字符是改用*

char *GetPassword(int x,int y) //x,y为光标坐标,返回值为读取的密码字符
{
	char s[SIZE+1];
	int i=0,j,t=0;			//用i记录光标以及读取字符的位置
	
	char ch;
	
	while(i<SIZE-2)
	{
		ch=getch();
		if(ch != '\n' && ch != '\r')
		{
			if(!i && ch == '\b')
			{
				continue;		//重新获得下一个输入 ,防止删过头 
			}
			else
			{
				if(ch == '\b')
				{
					i--;
					gotoxy(x+i,y,1);
					printf(" ");
					gotoxy(x+i,y,1);
					s[i]='\0';
				}
				else
				{
					gotoxy(x+i,y,1);
					s[i]=ch;
					printf("*");	  //打印*号,达到加密效果
					i++;
					gotoxy(x+i,y,1);
				}
			}
		}
		else
		{
			break;
		}
		
	}
	
	if(i == SIZE-2)
	{
		if(s[i-1] == '\n')
			s[i-1] = '\0';
		PRINT_(x+SIZE+10,y);
		gotoxy(x+SIZE+12,y,0);
		Color(2);
		printf("超出上限");
		PRINT_(x,y);
		s[0]='\0';
		gotoxy(0,0,0);
		Color(7);
	}
	else
	{
		s[i]='\0';
		
	}
	
	return s;
}

4.3)两个选取框部分

过滤学生成绩部分

void Filtr(LinkList *lp)
{
	system("cls");
	
	char c;
	int key = 1,x = 43,y = 4,w_flag=1,key_flag=1,yy=4; //通过flag来判断是否能够进入下一步操作
	int flag = 0,max=150,min=0;
	char Max[SIZE],Min[SIZE];
	
	printf("     --------------------------------------------------------------------------------------------------------------\n");
	printf("     |                                          学生学籍管理系统                                                  |\n");
	printf("     --------------------------------------------------------------------------------------------------------------\n");
	printf("     |           请选择操作:                                                       (默认最高 150,最低 0)          |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                       1.语文                                                               |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                       2.数学                                                               |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                       3.英语                                                               |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                       4.最高分:                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                       5.最低分:                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                       6.确认                                                               |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                                                                                            |\n");
	printf("     |                                       7.返回                                                               |\n");
	printf("     |                                                                       W S 控制   ENTER  确认               |\n");
	printf("     --------------------------------------------------------------------------------------------------------------\n");
	
	
	
	PrintK2(x,y,1);		//默认白框在查看 
	
	
	while(!flag)
	{
		c = getch();			//读取一个输入 
		c = Change(c);
		while(c != 's' && c != 'w' && c != '\r')
		{
			c = getch();			//读取一个输入 
			c = Change(c);
		}
		while(c != 13)	  //'\r'd ASCII码值 
		{
		
			
			
			if(c == 's' && key <= 7)      		//下移 
			{
				if(key == 7)		//key=4此时框在最下面,应消去,在管理员处打印 
				{
					if(key != key_flag)
						PrintK2(x,y,0);
					key=1;
					y = 4;
					PrintK2(x,y,1);
					
				}
				else
				{
					if(key != key_flag)
						PrintK2(x,y,0);
					key++;
					y += 3;
					PrintK2(x,y,1);
				}					//框可继续往下移
				 
				
			} 
			
			if(c == 'w'&& key >= 1)      		//上移 
			{
				if(key == 1)		//key=1此时框在最上面,应消去,在退出程序处打印 
				{
					if(key != key_flag)
						PrintK2(x,y,0);
					key=7;
					y = 22;
					PrintK2(x,y,1);
					
				}
				else				//框可继续往上移
				{
					if(key != key_flag)
						PrintK2(x,y,0);
					key--;
					y -= 3;
					PrintK2(x,y,1);
				}					
			} 	
			c= getch();
			c = Change(c);
			while(c != 's' && c != 'w' && c != '\r')
			{
				c = getch();			//读取一个输入 
				c = Change(c);
			}
		}
		
		//下面为同时出现两个选取框的操作
		
		switch(key)
		{
			case 1:  	if(key_flag != 1)
							PrintK2(x,yy,0);		//清除上次选框 
						yy=4;						//记录本次,为下次消去做准备 
						key_flag=1;
						w_flag=1;
				break;
			case 2:  	if(key_flag != 2)
							PrintK2(x,yy,0);
						yy=7;
						key_flag=2;
						w_flag=2; 
				break;
			case 3:		if(key_flag != 3)
							PrintK2(x,yy,0);
						yy=10;
						key_flag=3;
						w_flag=3;
				break;
			case 4:		PRINT_(x+11,y+1);
						max = 300;	
						gotoxy(x+11,y+1,1);
						GetS(x+11,y+1,Max);
						gotoxy(0,0,0);
						if(!IS_N(Max))  //输入不是纯数字,使用默认值 
						{
							PRINT_(x+11,y+1);
							max = 300;	
						}
						else
						{
							max = W_TO_N(Max); //字符转数字 
						}
				break;
			case 5:		PRINT_(x+11,y+1);
						min = 300;	
						gotoxy(x+11,y+1,1);
						GetS(x+11,y+1,Min);
						gotoxy(0,0,0);
						if(!IS_N(Min))  //输入不是纯数字,使用默认值 
						{
							PRINT_(x+11,y+1);
							min = 300;	
						}
						else
						{
							min = W_TO_N(Min); //字符转数字 
						}
				break;
			case 6:		F(lp,w_flag,max,min);							//跳转页面显示过略后的排序
						flag=1; 
				break;
			default : T(); 
				
			
		}	 
	} //flag
	
	Filtr(lp);
} 

5.个人总结

代码有些冗长,可凝练为自定义函数

功能均能实现

用户体验较好

界面较为美观

链接源码包


网站公告

今日签到

点亮在社区的每一天
去签到