目录
学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?
导言
学生菜单系统是基于前阶段的C语言学习,从实际出发,巩固C语言基础的练习,通过多种函数的不同运用,检验知识点的牢固可靠性。
系统设计概述
整个学生系统将会被分成几个内容,将大任务分为多个小任务,并将其合理连接起来,独立而又有联系,对逻辑能力有一定要求(没错,我是木头)
设计多个模块
- 开发团队信息(即首页,目前来说是次要,直接运用printf即可)
- 模拟系统密码登录(通过循环对不同密码情况进行判定,从而使系统做出不同反应,一般包含①密码正确,进入系统②密码错误,退出系统,这两种情况)根据平时实际情况,多次输入密码错误,也可以添加这一项内容,实现更完整的功能还原
- 学生信息录入版块(运用结构体和数组,对学生多项信息进行输入,可包括姓名,学号,性别,年龄,成绩等。由于是模拟班级或者学校系统,所以会模拟多个学生信息录入的过程,此过程可运用循环实现)
- 计算分数版块(使用简单的运算法则即可完成,此处还可细分两种,一种是计算成绩总分,另一种是计算平均分)
- 信息修改版块(通过学生学号查找,进行修改、添加或删除等操作)
- 成绩排序版块(运用冒泡法,对学生一一对比,按学生总分进行排序输出)
- 系统退出
详细代码操作
所涉及的头函数:
自定义函数:
showAuthor(); 团队信息
checkLogin(); 密码检测
MainMenu(); 主菜单
input(); 信息录入
add(); 添加信息
Delete(); 删除信息
countScore(); 等级评定
oderbyScore() 成绩排序
结构体定义:
使用结构体将所需学生信息罗列出来,定义一个数组,保存各项内容本文内容的系统包括的信息如下:学号,姓名,年龄,性别,手机号码,数学、英语、体育和语文的成绩,总分和平均分。(此处成绩不分为两个函数了,直接进行计算)
structstudent//结构体{ charsno[10]; //学号charsname[10]; //姓名intsage; //年龄charssex[10]; //性别charstel[20]; //手机号码floatMath; //数学成绩floatC; //语文成绩floatEnglish; //英语成绩floatSport; //体育floatScore; //总成绩floatAver; //平均分}; structstudentp[100]; //数组
详细设计
首先,进入系统显示的团队信息printf即可,无需过于复杂
模板如下
系统显示
voidshowAuthor() // 显示团队信息{ printf("========= ===**小九出品 $ 必属良品**==============\n"); printf("\n"); printf("=============技术不精**被逼无奈**实属下策=============\n"); printf("\n"); printf(" * * * 开发团队信息 * * * *\n"); printf("\n"); printf("====================**盗版必究**======================\n"); printf("\n"); }
其次呢,我们进入系统肯定得设置一串密码吧,由于学艺不精,这密码暂时只设置包含数字的吧,初始密码123456,暂且用 int 混过去。接着回想登录过程,有正误之分,那必然少不了else-if的参与,通过判定密码值,来确定循环条件中的0和1
而后,可设定一个计数器 cnt,用while循环实现当cnt=n次时,系统锁定自动退出
注:在这几项过程中,很明显若是单纯的一个画面,那必然导致文字繁多画面杂乱
我们就可以利用好system("cls");清屏特点,再适当时候,进行画面清楚
运用好这点,也可以配合Sleep(n);实现计时器的倒计时特点
voidcheckLogin() //密码检测登录{ intPW=123456; //密码printf("请输入系统密码:"); for(cnt=0;cnt!=3;) { scanf("%d",&password); if(password==PW) { n=1; printf("登录成功,3秒后自动进入系统\n"); Sleep(1000); printf("登录成功,2秒后自动进入系统\n"); Sleep(1000); printf("登录成功,1秒后自动进入系统\n"); Sleep(1000); system("cls"); break; } else { cnt++; while(cnt==3) { printf("系统锁定,无法输入密码,3秒后系统自动关闭\n"); Sleep(2000); system("cls"); printf("系统锁定,无法输入密码,2秒后系统自动关闭\n"); Sleep(1200); system("cls"); printf("系统锁定,无法输入密码,1秒后系统自动关闭\n"); Sleep(1200); system("cls"); exit(0); } printf("密码错误,再次输入密码:"); } } }
密码输入完成后,必然有主菜单,清屏弹出主菜单界面,就可以用简单的循环来实现,同时编辑出上下左右的边框,美观!(全局变量中一定要定义好画布大小,否则该功能无法实现)
voidMainMenu() //主菜单{ inti,j; printf("—————欢迎使用小九牌伪劣系统—————\n"); printf("\n"); printf("\n"); for(i=6;i<=high;i++) { for(j=0;j<=width;j++) { if((i==6)||(i==high)) { printf("#"); //上下边框 } elseif((i==7)&&(j==16)) { printf("1.信息录入\t"); } elseif((i==9)&&(j==16)) { printf("2.添加信息\t"); } elseif((i==11)&&(j==16)) { printf("3.删除信息\t"); //待完善 } elseif((i==13)&&(j==16)) { printf("4.等级评定\t"); //待完善 } elseif((i==15)&&(j==16)) { printf("5.成绩修改\t"); //待完善 } elseif((i==17)&&(j==16)) { printf("6.成绩排序\t"); //待完善 } elseif((i==19)&&(j==16)) { printf("0.退出系统\t"); //待完善 } elseif((j==0)||(j==width)) { printf("1"); } else { printf(" "); } } printf("\n"); } }
效果如下:编辑
接着就是菜单的跳转功能,此处就要运用到一个与它必然相关的选择Switch-case
运用不同的case n:,跳转到不同的函数,进行相应的操作。格式重复,十分简单。
while(1) { printf("请输入你的选择(0-6)"); scanf("%d",&num_choose); switch(num_choose) { case1: input(); system("cls"); break; case2: add(); system("cls"); break; case3: Delete(); system("cls"); break; case4: countScore(); system("cls"); break; case5: oderbyScore(); system("cls"); break; case6: modifyScore(); system("cls"); break; case0: system("cls"); break; default:printf("结束\a");system("cls"); } }
后面就以一个自定义函数为例,运用结构体和数组,实现学生信息的录入
这里的第一步,自然是判断学生的人数,根据实际判断条件,给while的操作与否提供数值,当学生人数超出范围,那自然要重新输入。
再运用i定义出不同的p[i],给不同学号i的学生留出空间
信息录入
voidinput() //信息录入{ inti,j,k=1; printf("请输入学生人数(0-100):"); scanf("%d",&j); while((j<0)||(j>100)) { printf("请重新输入学生人数(0-100):"); scanf("%d",&j); } n=j; for(i=0;i<n;i++) { printf("输入第%d个学生的学号:",i+1); scanf("%s",&p[i].sno); printf("输入第%d个学生的姓名:",i+1); scanf("%s",&p[i].sname); printf("输入第%d个学生的年龄:",i+1); scanf("%d",&p[i].sage); printf("输入第%d个学生的性别:",i+1); scanf("%s",&p[i].ssex); printf("输入第%d个学生的电话:",i+1); scanf("%s",&p[i].stel); printf("输入第%d个学生的数学成绩:",i+1); scanf("%f",&p[i].Math); printf("输入第%d个学生的C成绩:",i+1); scanf("%f",&p[i].C); printf("输入第%d个学生的英语成绩:",i+1); scanf("%f",&p[i].English); printf("输入第%d个学生的体育成绩:",i+1); scanf("%f",&p[i].Sport); printf("第%d个学生的总分为:%g",i+1,p[i].Score=p[i].Math+p[i].C+p[i].English+p[i].Sport); printf("第%d个学生的平均分为:%g",i+1,p[i].Aver=(p[i].Math+p[i].C+p[i].English+p[i].Sport)/4); printf("\n"); printf("\n"); printf("系统记录中,请稍等"); Sleep(3000); printf("\n"); } }
有输入就有修改选项,接下来就是删除信息板块
详细看代码,就不过多赘述了。
voidDelete() //删除信息{ inti,j,k,n=100; printf("请输入要删除的学生的学号:"); scanf("%d",&k); for(i=0;i<k;i++) { if(k==p[i].sno[10]) break; } if((i<0)||(i>100)) { printf("学号不存在!请输入正确的学号:\n"); } else { for(j=i;j<n;j++) p[j]=p[j+1]; printf("系统删除中,请稍后\n"); Sleep(3000); } }
删除信息
删除信息,等级评定,成绩修改等板块,都是几乎一样的模板,相同的查询方法,运用for if 循环
voidDelete() //删除信息****************************************************{ system("cls"); inti,flag=0; charj[10]; intn=100; printf("请输入要删除的学生所属学号:\n"); scanf("%s",&j); for(i=0;i<n;i++) { if(strcmp(j,p[i].sno)==0) { flag=1; p[i] =p[i+1]; printf("学生已删除"); } } if(flag==0) { printf("没有此学生\n"); } system("pause"); system("cls"); }
等级评定
voidcountScore() //等级评定***************************************************************************{ system("cls"); inti,flag=0; charj[10]; intn=100; printf("请输入一个学生的学号\n"); scanf("%s",&j); for(i=0;i<n;i++) { if(strcmp(j,p[i].sno)==0) { flag=1; printf("该学生总成绩为:%g\n",p[i].Score); if(p[i].Score<100) { printf("该学生成绩评级为:C"); system("pause"); } elseif((p[i].Score>=100)&&(p[i].Score<300)) { printf("该学生成绩评级为:B"); system("pause"); } elseif(p[i].Score>=300) { printf("该学生成绩评级为:A"); system("pause"); } } } if(flag==0) { printf("没有此学生"); system("pause"); system("cls"); printf("是否继续查找学生信息\n"); printf("输入a(继续),输入b(退出)\n"); charinput; input=getch(); if(input=='a') { countScore(); } elseif(input=='b') { MainMenu(); } } system("cls"); printf("是否继续查找学生信息\n"); printf("输入a(继续),输入b(退出)\n"); charinput; input=getch(); if(input=='a') { countScore(); } elseif(input=='b') { MainMenu(); } }
成绩排序
voidoderbyScore() //成绩排序***************************************************************************{ system("cls"); inti,k,l,flag=0; charj[10]; intn; printf("请输入要排序的学生个数:\n"); scanf("%d",&n); for(k=0;k<n;k++) { printf("请输入第%d个学生的学号:\n",k+1); scanf("%s",&j); for(i=0;i<100;i++) { if(strcmp(j,p[k].sno)==0) { flag=1; printf("该学生学号为%s\n",p[k].sno); printf("该学生总成绩为%g\n",p[k].Score); break; } } if(flag!=1) { printf("无此学生\n"); } } for(i=0;i<100;i++) { for(k=0;k<n-1-i;k++) { if(p[k].Score>=p[k+1].Score) { l=p[k].Score; p[k].Score=p[k+1].Score; p[k+1].Score=l; } } } printf("排名为:\n"); for(k=0;k<n;k++) { printf("%g\n",p[k].Score); } system("pause"); }
成绩修改
voidmodifyScore() //成绩修改****************************************************************************{ system("cls"); inti,flag=0; floatx[10]; charj[10]; system("cls"); printf("请输入要修改成绩的学生学号\n"); scanf("%s",&j); for(i=0;i<100;i++) { if(strcmp(j,p[i].sno)==0) { flag=1; printf("该学生成绩为%g\n",p[i].Score); printf("请输入要修改的成绩值(0~100)\n"); scanf("%g",&x[i]); p[i].Score=x[i]; } } if(flag!=1) { printf("无此学生"); } system("pause"); system("cls"); printf("是否继续查找学生信息\n"); printf("输入a(继续),输入b(退出)\n"); charinput; input=getch(); if(input=='a') { modifyScore(); } elseif(input=='b') { MainMenu(); } }
查找学生
voidsearchstu() //查找学生************************************************************************{ system("cls"); inti,flag=0; charj[10]; intn=100; printf("请输入一个学生的学号\n"); scanf("%s",&j); for(i=0;i<n;i++) { if(strcmp(j,p[i].sno)==0) { printf("学号:%s\n",p[i].sno); printf("姓名:%s\n",p[i].sname); printf("性别:%s\n",p[i].ssex); printf("电话号码:%s\n",p[i].stel); printf("年龄:%d\n",p[i].sage); printf("数学成绩:%g\n",p[i].Math); printf("英语成绩:%g\n",p[i].English); printf("C成绩:%g\n",p[i].C); printf("体育成绩:%g\n",p[i].Sport); printf("总成绩:%g\n",p[i].Score); printf("平均分:%g\n",p[i].Aver); flag=1; } } if(flag==0) { printf("没有此学生\n"); } system("pause"); system("cls"); printf("是否继续查找学生信息\n"); printf("输入a(继续),输入b(退出)\n"); charinput; input=getch(); if(input=='a') { searchstu(); } elseif(input=='b') { MainMenu(); } }
代码展示
目前只实现了这几个板块,后续还将继续补充其他板块,使这个系统更完整,残缺的代码就展示出来吧,仅供参考,我会继续努力,进一步完善。(忽略此内容嘿嘿)
此文案在上一次发布的内容做补充,各板块已基本实现其功能,欢迎修改bug,谢谢
此次发布时间 2022/09/24
#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<windows.h> void HideCursor() { CONSOLE_CURSOR_INFO cursor_info={1,0}; //0表示隐藏光标 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE),&cursor_info); } int high = 26; int width = 42; int password; int n=100; int cnt = 0; int choice; int num_choose; struct student { char sno[10]; char sname[10]; int sage; char ssex[10]; char stel[20]; float Math; float C; float English; float Sport; float Score; float Aver; }; struct student p[100]; void showAuthor() // 显示团队信息 { printf("========= ===**小九出品 $ 必属良品**==============\n"); printf("\n"); printf("=============技术不精**被逼无奈**实属下策=============\n"); printf("\n"); printf(" * * * 开发团队信息 * * * *\n"); printf("\n"); printf("====================**盗版必究**======================\n"); printf("\n"); } void MainMenu() //主菜单***************************************************************************** { int i,j; printf("—————欢迎使用小九牌伪劣系统—————\n"); printf("\n"); printf("\n"); for(i=6;i<=high;i++) { for(j=0;j<=width;j++) { if((i==6)||(i==high)) { printf("#"); //上下边框 } else if((i==7)&&(j==16)) { printf("1.信息录入\t"); } else if((i==9)&&(j==16)) { printf("2.删除信息\t"); } else if((i==11)&&(j==16)) { printf("3.等级评定\t"); } else if((i==13)&&(j==16)) { printf("4.成绩排序\t"); } else if((i==15)&&(j==16)) { printf("5.成绩修改\t"); } else if((i==17)&&(j==16)) { printf("6.查找学生\t"); } else if((i==19)&&(j==16)) { printf("0.退出系统\t"); } else if((i==21)&&(j==16)) { printf("完善中。。。\t"); //待完善 } else if((i==23)&&(j==16)) { printf("完善中。。。\t"); //待完善 } else if((i==25)&&(j==16)) { printf("完善中。。。\t"); //待完善 } else if((j==0)||(j==width)) { printf("1"); } else { printf(" "); } } printf("\n"); } } void checkLogin() //密码检测登录************************************************************************ { int PW = 123456; //密码 printf("请输入系统密码:"); for(cnt=0;cnt!=3;) { scanf("%d",&password); if(password==PW) { n=1; printf("登录成功,3秒后自动进入系统\n"); Sleep(1000); printf("登录成功,2秒后自动进入系统\n"); Sleep(1000); printf("登录成功,1秒后自动进入系统\n"); Sleep(1000); system("cls"); break; } else { cnt++; while(cnt==3) { printf("系统锁定,无法输入密码,3秒后系统自动关闭\n"); Sleep(2000); system("cls"); printf("系统锁定,无法输入密码,2秒后系统自动关闭\n"); Sleep(1200); system("cls"); printf("系统锁定,无法输入密码,1秒后系统自动关闭\n"); Sleep(1200); system("cls"); exit(0); } printf("密码错误,再次输入密码(你只有三次机会):\n"); } } } void input() //信息录入********************************************************************************** { system("cls"); int i,j; printf("请输入学生人数(0-100):"); scanf("%d",&j); while((j<0)||(j>100)) { printf("请重新输入学生人数(0-100):"); scanf("%d",&j); } n=j; for(i=0;i<n;i++) { printf("输入第%d个学生的学号:",i+1); scanf("%s",&p[i].sno); while((*p[i].sno<0)&&(*p[i].sno>100)) { printf("请重新输入学生学号(0-100):"); scanf("%s",&p[i].sno); } printf("输入第%d个学生的姓名:",i+1); scanf("%s",&p[i].sname); printf("输入第%d个学生的年龄:",i+1); scanf("%d",&p[i].sage); printf("输入第%d个学生的性别:",i+1); scanf("%s",&p[i].ssex); printf("输入第%d个学生的电话:",i+1); scanf("%s",&p[i].stel); printf("输入第%d个学生的数学成绩:",i+1); scanf("%f",&p[i].Math); printf("输入第%d个学生的C成绩:",i+1); scanf("%f",&p[i].C); printf("输入第%d个学生的英语成绩:",i+1); scanf("%f",&p[i].English); printf("输入第%d个学生的体育成绩:",i+1); scanf("%f",&p[i].Sport); p[i].Score=p[i].Math+p[i].C+p[i].English+p[i].Sport; printf("第%d个学生的总分为:%g\n",i+1,p[i].Score); p[i].Aver=(p[i].Math+p[i].C+p[i].English+p[i].Sport)/4; printf("第%d个学生的平均分为:%g\n",i+1,p[i].Aver); printf("\n"); printf("\n"); printf("系统记录中,请稍等\n"); Sleep(1000); system("pause"); printf("\n"); system("cls"); } } void Delete() //删除信息***************************************************************************** { system("cls"); int i,flag = 0; char j[10]; int n = 100; printf("请输入要删除的学生所属学号:\n"); scanf("%s",&j); for(i=0;i<n;i++) { if(strcmp(j,p[i].sno)==0) { flag = 1; p[i] = p[i+1]; printf("学生已删除"); } } if(flag==0) { printf("没有此学生\n"); } system("pause"); system("cls"); } void countScore() //等级评定*************************************************************************** { system("cls"); int i,flag=0; char j[10]; int n = 100; printf("请输入一个学生的学号\n"); scanf("%s",&j); for(i=0;i<n;i++) { if(strcmp(j,p[i].sno)==0) { flag = 1; printf("该学生总成绩为:%g\n",p[i].Score); if(p[i].Score < 100) { printf("该学生成绩评级为:C"); system("pause"); } else if((p[i].Score>=100)&&(p[i].Score<300)) { printf("该学生成绩评级为:B"); system("pause"); } else if(p[i].Score>=300) { printf("该学生成绩评级为:A"); system("pause"); } } } if(flag == 0) { printf("没有此学生"); system("pause"); system("cls"); printf("是否继续查找学生信息\n"); printf("输入a(继续),输入b(退出)\n"); char input; input = getch(); if(input =='a') { countScore(); } else if(input == 'b') { MainMenu(); } } system("cls"); printf("是否继续查找学生信息\n"); printf("输入a(继续),输入b(退出)\n"); char input; input = getch(); if(input =='a') { countScore(); } else if(input == 'b') { MainMenu(); } } void oderbyScore() //成绩排序*************************************************************************** { system("cls"); int i,k,l,flag=0; char j[10]; int n; printf("请输入要排序的学生个数:\n"); scanf("%d",&n); for(k=0;k<n;k++) { printf("请输入第%d个学生的学号:\n",k+1); scanf("%s",&j); for(i=0;i<100;i++) { if(strcmp(j,p[k].sno)==0) { flag = 1; printf("该学生学号为%s\n",p[k].sno); printf("该学生总成绩为%g\n",p[k].Score); break; } } if(flag!=1) { printf("无此学生\n"); } } for(i=0;i<100;i++) { for(k=0;k<n-1-i;k++) { if(p[k].Score>=p[k+1].Score) { l=p[k].Score; p[k].Score=p[k+1].Score; p[k+1].Score=l; } } } printf("排名为:\n"); for(k=0;k<n;k++) { printf("%g\n",p[k].Score); } system("pause"); } void modifyScore() //成绩修改**************************************************************************** { system("cls"); int i,flag=0; float x[10]; char j[10]; system("cls"); printf("请输入要修改成绩的学生学号\n"); scanf("%s",&j); for(i=0;i<100;i++) { if(strcmp(j,p[i].sno)==0) { flag = 1; printf("该学生成绩为%g\n",p[i].Score); printf("请输入要修改的成绩值(0~100)\n"); scanf("%g",&x[i]); p[i].Score = x[i]; } } if(flag != 1) { printf("无此学生"); } system("pause"); system("cls"); printf("是否继续查找学生信息\n"); printf("输入a(继续),输入b(退出)\n"); char input; input = getch(); if(input =='a') { modifyScore(); } else if(input == 'b') { MainMenu(); } } void searchstu() //查找学生************************************************************************ { system("cls"); int i,flag=0; char j[10]; int n = 100; printf("请输入一个学生的学号\n"); scanf("%s",&j); for(i=0;i<n;i++) { if(strcmp(j,p[i].sno)==0) { printf("学号:%s\n",p[i].sno); printf("姓名:%s\n",p[i].sname); printf("性别:%s\n",p[i].ssex); printf("电话号码:%s\n",p[i].stel); printf("年龄:%d\n",p[i].sage); printf("数学成绩:%g\n",p[i].Math); printf("英语成绩:%g\n",p[i].English); printf("C成绩:%g\n",p[i].C); printf("体育成绩:%g\n",p[i].Sport); printf("总成绩:%g\n",p[i].Score); printf("平均分:%g\n",p[i].Aver); flag=1; } } if(flag==0) { printf("没有此学生\n"); } system("pause"); system("cls"); printf("是否继续查找学生信息\n"); printf("输入a(继续),输入b(退出)\n"); char input; input = getch(); if(input =='a') { searchstu(); } else if(input == 'b') { MainMenu(); } } void closesystem() //关闭系统****************************************************************************** { system("cls"); printf("您确定要关闭系统吗,请输入你的选项\n"); printf("输入a确定关闭\n输入b返回菜单\n"); char input; input = getch(); if(input == 'a') { printf("系统3秒后关闭"); Sleep(1000); system("cls"); printf("系统2秒后关闭"); Sleep(1000); system("cls"); printf("系统1秒后关闭"); Sleep(1000); system("cls"); exit(0); }else if(input == 'b') { printf("三秒后跳转主菜单"); Sleep(3000); MainMenu(); } } int main() //****************************************************************************************** { showAuthor(); checkLogin(); if(n) { while(1) { MainMenu(); printf("请输入你的选择(0-6)"); scanf("%d",&num_choose); switch(num_choose) { case 1: input(); //录入信息 system("cls"); break; case 2: Delete(); //删除信息 system("cls"); break; case 3: countScore(); //等级评定 system("cls"); break; case 4: oderbyScore(); //成绩排序 system("cls"); break; case 5: modifyScore(); //成绩修改 system("cls"); break; case 6: searchstu(); //查找学生 system("cls"); break; case 0: closesystem(); //关闭系统 system("cls"); break; default:printf("结束\a");system("cls"); } } } system("pause"); return 0; }