C语言实现简单的学生管理系统

前言

大一上学期用C语言写的学生管理系统,写的比较粗糙,但是基本的功能都实现了,发出来供有需要的同学参考。

预备知识

  • 结构体以及结构体数组的使用

  • 清屏函数

  • C语言的基本语法

  • C语言的基本函数库的使用

  • 冒泡法排序

  • 删除、插入、添加算法的实现

  • 功能的模块化实现

代码实现

#include<stdio.h>                    // bug    成绩输入时输入字母或者特殊字符会使程序崩溃 
#include<string.h>
#include <stdlib.h>
struct student                    //结构体 
{
	char ID[20];
	char name[20];
	int eng,chn,cop;          //英语 思修 体育 
    float ave;               //用来对成绩排序 
};
struct student st[10000];  //定义结构体变量 
int num=0;                //全局变量 
void  display()          //主菜单 
{
	system("color 0");
	printf("                    *欢迎使用学生成绩管理系统*                           \n");
	printf("********************************************************************************\n");
	printf("  *请用户根据以下提示进行操作(温馨提示:请在成绩录入后再使用其它功能)*    \n");
	printf("*******************************************************************************\n"); 
	printf("0.退出系统                 1.成绩录入        2.计算平均成绩        3.成绩输出\n");
	printf("4.成绩排序(按平均成绩)   5.成绩查找        6.成绩修改            7.成绩追加\n");
	printf("8.删除成绩                 9.成绩分段       10.文件存储           11.文件输出\n");
	printf("*******************************************************************************\n");
	printf("                       *如需退出系统请按0*                                      \n" );
}
void entry()         //成绩录入 
{
	int i=0;
	char a;
	while(1)
	{
		printf("请输入学号:");
		scanf("%s",st[num].ID );
		printf("请输入姓名:");
		scanf("%s",st[num].name );
		printf("请输入英语成绩:");
		scanf("%d",&st[num].eng );
		printf("请输入思修成绩:");
		scanf("%d",&st[num].chn );
		printf("请输入体育成绩:");
		scanf("%d",&st[num].cop );
		num++;
		printf("任意键继续,n退出:");
		getchar();
		if(getchar()=='n')
		{
			break;
		 } 
	}
	for(i=0;i<num;i++)                                //计算平均成绩 (个人) 
	{
		st[i].ave=(st[i].chn+st[i].cop+st[i].eng)/3.0;  
	}
}
void average()          //平均分(班级) 
{
	system("cls");
	display();
	float socer=0,s1=0,s2=0,s3=0;
	float aver,aver1,aver2,aver3;
	int i;
    for(i=0;i<num;i++)
    {
    	socer=socer+st[i].ave; 
	}
	aver=socer/num;
	for(i=0;i<num;i++)
	{
		s1=s1+st[i].eng; 
	}
	aver1=s1/num;
	for(i=0;i<num;i++)
	{
		s2=s2+st[i].chn; 
	}
	aver2=s2/num;
	for(i=0;i<num;i++)
	{
		s3=s3+st[i].cop; 
	}
	aver3=s3/num;
	printf("班级平均分	英语平均分	思修平均分	体育平均分\n");
	printf("------------------------------------------------------------\n"); 
	printf("%.2f		",aver);
	printf("%.2f		",aver1);
	printf("%.2f		",aver2);
	printf("%.2f		\n",aver3);
}
void OUTPUT()         //成绩输出 
{
	 system("cls");
	 display();
     int i;
     printf("%s	%s	%s	%s	%s	%s\n","学号","姓名","思修","体育","英语","平均分");
     printf("--------------------------------------------------------\n");
     for (i=0;i<num;i++)
     {
         printf("%s	%s	%d	%d	%d	%.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
     }
}
void sort()              //冒泡法排序        修改       
{
 system("cls");
 display();
 int j=0;
int i=0;
struct student st1;       //定义一个结构体用来做中间变量          
float f=0;
for(j=0;j<num-1;j++)       
 for(i=0;i<num-1-j;i++)
   if(st[i].ave>st[i+1].ave)
   {st1=st[i];st[i]=st[i+1];st[i+1]=st1;}     //结构体交换 
printf("按平均成绩排序后的结果为:\n");
printf("----------------------------------------------------------------------\n");
printf("%s	%s	%s	%s	%s	%s\n","学号","姓名","思修","体育","英语","平均分");
for(i=num-1;i>=0;i--)
{
  printf("%s	%s	%d	%d	%d	%.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
}        
printf("\n");
}
int findname(char name[])        //返回数组下标的函数         返回值为int型 
{
	int i;
	for(i=0;i<num;i++)
	{
		if(strcmp(st[i].name,name)==0)         //比较原数据与传入的数据是否相等,若相等则返回姓名下标 
		{
			return i;
		}
		else if(strcmp(st[i].ID,name)==0)     //返回ID下标 
		{
			return i;
		}
	}
	return -1;                             //若姓名和ID均没有相同的,则返回-1 
}
void display1(int a);
void find1()       //按姓名或者学号查找学生 
{
	system("cls");
    display();
    int i,t=0;
    printf("学生名单:\n");
    printf("****************************************************************************\n");
    for(i=0;i<num;i++)
    {
    	printf("%s %s\t",st[i].ID,st[i].name);
    	t++;
    	if(t==5)
    	{
    		printf("\n");
    		t=0;
    	}
    }
    printf("\n");
	while(1)
	{
	  char name[20];
	  int a;
	  printf("请输入要查询的学生信息:");
	  scanf("%s",name);
	  printf("\n");
	  getchar();                         //不可省略 
	  a=findname(name);
	  if(a==-1)
	  {
	  	printf("学生信息有误,请重新输入!\n");
	  }
	  else
	  {
	  	printf("您要查询的学生信息为:\n");
	  	printf("****************************************************************************\n");
	  	display1(a);
	  }
	  printf("任意键继续,n退出:");
	  if(getchar()=='n')
	  {
	  	break;
	  }
    }
}
void display1(int a)           //单一学生信息显示 
{
	printf("%s	%s	%s	%s	%s	%s\n","学号","姓名","思修","体育","英语","平均分");
    printf("----------------------------------------------------------------------------\n");
    printf("%s	%s	%d	%d	%d	%.2f\n",st[a].ID,st[a].name,st[a].chn,st[a].cop,st[a].eng,st[a].ave);
}
void subsection()           //成绩分段            
{
	system("cls");          //清屏函数 
    display();              //使菜单始终显示在顶端 
	int i;
	int b=0;
	int t1=0,t2=0,t3=0;
	printf("优秀学生名单:\n");       //通过三个循环将优秀、优良、差生分别累加并分类显示 
	printf("--------------------------------------------------------------------\n");
	for(i=0;i<num;i++)
	{
		b=b+st[i].chn+st[i].cop+st[i].eng;
		if(b>=211&&b<=300)
		{
			t1++;
			printf("%s	%s	%d	%d	%d	%.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
		}
		b=0;
	}
	b=0;
	printf("--------------------------------------------------------------------\n");
	printf("优良学生名单:\n");
	printf("--------------------------------------------------------------------\n");
	for(i=0;i<num;i++)
	{
		b=b+st[i].chn+st[i].cop+st[i].eng;
		if(b>=180&&b<=210)
		{
			t2++;
			printf("%s	%s	%d	%d	%d	%.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
		}
		b=0;
	}
	b=0;
	printf("--------------------------------------------------------------------\n");
	printf("差生名单:\n");
	printf("--------------------------------------------------------------------\n");
	for(i=0;i<num;i++)
	{
		b=b+st[i].chn+st[i].cop+st[i].eng;
		if(b>=0&&b<=179)
		{
			t3++;
			printf("%s	%s	%d	%d	%d	%.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
		}
		b=0;
	}
	b=0;
	    printf("\n");
		printf("********************************************************************\n");
		printf("\n");
		printf("优等生	优良生	差生\n");
		printf("--------------------------------------------------------------------\n");
		printf("%d个	%d个	%d个\n",t1,t2,t3);
		printf("\n"); 
}
void output()       //文件输出或者存储 
{
	system("cls");
    display();
	int i;
	FILE *fp;
	fp=fopen("student.txt","w+");
	if(fp==NULL)
	{
		printf("文件打开错误!");
		exit(0);
	}
	for(i=0;i<num;i++)
	{
		fprintf(fp,"%s	%s	%d	%d	%d	%.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
		fprintf(fp,"\n");
	}
	fclose(fp);
}
void modify()              //学生成绩修改 
{
	system("cls");
    display();
	int a;
	int i;
	char name[20];
	printf("学生名单:\n");             //显示学生的姓名以备教师查看 
	printf("**************************************************************************\n");
	for(i=0;i<num;i++)                 
	{
        printf("%s\t",st[i].name);
    }
    printf("\n");
    printf("\n");
	while(1)
	{
	printf("请输入要修改的学生的姓名:");
	scanf("%s",&name);
	a=findname(name);                //通过姓名找到数组下标 
	if(a==-1)                     //如果没找到就接收到-1,从而报错 
	{
		printf("学生信息有误!!!");
	}
	else
	{
		printf("需要修改的信息为:\n");
		display1(a);                                                             //将需要修改的学生信息显示出来 
			int q;
			printf("请输入要修改成绩的序号(1.英语 2.思修 3.体育):");         //选择要修改的科目 
			scanf("%d",&q);
			if(q==1)                                                          //判断要修改的科目 
			{
		       printf("请输入要修改的英语成绩:");
		       scanf("%d",&st[a].eng);                                      //重新输入要修改的成绩(将原先覆盖) 
		       st[a].ave=(st[a].chn+st[a].cop+st[a].eng)/3.0;              //对已修改的学生的平均分进行重新计算 
		       getchar();                                                 
		       printf("任意键继续修改,n退出:");
		       if(getchar()=='n')
		       {
			      break;
		       }
			}
			if(q==2)
			{
		       printf("请输入要修改的思修成绩:");
		       scanf("%d",&st[a].chn);                                            
		       st[a].ave=(st[a].chn+st[a].cop+st[a].eng)/3.0;
		       getchar();
		       printf("任意键继续修改,n退出:");
		       if(getchar()=='n')
		       {
			       break;
		       }
		    }
		    if(q==3)
		    {
		       printf("请输入要修改的体育成绩:");
		       scanf("%d",&st[a].cop);
		       st[a].ave=(st[a].chn+st[a].cop+st[a].eng)/3.0;
		       getchar(); 
            }
            printf("任意键继续修改,n退出:");
	        if(getchar()=='n')
	        {
	            break;
	        }
	}
	} 
}
void write()        //bug      乱码问题解决,但是文本信息修改后读入的信息未改变           部分解决。 有bug 
{
     FILE *fp;
     int i;
     if ((fp=fopen("student.txt","rb"))==NULL)
     {
         printf("不能打开文件!\n");
         return;
     }
      if(fread(&st[i], sizeof(struct student),2,fp)!=1)
      {
           printf("%s	%s	%d	%d	%d	%.2f\n",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
           printf("\n");
      }
      fclose(fp);
}
void Delete()             //删除学生信息 
{
	 system("cls");
     display();
     int i;
     printf("学生名单:\n");
     printf("*************************************************\n");
     for(i=0;i<num;i++)
	 {
	 	printf("%s\t",st[i].name);
	 }
	 printf("\n");
	 printf("*************************************************\n"); 
     while(1)
     {
         char name[20];
         int a;
         printf("请输入要删除的学生姓名:");      //ID也可以实现,原理类似 
         scanf("%s",name);
         a=findname(name);                     //确定数组下标 
         if(a==-1)                            //如果返回值为-1,提醒出错 
         {
              printf("学生不存在!\n");
         }
         else
         {
              printf("你要删除的学生信息为:\n");
              display1(a);                                    //显示要删除的学生信息 
              printf("是否删除(确认请按y):");
              getchar();
              if(getchar()=='y')
              {
                   for(i=a;i<num-1;i++)
                   {
                       st[i]=st[i+1];                   //把后边的对象都向前移动
                   }
                   num--;                               //学生人数减去一,最后一位(即要删除的学生)就不会被显示了 
              }
         }
         getchar();
         printf("任意键继续,n退出:");
         if (getchar()=='n')
         {
              break;
         }
     }
}

int main()                 //主函数 
{
	display();                                                                                              
	char i[200];                                                                                            
	int b;                                                                                                 
	char p[30];                                                                                        
	char a[60];                                                                                         
	while(1)                                                                                           
	{
		printf("请输入密码:");                     //密码   zhang                                        中国智造2025 
		scanf("%s",a);
		if(strcmp(a,"zhang")==0)      //设置简单的密码,如果输入的与设置的一致则程序继续运行,否则报错。 
		{
	  	while(1)
	  	{
	  	printf("\n请选择功能:");          //系统可选功能范围,超出则提示输入有误,请先录入学生信息!
	  	scanf("%s",&p);
	  	printf("\n");
	  	if(p[0]=='1'&&p[1]=='\0')
	  	{
	  		entry();break;
	  	}
	  	else if(p[0]=='1'&&p[1]=='1'&&p[2]=='\0')
	  	{
	  		write();
	  	}
	  	else if(p[0]=='0'&&p[1]=='\0')
	  	{
	  		exit(0);                    //退出系统 
	  	}
	  	else
	  	{
	  		printf("输入有误,请先录入学生信息!\n");
	  	}
	    }
	  while(1)
	  {
	      printf("\n请选择功能:");
		  scanf("%s",i);                                   //判断用户输入的是否在0-11数字范围内,若输入字母或特殊符号则报错!
		  printf("\n"); 
		  if(strcmp(i,"1")==0)b=1;
		  else if(strcmp(i,"0")==0)b=0;                    //起 
		  else if(strcmp(i,"2")==0)b=2;
		  else if(strcmp(i,"3")==0)b=3;
		  else if(strcmp(i,"4")==0)b=4;
		  else if(strcmp(i,"5")==0)b=5;
		  else if(strcmp(i,"6")==0)b=6;                                      
		  else if(strcmp(i,"7")==0)b=7;
		  else if(strcmp(i,"8")==0)b=8;
		  else if(strcmp(i,"9")==0)b=9;
		  else if(strcmp(i,"10")==0)b=10;
		  else if(strcmp(i,"11")==0)b=11;                   // 终 
		  else 
		  {
		  	b=-1;
		  }
		  if(b>=0&&b<=11)            //b的范围在0-11之间 
		  {
		  switch(b)
		  {                                                     
			  case 1:entry();break;                              //录入信息
			  case 2:average();break;                    //求班级总体的平均分
			  case 3:OUTPUT();break;                           //输出学生信息 
			  case 4:sort();break;                            //排序
			  case 5:find1();break;                          //按学号或者姓名查找
			  case 6:modify();break;                        //修改
			  case 7:entry();break;                        //追加/
			  case 8:Delete();break;                      //删除
			  case 9:subsection();break;                 //成绩分段
			  case 10:output();break;                   //输出到文件 
			  case 11:write();break;                   //从文件读取信息
			  case 0:exit(0);break;                   //退出系统 
		  }                                          
	      }
	      else if(b=-1)            //如果b=-1,则报错 
		  {
	          printf("暂未建设此功能,请重新选择!\n");
	      }
	  }
      }
    else
    {
    	printf("密码错误请重新输入!\n");
    }
    }
}
posted @ 2021-01-06 22:27  哆啦是只小猫咪  阅读(1230)  评论(0编辑  收藏  举报