临近期末,各个学科都在赶进度,所以本周完成事项不多,总结了一下前几周对学生管理系统的理解以及构思,初步实现了学生管理系统。以下为代码实现:
#include <stdio.h>
#include <stdlib.h>//其中包含system函数
#include <conio.h>//定义了通过控制台进行 数据输入 和数据输出的函数,如getch函数。
#include <string.h>//定义字符数组
#include <math.h>
#define LEN sizeof(struct xuesheng)//有关学生信息的结构体
#define LEN1 sizeof(struct kaoshi)//有关考试的结构体
#define LEN2 sizeof(struct land)//有关登录系统的结构体
struct xuesheng
{
int many;
float price;
char num[20],xuehao[20],nam[20],xb[200],nianji[20],banji[20],year[20],month[20],day[20];
struct xuesheng *next;
};
struct kaoshi
{
char name[20];
int yu,shu,ying,sheng,wu,hua,zong;
struct kaoshi *next;
};
struct land
{
int zhanghao;
char password[20];
struct land *next;
};
//登录系统
void lmenu();//显示登录菜单
void xg();//修改函数
void land();//登录功能系统
void xinjian();//创建账号密码
void xgmm();//修改密码
void lmain();//登录界面函数
int match(int m,char a[20]);//匹配数据库中的账号密码
int tjzhgs();//统计账号个数
void mainmenu();//主菜单
void main1();//主菜单功能
void jmenu();//显示学生信息菜单
void jmain();//学生信息操作功能
void zjy();//增加学生
void scy();//删除学生
int tjgs();//统计学生个数
void lly();//浏览学生信息
void cxyk();//查询学生
void mmenu();//显示考试系统
void mmain();//考试菜单功能
void cjck();//成绩查看
void zjcj();//增加学生成绩
int tjbrgs();//统计成绩个数
void lmenu()//显示登录菜单
{
printf("\n\n\t 欢迎使用学籍系统\n\n");
printf("**********************************************");
printf("\n\n\t\t1.登录系统\n\n");
printf("\n\n\t\t2.创建账号\n\n");
printf("\n\n\t\t3.修改密码\n\n");
printf("\n\n\t\t4.退出系统\n\n");
printf("\n\n\t 请按键选择,回车确定\n");
printf("**********************************************");
return ;
}
void lmain()//登录功能函数
{
void land();
void xinjian();
char choose;
lmenu();
scanf(" %c",&choose);
switch(choose)//功能函数
{
case'1':
land();
break;
case'2':
xinjian();
break;
case'3':
xgmm();
break;
case'4':
system("cls");
getch();
exit(0);
system ("cls");
break;
}
}
void xinjian()//新建账户密码
{
FILE *fp;
int zhanghao;
char password[20],password1[20];
char hit=0;
if ((fp=fopen("land.txt","r"))==NULL)//if语句:打开药店文件,不存在此文件则新建
{
fp=fopen("land.txt","w");
fclose(fp);
}
system("cls");
fp=fopen("land.txt","a");
for(;;)//输入两次密码确认,两次相同才能确认
{
printf("\n请按以下格式输入账户:\n学号 密码\n");
printf("请输入:");
scanf("%d %s",&zhanghao,password);
printf("再次输入密码:\n");
scanf("%s",password1);
if(strcmp(password,password1)==0)
{
fprintf(fp,"%d %s\n",zhanghao,password);
break;
}
else
{
printf("两次输入密码不一致,继续创建按回车,退出按ESC");
hit=getch();
if(hit==27)
system("cls");
lmain();
}
}
fclose(fp);
printf("创建成功,按任意键返回");
getch();
system("cls");
lmain();
}
int match(int m,char a[20])//匹配数据库中的账号密码
{
FILE*fp;
int n=0,i=0,k,t;
int zhanghao;
char password[20];
if ((fp=fopen("land.txt","r"))==NULL)//不存在登录者文件
{
system ("cls");
printf("\n 还未存在用户!请新建账户");
getch();
system("cls");
lmain();
}
k=tjzhgs();
for(t=0;t<=k;t++)
{
fscanf(fp,"%d%s",&zhanghao,password);
if(m==zhanghao)
{
if(strcmp(a,password)==0)
return 1;
else
return -1;
}
}
return 0;
}
void land()//输入账户密码的登录函数
{
int zhanghao;
char password[20];
int i=2,j,k,m=0,n;
char hit=0;
system("cls");
do
{
printf("\n请输入账号:\n");
scanf("%d",&zhanghao);
printf("确认输入请安回车,重新输入请按ECS");
hit=getch();//暂停程序当i接收后继续下一条指令
for (;hit!=13&&hit!=27;)//保证只能是CR和ESC才能退出循环,输入其他字符无用,暂停程序,按'CR'继续。
{
hit=getch();
}
}
while(hit==27);
printf("\n请输入密码:\n");
do
{
password[m]=getch();
if(password[m]=='\r')
break;
else if(password[m]=='\b')
{
if(m==0)
{
printf("\a");
continue;
}
m--;
printf("\b");
}
else
{
m++;
printf("*");
}
} while(password[m]!='\n'&&m<20);
password[m]='\0';
i=match(zhanghao,password);
if(i==1)
{
printf("登陆成功!按任意键继续");
getch();
main1();
}
else
{
if(i==-1)
{
printf("密码错误!");
getch();
land();
}
if(i==0)
printf("不存在此用户");
getch();
system("cls");
lmain();
}
}
void xg(int z,char m[20])//修改函数
{
FILE *fp;
int zhanghao1,n,j,k;
char mima1[20];
struct land *head,*p,*p1,*p2;
fp=fopen("land.txt","r");
j =tjzhgs();
for (k=0;k<=j;k++)
{
fscanf(fp,"%d %s",&zhanghao1,mima1);
if (z!=zhanghao1)//比较名字,将不同名字的信息复制到链表
{
n++;//相同返回值为0不执行if语句继续循环,不同则执行直到将所有不同的书名建立成链表
if (n==1)//建立链表
{
p1=p2=(struct land*)malloc(LEN2);
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(struct land*)malloc(LEN2);//新建链表
}
p1->zhanghao=zhanghao1;
strcpy(p1->password,mima1);//复制账号密码
}
}
if (n==0)
{
head=NULL;
}
else//建立链表的最后剩余一个储存空间,所以封底
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
fp=fopen("land.txt","w");//清空文件,只写打开,然后关闭
fclose(fp);
fp=fopen("land.txt","a");//追加文件
p=head;
for (;p!=NULL;)//把链表内容覆盖到文件
{
fprintf(fp,"%d %s%\n",p->zhanghao,p->password);
p=p->next;
}
fprintf(fp,"%d %s\n",z,m);
fclose(fp);
system ("cls");
}
void xgmm()//修改密码
{
FILE *fp;
int zh=0,k=0,many=0,m=0,n=0;
int chazhao,hit;
char mima[20]={'\0'},password1[20]={'\0'};
char mm[20]={'\0'};
char i;
if ((fp=fopen("land.txt","r"))==NULL)//打开文件
{
system ("cls");
printf("\n记录文件不存在!按任意键返回");
getch();
system("cls");
lmain();
}
system("cls");
printf("请输入你的帐号和旧密码:\n");
scanf("%d %s",&chazhao,mima);
m =tjzhgs();
for (n=0;n<=m;n++)
{
fscanf(fp,"%d %s",&zh,mm);
if(zh==chazhao)
{
if(!strcmp(mm,mima))
{
printf("请输入新的密码");
scanf("%s",mima);
printf("再次输入密码:\n");
scanf("%s",password1);
if(strcmp(mima,password1)==0)
{
xg(chazhao,mima);
getch();
lmain();
system("cls");
}
else
{
printf("两次输入密码不一致,按任意键退出");
hit=getch();
system("cls");
lmain();
}
}
else
{
printf("旧密码错误,按任意键返回!");
getch();
system("cls");
lmain();
}
}
}
printf("不存在此账号,按任意键返回");
fclose(fp);//修改结束
getch();
system("cls");
lmain();
}
int tjzhgs()//统计账号个数
{
FILE *fp;
int zh=0,n;
char mm[20]={'\0'};
fp=fopen("land.txt","r");
for (n=0;!feof(fp);n++)//逐个读文件
fscanf(fp,"%d %s",&zh,mm);
n--;
fclose(fp);//关闭文件
return (n);//返回个数
}
//首层菜单
void mainmenu()//主菜单
{
system ("cls");
printf("**************************************************");
printf("\n\n 1.学生信息系统\n\n");
printf("\n\n 2.考试系统\n\n");
printf("\n\n 3.退出系统\n\n");
printf("\n\n 请按键选择,回车确定\n");
printf("*************************************************\n");
return ;
}
void main1()
{
void jmian();
void mmain();
char choose;
mainmenu();
scanf(" %c",&choose);
switch(choose)//功能函数
{
case'1':
jmain();
break;
case'2':
mmain();
break;
case'3':
system("cls");
getch();
exit(0);
system ("cls");
break;
}
}
//二层菜单及功能 //学生信息
void jmenu()
{
system ("cls");
printf("****************************************************");
printf("\n 1.入学登记\n\n");
printf("\n 2.退学处理\n\n");
printf("\n 3.查询学生\n\n");
printf("\n 4.学生浏览\n\n");
printf("\n 5.返回上一层\n\n");
printf("\n 请按键选择,回车确定\n");
printf("***************************************************\n");
return ;
}
void jmain()
{
void cryp();//插入函数
void cxyk();//查询学生
void zjy();//增加学生
void scy();//删除学生
void lly();//浏览学生
char choose;
jmenu();
scanf(" %c",&choose);
for(;;)
{
switch(choose)
{
case'1':
zjy();
break;
case'2':
scy();
break;
case'3':
cxyk();
break;
case'4':
lly();
break;
case'5':
main1();
break;
}
}
}
void zjy()//增加学生
{
FILE *fp;
char i;
char num[20]={'\0'},xuehao[20]={'\0'},nam[200]={'\0'},xb[20]={'\0'},nianji[20]={'\0'},banji[20]={'\0'},year[20]={'\0'},month[20]={'\0'},day[20]={'\0'};
system("cls");
if((fp=fopen("xuesheng.txt","r"))==NULL)//if语句:打开信息文件,若不存在,则新建。
{
fp=fopen("xuesheng.txt","w");
fclose(fp);
}
fp=fopen("xuesheng.txt","a");
printf("\n请按以下格式输入学生信息:\n序号 学号 名字 性别 年级 班级 出生年 出生月 出生日 \n");
for(;i!=27;)
{
printf("请输入:\n");
scanf("%s%s%s%s%s%s%s%s%s",num,xuehao,nam,xb,nianji,banji,year,month,day);
fprintf(fp,"%-8s%-9s%-8s%-8s%-8s%-8s%-8s%-8s%-8s\n",num,xuehao,nam,xb,nianji,banji,year,month,day);
printf("继续录入请按回车,结束请按ESC\n");
i=getch();
for(;i!=13&&i!=27;)//保证是ESC和回车
i=getch();
}
fclose(fp);
printf("\n保存成功,按任意键返回上一层!");
getch();
jmain();
}
void scy()//退学学生
{
struct xuesheng *head=NULL;
struct xuesheng *p,*p1,*p2;
int n=0,j,k;
char jjnam[20]={'\0'};//删除的学生名
char i;
char tnum[20]={'\0'},txuehao[20]={'\0'},tnam[20]={'\0'},txb[20]={'\0'},tnianji[20]={'\0'},tbanji[20]={'\0'},tyear[20]={'\0'},tmonth[20]={'\0'},tday[20]={'\0'};
FILE *fp;
if((fp=fopen("xuesheng.txt","r"))==NULL)
{
system("cls");
printf("\n文件记录不存在,按任意键返回!");
getch();
jmain();
}
else//删除
{
system("cls");
printf("\n请输入退学学生名字:");
scanf("%s",jjnam);
printf("\n确认请按回车,取消请按ESC\n");
i=getch();
for(;i!=13&&i!=27;)
i=getch();
if(i==27)
jmain();
fp=fopen("xuesheng.txt","r");
j=tjgs();
for(k=0;k<j;k++)
{
fscanf(fp,"%s%s%s%s%s%s%s%s%s",tnum,txuehao,tnam,txb,tnianji,tbanji,tyear,tmonth,tday);
if(strcmp(jjnam,tnam))//如果一样,strcmp的返回值为0,不执行if
{
n++;
if(n==1)
{
p1=p2=(struct xuesheng*)malloc(LEN);
head=p1;
}
else
{
p2->next=p1;
p2=p1;
p1=(struct xuesheng*)malloc(LEN);//新建链表
}
strcpy(p1->num,tnum);//复制编号
strcpy(p1->xuehao,txuehao);//复制学号
strcpy(p1->nam,tnam);//复制名字
strcpy(p1->xb,txb);//复制性别
strcpy(p1->nianji,tnianji);//复制月年级
strcpy(p1->banji,tbanji);//复制班级
strcpy(p1->year,tyear);//复制 年
strcpy(p1->month,tmonth);//复制 月
strcpy(p1->day,tday);//复制 日
}
}
if(n==0)//说明只有这一个学生
{
head=NULL;
fclose(fp);
}
else
{
p2->next=p1;
p1->next=NULL;
fclose(fp);
}
}
fp=fopen("xuesheng.txt","w");//清空文件,准备重新录入
fclose(fp);
fp=fopen("xuesheng.txt","a");//以追加形式打开,准备录入信息
p=head;
for(;p!=NULL;)
{
fprintf(fp,"%-8s%-9s%-8s%-8s%-8s%-8s%-8s%-8s%-8s\n",p->num,p->xuehao,p->nam,p->xb,p->nianji,p->banji,p->year,p->month,p->day);
p=p->next;
}
fclose(fp);
system("cls");
if(n==j)
printf("\n无该学生\n按任意键返回上一层\n");
else
printf("\n删除成功!\n按任意键返回上一层\n");
getch();
jmain();
}
int tjgs()//统计学生个数
{
FILE * fp;
int n;
char num[20]={'\0'},xuehao[20]={'\0'},nam[20]={'\0'},xb[20]={'\0'},nianji[20]={'\0'},banji[20]={'\0'},year[20]={'\0'},month[20]={'\0'},day[20]={'\0'};
fp=fopen("xuesheng.txt","r");
for(n=0;!feof(fp);n++)
fscanf(fp,"%s%s%s%s%s%s%s%s%s",num,xuehao,nam,xb,nianji,banji,year,month,day);
n--;
fclose(fp);//关闭文件
return (n);
}
void lly()//浏览学生信息
{
FILE *fp;
int n=0;
int k=0,m=0;
char num[20]={'\0'},xuehao[20]={'\0'},nam[200]={'\0'},xb[20]={'\0'},nianji[20]={'\0'},banji[20]={'\0'},year[20]={'\0'},month[20]={'\0'},day[20]={'\0'};
char i;
if ((fp=fopen("xuesheng.txt","r"))==NULL)//打开文件
{
system("cls");
printf("\n记录文件不存在!请按任意键返回!\n");
fclose(fp);
getch();
jmain();
}
n=tjgs();
if(n==0)
{
system("cls");
printf("\n无任何记录!");
}
fp=fopen("xuesheng.txt","r");
system("cls");
printf("\n序号\t学号\t名字\t性别\t年级\t班级\t出生年\t出生月\t出生日\n");
for(m=0;m<n;m++)
{
fscanf(fp,"%s%s%s%s%s%s%s%s%s",num,xuehao,nam,xb,nianji,banji,year,month,day);
printf("%-8s%-9s%-8s%-8s%-8s%-8s%-8s%-8s%-8s\n",num,xuehao,nam,xb,nianji,banji,year,month,day);
}
fclose(fp);
printf("\n按任意键返回!\n");
getch();
jmain();
}
void cxyk()//查询学生
{
FILE *fp;
int k=0,m=0,n=0;
char num[20]={'\0'},xuehao[20]={'\0'},nam[200]={'\0'},xb[20]={'\0'},nianji[20]={'\0'},banji[20]={'\0'},year[20]={'\0'},month[20]={'\0'},day[20]={'\0'};
char i;
char chazhao1[20]={'\0'};
char chazhao[20]={'\0'};
if((fp=fopen("xuesheng.txt","r"))==NULL)//打开文件
{
system("cls");
printf("\n文件不存在,按任意键返回");
getch();
jmain();
}
system("cls");
printf("请输入名字和学号进行查找:\n");
scanf("%s %s",chazhao,chazhao1);
system("cls");
m=tjgs();
if(m==0)
{
system("cls");
printf("\n无记录!\n");
}
fp=fopen("xuesheng.txt","r");
for(n=0;n<m;n++)
{
fscanf(fp,"%s%s%s%s%s%s%s%s%s",num,xuehao,nam,xb,nianji,banji,year,month,day);
if(!strcmp(chazhao,nam)&&!strcmp(chazhao1,xuehao))
{
if(k==0)
{
printf("\n序号\t学号\t名字\t性别\t年级\t班级\t出生年\t出生月\t出生日\n");
}
printf("%-8s%-9s%-8s%-8s%-8s%-8s%-8s%-8s%-8s\n",num,xuehao,nam,xb,nianji,banji,year,month,day);
k++;
}
}
if(k==0)//没有查找到
{
printf("\n该学生不存在\n");
printf("按任意键返回上一层!\n");
getch();
jmain();
}
fclose(fp);
getch();
jmain();
}
//三层菜单
void mmenu()//显示考试功能菜单
{
system("cls");
printf("*****************************************************");
printf("\n\n 1.成绩登记\n\n");
// printf("\n\n 2.成绩删除\n\n");
// printf("\n\n 3.成绩排序\n\n");
// printf("\n\n 4.成绩查询\n\n");
// printf("\n\n 5.成绩概览\n\n");
// printf("\n\n 6.返回上一层\n\n");
// printf("\n\n 请按键选择,回车确定\n");
printf("\n\n 2.成绩概览\n\n");
printf("\n\n 3.返回上一层\n\n");
printf("\n\n 请按键选择,回车确定\n");
printf("****************************************************");
return ;
}
void mmain()//考试菜单功能
{
void zjcj();
void sccj();
void cjpx();
void cjcx();
void llcj() ;
char choose;
mmenu();
scanf(" %c",&choose);
switch(choose)
{
case '1':zjcj();break;
case '2':cjck();break;
case '3':main1();break;
}
}
void zjcj()//增加学生成绩
{
FILE *fp;
char i;
char num[20]={'\0'};
int yu,shu,ying,sheng,wu,hua,zong;
system("cls");
if((fp=fopen("chengji.txt","r"))==NULL)//if语句:打开信息文件,若不存在,则新建。
{
fp=fopen("chengji.txt","w");
fclose(fp);
}
fp=fopen("chengji.txt","a");
printf("\n请按以下格式输入学生信息:\n名字 语文 数学 英语 生物 化学 物理\n");
for(;i!=27;)
{
printf("请输入:\n");
scanf("%s%d%d%d%d%d%d",num,&yu,&shu,&ying,&sheng,&wu,&hua);
zong=yu+shu+ying+wu+sheng+hua;
fprintf(fp,"%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8d\n",num,yu,shu,ying,sheng,wu,hua,zong);
printf("继续录入请按回车,结束请按ESC\n");
i=getch();
for(;i!=13&&i!=27;)//保证是ESC和回车
i=getch();
}
fclose(fp);
printf("\n保存成功,按任意键返回上一层!");
getch();
mmain();
}
int tjbrgs()//统计成绩个数
{
FILE *fp;
int yu,shu,ying,wu,sheng,hua,zong,n;
char name[20]={'\0'};
fp=fopen("chengji.txt","r");
for(n=0;!feof(fp);n++)
fscanf(fp,"%s%d%d%d%d%d%d%d",name,&yu,&shu,&ying,&sheng,&hua,&wu,&zong);
n--;
fclose(fp);//关闭文件
return (n);//返回个数
}
void cjck()//浏览学生信息
{
FILE *fp;
int n=0;
int k=0,m=0;
char name[20]={'\0'};
int yu,shu,ying,sheng,wu,hua,zong;
char i;
if ((fp=fopen("chengji.txt","r"))==NULL)//打开文件
{
system("cls");
printf("\n记录文件不存在!请按任意键返回!\n");
fclose(fp);
getch();
mmain();
}
n=tjgs();
if(n==0)
{
system("cls");
printf("\n无任何记录!");
}
fp=fopen("chengji.txt","r");
system("cls");
printf("\n名字\t语文\t数学\t英语\t生物\t物理\t化学\t总分\n");
for(m=0;m<n;m++)
{
fscanf(fp,"%s%d%d%d%d%d%d%d%d",name,&yu,&shu,&ying,&sheng,&wu,&hua,&zong);
printf("%-8s%-8d%-8d%-8d%-8d%-8d%-8d%-8d\n",name,yu,shu,ying,sheng,wu,hua,zong);
}
fclose(fp);
printf("\n按任意键返回!\n");
getch();
mmain();
}
int main()
{
system("color f0");
lmain();
return 0;
}
其中总共有20个左右的函数
分为三个文件分别管理登陆账号、学生信息、考试信息,开头定义三个结构体,分别来进行数据的操作。
之后为登录系统,从文件中寻找登陆数据进行匹配,登录系统之后分两种途径来对考试和学生系统来进行操作。