zoukankan      html  css  js  c++  java
  • 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("密码错误请重新输入!
    ");
        }
        }
    }
    
  • 相关阅读:
    自定义带有uitableview的alertview对话框
    ZBarSDK扫描二维码
    iOS-UISearchBar和UISearchController(参考网友来练习一下)
    Nsstring中的搜索方法rangeOfString
    手势识别UIGestureRecognizer
    对iPhone手机型号进行判断
    iOS NSString 与NSData转化
    使用dispatch_once实现单例
    Command /usr/bin/codesign failed with exit code 1
    ios button的title下面添加横线
  • 原文地址:https://www.cnblogs.com/zwscode/p/14243814.html
Copyright © 2011-2022 走看看