笔记以及记录:学生管理系统

    技术2025-04-05  17

    新手上路,纪念一下。(有不足请指出)

    /*学生管理系统*/ #include <stdio.h> #include <string.h> #include <malloc.h> #include <stdlib.h> #define N 100 int i = 0; //声明全局变量,用来刷新系统数据。即通过对循环次数的修改来控制结构体数组元素的输出 void publishing(); //1: 功能菜单 void put_infor(); //2:信息录入 void bro_infor(); //3:信息浏览 void sort_infor(); //4:信息排序 void search_infor(); //5:信息查询 void delet_infor(); //7:信息删除 void chang_infor(); //8;信息修改 void sort(int numb, char cha); //此函数用于实现信息排序功能中升降序输出 struct student //存储学生数据 { int id; //学号 char name[30]; //姓名 float score[3]; //分数 float avg; //均分 }stu[N]={ {1002, "LiLan", {70, 80, 90}}, {1004, "WangHai", {75, 85, 95}}, {1003, "LiYang", {60, 80, 73}}, {1001, "JackChe", {95, 90, 100}}, }; //主函数 int main(void) { int num; //接收用户输入的菜单选项 do { publishing(); scanf("%d", &num); //用户选择程序功能 switch (num) { case 3: bro_infor(); printf("\n"); break; case 2: put_infor(); printf("\n"); break; case 1: break; case 4: sort_infor(); printf("\n"); break; case 5: search_infor(); printf("\n"); break; case 6: system("cls"); break; case 7: delet_infor(); printf("\n"); break; case 8: chang_infor();printf("\n"); break; } }while (num != 1); //按1退出程序 printf("系统结束。"); return 0; } void publishing() //1: 功能菜单 { printf("\t\t\t------------------学生管理系统------------------\n"); printf("\t\t\t******** 1、退出系统 | 2、信息录入 ********\n"); printf("\t\t\t******** 3、信息浏览 | 4、信息排序 ********\n"); printf("\t\t\t******** 5、信息查询 | 6、信息清屏 ********\n"); printf("\t\t\t******** 7、信息删除 | 8、信息修改 ********\n"); printf("\t\t\t-----------------------------------------------\n"); printf("请选择:"); } void bro_infor() //3:信息浏览 { int j; struct student *p = stu; float avg; //对于学生平均分的处理 printf("ID \tNAME\t\t STB\t C SQL\t AVG\n"); for(j = 0; j < 4+i; j++) { avg = (p[j].score[0] + p[j].score[1] + p[j].score[2]) / 3; p[j].avg = avg; printf("%d %s\t\t %.0f\t %.0f\t %.0f\t %.2f\n", p[j].id, p[j].name, p[j].score[0], p[j].score[1], p[j].score[2], p[j].avg); } } void put_infor() //功能2:信息录入 { char x; int j; int flag = 1; //若用户连续输入错误,也会给予提醒 struct student *p = stu; do { printf("请输入学生ID:\n"); scanf("%d", &p[4+i].id); while (flag == 1) { flag = 0; //若未重复,不会提醒错误 for(j = 0; j < 4+i; j++) { if(p[4+i].id == p[j].id) { flag = 1; //若重复,不会退出while循环 printf("输入错误,此学号已存在。\n"); printf("请重新输入学生ID:\n"); scanf("%d", &p[4+i].id); } } } printf("请输入学生name:\n"); scanf("%s", p[4+i].name); printf("请输入第1门成绩:\n"); scanf("%f", &p[4+i].score[0]); printf("请输入第2门成绩:\n"); scanf("%f", &p[4+i].score[1]); printf("请输入第3门成绩:\n"); scanf("%f", &p[4+i].score[2]); i++; printf("是否继续录入信息?<y/n>"); getchar(); scanf("%c", &x); }while (x == 'y' || x == 'Y'); } void sort_infor() //功能4:信息排序(冒泡排序法) { int m, n; int numb; char cha; struct student temp; struct student *p = stu; do { printf("--------1.按学号排序 2.按姓名排序--------\n"); printf("--------3.按均分排序 4.不想再排序--------\n"); printf("请选择:"); scanf("%d", &numb); //外层循环控制比较轮数 for (m = 0; m < 4+i; m++) { //内层循环比较相邻的两个数 for (n = 0; n < 4+i-1-m; n++) { //选择排序分类 switch(numb) { case 1: if(p[n].id < p[n+1].id) //按学号排序 { temp = p[n]; p[n] = p[n+1]; p[n+1] = temp; } break; case 2: if(strcmp(p[n].name, p[n+1].name) < 0) //按姓名排序 { temp = p[n]; p[n] = p[n+1]; p[n+1] = temp; } break; case 3: if(p[n].avg < p[n+1].avg) //按均分排序 { temp = p[n]; p[n] = p[n+1]; p[n+1] = temp; } break; default: break; } } } //若未选择退出,会有升降序选项 if (numb < 4) { printf("\n"); printf("--------a.降序输出 b.升序输出-------\n"); printf("请选择:"); getchar(); scanf("%c", &cha); printf("\n"); sort(numb, cha); } }while (numb != 4); } void sort(int numb, char cha) //升序降序输出 { int j; float avg; struct student *p = stu; switch (cha) { //降序输出,直接使用浏览功能函数输出 case 'a': if(numb < 4) bro_infor(); break; //升序输出 case 'b': if(numb != 4) { printf("ID \tNAME\t\t STB\t C SQL\t AVG\n"); for(j = 3 + i;j >= 0; j--) { avg = (p[j].score[0] + p[j].score[1] + p[j].score[2]) / 3; p[j].avg = avg; printf("%d %s\t\t %.0f\t %.0f\t %.0f\t %.2f\n", p[j].id, p[j].name, p[j].score[0], p[j].score[1], p[j].score[2], p[j].avg); } } break; } } void search_infor() //查询信息函数 { int num2, num3; //前者接收选项,后者接收查询id int k, l; int flag = 1; //处理学号不存在的情况 char* cha1; //接收查询姓名 float avg; struct student *p = stu; cha1 = (char*)malloc(100); do { printf("\t\t\t--------------------------------------\n"); printf("\t\t\t------1.退出 2.按学号 3.按姓名------\n"); printf("\t\t\t--------------------------------------\n"); printf("请选择:"); scanf("%d", &num2); switch(num2) { case 1: break; //id查询 case 2: printf("请输入要查询的id:"); scanf("%d", &num3); for(k = 0; k < 4+i; k++) { if (num3 == p[k].id) { flag = 0; printf("ID \tNAME\t\t STB\t C SQL\t AVG\n"); avg = (p[k].score[0] + p[k].score[1] + p[k].score[2]) / 3; p[k].avg = avg; printf("%d %s\t\t %.0f\t %.0f\t %.0f\t %.2f\n", p[k].id, p[k].name, p[k].score[0], p[k].score[1], p[k].score[2], p[k].avg); } } if(flag == 1) { printf("学号不存在!\n"); } break; //姓名查询 case 3: printf("请输入要查询的学生姓名:"); scanf("%s", cha1); for(l = 0; l < 4+i; l++) { if (strcmp(cha1, p[l].name) == 0) { flag = 0; printf("ID \tNAME\t\t STB\t C SQL\t AVG\n"); avg = (p[l].score[0] + p[l].score[1] + p[l].score[2]) / 3; p[l].avg = avg; printf("%d %s\t\t %.0f\t %.0f\t %.0f\t %.2f\n", p[l].id, p[l].name, p[l].score[0], p[l].score[1], p[l].score[2], p[l].avg); } } if(flag == 1) { printf("学号不存在!\n"); } break; } }while(num2 != 1); } void delet_infor() //信息删除函数 { int num3; //接收删除学生的id int k, v; int flag = 1; //处理学号不存在的情况 char num2; struct student *p = stu; do { printf("请输入要删除学生的id:"); scanf("%d", &num3); for(k = 0; k < 4+i; k++) { if (num3 == p[k].id) { flag = 0; for(v = k; v < (4 + i) -1; v++) { p[v] = p[v+1]; } } } if(flag == 0) { printf("删除成功!\n"); i--; } else{ printf("该学号不存在\n"); } printf("是否继续?(y/n)"); getchar(); scanf("%c", &num2); }while(num2 != 'n'); } void chang_infor() //8;信息修改 { int num, num2; int k, m; //前者用来处理id不存在的情况,后者来记录对应学号的结构体数组元素的下标,这里初始化为100(随意) int flag = 1, flag2 = 100; char cha; float avg; struct student *p = stu; printf("请输入需要修改信息的学生id:"); scanf("%d", &num); //输出改学生的当前信息 for(k = 0; k < 4+i; k++) { if (num == p[k].id) { flag = 0; flag2 = k; //存储下标 avg = (p[k].score[0] + p[k].score[1] + p[k].score[2]) / 3; p[k].avg = avg; printf("该学生的信息为:\n"); printf("ID \tNAME\t\t STB\t C SQL\t AVG\n"); printf("%d %s\t\t %.0f\t %.0f\t %.0f\t %.2f\n", p[k].id, p[k].name, p[k].score[0], p[k].score[1], p[k].score[2], p[k].avg); printf("\n"); } } if (flag == 1) { printf("改学号不存在!\n"); chang_infor(); //函数递归,提醒用户函数不存在并且可以重新输入。 } else { do { printf("请输入要修改的内容:\n"); printf("---1.学号 2.姓名 3.STB成绩 4.C成绩 5.SQL成绩 6.退出---\n"); scanf("%d", &num2); switch (num2) { case 1: printf("请输入新id:"); scanf("%d", &p[flag2].id); printf("修改成功\n"); break; case 2: printf("请输入新姓名:"); scanf("%s", p[flag2].name); printf("修改成功\n"); break; case 3: printf("请输入新STB成绩:"); scanf("%f", &p[flag2].score[0]); printf("修改成功\n"); break; case 4: printf("请输入新C成绩:"); scanf("%f", &p[flag2].score[1]); printf("修改成功\n"); break; case 5: printf("请输入新SQL成绩:"); scanf("%f", &p[flag2].score[2]); printf("修改成功\n"); break; } printf("是否继续修改此学生信息?<y/n>"); getchar(); scanf("%c", &cha); }while(cha == 'y'); } }
    Processed: 0.015, SQL: 9