这是大一第一次做出来的程序 想着也有点纪念意义
两个文章一起发是因为懒(
#define _CRT_SECURE_NO_WARNINGS //编程软件为VS2019 #include//io头文件 #include //用到了字符串 #include //用到了system #include //有个小惊喜 #include //控制一下窗口大小 struct stu; void luru();//初次录入 void zengjia();//增加学生 void liulan();//浏览信息 void chaxuehao();//学号查成绩 void chamingzi();//姓名查成绩 int zcj(int);//计算总成绩 void paichengji();//成绩排序 void paixingming();//姓名排序 void shanchu();//删除 void xiugai();//修改 void yinmi();//特殊功能 int m = 0;//记录已录入学生数量 int zhu1 = 0;//判断是否使用过初次录入 int zhu2 = 0;//判断是否是第一次进入主函数 int jimenchengji = 0;//记录 要求的成绩数量 int jigeren = 0;//记录 要求的人数上限 struct stu//学号 姓名 成绩 结构体 { int xuehao; char xingming[20];//姓名上限为20个字符 int chengji[6]; }k[40];//最多人数为40 void luru()//初次录入 { if (zhu1 == 123) { goto zhuzhu;//经过一次初次录入后,zhu1会被赋值 123 再次进入会直接goto进 zhuzhu } int i = 0;//循环 int a = 0;//初次录入的人数 int j = 0;//循环 printf("n请问你要录入几个人呢?n"); scanf("%d", &a); m = a;//记录总人数 zhu1 = 123;//判断是否进入过初次录入 for (i = 0; i < a; i++)//本次录入几人 就循环输入几次 { printf("n请输入这位学生的学号 姓名 各科成绩(共 %d 门课) 一共有 %d 名学生需要录入,这是第 %d 位 n",jimenchengji, a, i + 1); scanf("%d %s", &k[i].xuehao, k[i].xingming); for (j = 0; j < jimenchengji; j++)//本次录入几门成绩 就循环输入几次 scanf("%d", &k[i].chengji[j]); } while (getchar() != 'n')//因为缓冲区总是被'n'占满,scanf总是被无视,所以清理缓冲区中的'n' { ; } if (zhu1 == 124341421) { zhuzhu: printf("n你已经初次录入过了!如果想要增加学生的话n请选择 2.增加学生信息!n");//第二次进入《初次录入》时的提示 } system("pause");//主函数中会清屏 在此暂停 } void zengjia()//增加录入人数 { int a = 0;//本次增加人数 int i = 0;//循环 int j = 0;//循环 printf("n请问你要增加几个人呢?n"); scanf("%d", &a); for (i = m; i < (a + m); i++)//与《初次录入》程序逻辑相同 接着《初次录入》往后面序号的结构体录入信息 { printf("请输入这位学生的学号 姓名 各科成绩(共 %d 门课) 一共有 %d 名学生需要录入,这是第 %d 位 n",jimenchengji,a, i + 1 - m); scanf("%d %s", &k[i].xuehao, k[i].xingming); for (j = 0; j < jimenchengji; j++) { scanf("%d", &k[i].chengji[j]); } } m += a;//记录总人数 while (getchar() != 'n')//清理缓冲区 { ; } system("pause");//暂停 } void liulan()//浏览已录入的成绩 { int i = 0, j = 0;//循环 if (m == 0)//如果总人数是0,则提示 { printf("n暂无学生成绩录入n"); } if (m != 0) { printf("n现有学生的如下n顺序为 学号 姓名"); for (i = 1; i <= jimenchengji; i++)//提示一下有几门成绩 { printf(" 成绩%d ", i); } for (i = 0; i < m; i++)//和《初次录入》的结构逻辑相同 将scanf换成了printf { printf("n%d %s", k[i].xuehao, k[i].xingming); for (j = 0; j < jimenchengji; j++) { printf(" %d", k[i].chengji[j]); } } printf("n");//这个就是为了让“按任意键继续”去下一行,美观一些 } while (getchar() != 'n')//清理缓冲区 { ; } system("pause");//暂停 } void chaxuehao()//以学号查询成绩 { int i = 0, j = 0, n = 0, a = 0;//i j n都是循环用的,a是用来输入学号的 if (m == 0) { printf("n暂无学生成绩录入n"); } if (m != 0) { printf("n请输入想要查找的学号n"); scanf("%d", &a); for (n = 0; n < m; n++)//循环一遍结构体 找一下对应学号 { if (k[n].xuehao == a)//找到之后k[n]就是该名学生的结构体序号 { printf("n该同学的学号 姓名");//与《浏览》中打印学生成绩的逻辑相同 for (i = 1; i <= jimenchengji; i++) { printf(" 成绩%d ", i); } printf("为:n"); printf("n%d %s", k[n].xuehao, k[n].xingming); for (j = 0; j < jimenchengji; j++) { printf(" %d", k[n].chengji[j]); } printf("n"); break;//打印完这名学生后跳出循环 } } if (n == m) printf("n没有找到该名学生的信息n");//当循环过m遍之后,就找完了结构体里录入的所有信息。若仍然没有配对的,就输出“没有找到” } while (getchar() != 'n')//清理缓冲区 { ; } system("pause");//暂停 } void chamingzi()//以姓名查询成绩 { int i = 0, j = 0, n = 0;//循环 char a[20]="0";//输入a代表该名同学的名字 if (m == 0)//如果 m = 0则结构体中 没有学生成绩录入 { printf("n暂无学生成绩录入n"); } if (m != 0) { printf("n请输入想要查找的姓名n"); scanf("%s", a); for (n = 0; n < m; n++)//与以学号查询成绩的逻辑相同 { if (strcmp(k[n].xingming, a) == 0) { printf("n该同学的学号 姓名"); for (i = 1; i <= jimenchengji; i++) { printf(" 成绩%d ", i); } printf("为:n"); printf("n%d %s", k[n].xuehao, k[n].xingming); for (j = 0; j < jimenchengji; j++) { printf(" %d", k[n].chengji[j]); } printf("n"); break; } } if (n == m) printf("n没有找到该名学生的信息n");//提示 循环 m 遍后,则结构体内没有这名学生的信息 } while (getchar() != 'n')//缓冲区 { ; } system("pause");//暂停 } int zcj(int x)//求总成绩 输入x 返回k[x].chengji的和 { int i = 0, zcj = 0; for (i = 0; i < jimenchengji; i++) { zcj += k[x].chengji[i]; } return zcj; } void paichengji()//以总成绩排序 { int i = 0, j = 0,a[40],b = 0,c = 0;//a[40]是用来接收结构体k[40]总成绩的 b是用来模拟 m 的,模拟的原因在下面,i j c都是循环 if (m == 0) { printf("n暂无学生成绩录入n"); } if (m != 0) { for (i = 0; i < m; i++)//给a[i]赋值k[i] 的总成绩 { a[i] = zcj(i); } for (i = 0; i < m; i++)//给a排序 { for (j = i; j < m; j++) { if (a[i] < a[j]) { int jiaohuan = a[j]; a[j] = a[i]; a[i] = jiaohuan; } } } for (i = 0, b = m; i < b; i++)//给a删除重复的成绩,否则若n个总成绩重复时 程序会打印 2^n 次 { for (j = i + 1; j < b; j++) { if (a[i] == a[j]) { for (c = j; c < b; c++) a[c] = a[c + 1]; j--; b--; } } } printf("n现有学生的如下n顺序为 学号 姓名"); int n = 0; for (n = 1; n <= jimenchengji; n++) { printf(" 成绩%d ", n); } printf("总成绩"); printf(":n"); for (i = 0; i < m; i++) { for (j = 0; j < m; j++) { if (a[i] == zcj(j))//通过a[i]的总成绩,找到对应的k[j],并将k[j]的学号姓名成绩都打印出来。如果刚才没有删除a中的重复元素,则会导致打印多余学生 { printf("n%d %s", k[j].xuehao, k[j].xingming); for (n = 0; n < jimenchengji; n++) { printf(" %d", k[j].chengji[n]); } printf(" %d", zcj(j)); printf("n"); } } } } while (getchar() != 'n')//清理缓冲区 { ; } system("pause");//暂停 } void paixingming()//用姓名排序 { char a[20][40];//接收k.xingming int i = 0,j = 0;//循环 if (m == 0) { printf("n暂无学生成绩录入n"); } if (m != 0) { for (i = 0; i < m; i++) { strcpy(a[i], k[i].xingming);//a[i]接收k[i].xingming } for (i = 0; i < m; i++)//给a排序 { for (j = i; j < m; j++) { if (strcmp(a[i], a[j]) > 0) { char jiaohuan[20]; strcpy(jiaohuan, a[i]); strcpy(a[i], a[j]); strcpy(a[j], jiaohuan); } } } printf("n现有学生的如下n顺序为 学号 姓名");//打印逻辑和总成绩排序一样 int n = 0; for (n = 1; n <= jimenchengji; n++) { printf(" 成绩%d ", n); } printf(":n"); for (i = 0; i < m; i++) { for (j = 0; j < m; j++) { if (strcmp(a[i], k[j].xingming) == 0) { printf("n%d %s", k[j].xuehao, k[j].xingming); for (n = 0; n < jimenchengji; n++) { printf(" %d", k[j].chengji[n]); } printf("n"); } } } } while (getchar() != 'n')//清理缓冲区 { ; } system("pause");//暂停 } void shanchu() { int i = 0, j = 0, a = 0, n = 0, b = 0;//a 接收 被删除的学号 b 是下面交换时的中间值 i,j,n是循环 char jiaohuan[20];//姓名交换的中间值 if (m == 0) { printf("n暂无学生成绩录入n"); } if (m != 0) { printf("n请输入您要删除的学号n"); scanf("%d", &a); for (i = 0; i < m; i++) { if (k[i].xuehao == a)//找到该名学生结构体序号是k[i] { for (j = i; j < m - 1; j++)//将该名学生与后面的学生 姓名 学号 成绩都进行交换,总计需要交换 m - i - 1 次 //j 初始值又为 i 则可计算为 当限制条件为j < m - 1时 ,可让for循环 m - i - 1次 //交换到最后 j 与 j+1交换时 ,需要删除的信息 就会变成 m - 1,即结构体序号中的最后一位 { for (n = 0; n < jimenchengji; n++) { b = k[j].chengji[n]; k[j].chengji[n] = k[j + 1].chengji[n]; k[j + 1].chengji[n] = b; } b = k[j].xuehao; k[j].xuehao = k[j + 1].xuehao; k[j + 1].xuehao = b; strcpy(jiaohuan, k[j].xingming); strcpy(k[j].xingming, k[j + 1].xingming); strcpy(k[j + 1].xingming, jiaohuan); } } } m--;// 将m-- 因为输出成绩时 输出数量由m控制 因此 m-- 后,输出成绩便不会输出最后一位结构体 // 并且 输入成绩时 输入的位置也由 m 控制,输入新的学生信息时 会覆盖被删除的信息 printf("n删除成功!n"); } while (getchar() != 'n')//清理缓冲区 { ; } system("pause");//暂停 } void xiugai()//修改学生信息 { int i = 0, j = 0, a = 0;//a接收学号, i j循环 if (m == 0) { printf("n暂无学生成绩录入n"); } if (m != 0) { printf("n请输入需要修改的学号n"); scanf("%d", &a); for (i = 0; i < m; i++)//与《初次录入》结构相同 { if (k[i].xuehao == a) { printf("n请重新输入"); int n = 0;//循环 for (n = 1; n <= jimenchengji; n++) { printf(" 成绩%d ", n); } printf(":n"); for (j = 0; j < jimenchengji; j++) { scanf("%d", &k[i].chengji[j]); } } } printf("n修改成功!n"); } while (getchar() != 'n')//清理缓冲区 { ; } system("pause");//暂停 } void yinmi()//特殊功能 打印心 { system("cls");//清屏 Sleep(300);//延时300ms printf("ttt********** **********n"); Sleep(300); printf("tt ***** ****** ***** *****n"); Sleep(300); printf("tt*** **** **** ***n"); Sleep(300); printf("t *** *** *** ***n"); Sleep(300); printf("t ** ***** **n"); Sleep(300); printf("t * *n"); Sleep(300); printf("t ** 421109070919 朱轶豪 **n"); Sleep(300); printf("t ** **n"); Sleep(300); printf("t * 听我说 谢谢你 因为有你 *n"); Sleep(300); printf("t ** **n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** 温暖了四季 ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t *** ***n"); Sleep(300); printf("t ** **n"); Sleep(300); printf("t ***n"); while (getchar() != 'n')//清理缓冲区 { ; } system("pause");//暂停 } int main() { system("mode con cols=120 lines=40");//改变窗口大小 gaijimen://为后面goto提供坐标 printf("************************************************************************************************************************n"); printf("*************** 请问您在这个程序当中 想要记录几科成绩呢? ***************n"); printf("n 我选择..."); scanf("%d", &jimenchengji); if (zhu2 == 1234123)//修改时才显示,初次录入不显示 { printf("n修改成功!n"); system("pause"); } if (zhu2 != 1234123)//在后面会赋值 zhu2 = 1234123 防止 下次修改《成绩数量》时 进入修改《学生上限》 { gaijiren://为后面goto提供坐标 printf("n************************************************************************************************************************n"); printf("*************** 请问您在这个程序当中 最多想储存几位同学的成绩呢? *************n"); printf("n 我选择..."); scanf("%d", &jigeren); if (zhu2 == 1234123)//修改时才显示,初次录入不显示 { printf("n修改成功!n"); system("pause"); } } zhu2 = 1234123;//赋值 system("cls");//清屏 int a = 0, p = 0; while (1) { if (m > jigeren) { while (1) printf("人数超了不知道?自己定的人数上限自己不知道?t");//如果人数超出上限会有提示 } printf("************************************************************************************************************************n"); printf("************************************************************************************************************************n"); printf("*********************** 学生信息录入系统 学号 421109070919 作者:朱轶豪 **********************************n"); printf("************************************************************************************************************************n"); printf("*** ************************************************n"); printf("*** 1. 初次录入学生信息 *** 最多录入 %-2d 人 ***n",jigeren); printf("*** 2. 增加一名学生的信息 *** 每人应录入 %-2d 科成绩 ***n", jimenchengji); printf("*** 3. 学生信息浏览 *** 现已录入 %-2d 人 ***n", m); printf("*** 4. 信息查询(按学号查) ************************************************n"); printf("*** 5. 信息查询(按姓名查) ***n"); printf("*** 6. 信息排序(按总分降序) ***n"); printf("*** 7. 信息排序(按姓名排序) ***n"); printf("*** 8. 信息删除(给定学号,删除该学生信息) ***n"); printf("*** 9. 信息修改(给定学号,修改该学生信息) ***n"); printf("*** 10. 更改录入学生上限或录入成绩数量 ***n"); printf("*** 0. 退出 ***n"); printf("*** 输入123456 给你画画 ***n"); printf("************************************************************************************************************************n"); printf("************************************************************************************************************************n"); printf("我选择:..."); scanf("%d", &a); switch (a) { case 0: return 0; break; case 1: luru(); break; case 2: zengjia(); break; case 3: liulan(); break; case 4: chaxuehao(); break; case 5: chamingzi(); break; case 6: paichengji(); break; case 7: paixingming(); break; case 8: shanchu(); break; case 9: xiugai(); break; case 10: printf("选择修改录入学生上限输入 1 n选择修改录入成绩数量输入 2 n");//更改学生上限和成绩数量 scanf("%d", &p); if (1 == p) goto gaijiren; if (2 == p) goto gaijimen; break; case 123456: yinmi(); break; default: printf("请选择输入一个页面上的选项");//如果选项中没有你输入的数,会有提示 break; } system("cls");//清屏 } return 0; }



