#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 chinese;
int math;
int english;
int data_structure;
int physics;
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 *menull[] =
{
"自主添加成绩",
"导入随机成绩",
"学生信息查找",
"学生信息排序",
"学生信息修改",
"学生信息删除",
" 返回 ",
" ",
}; //教师端界面
char *menulll[] =
{
"学生信息打印",
"学生信息排序",
"学生信息查找",
" 返回 ",
" ",
}; //学生端界面
char *menu_student[] =
{
"学号",
"语文",
"数学",
"英语",
"数据结构",
"物理",
"平均分",
"总分",
};
CONSOLE_CURSOR_INFO cci;
COORD pos = {0, 0};
void color(short x); //这是一个改变字体颜色的函数
void HideCursor(HANDLE hout); //隐藏光标
void first_menu(HANDLE hout, int index, int number); //第一个界面
void teacher_jurisdiction(HANDLE hout, char **menull, int size, int index, int number); //教师端界面
void student_jurisdiction(HANDLE hout, char **menulll, int size, int index, int number); //学生端界面
void add_self(HANDLE hout, int number); //自主添加成绩
void add_random(HANDLE hout, int number); //添加随机成绩
void printf_now_message(HANDLE hout, int number); //打印成绩
void sort_message(HANDLE hout, int number); //顺序排序
void recover_message(HANDLE hout, int number); //恢复默认顺序
void find_message(HANDLE hout, int number); //输入学号查找学生
void alter_message(HANDLE hout, int index, int number); //修改信息
void delete_message(HANDLE hout, int index, int number); //删除学生信息
void general_keyboard_update_menu(HANDLE hout, int x, int y, char **option, int size, int index, int number); //更新菜单选项,参数(句柄,选项x位置,选项之间y距离,选项数组,选项个数,选择位置)
void goto_x_y(HANDLE hout, int x, int y); //将光标移到想x,y位置
int get_userinput(int *index, int size); //检测键盘输入改变x轴
int special_get_userinput(int *index, int size); //检测键盘输入改变x轴2
int get_y_userinput(int *indey, int size); //检测键盘输入改变y轴
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, 54, 20, 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");
teacher_jurisdiction(hout, menull, NR(menull), 0, number);
break;
case 1:
system("cls");
student_jurisdiction(hout, menulll, NR(menulll), 0, number);
break;
case 2:
exit(0);
}
}
}
}
int get_userinput(int *index, int size)
{
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)
{
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 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%-12s%-12s",
menu_student[0],
menu_student[1],
menu_student[2],
menu_student[3],
menu_student[4],
menu_student[5],
menu_student[6],
menu_student[7]);
}
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:
sort_message(hout, number);
printf_now_message(hout, number);
goto_x_y(hout, 0, 23);
printf(" ");
goto_x_y(hout, 0, 23);
color(2);
printf("[成功]正在使用教师权限进行操作");
break;
case 4:
alter_message(hout, 1, number);
break;
case 5:
delete_message(hout, 1, number);
break;
case 6:
system("cls");
recover_message(hout, number);
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("[成功]正在使用学生权限进行操作");
general_keyboard_update_menu(hout, 0, 10, menulll, size, index, number);
if (ret == ESC)
exit(0);
if (ret == ENTER)
{
switch (index)
{
case 0:
if (number == 0)
{
goto_x_y(hout, 0, 23);
color(772);
printf(" ");
goto_x_y(hout, 0, 23);
color(772);
printf("[操作失败]暂无数据");
}
printf_now_message(hout, number);
break;
case 1:
sort_message(hout, number);
printf_now_message(hout, number);
goto_x_y(hout, 0, 23);
color(2);
printf("[操作成功]正在使用学生权限进行操作");
break;
case 2:
find_message(hout, number);
break;
case 3:
system("cls");
recover_message(hout, number);
first_menu(hout, 0, number);
break;
}
}
GetConsoleCursorInfo(hout, &cci);
ret = get_userinput(&index, size);
}
system("cls");
}
void add_random(HANDLE hout, int number)
{
student_message[number].serial = number;
student_message[number].number_stu = rand() % 8797369 + 1202630;
student_message[number].chinese = rand() % 150 + 1;
student_message[number].math = rand() % 150 + 1;
student_message[number].english = rand() % 150 + 1;
student_message[number].data_structure = rand() % 150 + 1;
student_message[number].physics = rand() % 150 + 1;
student_message[number].total = student_message[number].physics + student_message[number].chinese + student_message[number].math + student_message[number].english + student_message[number].data_structure;
student_message[number].average_score = (student_message[number].total) / 5;
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%-12s%-12s",
menu_student[0],
menu_student[1],
menu_student[2],
menu_student[3],
menu_student[4],
menu_student[5],
menu_student[6],
menu_student[7]);
for (i = 1; i <= number; i++)
{
goto_x_y(hout, 20, i);
printf("%-12d%-12d%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].chinese,
student_message[i].math,
student_message[i].english,
student_message[i].data_structure,
student_message[i].physics,
student_message[i].average_score,
student_message[i].total);
}
}
void sort_message(HANDLE hout, int number)
{
int i, j;
for (i = 1; i <= number; i++)
{
for (j = i + 1; j <= number; j++)
{
if (student_message[i].total < student_message[j].total)
{
student_message[0] = student_message[i];
student_message[i] = student_message[j];
student_message[j] = student_message[0];
}
}
}
}
void recover_message(HANDLE hout, int number)
{
int i, j;
for (i = 1; i <= number; i++)
{
for (j = i + 1; j <= number; j++)
{
if (student_message[i].serial > student_message[j].serial)
{
student_message[0] = student_message[i];
student_message[i] = student_message[j];
student_message[j] = student_message[0];
}
}
}
}
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%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].chinese,
student_message[i].math,
student_message[i].english,
student_message[i].data_structure,
student_message[i].physics,
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%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].chinese,
student_message[i].math,
student_message[i].english,
student_message[i].data_structure,
student_message[i].physics,
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)
sort_message(hout, number);
printf_now_message(hout, number);
teacher_jurisdiction(hout, menull, NR(menull), 0, number);
break;
}
}
}
int special_get_userinput(int *index, int size)
{
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;
}
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%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].chinese,
student_message[i].math,
student_message[i].english,
student_message[i].data_structure,
student_message[i].physics,
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("[查找失败]无法找到该数据");
}
}
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].chinese);
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);
getchar();
goto_x_y(hout, 68, number);
scanf("%d", &student_message[number].data_structure);
getchar();
goto_x_y(hout, 80, number);
scanf("%d", &student_message[number].physics);
getchar();
student_message[number].total = student_message[number].physics + student_message[number].chinese + student_message[number].math + student_message[number].english + student_message[number].data_structure;
student_message[number].average_score = (student_message[number].total) / 5;
color(7);
goto_x_y(hout, 20, number);
printf("%-12d%-12d%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[number].number_stu,
student_message[number].chinese,
student_message[number].math,
student_message[number].english,
student_message[number].data_structure,
student_message[number].physics,
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%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].chinese,
student_message[i].math,
student_message[i].english,
student_message[i].data_structure,
student_message[i].physics,
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%-12d%-12d%-8d",
student_message[i].number_stu,
student_message[i].chinese,
student_message[i].math,
student_message[i].english,
student_message[i].data_structure,
student_message[i].physics,
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%-12d%-12d%-8d",
student_message[index].number_stu,
student_message[index].chinese,
student_message[index].math,
student_message[index].english,
student_message[index].data_structure,
student_message[index].physics,
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].chinese);
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);
if (indey == 5)
color(128);
else
color(7);
goto_x_y(hout, 68, index);
printf("%d", student_message[index].data_structure);
if (indey == 6)
color(128);
else
color(7);
goto_x_y(hout, 80, index);
printf("%d", student_message[index].physics);
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].chinese);
}
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);
}
if (indey == 5)
{
color(128);
goto_x_y(hout, 68, index);
printf(" ");
goto_x_y(hout, 68, index);
scanf("%d", &student_message[index].data_structure);
}
if (indey == 6)
{
color(128);
goto_x_y(hout, 80, index);
printf(" ");
goto_x_y(hout, 80, index);
scanf("%d", &student_message[index].physics);
}
student_message[index].total = student_message[index].physics + student_message[index].chinese + student_message[index].math + student_message[index].english + student_message[index].data_structure;
student_message[index].average_score = (student_message[index].total) / 5;
color(7);
goto_x_y(hout, 20, index);
printf("%-12d%-12d%-12d%-12d%-12d%-12d%-12d%-8d",
student_message[index].number_stu,
student_message[index].chinese,
student_message[index].math,
student_message[index].english,
student_message[index].data_structure,
student_message[index].physics,
student_message[index].average_score,
student_message[index].total);
break;
}
}
}
int get_y_userinput(int *indey, int size)
{
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;
}
直接上代码,不多bb。
记录学习,大佬勿喷。
注意:键盘W S A D控制光标上下左右移动,回车即确定。
上几张图片: