第五周总结

临近期末,各个学科都在赶进度,所以本周完成事项不多,总结了一下前几周对学生管理系统的理解以及构思,初步实现了学生管理系统。以下为代码实现:

#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个左右的函数

分为三个文件分别管理登陆账号、学生信息、考试信息,开头定义三个结构体,分别来进行数据的操作。

之后为登录系统,从文件中寻找登陆数据进行匹配,登录系统之后分两种途径来对考试和学生系统来进行操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值