学生学籍管理系统(带面板)【结尾有源码链接】
C语言大作业 学生学籍管理系统,带面板
[外链图片转存中…(img-SUhm4QifnCLAcCL-1627633442038)]
0.功能要求
1.结构安排
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.个人总结
代码有些冗长,可凝练为自定义函数
功能均能实现
用户体验较好
界面较为美观
链接:源码包