• 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("                    *欢迎使用学生成绩管理系统*                           
    ");
    	printf("********************************************************************************
    ");
    	printf("  *请用户根据以下提示进行操作(温馨提示:请在成绩录入后再使用其它功能)*    
    ");
    	printf("*******************************************************************************
    "); 
    	printf("0.退出系统                 1.成绩录入        2.计算平均成绩        3.成绩输出
    ");
    	printf("4.成绩排序(按平均成绩)   5.成绩查找        6.成绩修改            7.成绩追加
    ");
    	printf("8.删除成绩                 9.成绩分段       10.文件存储           11.文件输出
    ");
    	printf("*******************************************************************************
    ");
    	printf("                       *如需退出系统请按0*                                      
    " );
    }
    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("班级平均分	英语平均分	思修平均分	体育平均分
    ");
    	printf("------------------------------------------------------------
    "); 
    	printf("%.2f		",aver);
    	printf("%.2f		",aver1);
    	printf("%.2f		",aver2);
    	printf("%.2f		
    ",aver3);
    }
    void OUTPUT()         //成绩输出 
    {
    	 system("cls");
    	 display();
         int i;
         printf("%s	%s	%s	%s	%s	%s
    ","学号","姓名","思修","体育","英语","平均分");
         printf("--------------------------------------------------------
    ");
         for (i=0;i<num;i++)
         {
             printf("%s	%s	%d	%d	%d	%.2f
    ",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("按平均成绩排序后的结果为:
    ");
    printf("----------------------------------------------------------------------
    ");
    printf("%s	%s	%s	%s	%s	%s
    ","学号","姓名","思修","体育","英语","平均分");
    for(i=num-1;i>=0;i--)
    {
      printf("%s	%s	%d	%d	%d	%.2f
    ",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
    }        
    printf("
    ");
    }
    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("学生名单:
    ");
        printf("****************************************************************************
    ");
        for(i=0;i<num;i++)
        {
        	printf("%s %s	",st[i].ID,st[i].name);
        	t++;
        	if(t==5)
        	{
        		printf("
    ");
        		t=0;
        	}
        }
        printf("
    ");
    	while(1)
    	{
    	  char name[20];
    	  int a;
    	  printf("请输入要查询的学生信息:");
    	  scanf("%s",name);
    	  printf("
    ");
    	  getchar();                         //不可省略 
    	  a=findname(name);
    	  if(a==-1)
    	  {
    	  	printf("学生信息有误,请重新输入!
    ");
    	  }
    	  else
    	  {
    	  	printf("您要查询的学生信息为:
    ");
    	  	printf("****************************************************************************
    ");
    	  	display1(a);
    	  }
    	  printf("任意键继续,n退出:");
    	  if(getchar()=='n')
    	  {
    	  	break;
    	  }
        }
    }
    void display1(int a)           //单一学生信息显示 
    {
    	printf("%s	%s	%s	%s	%s	%s
    ","学号","姓名","思修","体育","英语","平均分");
        printf("----------------------------------------------------------------------------
    ");
        printf("%s	%s	%d	%d	%d	%.2f
    ",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("优秀学生名单:
    ");       //通过三个循环将优秀、优良、差生分别累加并分类显示 
    	printf("--------------------------------------------------------------------
    ");
    	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
    ",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
    		}
    		b=0;
    	}
    	b=0;
    	printf("--------------------------------------------------------------------
    ");
    	printf("优良学生名单:
    ");
    	printf("--------------------------------------------------------------------
    ");
    	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
    ",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
    		}
    		b=0;
    	}
    	b=0;
    	printf("--------------------------------------------------------------------
    ");
    	printf("差生名单:
    ");
    	printf("--------------------------------------------------------------------
    ");
    	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
    ",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
    		}
    		b=0;
    	}
    	b=0;
    	    printf("
    ");
    		printf("********************************************************************
    ");
    		printf("
    ");
    		printf("优等生	优良生	差生
    ");
    		printf("--------------------------------------------------------------------
    ");
    		printf("%d个	%d个	%d个
    ",t1,t2,t3);
    		printf("
    "); 
    }
    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
    ",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
    		fprintf(fp,"
    ");
    	}
    	fclose(fp);
    }
    void modify()              //学生成绩修改 
    {
    	system("cls");
        display();
    	int a;
    	int i;
    	char name[20];
    	printf("学生名单:
    ");             //显示学生的姓名以备教师查看 
    	printf("**************************************************************************
    ");
    	for(i=0;i<num;i++)                 
    	{
            printf("%s	",st[i].name);
        }
        printf("
    ");
        printf("
    ");
    	while(1)
    	{
    	printf("请输入要修改的学生的姓名:");
    	scanf("%s",&name);
    	a=findname(name);                //通过姓名找到数组下标 
    	if(a==-1)                     //如果没找到就接收到-1,从而报错 
    	{
    		printf("学生信息有误!!!");
    	}
    	else
    	{
    		printf("需要修改的信息为:
    ");
    		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("不能打开文件!
    ");
             return;
         }
          if(fread(&st[i], sizeof(struct student),2,fp)!=1)
          {
               printf("%s	%s	%d	%d	%d	%.2f
    ",st[i].ID,st[i].name,st[i].chn,st[i].cop,st[i].eng,st[i].ave);
               printf("
    ");
          }
          fclose(fp);
    }
    void Delete()             //删除学生信息 
    {
    	 system("cls");
         display();
         int i;
         printf("学生名单:
    ");
         printf("*************************************************
    ");
         for(i=0;i<num;i++)
    	 {
    	 	printf("%s	",st[i].name);
    	 }
    	 printf("
    ");
    	 printf("*************************************************
    "); 
         while(1)
         {
             char name[20];
             int a;
             printf("请输入要删除的学生姓名:");      //ID也可以实现,原理类似 
             scanf("%s",name);
             a=findname(name);                     //确定数组下标 
             if(a==-1)                            //如果返回值为-1,提醒出错 
             {
                  printf("学生不存在!
    ");
             }
             else
             {
                  printf("你要删除的学生信息为:
    ");
                  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("
    请选择功能:");          //系统可选功能范围,超出则提示输入有误,请先录入学生信息!
    	  	scanf("%s",&p);
    	  	printf("
    ");
    	  	if(p[0]=='1'&&p[1]=='')
    	  	{
    	  		entry();break;
    	  	}
    	  	else if(p[0]=='1'&&p[1]=='1'&&p[2]=='')
    	  	{
    	  		write();
    	  	}
    	  	else if(p[0]=='0'&&p[1]=='')
    	  	{
    	  		exit(0);                    //退出系统 
    	  	}
    	  	else
    	  	{
    	  		printf("输入有误,请先录入学生信息!
    ");
    	  	}
    	    }
    	  while(1)
    	  {
    	      printf("
    请选择功能:");
    		  scanf("%s",i);                                   //判断用户输入的是否在0-11数字范围内,若输入字母或特殊符号则报错!
    		  printf("
    "); 
    		  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("暂未建设此功能,请重新选择!
    ");
    	      }
    	  }
          }
        else
        {
        	printf("密码错误请重新输入!
    ");
        }
        }
    }
    
  • 相关阅读:
    88. Merge Sorted Array
    87. Scramble String
    86. Partition List
    85. Maximal Rectangle
    84. Largest Rectangle in Histogram
    83. Remove Duplicates from Sorted List
    82. Remove Duplicates from Sorted List II
    81. Search in Rotated Sorted Array II
    80. Remove Duplicates from Sorted Array II
    计算几何——点线关系(叉积)poj2318
  • 原文地址:https://www.cnblogs.com/zwscode/p/14243814.html
Copyright © 2020-2023  润新知