学生成绩管理系统
本系统能够对学生成绩管理功能,包括:
1.对多个学生成绩进行管理,至少10个学生。
2.每个学生至少3门课程。
3.对每个学生大学期间的成绩进行记录。
4.修改学生成绩。
5.不同用户的权限不同,管理员拥有所有权限(打印、登记、添加、排序、查询、修改、删除学生信息)、教师可以排序、查询、登记和修改成绩;学生可以查询成绩。 其中查询分姓名查询、学号查询;排序分总成绩排序及各科成绩排序.
6.成绩说明:0~100,整数。
7.成绩需要保存进文件,程序初始化时读取文件。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <windows.h>
#define N 100
#define NR(x) (sizeof(x) / sizeof((x[0]) + 0))
typedef struct student
{
int serial;
int number_stu;
int subject_1;//科目1-线性代数
int math;//高等数学
int english;//大学英语
int average_score;
int total;
} student;
student student_message[N];
enum
{
UP = 'w',
DOWN = 's',
LEFT = 'a',
RIGHT = 'd',
ENTER = 13,
ESC = 27,
};
char *menu[] =
{
"管理端",
"教师端",
"学生端",
" ",
}; //初始界面
char *menul[] =
{
"登记学生成绩",
"导入随机成绩",
"查找学生信息",
"修改学生信息",
"删除学生信息",
" 返回 ",
" ",
}; //管理端界面
char *menull[] =
{
"登记学生成绩",
"导入随机成绩",
"查询学生成绩",
"修改学生成绩",
" 返回 ",
" ",
}; //教师端界面
char *menulll[] =
{
"查询成绩",
" 返回 ",
" ",
}; //学生端界面
char *menu_student[] =
{
"学号",
"线性代数",
"高等数学",
"大学英语",
"平均分",
"总分",
};
CONSOLE_CURSOR_INFO cci;
COORD pos = {0, 0};
int main()
{
int index = 0, number = 0;
HANDLE hout;
srand((unsigned)time(NULL));
SetConsoleTitleA("学生成绩管理系统"); //窗口标题
hout = GetStdHandle(STD_OUTPUT_HANDLE); //获取句柄
first_menu(hout, index, number);
system("pause");
return 0;
}
void first_menu(HANDLE hout, int index, int number)//首页界面
{
int ret;
while (1)
{
HideCursor(hout); //隐藏光标
goto_x_y(hout, 46, 0);
color(15);
printf("欢迎使用学生管理系统");
GetConsoleCursorInfo(hout, &cci);
general_keyboard_update_menu(hout, 50, 10, menu, NR(menu), index, number);
ret = get_userinput(&index,NR(menu));
if (ret == ESC)
exit(0);
if (ret == ENTER)
{
switch (index)
{
case 0:
system("cls");
administered_jurisdiction(hout, menul,NR(menul),0,number);
break;
case 1:
system("cls");
teacher_jurisdiction(hout, menull, NR(menull), 0, number);
break;
case 2:
system("cls");
student_jurisdiction(hout, menulll, NR(menulll), 0, number);
break;
case 3:
exit(0);
}
}
}
}
void administered_jurisdiction(HANDLE hout, char **menul, int size, int index, int number)//管理端界面
{
int ret = 0;
system("cls");
while (1)
{
color(7);
goto_x_y(hout, 0, 23);
printf(" ");
goto_x_y(hout, 0, 23);
color(2);
printf("[成功]正在使用管理权限进行操作");
if (number != 0)
printf_now_message(hout, number);
else
{
color(7);
goto_x_y(hout, 20, 0);
printf("%-12s%-12s%-12s%-12s%-12s%-12s",
menu_student[0],
menu_student[1],
menu_student[2],
menu_student[3],
menu_student[4],
menu_student[5]);
}
general_keyboard_update_menu(hout, 0, 10, menul, size, index, number);
if (ret == ESC)
exit(0);
if (ret == ENTER)
{
switch (index)
{
case 0:
if (number <= 21)
{
add_self(hout, number);
number++;
}
else
{
goto_x_y(hout, 0, 23);
color(772);
printf("[失败]数据已满,不可进行添加操作");
}
break;
case 1:
if (number <= 21)
{
goto_x_y(hout, 0, 23);
color(2);
printf("[成功]正在使用管理权限进行操作");
number++;
add_random(hout, number);
}
else
{
goto_x_y(hout, 0, 23);
color(772);
printf("[失败]数据已满,不可进行添加操作");
}
break;
case 2:
find_message(hout, number);
break;
case 3:
alter_message(hout, 1, number);
break;
case 4:
delete_message(hout, 1, number);
break;
case 5:
system("cls");
first_menu(hout, 0, number);
break;
}
}
GetConsoleCursorInfo(hout, &cci);
ret = get_userinput(&index, size);
}
system("cls");
}
void teacher_jurisdiction(HANDLE hout, char **menull, int size, int index, int number)//教师端界面
{
int ret = 0;
system("cls");
while (1)
{
color(7);
goto_x_y(hout, 0, 23);
printf(" ");
goto_x_y(hout, 0, 23);
color(2);
printf("[成功]正在使用教师权限进行操作");
if (number != 0)
printf_now_message(hout, number);
else
{
color(7);
goto_x_y(hout, 20, 0);
printf("%-12s%-12s%-12s%-12s%-12s%-12s",
menu_student[0],
menu_student[1],
menu_student[2],
menu_student[3],
menu_student[4],
menu_student[5]);
}
general_keyboard_update_menu(hout, 0, 10, menull, size, index, number);
if (ret == ESC)
exit(0);
if (ret == ENTER)
{
switch (index)
{
case 0:
if (number <= 21)
{
add_self(hout, number);
number++;
}
else
{
goto_x_y(hout, 0, 23);
color(772);
printf("[失败]数据已满,不可进行添加操作");
}
break;
case 1:
if (number <= 21)
{
goto_x_y(hout, 0, 23);
color(2);
printf("[成功]正在使用教师权限进行操作");
number++;
add_random(hout, number);
}
else
{
goto_x_y(hout, 0, 23);
color(772);
printf("[失败]数据已满,不可进行添加操作");
}
break;
case 2:
find_message(hout, number);
break;
case 3:
alter_message(hout, 1, number);
break;
case 4:
system("cls");
first_menu(hout, 0, number);
break;
}
}
GetConsoleCursorInfo(hout, &cci);
ret = get_userinput(&index, size);
}
system("cls");
}
void student_jurisdiction(HANDLE hout, char **menulll, int size, int index, int number)//学生端界面
{
int ret = 0;
system("cls");
while (1)
{
goto_x_y(hout, 0, 23);
color(2);
printf("[成功]正在使用学生权限进行操作");
color(7);
goto_x_y(hout, 20, 0);
printf("%-12s%-12s%-12s%-12s%-12s%-12s",
menu_student[0],
menu_student[1],
menu_student[2],
menu_student[3],
menu_student[4],
menu_student[5]);
general_keyboard_update_menu(hout, 0, 10, menulll, size, index, number);
if (ret == ESC)
exit(0);
if (ret == ENTER)
{
switch (index)
{
case 0:
find_message(hout, number);
break;
case 1:
system("cls");
first_menu(hout, 0, number);
break;
}
}
GetConsoleCursorInfo(hout, &cci);
ret = get_userinput(&index, size);
}
system("cls");
}
void add_self(HANDLE hout, int number)//登记学生成绩
{
number++;
student_message[number].serial = number;
color(128);
goto_x_y(hout, 20, number);
printf(" ");
goto_x_y(hout, 20, number);
scanf("%d", &student_message[number].number_stu);
getchar();
goto_x_y(hout, 32, number);
scanf("%d", &student_message[number].subject_1);
getchar();
goto_x_y(hout, 44, number);
scanf("%d", &student_message[number].math);
getchar();
goto_x_y(hout, 56, number);
scanf("%d", &student_message[number].english);
student_message[number].total = student_message[number].subject_1 + student_message[number].math + student_message[number].english ;
student_message[number].average_score = (student_message[number].total) / 3;
color(7);
goto_x_y(hout, 20, number);
printf("%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[number].number_stu,
student_message[number].subject_1,
student_message[number].math,
student_message[number].english,
student_message[number].average_score,
student_message[number].total);
}
void alter_message(HANDLE hout, int index, int number)//修改学生信息
{
int i, ret, j, sign = 0, x, indey = 1;
while (1)
{
for (i = 1; i <= number; i++)
{
if (i == index)
{
color(496);
goto_x_y(hout, 20, i);
printf("%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].subject_1,
student_message[i].math,
student_message[i].english,
student_message[i].average_score,
student_message[i].total);
}
else
{
SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
goto_x_y(hout, 20, i);
printf("%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].subject_1,
student_message[i].math,
student_message[i].english,
student_message[i].average_score,
student_message[i].total);
}
}
ret = special_get_userinput(&index, number);
if (ret == ENTER)
{
ret = 1;
while (ret != ENTER)
{
color(7);
goto_x_y(hout, 20, index);
printf("%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[index].number_stu,
student_message[index].subject_1,
student_message[index].math,
student_message[index].english,
student_message[index].average_score,
student_message[index].total);
if (indey == 1)
color(128);
else
color(7);
goto_x_y(hout, 20, index);
printf("%d", student_message[index].number_stu);
if (indey == 2)
color(128);
else
color(7);
goto_x_y(hout, 32, index);
printf("%d", student_message[index].subject_1);
if (indey == 3)
color(128);
else
color(7);
goto_x_y(hout, 44, index);
printf("%d", student_message[index].math);
if (indey == 4)
color(128);
else
color(7);
goto_x_y(hout, 56, index);
printf("%d", student_message[index].english);
ret = get_y_userinput(&indey, 6);
}
if (indey == 1)
{
color(496);
goto_x_y(hout, 20, index);
printf(" ");
goto_x_y(hout, 20, index);
scanf("%d", &student_message[index].number_stu);
}
if (indey == 2)
{
color(128);
goto_x_y(hout, 32, index);
printf(" ");
goto_x_y(hout, 32, index);
scanf("%d", &student_message[index].subject_1);
}
if (indey == 3)
{
color(128);
goto_x_y(hout, 44, index);
printf(" ");
goto_x_y(hout, 44, index);
scanf("%d", &student_message[index].math);
}
if (indey == 4)
{
color(128);
goto_x_y(hout, 56, index);
printf(" ");
goto_x_y(hout, 56, index);
scanf("%d", &student_message[index].english);
}
student_message[index].total = student_message[index].subject_1 + student_message[index].math + student_message[index].english;
student_message[index].average_score = (student_message[index].total) / 3;
color(7);
goto_x_y(hout, 20, index);
printf("%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[index].number_stu,
student_message[index].subject_1,
student_message[index].math,
student_message[index].english,
student_message[index].average_score,
student_message[index].total);
break;
}
}
}
void delete_message(HANDLE hout, int index, int number) //删除学生信息
{
int i, ret, j, sign = 0, x;
while (1)
{
for (i = 1; i <= number; i++)
{
if (i == index)
{
color(496);
goto_x_y(hout, 20, i);
printf("%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].subject_1,
student_message[i].math,
student_message[i].english,
student_message[i].average_score,
student_message[i].total);
}
else
{
SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
goto_x_y(hout, 20, i);
printf("%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].subject_1,
student_message[i].math,
student_message[i].english,
student_message[i].average_score,
student_message[i].total);
}
}
ret = special_get_userinput(&index, number);
if (ret == ENTER)
{
x = student_message[index].serial;
for (i = 1; i <= number; i++)
{
for (j = i + 1; j <= number; j++)
{
if (student_message[i].serial > student_message[j].serial)
{
sign = 1;
student_message[0] = student_message[i];
student_message[i] = student_message[j];
student_message[j] = student_message[0];
}
}
}
for (x; x <= number; x++)
student_message[x] = student_message[x + 1];
student_message[x] = student_message[0];
number = number - 1;
for (j = 1; j <= number; j++)
student_message[j].serial = j;
system("cls");
if (sign == 1)
printf_now_message(hout, number);
teacher_jurisdiction(hout, menull, NR(menull), 0, number);
break;
}
}
}
void find_message(HANDLE hout, int number)//输入学号查找学生
{
long int find, i, sign = 0;
color(7);
goto_x_y(hout, 0, 24);
printf("请输入要查找的学号:\n");
scanf("%d", &find);
for (i = 1; i <= number; i++)
{
if (find == student_message[i].number_stu)
{
sign = 1;
break;
}
}
color(7);
goto_x_y(hout, 0, 24);
printf(" \n");
printf(" ");
if (sign == 1)
{
color(496);
goto_x_y(hout, 20, i);
printf("%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].subject_1,
student_message[i].math,
student_message[i].english,
student_message[i].average_score,
student_message[i].total);
}
else
{
goto_x_y(hout, 0, 23);
color(7);
printf(" ");
goto_x_y(hout, 0, 23);
color(772);
printf("[查找失败]无法找到该数据");
find_message( hout, number);
}
}
int special_get_userinput(int *index, int size)//检测键盘输入改变x轴2
{
int ch;
ch = getch();
switch (ch)
{
case UP:
if (*index > 1)
*index -= 1;
return 0;
case DOWN:
if (*index < (size))
*index += 1;
return 0;
case ENTER:
return ENTER;
case ESC:
return ESC;
}
return 0;
}
int get_userinput(int *index, int size)//检测键盘输入改变x轴
{
int ch;
ch = getch();
switch (ch)
{
case UP:
if (*index > 0)
*index -= 1;
return 0;
case DOWN:
if (*index < (size - 2))
*index += 1;
return 0;
case ENTER:
return ENTER;
case ESC:
return ESC;
}
return 0;
}
void color(short x) //改变字体颜色
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), x);
}
void HideCursor(HANDLE hout)//隐藏光标
{
CONSOLE_CURSOR_INFO cursor;
cursor.bVisible = FALSE;
cursor.dwSize = sizeof(cursor);
SetConsoleCursorInfo(hout, &cursor);
}
void goto_x_y(HANDLE hout, int x, int y) //移动光标
{
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(hout, pos);
}
void general_keyboard_update_menu(HANDLE hout, int x, int y, char **option, int size, int index, int number)
//更新菜单选项,参数(句柄,选项x位置,选项之间y距离,选项数组,选项个数,选择位置)
{
int j;
for (j = 0; j < size; j++)
{
if (j == index)
{
color(496);
goto_x_y(hout, x, y + j);
printf("%s", option[j]);
}
else
{
SetConsoleTextAttribute(hout, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
goto_x_y(hout, x, y + j);
printf("%s", option[j]);
}
}
}
void add_random(HANDLE hout, int number)//导入随机成绩
{
student_message[number].serial = number;
student_message[number].number_stu = rand() % 212020090 + 2120220001;
student_message[number].subject_1 = rand() % 100 + 0;
student_message[number].math = rand() % 100+ 0;
student_message[number].english = rand() % 100 + 0;
student_message[number].total = student_message[number].subject_1 + student_message[number].math + student_message[number].english ;
student_message[number].average_score = (student_message[number].total) / 3;
printf_now_message(hout, number);
}
void printf_now_message(HANDLE hout, int number)
{
int i;
goto_x_y(hout, 20, 0);
color(7);
printf("%-12s%-12s%-12s%-12s%-12s%-12s",
menu_student[0],
menu_student[1],
menu_student[2],
menu_student[3],
menu_student[4],
menu_student[5]);
for (i = 1; i <= number; i++)
{
goto_x_y(hout, 20, i);
printf("%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].subject_1,
student_message[i].math,
student_message[i].english,
student_message[i].average_score,
student_message[i].total);
}
}
int get_y_userinput(int *indey, int size)//检测键盘输入改变y轴
{
int ch;
ch = getch();
switch (ch)
{
case LEFT:
if (*indey > 1)
*indey -= 1;
return 0;
case RIGHT:
if (*indey < (size))
*indey += 1;
return 0;
case ENTER:
return ENTER;
case ESC:
return ESC;
}
return 0;
}