学生信息管理系统

学生管理系统
问题描述
学生信息管理系统,要求完成以下基本任务:
1.改写程序为良好程序风格(文档注释,函数注释,语句注释)。
2.将功能补充完全(基于文件处理,完成刷新和保存功能)。
建立文件来保存学生信息。
3.将学生信息改为更好的数据组织,而非离散形式(结构体)。
提高要求: 可将程序中的不足(如数据验证)等根据自己的能力与理解完成。
1.增添了密码保护功能。
2. 增加分数限制功能。
3 用输入姓名的方法删除该同学的信息。
代码实现

#include<stdio.h>	/*I/O函数*/
#include<stdlib.h>	/*其它说明*/
#include<string.h>	/*字符串函数*/
#define LEN 15		/* 学号和姓名最大字符数,实际请更改*/
#define N 50		/* 最大学生人数,实际请更改*/
struct record{    char code[LEN+1];	/* 学号*/    
char name[LEN+1];	/* 姓名*/
    int age;			/* 年龄*/    
    char sex;		/* 性别*/   
     float score[3]; /* 3门课程成绩*/}stu[N];
     int k,n,m;       /* n代表当前记录的学生人数,m为新增人数*/
     void help();      /*帮助*/
     void reread();   /*读入历史数据*/
     void seek();    /*查找信息*/
     void modify(); /*修改信息*/
     void insert();/*插入信息*/
     void del();  /*删除信息*/
     void save();/*保存信息*/
     void display();/*显示所有学生信息*/
     void menu();
      int main(){ 		 
      FILE *fp;    
      char s1[10],s2[10];   
       if((fp=fopen("key.txt","r+"))==NULL)	
       { 		printf("获取密码失败!\n");	}   
        else    {		    fgets(s1,10,fp);          
        do		  {            
         printf("请输入密码:");           
           gets(s2);		  }while(strcmp(s1,s2)!=0);      
               if(strcmp(s1,s2)==0)		 
                { 		    printf("密码正确!\n");			
                while(1)			
                {	        
                	menu();			
                	}    
                	 }	
                	 } 	
                	 return 0;}
                	 void help()//使用说明
                	 { 	printf("\n0.欢迎使用系统帮助!\n");	
                	 printf("\n1.初次进入系统,先增添学生信息;\n");	
                	 printf("\n2.按照菜单提示键入数字代号;\n");	
                	 printf("\n3.录入学生信息后,切记保存;\n");	
                	 printf("\n4.谢谢您的使用!\n");	
                	 system("pause");} 
                	 void reread()/*关闭程序再次启动,该函数可恢复以前建的学生数据*/
                	 {	char filename[LEN+1];	
                	 FILE *fp;	int i=0;	
                	 printf("请输入已存有学生信息的文件名:");	
                	 scanf("%s",&filename);	
                	 if((fp=fopen(filename,"r"))==NULL)	
                	 {       printf("open error");	   
                	 printf("请选择4功能增加学生信息并保存。");	   
                	 system("pause");	   
                	 return;	}	
                	 while(fscanf(fp,"%s %s %d %c %f %f %f",stu[i].code,stu[i].name,&stu[i].age,						&stu[i].sex,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2])==7)	
                	 {		i++;	}   
                	  n=i;/*循环结束条件*/	
                	  if(i==0)		
                	  printf("文件为空!\n");
                	  	else		
                	  	printf("读入完毕!\n");
                	  		fclose(fp);}
                	  		void seek() /*查找*/
                	  		{	int i,item,flag;	
                	  		char s1[21]; /* 以姓名和学号最长长度+1为准*/
                	  		printf("----------------------\n");	
                	  		printf("-----1.按学号查询-----\n");
                	  		printf("-----2.按姓名查询-----\n");
                	  		printf("-----3.退出本菜单-----\n");
                	  		printf("----------------------\n");	
                	  		while(1)	{		
                	  		printf("请选择子菜单编号:");		
                	  		scanf("%d",&item);		
                	  		flag=0;		
                	  		switch(item)		
                	  		{		
                	  		case 1:			
                	  		printf("请输入要查询的学生的学号:");			
                	  		scanf("%s",s1);			
                	  		for(i=0;i<n;i++)				
                	  		if(strcmp(stu[i].code,s1)==0)				
                	  		{					
                	  		flag=1;					
                	  		printf("学生学号    学生姓名  年龄   性别  C语言成绩  高等数学  大学英语成绩\n");									
                	  		printf("--------------------------------------------------------------------\n");					
                	  		printf("%6s %7s %6d %6c %9.1f %10.1f %10.1f\n",stu[i].code,stu[i].name,stu[i].age,						stu[i].sex,stu[i].score[0],stu[i].score[1],stu[i].score[2]);				}				
                	  		if(0==flag)					
                	  		printf("该学号不存在!\n"); break;		
                	  		case 2:			
                	  		printf("请输入要查询的学生的姓名:\n");			
                	  		scanf("%s",s1);			
                	  		for(i=0;i<n;i++)				
                	  		if(strcmp(stu[i].name,s1)==0)				
                	  		{					
                	  		flag=1;					
                	  		printf("学生学号    学生姓名  年龄   性别  C语言成绩  高等数学  大学英语成绩\n");									
                	  		printf("--------------------------------------------------------------------\n");					
                	  		printf("%6s %7s %6d %6c %9.1f %10.1f %10.1f\n",stu[i].code,stu[i].name,stu[i].age,						stu[i].sex,stu[i].score[0],stu[i].score[1],stu[i].score[2]);				}					
                	  		if(0==flag)						
                	  		printf("该姓名不存在!\n"); break;	
                	  		case 3:return;		
                	  		default:printf("请在1-3之间选择\n");		
                	  		}	
                	  		}}  
                	  		void modify() /*修改信息*/
                	  		{	
                	  		int i,item,num;	
                	  		char sex1,s1[LEN+1],s2[LEN+1]; /* 以姓名和学号最长长度+1为准*/	
                	  		float score1;	
                	  		printf("请输入要要修改的学生的学号:");	
                	  		scanf("%s",s1);	
                	  		for(i=0;i<n;i++)		
                	  		if(strcmp(stu[i].code,s1)!=0) /*比较字符串是否相等*/		
                	  		{			
                	  		printf("无该学号\n");		    
                	  		return;		}		
                	  		else 			
                	  		num=i;		
                	  		printf("------------------\n");		
                	  		printf("1.修改姓名\n");		
                	  		printf("2.修改年龄\n");		
                	  		printf("3.修改性别\n");		
                	  		printf("4.修改C语言成绩\n");		
                	  		printf("5.修改高等数学成绩\n");		
                	  		printf("6.修改大学英语成绩\n");		
                	  		printf("7.退出本菜单\n");		
                	  		printf("------------------\n");		
                	  		while(1)		
                	  		{			
                	  		printf("请选择子菜单编号:");			
                	  		scanf("%d",&item);			
                	  		switch(item)			
                	  		{			
                	  		case 1:				
                	  		printf("请输入新的姓名:\n");				
                	  		scanf("%s",s2);				
                	  		strcpy(stu[num].name,s2); 
                	  		break;			
                	  		case 2:				
                	  		printf("请输入新的年龄:\n");				
                	  		scanf("%d",&stu[num].age);break;			
                	  		case 3:				
                	  		printf("请输入新的性别:\n");				
                	  		scanf("%c",&sex1);				
                	  		stu[num].sex=sex1; break;			
                	  		case 4:				
                	  		printf("请输入新的C语言成绩:\n");				
                	  		scanf("%f",&score1);					
                	  		if((score1<0.0)||(score1>100.0))					
                	  		{		            	
                	  		printf("输入成绩错误!\n");		            	
                	  		return;					
                	  		}				
                	  		stu[num].score[0]=score1; break;			
                	  		case 5:				
                	  		printf("请输入新的高等数学成绩:\n");				
                	  		scanf("%f",&score1);					
                	  		if((score1<0.0)||(score1>100.0))					
                	  		{			           
                	  		printf("输入成绩错误!\n");			           
                	  		return;					
                	  		}				
                	  		stu[num].score[1]=score1; break;			
                	  		case 6:				
                	  		printf("请输入新的大学英语成绩:\n");				
                	  		scanf("%f",&score1);					
                	  		if((score1<0.0)||(score1>100.0))		
                	  		{			
                	  		printf("输入成绩错误!\n");			
                	  		return;		
                	  		}				
                	  		stu[num].score[2]=score1; break;			
                	  		case 7:	return;			
                	  		default:printf("请在1-7之间选择\n");			
                	  		}		
                	  		}} 
                	  		void sort()/*按学号排序*/
                	  		{	
                	  		int i,j,k,*p,*q,s;	
                	  		char temp[LEN+1],ctemp;	
                	  		float ftemp;	
                	  		for(i=0;i<n-1;i++)	
                	  		{		
                	  		for(j=n-1;j>i;j--)			
                	  		if(strcmp(stu[i].code,stu[i].code)>0)			
                	  		{				
                	  		strcpy(temp,stu[j-1].code);				
                	  		strcpy(stu[j-1].code,stu[i].code);				
                	  		strcpy(stu[j].code,temp);				
                	  		strcpy(temp,stu[j-1].name);				
                	  		strcpy(stu[j-1].name,stu[j].name);				
                	  		strcpy(stu[j].name,temp);				
                	  		ctemp=stu[j-1].sex;				
                	  		stu[j-1].sex=stu[j].sex;				
                	  		stu[j].sex=ctemp;				
                	  		p=&stu[j-1].age;				
                	  		q=&stu[j].age;				
                	  		s=*q;				
                	  		*q=*p;				
                	  		*p=s;				
                	  		for(k=0;k<3;k++)				
                	  		{					
                	  		ftemp=stu[j-1].score[k];					
                	  		stu[j-1].score[k]=stu[j].score[k];					
                	  		stu[j].score[k]=ftemp;				
                	  		}			
                	  		}	
                	  		}} 
                	  		 void insert() /*插入函数*/
                	  		 {	
                	  		 int i=n,j,flag;	
                	  		 printf("请输入待增加的学生数:");	
                	  		 scanf("%d",&m);	
                	  		 do	
                	  		 {   
                	  		 flag=1;	
                	  		 while(flag)	
                	  		 {		
                	  		 flag=0;		
                	  		 printf("请输入第%d个学生的学号:",i+1);		
                	  		 scanf("%s",stu[i].code);		
                	  		 for(j=0;j<i;j++)		
                	  		 if(strcmp(stu[i].code,stu[j].code)==0)		
                	  		 {			
                	  		 printf("已有该学号,请检查后重新录入!\n");			
                	  		 flag=1;			
                	  		 break;		
                	  		 }	
                	  		 }		
                	  		 printf("请输入第%d个学生的姓名:",i+1);		
                	  		 scanf("%s",stu[j].name);		
                	  		 printf("请输入第%d个学生的年龄:",i+1);		
                	  		 scanf("%d",&stu[j].age);		
                	  		 printf("请输入第%d个学生的性别:",i+1);		
                	  		 scanf("%s",&stu[j].sex);		
                	  		 printf("请输入第%d个学生的C语言成绩:",i+1);		
                	  		 scanf("%f",&stu[j].score[0]);		
                	  		 if((stu[j].score[0]<0.0)||(stu[j].score[0]>100.0))		
                	  		 {			
                	  		 printf("输入成绩错误!\n");			
                	  		 return;		
                	  		 }		
                	  		 printf("请输入第%d个学生的高等数学成绩:",i+1);		
                	  		 scanf("%f",&stu[j].score[1]);			
                	  		 if((stu[j].score[1]<0.0)||(stu[j].score[1]>100.0))		
                	  		 {			
                	  		 printf("输入成绩错误!\n");			
                	  		 return;		
                	  		 }		
                	  		 printf("请输入第%d个学生的大学英语成绩:",i+1);		
                	  		 scanf("%f",&stu[j].score[2]);			
                	  		 if((stu[j].score[2]<0.0)||(stu[j].score[2]>100.0))		
                	  		 {			
                	  		 printf("输入成绩错误!\n");			
                	  		 return;		
                	  		 }		
                	  		 if(0==flag)		
                	  		 {			
                	  		 i++;		
                	  		 }			
                	  		 }while(i<n+m);	n+=m;	
                	  		 printf("信息增加完毕!请及时保存!\n");	
                	  		 sort();
                	  		 }  
                	  		 void del()/*删除函数*/
                	  		 {	
                	  		 int i,j,x,flag=0;	
                	  		 char s1[LEN+1],s2[LEN+1];	
                	  		 printf("****请选择删除方式****\n");	
                	  		 printf("--------------\n");
                	  		 printf("1.按学号删除\n");	
                	  		 printf("2.按姓名删除\n");	
                	  		 printf("3.退出子菜单\n");	
                	  		 printf("--------------\n");	
                	  		 scanf("%d",&x);	
                	  		 switch(x)	
                	  		 {	
                	  		 case 1:	printf("请输入要删除学生的学号:\n");	       
                	  		  scanf("%s",s1);         	
                	  		  for(i=0;i<n;i++)	    	
                	  		  if(strcmp(stu[i].code,s1)==0)			
                	  		  {			   
                	  		   flag=1;			  
                	  		   for(j=i;j<n-1;j++)		     
                	  		   stu[j]=stu[j+1];			
                	  		   }		    
                	  		   if(flag==0)			
                	  		   printf("该学号不存在!\n");		    
                	  		   if(flag==1)			
                	  		   {			  
                	  		   printf("删除成功!\n");			 
                	  		    n--;			
                	  		    }	
                	  		    case 2:printf("请输入要删除学生的姓名:");		   
                	  		    scanf("%s",s2);		   
                	  		    for(i=0;i<n;i++)			   
                	  		    for(int j=0;j<i;j++)			  
                	  		     {				   
                	  		     if(strcmp(stu[i].name,stu[j].name)==0)					  
                	  		     printf("有重名,以防误删,请选择用学号删除!\n");                     
                	  		     return;			  
                	  		      }        
                	  		      	for(i=0;i<n;i++)		   
                	  		      	if(strcmp(stu[i].name,s2)==0)		   
                	  		      	{			   
                	  		      	flag=1;               
                	  		      	for(j=i;j<n-1;j++)		     	
                	  		      	stu[j]=stu[j+1];			
                	  		      	}		    
                	  		      	if(flag==0)			
                	  		      	printf("该学生不存在!\n");		    
                	  		      	if(flag==1)			
                	  		      	{			  
                	  		      	printf("删除成功!\n");			  
                	  		      	n--;			
                	  		      	}	
                	  		      	case 3:return;    
                	  		      	default:printf("请选择1-3\n");	
                	  		      	} }  
                	  		      	void display()/*显示所有学生信息*/
                	  		      	{	
                	  		      	int i;	
                	  		      	printf("共有%d位学生的信息:\n",n);	
                	  		      	if(0!=n)	
                	  		      	{		
                	  		      	printf("学生学号  学生姓名 年龄  性别  C语言成绩  高等数学  大学英语成绩\n");						
                	  		      	printf("--------------------------------------------------------------------\n");		
                	  		      	for(i=0;i<n;i++)		
                	  		      	{ 			
                	  		      	printf("%7s %7s %6d %6c %9.1f %10.1f %10.1f\n",stu[i].code,stu[i].name,stu[i].age,						
                	  		      	stu[i].sex,stu[i].score[0],stu[i].score[1],stu[i].score[2]);		
                	  		      	}	
                	  		      	}} 
                	  		      	void save()/*保存学生信息*/
                	  		      	{   
                	  		      	 int i;	FILE *fp;	
                	  		      	 char filename[LEN+1];	
                	  		      	 printf("请输入将学生信息写入的文件名:");	
                	  		      	 scanf("%s",filename);	
                	  		      	 fp=fopen(filename,"w");	
                	  		      	 for(i=0;i<n;i++)	
                	  		      	 {		
                	  		      	 fprintf(fp,"%7s %7s %6d %6c %9.1f %10.1f %10.1f\n",stu[i].code,stu[i].name,stu[i].age,						stu[i].sex,stu[i].score[0],stu[i].score[1],stu[i].score[2]);	}	
                	  		      	 printf("保存成功!");	
                	  		      	 fclose(fp);	
                	  		      	 system("pause");}
                	  		      	 void menu()/* 界面*/
                	  		      	 {	int num;	printf("     *****************************************************      \n\n");	
                	  		      	 printf("     *                学生信息管理系统            *             \n \n");	
                	  		      	 printf("     *********************系统功能菜单********************      \n \n");	
                	  		      	 printf("     * 0.系统帮助及说明   * *  1.读取已有学生信息(文件)*      \n");	
                	  		      	 printf("    ------------------------------------------------------      \n"); 	
                	  		      	 printf("     * 2.查询学生信息     * *  3.修改学生信息            *      \n");	
                	  		      	 printf("    ------------------------------------------------------      \n");	
                	  		      	 printf("     * 4.增添学生信息     * *  5.按学号或姓名删除信息    *      \n");	
                	  		      	 printf("    ------------------------------------------------------      \n");	
                	  		      	 printf("     * 6.显示当前所有信息 * *  7.保存当前学生信息        *      \n");	
                	  		      	 printf("    ------------------------------------------------------      \n");	
                	  		      	 printf("     * 8.退出系统                                        *      \n");	
                	  		      	 printf("    ******************************************************      \n");	
                	  		      	 printf("选择您需要实现的功能:");	
                	  		      	 scanf("%d",&num);	
                	  		      	 switch(num)	
                	  		      	 { 	
                	  		      	 case 0:help();break;	
                	  		      	 case 1:reread();break;	
                	  		      	 case 2:seek();break;	
                	  		      	 case 3:modify();break;	
                	  		      	 case 4:insert();break; 	
                	  		      	 case 5:del();break; 	
                	  		      	 case 6:display();break;	
                	  		      	 case 7:save();break;	
                	  		      	 case 8:exit(0);break;	
                	  		      	 default:printf("请在0-8之间选择\n");	
                	  		      	 }
                	  		      	 }

关键算法构造
流程图
流程图
经验归纳
通过本次实验学会结构化程序设计的基本结构,设计合理的结构化程序解决问题。本次实验学会了很多东西,进一步理解关于文件读入和存储的功能,还学会了为学生管理系统设置密码,新的技能,但不能限制输入错误的次数,以后更新这个漏洞。程序还增添了输入姓名删除信息的功能,用“||”符号时左右两个表达式要用括号不然会出现错误。
还了解了有关结构体的知识,把关系密切而数据类型不同的数据有机地结合为一个整体,易于使用和操作,极大提高这类数据的处理效率,在这次学生管理系统中,把学生的所有信息弄成一个结构体,方便之后对学生信息的增、删、改、查操作。为了使程序更易懂,把每个功能写成单独的函数,便于之后系统的维护和调试。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值