学生信息管理系统分成四个模块: 管理员, 教师, 学生, 退出系统
每个模块都需要实现不同的功能.
列如教师模块实现了: 输入学生信息, 显示学生信息, 删除学生信息, 修改学生信息, 插入学生信息
学生模块实现了:单科成绩查询, 总成绩查询
//main.cpp 模块 #include#include"taaer.h" #include #include #include using namespace std; #define MAX_COUNT 1000 #define RECORDER_PER_PAGE 10 struct student { int num; //学号 char name[16]; char professional[16]; //专业 int cLang; //C 语言 int algo; //计算材料学 int database; //原子物理 int electricity; // 电动力学 }; struct student stu[MAX_COUNT]; int currentCount = 0; void init() { //初始化 char cmd[128]; //errno_t err; //mode con lines=%d cols=%d ,这段代码控制控制台的大小 sprintf_s(cmd, "mode con lines=%d cols=%d", WIN_HEIGHT, WIN_WIDTH); system(cmd); //cmd 输入到 控制台中 system("color 1f"); memset(stu, 0, sizeof(stu)); //清空数组 //FILE* fp = NULL; //err = fopen_s(&fp, "acc.txt", "rb"); FILE* fp = fopen("acc.txt", "rb"); if (fp == NULL) { //printf("文件不存在!n"); currentCount = 0; return; } int i = 0; while (!feof(fp)) { //检测流上的文件结束符 ,文件未结束就继续执行 int ret = fread(&stu[i],sizeof(struct student), 1, fp); //从文件中读取数据 if (ret == 1) { //读取成功 i++; } } currentCount = i; } void waitConfirm() { rewind(stdin); // rewind,清空缓存区 getch(); //即从控制台读取一个字符,但不显示在屏幕上 } void menu() { //菜单界面 system("cls"); //清空控制台 printTableHead(MENU_WIDTH); printTableMidInfo(MENU_WIDTH, "学生信息管理系统"); printTableMidInfo(MENU_WIDTH, ""); const char* subMenus[] = { "1.管理员 ", "2.教师 ", "3.学生 ", "0.退出系统 " }; int count = sizeof(subMenus) / sizeof(subMenus[0]); for (int i = 0; i < count; i++) { printTableMidInfo(MENU_WIDTH, subMenus[i]); } printTableMidInfo(MENU_WIDTH, ""); printTableTail(MENU_WIDTH); printMidInfo("请选择(0-3): "); } struct student inputInfo() { struct student s; rewind(stdin); //清空输入缓存区 printf("学号:"); scanf_s("%d", &s.num); rewind(stdin); printf("姓名:"); scanf_s("%s", s.name, 16); rewind(stdin); printf("专业:"); scanf_s("%s", s.professional,16); rewind(stdin); printf("C语言:"); scanf_s("%d", &s.cLang); rewind(stdin); printf("计算材料学:"); scanf_s("%d", &s.algo); rewind(stdin); printf("原子物理:"); scanf_s("%d", &s.database); rewind(stdin); printf("电动力学:"); scanf_s("%d", &s.electricity); rewind(stdin); //s.sum = s.cLang + s.algo + s.database + s.electricity; return s; } int searchStu(int snum) { //判断学号是否存在 for (int i = 0; i < currentCount; i++) { if (stu[i].num == snum) { return i; } } return -1; } bool save() { //信息输入文件 FILE* fp = fopen("acc.txt", "wb"); if (fp == NULL) { fclose(fp); //关闭流 return false; } for (int i = 0; i < currentCount; i++) { if (fwrite(&stu[i], sizeof(struct student), 1, fp) != 1) { fclose(fp); return false; } } fclose(fp); return true; } void input() { //输入功能 char str[16]; struct student s; while (1) { system("cls"); printf("输入学生信息(y/n):"); rewind(stdin); //清空输入缓存区 scanf_s("%s", str,16); if (strcmp(str, "Y") != 0 && strcmp(str, "y") != 0) { //输入Yy 进行输入 break; } s = inputInfo(); if (searchStu(s.num) >= 0) { //判断学号是否存在 printf("学号[%d] 已经存在!n", s.num); waitConfirm(); continue; } stu[currentCount++] = s; if (!save()) { printf("保存失败!n"); } else { printf("保存成功!n"); } waitConfirm(); } printf("n 结束输入!n"); } void Tinterface() { //教师操作界面 system("cls"); //清空控制台 printTableHead(MENU_WIDTH); printTableMidInfo(MENU_WIDTH, "教师操作界面"); printTableMidInfo(MENU_WIDTH, ""); const char* Tinterfaces[] = { "1.输入学生信息", "2.显示学生信息", "3.删除学生信息", "4.修改学生信息", "5.插入学生信息", "0.退出 " }; int count = sizeof(Tinterfaces) / sizeof(Tinterfaces[0]); for (int i = 0; i < count; i++) { printTableMidInfo(MENU_WIDTH, Tinterfaces[i]); } printTableMidInfo(MENU_WIDTH, ""); printTableTail(MENU_WIDTH); printMidInfo("请选择(0-5): "); } void Ainterface() { //管理员操作界面 system("cls"); //清空控制台 printTableHead(MENU_WIDTH); printTableMidInfo(MENU_WIDTH, "管理员操作界面"); printTableMidInfo(MENU_WIDTH, ""); const char* Ainterfaces[] = { "1.教师身份", "2.学生身份", "0.退出 " }; int count = sizeof(Ainterfaces) / sizeof(Ainterfaces[0]); for (int i = 0; i < count; i++) { printTableMidInfo(MENU_WIDTH, Ainterfaces[i]); } printTableMidInfo(MENU_WIDTH, ""); printTableTail(MENU_WIDTH); printMidInfo("请选择(0-2): "); } void Sinterface() { //学生操作界面 system("cls"); //清空控制台 printTableHead(MENU_WIDTH); printTableMidInfo(MENU_WIDTH, "学生操作界面"); printTableMidInfo(MENU_WIDTH, ""); const char* subMenus[] = { "1.单科成绩查询", "2.总成绩查询 ", "0.退出 " }; int count = sizeof(subMenus) / sizeof(subMenus[0]); for (int i = 0; i < count; i++) { printTableMidInfo(MENU_WIDTH, subMenus[i]); } printTableMidInfo(MENU_WIDTH, ""); printTableTail(MENU_WIDTH); printMidInfo("请选择(0-3): "); } void insert() { //插入学生信息 int snum; system("cls"); printf("请输入要插入的位置(学号):"); scanf("%d", &snum); int destIndex = searchStu(snum); if (destIndex < 0) { printf("没有这名学生,插入位置错误!n"); return; } struct student t = inputInfo(); int i = searchStu(t.num); if (i >= 0) { printf("学号[%d]已经存在! n", t.num); return; } for (int j = currentCount - 1; j > destIndex; j--) { stu[j + 1] = stu[j]; } stu[destIndex + 1] = t; currentCount++; if (save()) { printf("插入成功!n"); } else { printf("保存文件失败!n"); } } void modify() { //修改学生信息 int snum; system("cls"); printf("请输入要修改的学生的学号: "); scanf_s("%d", &snum); rewind(stdin); int i = searchStu(snum); //判断是否有这个学号 if (i < 0) { printf("没有找到这名学生!n"); return; } printf("找到了这名学生, 可以修改他的信息!n"); printf("姓名:"); scanf("%s", stu[i].name); rewind(stdin); printf("专业:"); scanf_s("%d", &stu[i].professional); rewind(stdin); printf("C 语言:"); scanf_s("%d", &stu[i].cLang); rewind(stdin); printf("计算材料学:"); scanf_s("%d", &stu[i].algo); rewind(stdin); printf("原子物理:"); scanf_s("%d", &stu[i].database); rewind(stdin); printf("电动力学:"); scanf_s("%d", &stu[i].professional); rewind(stdin); //stu[i].sum = stu[i].cLang + stu[i].algo + stu[i].database + stu[i].professional; if (save()) { printf("修改成功!n"); } else { printf("保存文件失败!n"); } } void del() { //删除学生功能 FILE* fp; int snum = 0; char str[16] = ""; system("cls"); printf("请输入学号:"); scanf("%d", &snum); int i = searchStu(snum); if (i < 0) { printf("没有找到这名学生!n"); return; } printf("找到这条记录,是否删除?(y/n)"); scanf("%s", str); if (strcmp(str, "Y") == 0 || strcmp(str, "y") == 0) { for (int j = i; j < currentCount; j++) { stu[j] = stu[j + 1]; } currentCount--; if (save()) { printf("删除成功!n"); } else { printf("保存文件失败!n"); } } else { printf("取消删除!n"); } } // 表头信息 char head[][COL_LEN_MAX] = { "学号", "姓名","专业","C语言","计算材料","原子物理","电动力学","总分"}; char heas[][COL_LEN_MAX] = { "学号","姓名","专业","c语言","计算材料","原子物理","电动力学"}; void showPage(int startIndex, int endIndex) { if (endIndex >= currentCount) { endIndex = currentCount - 1; } if (endIndex - startIndex + 1 > RECORDER_PER_PAGE) { endIndex = startIndex + RECORDER_PER_PAGE - 1; } char row[7][COL_LEN_MAX]; system("cls"); printTableHead(TABLE_WIDTH, 7); printTableRow(TABLE_WIDTH, heas, sizeof(heas) / sizeof(heas[0])); //打印到这出了问题 printTableMidLine(TABLE_WIDTH, 7); for (int i = startIndex; i <= endIndex; i++) { sprintf(row[0], "%d", stu[i].num); sprintf(row[1], "%s", stu[i].name); sprintf(row[2], "%s", stu[i].professional); sprintf(row[3], "%d", stu[i].cLang); sprintf(row[4], "%d", stu[i].algo); sprintf(row[5], "%d", stu[i].database); sprintf(row[6], "%d", stu[i].electricity); printTableRow(TABLE_WIDTH, row, 7); if (i < endIndex) { printTableMidLine(TABLE_WIDTH, 7); } else { printTableTail(TABLE_WIDTH, 7); } } } void show() { //显示学生信息 system("cls"); if (currentCount == 0) { //判断有没有学生信息 printf("还没有学生信息!n"); return; } int pageCount = (currentCount + RECORDER_PER_PAGE - 1) / RECORDER_PER_PAGE; //学生信息的页数 char buff[64]; for (int i = 0; i < pageCount; i++) { showPage(i * RECORDER_PER_PAGE, (i + 1) * RECORDER_PER_PAGE - 1); sprintf(buff, "共%d 页 第[%d]页", pageCount, i + 1); printMidInfo(buff); //打印共%d 页 第[%d]页 if (i < pageCount - 1) { waitConfirm(); } } } void OnlyDranch() { //单科成绩查询 system("cls"); int num; if (currentCount == 0) { printf("还没有学生记录!n"); return; } printf("请输入要查询的学生的学号: "); scanf_s("%d", &num); int i = searchStu(num); if (i < 0) { printf("没有找到这名学生!n"); return; } char ro[7][COL_LEN_MAX]; printTableHead(TABLE_WIDTH, 7); printTableRow(TABLE_WIDTH, heas, sizeof(heas) / sizeof(heas[0])); printTableMidLine(TABLE_WIDTH, 7); sprintf(ro[0], "%d", stu[i].num); sprintf(ro[1], "%s", stu[i].name); sprintf(ro[2], "%s", stu[i].professional); sprintf(ro[3], "%d", stu[i].cLang); sprintf(ro[4], "%d", stu[i].algo); sprintf(ro[5], "%d", stu[i].database); sprintf(ro[6], "%d", stu[i].electricity); printTableRow(TABLE_WIDTH, ro, 7); //printTableMidLine(TABLE_WIDTH, 7); printTableTail(TABLE_WIDTH, 7); } void Teachers() { //教师功能 Tinterface(); //教师操作界面 int n1; scanf_s("%d", &n1); rewind(stdin); while (1) { switch (n1){ case 1: //输入学生信息 input(); break; case 2: //显示学生信息 show(); break; case 3: //删除学生信息 del(); break; case 4: //修改学生信息 modify(); break; case 5: //插入学生信息 insert(); break; default: return; } break; } } void administrator() { //管理员功能 Ainterface(); //管理员操作界面 int n2; scanf_s("%d", &n2); while (1) { switch (n2) { case 1: //教师身份 printf("允许使用教师身份n"); printf("返回主菜单......"); case 2: //学生身份 printf("允许使用学生身份n"); printf("返回主菜单....."); default: return; } } } void students() { //学生功能 Sinterface(); //学生操作界面 int n3; scanf_s("%d", &n3); while (1) { switch (n3) { case 1: //单科成绩查询 OnlyDranch(); break; case 2: //总成绩查询 show(); //TheTotal(); break; default: return; } break; } } int main(void) { init(); //初始化 menu(); //菜单界面 int n; scanf_s("%d", &n); rewind(stdin); while (1) { switch (n) { case 1: //管理员 administrator(); break; case 2: //教师 //sum: Teachers(); break; case 3: //学生 //menu: students(); break; default:return 1; //退出系统 } waitConfirm(); menu(); rewind(stdin); // 清空输入缓冲区 scanf_s("%d", &n); } return 0; }
//haaer.h 模块 #pragma once // 窗口宽度 #define WIN_WIDTH 80 // 窗口高度 #define WIN_HEIGHT 25 #define TABLE_WIDTH 78 #define MENU_WIDTH 50 #define COL_LEN_MAX 64 void printTableHead(int tableWidth); void printTableTail(int tableWidth); void printTableRow(int tableWidth, char cols[][COL_LEN_MAX], int n); void printTableHead(int tableWidth, int cols); void printTableTail(int tableWidth, int cols); void printTableMidLine(int tableWidth, int cols); void printTableMidInfo(int tableWidth, const char* str); void printMidInfo(const char* str);
//taaer.cpp #include#include #include "taaer.h" void printTableHead(int tableWidth) { int margin = (WIN_WIDTH - tableWidth) / 2; for (int i = 0; i < margin; i++) printf(" "); printf("┌"); for (int i = 0; i < tableWidth - 2; i++)printf("─"); printf("┐n"); } void printTableTail(int tableWidth) { int margin = (WIN_WIDTH - tableWidth) / 2; for (int i = 0; i < margin; i++) printf(" "); printf("└"); for (int i = 0; i < tableWidth - 2; i++)printf("─"); printf("┘n"); } void printTableRow(int tableWidth, char cols[][COL_LEN_MAX], int n) { int margin = (WIN_WIDTH - tableWidth) / 2; for (int i = 0; i < margin; i++) printf(" "); int colWidth = (tableWidth - (n + 1)) / n; for (int i = 0; i < n; i++) { printf("│"); int leftSpan = (colWidth - strlen(cols[i])) / 2; int rightSpan = colWidth - leftSpan - strlen(cols[i]); for (int j = 0; j < leftSpan; j++) printf(" "); printf("%s", cols[i]); for (int j = 0; j < rightSpan; j++) printf(" "); } printf("│n"); } void printTableHead(int tableWidth, int cols) { int margin = (WIN_WIDTH - tableWidth) / 2; int spanLen = (tableWidth - (cols + 1)) / cols; for (int i = 0; i < margin; i++) printf(" "); printf("┌"); for (int i = 0; i < cols; i++) { for (int j = 0; j < spanLen; j++) { printf("─"); } if (i < cols - 1) { printf("┬"); } else { printf("┐"); } } printf("n"); } void printTableTail(int tableWidth, int cols) { int margin = (WIN_WIDTH - tableWidth) / 2; int spanLen = (tableWidth - (cols + 1)) / cols; for (int i = 0; i < margin; i++) printf(" "); //└─┴─┘ printf("└"); for (int i = 0; i < cols; i++) { for (int j = 0; j < spanLen; j++) { printf("─"); } if (i < cols - 1) { printf("┴"); } else { printf("┘"); } } printf("n"); } void printTableMidLine(int tableWidth, int cols) { int margin = (WIN_WIDTH - tableWidth) / 2; int spanLen = (tableWidth - (cols + 1)) / cols; for (int i = 0; i < margin; i++) printf(" "); printf("├"); for (int i = 0; i < cols; i++) { for (int j = 0; j < spanLen; j++) { printf("─"); } if (i < cols - 1) { printf("┼"); } else { printf("┤"); } } printf("n"); } void printTableMidInfo(int tableWidth, const char* str) { int margin = (WIN_WIDTH - tableWidth) / 2; for (int i = 0; i < margin; i++) printf(" "); printf("│"); int len1 = (tableWidth - 2 - strlen(str)) / 2; for (int i = 0; i < len1; i++) printf(" "); printf("%s", str); int len2 = tableWidth - 2 - len1 - strlen(str); for (int i = 0; i < len2; i++) printf(" "); printf("│n"); } void printMidInfo(const char* str) { int margin = (WIN_WIDTH - strlen(str)) / 2; for (int i = 0; i < margin; i++) printf(" "); printf("%s", str); }
注意 需要把项目属性 中 的 SDL检查 更改成 否
不然会报错
如果有不明白的地方,去 哔哩哔哩->奇牛学院
老师讲课十分容易听懂 , 常以 生活中的有趣事 讲解 难懂的技术