学生管理系统的优化过程
知道自己太弱,距离大神们差了十万八千里,但是我不希望自己将来成为一个平庸的程序员,所以希望借用博客园这一平台来不断发表自己的文章,从而不断激励自己,提升自己。-----静平
上学期学了C语言,一直想要写出个东西来,以前写过一个通讯录,上周末花了一天时间写了一个学生信息管理系统。但是两者都有一个致命的缺点:只能在.exe文件中保存和使用,却不能保存在电脑中。想过用文件的方法来实现,但是苦于水平太差。今天晚上看了一下c++中的文件,恍然大悟。于是决定利用博客园这一平台来记录自己将一个c程序改成c++程序并且不断完善它的过程。
好吧,下面先贴自己那丑的要命的代码:(基本是用函数和switch堆砌而成的)
这部分是头文件部分:
#include<string.h> #define strcpy strcpy_s //由于是在vs上编辑的,而且前期忘了加上_s,所以只好用define这种小聪明的办法了 typedef struct Primary { int sum; int grade[20]; char subject[20][20]; int classs; }Primary; struct Student { Primary primary; int ID; char name[20]; }; struct Student student[1000]; static int i=0,count=0; void sort(); void AddPrimary(); void AddStudent(); void ReaddStudent(); void LookUp(); void Change(); void Delete(); void Scan(); void AddGrade(); void DeleteGrade(); void ScanGrade(); void ChangeGrade(); void LookupGrade(); void Scanstatistic(); void sorting(); void grade(); void information(); void statistics(); void information() { printf("1----录入基础信息(科目)\n"); printf("2----录入学生信息\n"); printf("3----追加学生信息\n"); printf("4----查询指定学生信息\n"); printf("5----修改指定学生信息\n"); printf("6----删除指定学生信息\n"); printf("7----浏览学生信息\n"); printf("0----返回主菜单\n"); printf("请输入操作模块代号:"); int choice1; while (scanf_s("%d", &choice1)) { switch (choice1) { case 1:AddPrimary(); break; case 2:AddStudent(); break; case 3:ReaddStudent(); break; case 4:LookUp(); break; case 5:Change(); break; case 6:Delete(); break; case 7:Scan(); break; case 0: { printf("***************学生成绩管理系统主菜单*****************************************\n"); printf("1----学生基本信息管理模块(录入、修改、查询、删除、浏览)\n"); printf("2----学生成绩信息管理模块(录入、修改、查询、删除、浏览\n"); printf("3----学生成绩统计模块\n"); printf("0----退出系统\n"); printf("请输入操作模块代号:"); int choice; while (scanf_s("%d", &choice)) { switch (choice) { case 1:information(); break; case 2:grade(); break; case 3:statistics(); break; case 0:printf("谢谢使用,再见\n"); exit(0); } } }; break; } } } void grade() { printf("1----录入学生成绩\n"); printf("2----查询指定学生成绩\n"); printf("3----修改指定学生成绩\n"); printf("4----删除指定学生成绩\n"); printf("5----浏览学生成绩信息\n"); printf("0----返回主菜单\n"); printf("请输入操作模块代号:\n"); int choice1; while (scanf_s("%d", &choice1)) { switch (choice1) { case 1:AddGrade(); break; case 2:LookupGrade(); break; case 3:ChangeGrade(); break; case 4:DeleteGrade(); break; case 5:ScanGrade(); break; case 0: { { printf("***************学生成绩管理系统主菜单************************************\n"); printf("1----学生基本信息管理模块(录入、修改、查询、删除、浏览)\n"); printf("2----学生成绩信息管理模块(录入、修改、查询、删除、浏览\n"); printf("3----学生成绩统计模块\n"); printf("0----退出系统\n"); printf("请输入操作模块代号:"); int choice; while (scanf_s("%d", &choice)) { switch (choice) { case 1:information(); break; case 2:grade(); break; case 3:statistics(); break; case 0:printf("谢谢使用,再见\n"); exit(0); } } }; break; } } } } void statistics() { printf("1----按成绩从高到低排序\n"); //printf("2----统计\n"); printf("3----浏览\n"); printf("0----返回主菜单\n"); printf("请输入操作模块代号:\n"); int choice1; while (scanf_s("%d", &choice1)) { switch (choice1) { case 1:sorting(); break; //case 2:statistic(); break; case 3:Scanstatistic(); break; case 0: { printf("***************学生成绩管理系统主菜单**************************************\n"); printf("1----学生基本信息管理模块(录入、修改、查询、删除、浏览)\n"); printf("2----学生成绩信息管理模块(录入、修改、查询、删除、浏览\n"); printf("3----学生成绩统计模块\n"); printf("0----退出系统\n"); printf("请输入操作模块代号:"); int choice; while (scanf_s("%d", &choice)) { switch (choice) { case 1:information(); break; case 2:grade(); break; case 3:statistics(); break; case 0:printf("谢谢使用,再见\n"); exit(0); } } }; break; } } } void AddPrimary() { printf("请输入科目;\n"); printf("(注:当输入科目后,如果想退出程序请按回车键否则请按空格)\n"); getchar(); for (count = 0;; ) { scanf_s("%s", student[0].primary.subject[count], sizeof(student[0].primary.subject[count])); count++; if (getchar() == '\n')break; } printf("如果您想回到上级菜单,请输入0\n"); } void AddStudent() { again6: printf("请依此输入学生的ID,班级,姓名\n"); for (;;) { scanf_s("%d", &student[i].ID, sizeof(student[i].ID)); scanf_s("%d", &student[i].primary.classs, sizeof(student[i].primary.classs)); scanf_s("%s", student[i].name, 20 * sizeof(student[i].name[0]) ); i++; if (getchar() == '\n')break; } printf("请问您是否想要继续添加学生信息?(Y/N)\n"); char choice1; scanf_s("%c", &choice1); if (choice1 == 'y' || choice1 == 'Y') goto again6; printf("如果您想回到上级菜单,请输入0\n"); } void ReaddStudent() { again1: printf("请输入您要追加信息的学生的ID以及姓名:\n"); scanf_s("%d", &student[i].ID, sizeof(student[i].ID)); scanf_s("%s", student[i].name, 20 * sizeof(student[i].name[0])); printf("是否还要继续追加学生信息?(Y/N)\n"); char choice1; scanf_s("%c", &choice1); if (choice1 == 'n' || choice1 == 'N') return; if (choice1 == 'y' || choice1 == 'Y') goto again1; Scanstatistic(); } void LookUp() { again5: printf("请输入您要查看的学生的ID:\n"); int id; scanf_s("%d", &id); int k; int h = 1; for (k = 0;k<i ; k++) { if (id == student[k].ID) { h = 0; printf("学生信息:\nID:\t\t姓名:\t\t班级:\n"); printf("%d\t\t%s\t\t%d\t\t\n", student[k].ID, student[k].name, student[k].primary.classs); break; } } if (h == 1) { printf("对不起,没有找到您要查找的ID,请重新输入\n"); goto again5; } char choice1; scanf_s("%c", &choice1,sizeof(choice1));printf("请问您是否还想继续查看其他学生的信息?(Y/N)\n"); if (choice1 == 'y' || choice1 == 'Y') goto again5; else printf("如果您想回到上级菜单,请输入0\n"); } void Change() { again2: printf("请输入您要查询的学生的ID:\n"); int id,h=0; scanf_s("%d", &id); for (int k = 0; k <= i; k++) { if (id == student[k].ID) { h = 1; printf("请输入您要修改的内容:\n1.姓名 2.班级 \n"); int choice1; scanf_s("%d", &choice1); if (choice1 == 1) scanf_s("%s", student[k].name); if (choice1 == 2) scanf_s("%d", student[k].primary.classs); break; } } if (h == 0) { printf("对不起,没有您要查找的学生ID,请重新查找\n"); goto again2; } printf("如果您想回到上级菜单,请输入0\n"); } void Delete() { printf("请输入您要删除的学生的ID:\n"); int id,k; scanf_s("%d", &id); for (k = 0;; k++) { if (id == student[k].ID) { strcpy(student[k].name, "NULL"); student[k].ID = 0; student[k].primary.classs = 0; break; } } printf("如果您想回到上级菜单,请输入0\n"); } void Scan() { printf("学生信息:\nID:\t\t姓名:\t\t班级:\n"); int k; for (k = 0; student[k].ID != 0; k++) { printf("%d\t\t%s\t\t%d\t\t\n", student[k].ID, student[k].name, student[k].primary.classs); } printf("如果您想回到上级菜单,请输入0\n"); } void AddGrade() { printf("请输入您想添加的学生ID:\n"); int id; scanf_s("%d", &id); printf("请依次输入学生成绩:\n"); int k; for (int h = 0; h < i; h++) { if (id == student[h].ID) { for (k = 0; k < count; k++) { printf("%s:", student[0].primary.subject[k]); scanf_s("%d", &student[h].primary.grade[k]); } } } printf("如果您想回到上级菜单,请输入0\n"); } void DeleteGrade() { printf("请输入您要删除的学生的ID和科目成绩:\n"); int id; scanf_s("%d", &id); for (int k = 0;; k++) { if (student[k].ID == id) { for (int h = 0; h < count; h++) student[k].primary.grade[h] = 0; } } Scanstatistic(); printf("如果您想回到上级菜单,请输入0\n"); } void LookupGrade() { again4: printf("请输入您要查看的学生的ID:\n"); int id; for (int h = 0; h < count; h++) printf("%s\t", student[0].primary.subject[h]); printf("\n"); scanf_s("%d", &id); for (int h = 0; h < i; h++) { if (student[i].ID == id) { for (int hehe = 0; hehe < count; hehe++) { printf("%d\t", student[h].primary.grade[hehe]); } } } printf("请问您还想查看其他学生的各科成绩吗?(Y/N)\n"); char choice1; scanf_s("%c", &choice1); if (choice1 == 'y' || choice1 == 'Y') goto again4; printf("如果您想回到上级菜单,请输入0\n"); } void ScanGrade() { int h; printf("下面是学生的ID、姓名以及各科成绩以及总分:\n"); printf("ID:\t姓名:\t"); for (int hehe = 0; hehe <count; hehe++) printf("%s\t", student[0].primary.subject[hehe]); printf("总分\n"); for (h = 0; h <= i; h++) { printf("%d\t%s\t", student[h].ID, student[h].name); for (int hehe = 0; hehe < count; hehe++) printf("%d\t", student[h].primary.grade[hehe]); printf("%d", student[h].primary.sum); printf("\n"); } printf("如果您想回到上级菜单,请输入0\n"); } void ChangeGrade() { int id,chengji; char kemu[20]; again3: printf("请输入您要修改的学生的ID以及科目和修改后的成绩:\n"); scanf_s("%d%s%d", &id, kemu,&chengji); for (int h = 0; h < i; h++) { if (id == student[h].ID) { for (int w = 0; w < count; w++) { if (strcmp(student[0].primary.subject[w], kemu) == 0) { student[h].primary.grade[w] = chengji; break; } } } } printf("请问您还要修改其他科目的成绩吗?(Y/N)\n"); char choice1; scanf_s("%c", &choice1); if (choice1 == 'y' || choice1 == 'Y') goto again3; Scanstatistic(); printf("如果您想回到上级菜单,请输入0\n"); } void Scanstatistic() { int sum; for (int h = 0; h < i; h++) { for (int hehe = 0; hehe < count; hehe++) { student[h].primary.sum += student[h].primary.grade[hehe]; } } printf("如果您想回到上级菜单,请输入0\n"); } void sorting() { Scanstatistic(); printf("下面是学生各科成绩以及总分:\n"); printf("ID:\t姓名:\t"); for (int h = 0; h < count; h++) printf("%s\t", student[0].primary.subject[h]); printf("总分:\n"); int k, h,num=0; int max=0,token; for (h = 0; h < i; h++) { for (k = 0; k <= i; k++) { if (student[h].primary.sum>max) max = student[h].primary.sum; } } } void sort() { int k, j; for (k = 0; k < i; k++) { for (j = k; j <= i; j++) { if (student[k].ID>student[j].ID) { int t; char temp[20]; { t = student[k].ID; student[k].ID = student[j].ID; student[j].ID = t; } { t = student[k].primary.classs; student[k].primary.classs = student[j].primary.classs; student[j].primary.classs = t; } { strcpy(temp, student[k].name); strcpy(student[k].name, student[j].name); strcpy(student[j].name, temp); } { for (int h = 0; h < count;h++) { char temp[20]; strcpy(temp, student[k].primary.subject[h]); strcpy(student[k].primary.subject[h], student[i].primary.subject[h]); strcpy(student[i].primary.subject[h], temp); } } } } } }
接下来是主函数部分:
#include<stdio.h> #include<Windows.h> #include"functions.h" int main() { for (int h = 0; h < 1000; h++) student[i].ID = 0; printf("***************学生成绩管理系统主菜单*************************************\n"); printf("1----学生基本信息管理模块(录入、修改、查询、删除、浏览)\n"); printf("2----学生成绩信息管理模块(录入、修改、查询、删除、浏览\n"); printf("3----学生成绩统计模块\n"); printf("0----退出系统\n"); printf("请输入操作模块代号:"); int choice; while (scanf_s("%d", &choice)) { switch (choice) { case 1:information(); break; case 2:grade(); break; case 3:statistics(); break; case 0:printf("谢谢使用,再见\n"); return 0; } } system("pause"); return 0; }
由于写代码期间有了隔断,所以思路并不是很完整,因此出现不少思维漏洞的地方,还有的功能尚未实现。
决定周末好好的整改一下个程序。