精华内容
下载资源
问答
  • 【项目2-学生成绩处理】 (1)定义学生结构体,在结构体数组中,输入了学生学号和两门课的成绩,计算均分后,输出成绩单,请在下面的程序基础上,将程序补充完整。 #include <stdio.h> #define ...

    返回:贺老师课程教学链接

    【项目2-学生成绩处理】

    (1)定义学生结构体,在结构体数组中,输入了学生学号和两门课的成绩,计算均分后,输出成绩单,请在下面的程序基础上,将程序补充完整。
    这里写图片描述

    #include <stdio.h>
    #define N 100  /*N表示最多允许的学生人数*/
    struct Student
    {
       int num; //学号
       int c; //C语言成绩
       int math; //数学成绩
       float aver;  //两科均分
    };
    int main( )
    {
       int n;
       //定义结构体数组存放多名同学的成绩
       struct Student stu[N];
       printf("请输入学生人数: ");
       scanf("%d", &n);
       printf("请输入学号、C和数学课的成绩: \n");
       //输入数据
    
       //输出成绩单
    
       return 0;
    } 

    [参考解答]

    #include <stdio.h>
    #define N 100  /*N表示最多允许的学生人数*/
    struct Student
    {
       int num; //学号
       int c; //C语言成绩
       int math; //数学成绩
       float aver;  //两科均分
    };
    int main( )
    {
       int i, n, pass=0;
       //定义结构体数组存放多名同学的成绩
       struct Student stu[N];
       printf("请输入学生人数: ");
       scanf("%d", &n);
       printf("请输入学号、C和数学课的成绩: \n");
       for(i=0;i<n;i++)
       {
           scanf("%d %d %d",&stu[i].num,&stu[i].c, &stu[i].math);
           stu[i].aver=(stu[i].c+stu[i].math)/2.0;
           if(stu[i].c>=60&&stu[i].math>=60)
            pass++;
       }
       //输出成绩单
       printf("成绩单:\n");
       printf("学号\tC\t数学\t均分\n");
       for(i=0;i<n;i++)
           printf("%d\t%d\t%d\t%.2f\n",stu[i].num, stu[i].c,stu[i].math, stu[i].aver);
       //输出两门课都及格了的人数
       printf("两门课都及格了的人数有:%d\n", pass);
       return 0;
    }

    (2)请在上面的程序的基础上增加功能,使运行结果如下图:
    这里写图片描述
    其中,需要做出的改动是:

    • 计算每名学生的学分绩——各科成绩乘以学分的和,再除以总学分(本题中,C语言和数学课的学分分别是3和4);
    • 计算各科的均分;
    • 输出得奖学金的同学学号清单——奖学金规则是,学分绩要高于80且没有挂科。
      [参考解答]
    #include <stdio.h>
    #define N 100  /*N表示最多允许的学生人数*/
    struct Student
    {
        int num; //学号
        int c; //C语言成绩
        int math; //数学成绩
        float aver;  //两科均分
    };
    int main( )
    {
        int i, n=0;
        int totalC=0, totalMath=0;
        float averC, averMath;
        struct Student stu[N];
        printf("请输入学生人数: ");
        scanf("%d", &n);
        printf("请输入学号、C和数学课的成绩: \n");
        //输入成绩,并求出平均学分绩
        for(i=0; i<n; i++)
        {
            scanf("%d %d %d",&stu[i].num, &stu[i].c, &stu[i].math);
            stu[i].aver=(stu[i].c*3+stu[i].math*4)/7.0;
        }
        //求各科的总分,目的是求出各科均分,这个循环最好与上面的循环合并
        for(i=0; i<n; i++)
        {
            totalC += stu[i].c;
            totalMath += stu[i].math;
        }
        averC = 1.0*totalC/n;  
        averMath = 1.0*totalMath/n;
        //输出成绩单
        printf("学号\tC\t数学\t学分绩\n");
        for(i=0; i<n; i++)
            printf("%d\t%d\t%d\t%.2f\n",stu[i].num, stu[i].c, stu[i].math, stu[i].aver);
        printf("科均分\t%.2f\t%.2f\n\n",averC, averMath);
        //输出得奖学金(学分绩高于80且没有挂科)的同学学号
        printf("得奖学金的同学的学号是:\n");
        for(i=0; i<n; i++)
            if(stu[i].c>=60&&stu[i].math>=60&&stu[i].aver>=80)
                printf("%d ",stu[i].num);
        return 0;
    }
    展开全文
  • 学生成绩管理系统设计》 二、实训目的 (1)掌握结构化程序设计的基本方法,基本掌握面向对象程序设计的基本思路和方法。 (2)掌握C++的基本概念和基础知识。 (3)通过训练能够读懂较为复杂的C++语言源程序...

    很多朋友私信要一份C语言学生成绩管理系统设计报告,提供一下获取方法吧

    扫描下方公号,发送 成绩系统 三个字,获取实训报告。

    后续也会把之前搜集到的优质管理系统相关资料分享出来,大家一起学习,下面是作者自己的一份实训报告,希望能帮助到大家

    一、课程设计题目

    《学生成绩管理系统设计》

    二、实训目的

    (1)掌握结构化程序设计的基本方法,基本掌握面向对象程序设计的基本思路和方法。

    (2)掌握C++的基本概念和基础知识。

    (3)通过训练能够读懂较为复杂的C++语言源程序并具备基本C++语言程序设计的能力。

    4)通过实训,培养自己编写、调试、分析程序的能力。

    5)培养自己独立解决问题,查找资料的能力。同学之间相互帮助,相互交流,相互合作的团队精神。

    6) 培养自己良好的学习兴趣,独立的编程风格。

    7) 通过实训检查自己学习上的不足,达到熟练掌握C++语言的基本知识和技能。

    三、课程设计报告内容

    3.1功能要求

    该系统运行在DOS环境下,人机界面为命令行文本界面。完成的任务是对若干人的成绩信息进行管理,且数据保存到文件中。

    实现的主要功能是:

    系统以菜单方式进行工作

    学生信息和成绩输入功能

    学生信息和成绩输出功能

    学生信息和成绩浏览功能

    查询学生信息及成绩功能

    修改学生信息及成绩功能

    学生成绩排序

    以稳健的形式进行保存

    3.2 设计环境

    所使用的语言采用标准C,开发工具可选用在DOS环境下的Turbo C

    3.3 数据结构

    本系统是对学生成绩的信息进行管理,学生成绩信息采用C的结构体数据类型描述,定义如下:

    struct students
    {
       int num;          //学号-整型//
       char name[8];    //姓名-字符型//
       char chinese;    //大学语文-字符型//
       char math;       //大学数学-字符型//
       char computer;   //计算机-字符型//
       char sum;        //总成绩-字符型//
       char ave;        //平均分-字符型//
    }

    3.4实现方法及主要算法分析

    (1)主界面的设计:主界面采用文本菜单的形式,各功能调用通过菜单进行选择。采用循环处理,以便执行完某项处理后,仍可选择其他项处理。在循环内先显示提示信息,然后读取用户输入,使用switch语句对用户的输入进行判断,分别调用相应的模块,当某模块结束后再次回到文本菜单,直到用户选择结束程序菜单,才退出循环,从而退出系统。

    (2) 外部文件的类型:文件采用的二进制的文件,对文件的读写采用顺序文件的方式,并使用fread和fwrite等函数对文件进行操作。

    (3)清屏函数:一般由上一级菜单屏幕进入下一级菜单屏幕或由下一级菜单屏幕返回上一级菜单屏幕都需要清除屏幕原来显示的内容。同时在调用程序的过程中,记录需要清屏的位置,然后修改代码,加入clrscr()函数清屏。

    (4)提示信息:一般的输入与输出需有相应的提示信息,以增加用户的交互性,增加输出的可读性,以帮助用户使用程序。

    3.5模块设计

    根据功能要求,本系统为五大主要模块,具体模块如表所示。

    学生信息成绩管理系统的模块

    3.6处理流程

    (1)学生成绩管理系统主界面模块

    2)成绩输入模块 和(3)成绩排序模块

    (4)删除记录

    (5)修改记录

    (6)查找信息

    四、结论

    学生成绩管理系统的编写,看似杂乱无头绪,实际上却并不如此。它的每一个功能都能分成模块,有句话说的好,大事化小,小事化了。C语言编程也正式如此,把一个大的程序分为若干相互独立的模块,这样使完成每一个模块的工作变得单纯而明确,这样不仅降低了难度还使得思路清晰,很容易编写出要做的程序,从而为设计一些较大的软件打下了良好的基础。

    分析问题:

    学生成绩管理系统的整体功能都包括、增加成员、删除成员、查看成员、修改成员、登陆口令五大板块,而查看有包括学号,姓名,大学语文成绩,大学数学成绩,计算机成绩,总成绩,平均分七个模块。

    1. 设计的数据对象包括整形:学号。字符型:姓名、3门课程成绩、总成绩、平均成绩。
    2. 数据结构线性数据结构,定义人数上限为1000.

    算法的设计:

    1. 自顶向下

      现有全局,在进行整体设计,然后再进行下层的设计,逐步实现精细化。采用这种方法能够做到胸有全局,能全盘考虑,不至于顾此失彼,头重脚轻。

    1. 逐步细化

       一步步地将上层的任务分解成较小的、易于实现的任务,知道可以很简单实现为止。

    编写源程序:

    1. 不求速度,但求质量!一步一个脚印,编写程序时候宁可速度慢些也要尽量保证质量,做到尽量不出错。
    2. 精力集中,全神贯注!写程序时候最忌讳三心二意,这样才能思路清晰保证质量。
    3. 保持一个良好的编程心态,不要被长长的代码吓到

    程序的编译与运行:

    1. 查找错误是一件让人闹心的事,但是要注重技巧,注意平时经验的积累。
    2. 程序编译成功不要满足现状,要积极测试程序的可用性,对功能不理想,存在缺点的地方,积极的改进,完善。

    五、结束语

    在实训过程中,使我良好的锻炼了自己,首先是兴趣方面,通过编写通讯录管理系统使我更加喜欢编程,使我从以前的迷茫状态中解脱出来,使我了解了编程的真正意义。我想这对我以后的人生有着很大的帮助。其次通过编写通讯录管理系统使我对写程序有了一定的思路,不像以前无从下手,使我理解了算法的意义,使我懂得了模块化思想的好处。

    通过一个星期的编写代码,使我对书本上的知识有了更深的理解,甚至有很多不懂的问题在这过程中自然而然的理解了。对期末考试更有了信心。在朱老师的悉心指导下,我对C语言有了更深刻的理解,对程序的算法,数据的定义,程序的改错等方面的能力有了很大提高,自身的注意力,耐心,和对编程的兴趣有了很大增长,使我获益匪浅。

    六、参考书目:

    [1]谭浩强,《C语言程序设计》,清华大学出版社

    附完整代码:

    #include<stdio.h>
    #include<string.h>    //比较字符串头文件//
    #include<stdlib.h>   //实时检测总数头文件//
    #define N 1000       //控制最大输入//
    int n=0;             //实时检测的总数n//
    
    /*定义结构体students*/																	       
    struct students
    {
       int num;          //学号-整型//
       char name[8];     //姓名-字符型//
       char chinese;     //大学语文-字符型//
       char math;        //大学数学-字符型//
       char computer;    //计算机-字符型//
       char sum;         //总成绩-字符型//
       char ave;        //平均分-字符型//
    }student[N],student1;     //student[N]是结构体数组student1是结构体的初始化//
    
      /*实时检测总数n*/
    void count()  
     {
    	FILE *fp;         //定义一个文件指针fp//
    	fp=fopen("students.txt","at+");     //以“追加”方式打开students文本文件//
    	if(fp==NULL)                        //判断文件是否为空//
    		printf("Cannot open file!");
        struct students stu1;                 
    	n=0;         //初始化//
    	while(1)
    	{
    	  if(feof(fp))  //检测文件是否结束//
    	  break;
          fread(&stu1,sizeof(struct students),1,fp);   //读取文件//
    	  n++;    //读取文件数//
        }
    	n--;           //关闭文件数//
    	fclose(fp);    //关闭文件//
     }
    
    /*菜单*/
    void main()
    {
    	int i;        //获取用户在菜单中的选择//     
    	while(i!=0)
    	{
    		system("cls");     //清屏//
    	printf("\t\t欢迎进入学生信息管理系统\n");
      printf("\t\t==============================\n");
    		printf("\t\t*请择操作                    *\n");
    		printf("\t\t*1输入学生信息               *\n");
    		printf("\t\t*2输出学生信息               *\n");
    		printf("\t\t*3修改学生信息               *\n");
    		printf("\t\t*4查询学生信息               *\n");
           printf("\t\t*5排序学生信息               *\n");
    		printf("\t\t*6退出                       *\n");
    	printf("\t\t==============================\n");
     scanf("%d",&i);
     system("cls");     //清屏// 
    		count();     //实时检测总数n//
    		switch(i)
    		{
    		 case 1:input();break;    //输入学生信息//	
    		 case 2:output();break; 	//输出学生信息//
    	     case 3:xiugai();output();break;    //修改学生信息//
            case 4:query();break;    //查询学生信息*/
            case 5:paixu();output();break;    //成绩排序//
    	default:
    		   printf("输入有错\n");     //错误纠正//  
    		}
    	}
    	   if(i==0)
    	     tuichu();        //退出系统//
    }
    
    
    /*成绩输入*/
    void input()   
    {
      int i=0;     //学生人数初始化//
      char c;
      FILE *fp;     //定义一个文件指针fp//
    	count();     //实时检测总数n//
    	fp=fopen("students.txt","at+");    //以“追加”方式打开students文本文件//
      do 
      {	
       printf("请输入学生的个人信息:\n");
         printf("\n请输入第%d学生的信息:\n",n+1);
         printf("请输入学生的学号:");
         scanf("%d",&student[i].num);
         printf("请输入学生的姓名:");
        scanf("%s",student[i].name);getchar();
        printf("请输入学生的大学语文成绩");
        scanf("%s",student[i].chinese);
        printf("请输入学生的大学数学成绩:");
        scanf("%d",&student[i].math);
        printf("请输入学生的计算机成绩:");
        scanf("%s",student[i].computer);
         getchar();
         student[i].sum=student[i].chinese+student[i].math+student[i].computer;
    		student[i].ave=student[i].sum/3;
    fwrite(&student[i],sizeof(struct students),1,fp);  //以方式将其写入students文本文件//
    	i++;     
    	n++;      
    	printf("\n\n\t\t\t\t是否继续输入(Y/N):");getchar();     //提示是否继续,从键盘  
                                                               获得一个字符//  
    scanf("%c",&c);  
      }
     while(c=='y'||c=='Y');
     fclose(fp);
    }
    
    /*成绩输出*/        
    void output()  
    {
      int i;
      char c;
      FILE *fp;      //定义一个文件指针fp//
      fp=fopen("students.txt","rt");    //以“读取的” 方式打开students文本文件//
      system("cls");     //清屏//
      getchar();
        
    printf("||------||-----||-----||-----||------||-------||-------||------||");
    	printf("|#学号-----姓名------大学语文------大学数学------计算机------总成绩
    -----平均分---#|\n");
      do{  
    	  for(i=0;i<n;i++)  
    	  { 
           fread(&student[i],sizeof(struct students),1,fp);  
           printf("%d",student[i].num);
            printf(" %d",student[i].name);
    	        printf("%d",student[i].chinese);
              printf(" %d ",student[i].math);
              printf("%d ",student[i].computer);
              printf("%d",student[i].sum);
              printf(" %d ",student[i].ave);
         
    	  }
    printf("|------||-----||------||-----||-----||-----||-----||------ |");
      	  printf("\n\n\t\t\t\t是否继续其它操作(Y/N):");     //提示是否继续//
    	      scanf("%c",&c);
    	  c=getchar();
    	}while(c=='y'||c=='Y');
         fclose(fp);      //关闭文件//
    }
    
    /*成绩修改*/
    void xiugai()  { 
      int i,tp,num1;
      char c; 
      FILE *fp;     //定义一个文件指针fp//
    
    lb:  
      printf("\n按学号修改\n\n");
      printf("请输入要修改的学生学号\n");
      scanf("%d",&num1);
    
     for(i=0;i<n;i++) 
     {
    	if(num1==student[i].num)
    	  { 
    		printf("要修改的学生信息为:\n");
            printf("学号\t姓名\t大学语文成绩\t大学数学成绩\t计算机成绩\t总成绩\t
    平均分\n");          
            printf(" %d ",student[i].num);
            printf(" %d ",student[i].name);
            printf(" %d ",student[i].chinese);
            printf(" %d ",student[i].math);
            printf(" %d ",student[i].computer);
            printf(" %d ",student[i].sum);
            printf(" %d ",student[i].ave);
            do {
    		    printf("请选择要修改项:\n");
                printf("1学号\n2姓名\n3大学语文成绩\n4大学数学成绩\n5总成绩\n6平
    均分\n");
                scanf("%d",&tp);
    	            switch(tp)
    			{
    	         case 1:
    				{	 printf("请输入学号:\n");
    		          scanf("%d",&student[i].num);
    		          goto la;
    				}	
    	  	      case 2:
    				{ printf("请输入姓名:\n");
    		          scanf("%s",student[i].name);
    		          goto la;
    				}	
    	  	      case 3:
    				{ printf("请输入大学语文成绩:\n");
    				  getchar();
    		          scanf("%c",&student[i].chinese);
    		         goto la;
    				}	
    	  	      case 4:
    				{ printf("请输入大学数学成绩:\n");
    		          scanf("%d",&student[i].math);
    		         goto la;		  
    				}	
    	  	      case 5:
    				{printf("请输入计算机成绩:\n");
    		          scanf("%s",student[i].computer);	
    		         goto la;
    				}	
    	  	     case 6:
    				{ printf("请输入总成绩:\n");
    		          scanf("%s",student[i].sum);
    		         goto la;
    				}	
    	  	     case 7:
    				{ printf("请输入平均分:\n");
    		          scanf("%s",student[i].ave);
    		         goto la;
    				}
    			}
    		}while (tp<8);		 
    la:	  printf("是否继续修改(y/n)\n");     //提示是否继续//
    	  getchar();
    	  scanf("%c",&c);
    	  if(c=='y'||c=='Y')  goto lb;
             }
      }
        fp=fopen("students.txt","w+");   //以“读写” 方式打开students文本文件//
    	  for(i=0; i<n;i++)
    	  fwrite(&student[i],sizeof(struct students),1,fp);  //以 方式将其写入students
                                                     文本文件//
     fclose(fp);    //关闭文件//
    }
    
    
    /*成绩查询*/
    void query()
    { int querymode;     //子菜单选择//
      int i,j=0,findnum;
      char findname[20];
      int findok,t=0;     //定义一个判断标志的整型变量findok//
      char findct;        //定义一个用于判断是否继续查找的字符变量findct//
      
       FILE *fp;         //定义一个文件指针fp//
       count();     //实时检测总数n//
       fp=fopen("students.txt","r");       //以“只读” 方式打开students文本文件//
       system("cls");     //清屏//
    
      /*查询菜单*/
      printf("\t\t信息查询");
      printf("\n\t1按姓名查询");
      printf("\n\t2按学号查询");
      printf("\n\t0返回上级菜单");
      printf("\n请输入您的操作:");
      scanf("%d",&querymode);
    
      /*查询操作*/
      switch(querymode)
      {case 1: 
        {     printf("请输入要查询学生的姓名:\n");
                getchar();
                scanf("%s",findname); 
                for(i=0;i<N;i++)
    		{
         fread(&student[i],sizeof(struct students),1,fp); //以方式将其读入students
                                                          文本文件//
       if(strcmp(student[i].name,findname)==0)        //比较字符串//
    			 { 
    			   j++;
    			   printf("\n查寻到的学生为:\n");
    			   if(j==1)
                              、
    printf("|------||-----||------||------||------||-------||------||-----|");    
    //仅在第一次显示//
    	printf("|#学号-----姓名------大学语文------大学数学------计算机------总成绩-
    ----平均分---#|\n");
              
    printf("%4d%d%d%d%d%d%d%d",student[i].num,student[i].name,
    student[i].chinese,student[i].math,student[i].sum,student[i].ave);
    			  }
    
    			}
    			if(j==0)
    			  printf("\n>>>查无此人!");
    
               //提示是否继续// 
                printf ("\n是否继续查找(Y/N)?");       
                getchar();
                getchar();}break;
      
        case 2:{ printf("请输入要查询学生的学号:");
                 scanf("%d",&findnum);
                 for(i=0;i<n;i++)
    			 {
                  fread(&student[i],sizeof(struct students),1,fp);        
    //以结构体students的方式从文件fp中读取,将其读入students文本文件,每次读入一个 
    学生的信息//
                  if(student[i].num==findnum)      //整型数字的比较// 
    			  {findok=1;break;}
    			  else findok=0;
    			 }
                  if(!findok)
    				printf("\n>>>查无此人!");
    			  else
    			  { printf("\n查寻到的学生为:\n") ;
    			    if(j==1)
                          printf("|-------||------||------||-------||-------||-------||-------||------|");   
     //仅在第一次显示//
     printf("|学号-----姓名------大学语文------大学数学------计算机------总成绩-----平均分---|\n");
     printf("%4d%d%d%d%d%d%d%d",student[i].num,student[i].name,
    student[i].chinese,student[i].math,student[i].sum,student[i].ave);
    			  }
    //提示是否继续//
          printf ("\n是否继续查找(Y/N)?");       
            getchar();
    			findct=getchar();     //从键盘输入一个判断字符,并将它赋值给字符变量
                                   findct,用于以下的if语句的判断 //
    			if(findct=='Y' || findct=='y')
    			  query();
    		  }
      }
      fclose(fp);    //关闭文件//
    }
    
    
    /*成绩排序*/
    void paixu()
    {
       int i, j;
         FILE *fp;       //定义一个文件指针fp//
       system("cls");      //清屏//
       count();       //实时检测总数n// 
       for(i=0;i<n-1;i++)
    	    for(j=0;j<n-1-i;j++)    //按学号对学生信息进行排序//
    		{
    		     if(student[j].num>student[j+1].num)   //整型数字的比较//
    			 {
    			     student1=student[j];
    			     student[j]=student[j+1];
    			     student[j+1]=student1;
    			 }
    		}
    	fp=fopen("students.txt","w+");  //以 “读写”方式打开students文本文件//
    	for(i=0;i<n;i++)
    	fwrite(&student[i],sizeof(struct students),1,fp);  //以结构体students的方式从
       文件fp中读取,将其写入students文本文件,每次写入一个学生的信息//
        fclose(fp);      //关闭文件//
    }
    
    /*退出系统*/
    void tuichu() 
    {
    	char c;
    	  system("cls");      //清屏//
        printf("\n\n\t\t谢谢使用\n\n\n");
        printf("\n\n\t\t制作人:李姣 渠莉 宝珠 朱佳 刘妍\n");
    	  getchar();
    	c=getchar();       //取用户输入,回显//    
    }

    需要实训报告的同学,请在下方留言,看到会一个个回复的。

    或者直接扫描下方公号,发送 成绩系统 三个字,获取下载源码

    如果失效了,再请直接私信或留言,欢迎大家一起探讨学习。

    相关文章推荐:

    1、 C语言学生成绩管理系统源代码 ★★★★★

    2、 C语言学籍管理系统源代码 ★★

    3、C语言学生成绩管理系统设计 《C语言程序设计》实训报告 ★★★

    展开全文
  • 学生成绩管理系统数据库设计--MySQL

    万次阅读 多人点赞 2020-06-18 13:02:04
    MySQL/SQL Server 数据库设计学生成绩管理系统) 设计大纲 1. 项目背景及需求分析 1.1 项目背景 1.2 需求分析 1.2.1 信息需求 1.2.2 功能需求 1.2.3 安全性与完整性需求 2. 概念结构设计 2.1 抽象出系统实体 2.2 ...

    MySQL 数据库设计-学生成绩管理系统

    设计大纲

    在这里插入图片描述

    更新时间:2020.6.23

    1. 项目背景及需求分析

    1.1 项目背景

    为了深刻的理解MySQL数据库,以学生成绩信息管理为例,设计一个简单、规范、高效的学生成绩信息管理系统数据库。

    1.2 需求分析

    1.2.1 信息需求

    对学校而言,学生成绩管理是管理工作中重要的一环,但是高校学生的成绩管理工作量大、繁杂,人工处理非常困难。因此,借助于强大计算机的处理能力,能够把人从繁重的成绩管理工作中解脱出来,并且更加准确、安全、清晰的管理环境。

    1.2.2 功能需求

    能够进行数据库的数据定义、数据操纵、数据控制等处理功能。具体功能应包括:可提供课程安排、课程成绩数据的添加、插入、删除、更新、查询,学生及教职工基本信息查询的功能。

    1.2.3 安全性与完整性要求

    对于学生成绩管理系统数据库来讲,由于其主要数据是学生成绩,只能由本人以及所教老师及教务处知道,因此做好数据安全性是重中之重。另外,要求所有在校学生的信息都要录入其中,并且要设计好个别情况。

    2. 概念结构设计

    概念结构设计是整个数据库设计的关键,它通过对用户需求进行综合、归纳与抽象,形成一个独立于具体DBMS的概念模型。
    根据学生成绩信息管理数据库设计需求抽象出学生、教师、课程、成绩四个实体,对四个实体做简化处理,默认一门课程仅被一位老师讲授。因简化后关系结构比较简单,故省略了局部E-R图。对4个实体之间的关系进行分析如下:
    一位学生会被多位老师教导,一位老师会教导多位学生,所有学生与教师之间是多对多(m:n)的关系;
    一位学生可能会选修多门课程,一门课程会被多位学生选修,所以学生与课程之间是多对多(m:n)的关系;
    一位学生会有多项成绩(具体指某学生一门课程的分数),一项成绩仅被一位学生拥有,所以学生与成绩是一对多(1:n)的关系;
    一位教师会讲授多门课程,一门课程会被一位教师讲授,所以教师与课程的关系是一对多(1:n)的关系;
    一门课程拥有多项成绩,一项成绩仅被一门课程拥有,所以课程与成绩的关系是一对多(1:n)的关系;

    2.1 抽象出系统实体

    学生(学号、姓名、班级、性别、专业、出生日期、学分);
    老师(教师编号、姓名、学院);
    课程(课程编号、教师编号、课程名称、课程学分);
    成绩(学号、课程编号、分数);

    2.2 全局E-R图

    在这里插入图片描述

    3. 逻辑结构设计

    3.1 关系模式

    E-R图向关系模型转化要解决的问题是如何将实体型和实体间的联系转化为关系模式,如何确定这些关系模式的属性和码。
    设计学生成绩管理数据库,包括学生(students)、老师(teachers)、课程(courses)、成绩(scores)四个实体,其关系模式中对每个实体定义属性如下:

    students 表:学号(sid)、姓名(sname)、班级(sclass)、性别(sgender)、专业(smajor)、出生日期(sbirthday)、学分(credit_points),此为联系“students表”所对应的关系模式,学号为该关系的候选码,满足第三范式。

    teachers表:教师编号(tid)、姓名(tname)、学院(tschool),此为联系“teachers表”所对应的关系模式,教师编号为该关系的候选码,满足第三范式。

    courses表:课程编号(cid)、教师编号(tid)、课程名称(cname)、学分(credit_point),此为联系“courses表”所对应的关系模式,课程编号和教师编号为该关系的候选码,满足第三范式。

    scores表:学号(sid)、课程编号(cid)、分数(score),此为联系“scores表”所对应的关系模式,学号和课程编号为该关系的候选码,满足第三范式。

    3.2 函数依赖识别

    后续更新补充

    3.3 范式

    后续更新补充

    3.4 表结构

    数据库中包含4个表,即学生(students)、老师(teachers)、课程(courses)、成绩(scores)。

    students表的表结构
    在这里插入图片描述
    teachers表的表结构
    在这里插入图片描述
    courses表的表结构
    在这里插入图片描述
    scores表的表结构
    在这里插入图片描述

    4. 物理设计和实施

    4.1 数据库及表创建

    4.1.1 创建数据库

    -- 如果已有该数据库,则删除
    DROP DATABASE IF EXISTS StudentScore;
    
    -- 创建数据库
    CREATE DATABASE StudentScore CHARSET=UTF8;
    

    4.1.2 创建数据表

    -- 使用数据库
    USE StudentScore;
    
    -- 创建数据表
    -- table 1: students
    DROP TABLE IF EXISTS students;
    CREATE TABLE students(
    sid INT(20) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    sname VARCHAR(20),
    sclass INT(10),
    sgender VARCHAR(10),
    smajor VARCHAR(20),
    sbirthday DATE,
    credit_points INT(5) -- 学生已修学分
    );
    
    -- table 2: teachers
    DROP TABLE IF EXISTS teachers;
    CREATE TABLE teachers(
    tid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    tname VARCHAR(20),
    tschool VARCHAR(20)
    );
    
    -- table 3: courses
    DROP TABLE IF EXISTS courses;
    CREATE TABLE courses(
    cid INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT NOT NULL,
    cname VARCHAR(20),
    credit_point INT(5), -- 课程学分
    tid INT(10) UNSIGNED NOT NULL,
    FOREIGN KEY(tid) REFERENCES teachers(tid)
    );
    
    -- table 4: scores
    DROP TABLE IF EXISTS scores;
    CREATE TABLE scores(
    sid INT(10) UNSIGNED NOT NULL,
    cid INT(10) UNSIGNED NOT NULL,
    score DECIMAL(5, 2),
    FOREIGN KEY(sid) REFERENCES students(sid),
    FOREIGN KEY(cid) REFERENCES courses(cid)
    );
    
    

    4.2 表数据增删改查测试

    4.2.1 MySQL基础知识点总结

    在这里插入图片描述

    4.2.2 精选MySQL练习题数据及解析

    点击查看
    4.2.2 精选MySQL练习题数据及答案解析

    4.2.2.1. 连接查询 - 4题

    1.1 查询同时选修了课程 1 和 课程 2 的学生的信息

    1.2 查询课程 1 比 课程 2 成绩高的学生的信息及课程分数

    1.3 查询课程 1 分数小于 60 的学生信息和课程分数,按分数降序排列

    1.4 查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩

    4.2.2.2. 子查询、连接查询 - 4题

    2.1 查询有成绩的学生信息

    2.2 查询学过 孙悟空 老师所授课程的学生信息

    2.3 查询至少有一门课与学号为 1 的同学所学相同的学生信息

    2.4 查询选修了课程 2 但是没有选修课程 1 的学生信息

    4.2.2.3. 聚合分组、连接查询 - 8题

    3.1 查询同名学生名单,并统计同名人数

    3.2 查询选修了 3 门课程的学生信息

    3.3 查询平均成绩大于等于 85 的所有学生的学号、姓名、平均成绩(保留2位小数)

    3.4 查询平均成绩大于等于 60 分的学生学号、姓名、平均成绩(保留2位小数)

    3.5 查询两门及以上课程分数小于60分的学生学号、姓名及平均成绩(保留2位小数)

    3.6 查询姓 赵 的同学的学生信息、总分,若没选课则总分显示为 0

    3.7 查询所有同学的学号、姓名、选课总数、总成绩,没选课的学生要求显示选课总数和总成绩为 0

    3.8 查询所有学生学号、姓名、选课名称、总成绩,按总成绩降序排序,没选课的学生显示总成绩为 0

    4.2.2.4. if 或 case 语句 - 2题

    4.1 若学号sid为学生座位编号,现开始对座位号调整,奇数号和偶数号对调,如1和2对调、3和4对调…等, 如果最后一位为奇数,则不调换座位,查询调换后的学生座位号(sid)、姓名,按sid排序

    4.2 查询各科成绩最高分、最低分和平均分: 以如下形式显示:课程id、课程名、选修人数、最高分、最低分、平均分、及格率、中等率、优良率、优秀率
    及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90
    要求查询结果按人数降序排列,若人数相同,按课程号升序排列,平均分、及格率等保留2位小数

    4.2.2.5. 时间函数 - 6题

    5.1 查询 1990 年出生的学生信息

    5.2 查询各学生的年龄,分别按年份和按出生日期来算

    5.3 查询本周或下周过生日的学生

    5.4 查询本月或下月过生日的学生

    5.5 查询学生信息,要求:学号和年龄同时至少比一位学生的学号和年龄大

    5.6 查询连续相邻3年出生的学生中,学生性别相同的学生信息

    4.2.2.6.综合应用 - 12题

    6.1 查询和学号为 1 的同学学习的课程完全相同的其他同学的信息

    6.2 查询每科均及格的人的平均成绩:学号、姓名、平均成绩(保留2位小数)

    6.3 查询选修 张若尘 老师所授课程的学生中,该门课成绩最高的学生信息及成绩(成绩可能重复)

    6.4 查询各科成绩,按各科成绩进行排序,并显示排名 分数重复时保留名次空缺,即名次不连续

    6.5 查询各科成绩,按各科成绩进行排序,并显示排名 分数重复时不保留名次空缺,即名次连续

    6.6 查询学生 赵雷 的 变形 课程成绩的排名:学生信息,分数,排名 分数重复时不保留名次空缺,即名次连续

    6.7 查询课程 时空穿梭 成绩在第2-4名的学生,要求显示字段:学号、姓名、课程名、成绩 分数重复时不保留名次空缺,即名次连续

    6.8 查询学生的总成绩,并进行排名,总分重复时不保留名次空缺,即名次连续

    6.9 查询学生的总成绩,并进行排名,总分重复时保留名次空缺,及名次不连续 排名名次不连续,不需要去重

    6.10 统计各科成绩各分数段人数:课程编号,课程名称,[100-85],[85-70],[70-60],[60-0] 分别所占百分比 结果:保留2位小数

    6.11 查询各科成绩前三名的记录,按照课程编号和分数排序 分数重复时,重复分数按照一名算,即不保留名次空缺,及名次连续

    6.12 查询各科成绩的前两名,列出学生信息、课程名、分数,按照课程名、分数排序 分数重复时,重复分数按照一名算,即不保留名次空缺,及名次连续

    4.2.2.7 MySQL练习题数据及答案解析

    点击查看
    4.2.2 精选36道MySQL练习题数据及答案解析

    4.3 创建视图

    4.3.1 创建一个学生视图,要求显示学生学号、姓名、班级、性别、专业、各科成绩、平均分、总分

    DROP VIEW IF EXISTS v_students_info;
    
    CREATE VIEW v_students_info AS
    SELECT  stu.sid,
    		stu.sname,
    		stu.sclass,
    		stu.sgender,
    		stu.smajor,
    		sum(if(c.cname = "变形", sc.score, 0)) AS "变形",
    		sum(if(c.cname = "时空穿梭", sc.score, 0)) AS "时空穿梭",
    		sum(if(c.cname = "分解术", sc.score, 0)) AS "分解术",
    		sum(if(c.cname = "炼器", sc.score, 0)) AS "炼器",
    		sum(if(c.cname = "炼丹", sc.score, 0)) AS "炼丹",
    		sum(if(c.cname = "飞行", sc.score, 0)) AS "飞行",
    		round(ifnull(avg(sc.score), 0), 2) AS "平均分",
    		ifnull(sum(sc.score), 0) AS "总分"
    FROM 	students stu LEFT JOIN
    		scores sc ON stu.sid = sc.sid LEFT JOIN
    		courses c ON c.cid = sc.cid
    GROUP BY stu.sid;
    

    查看视图:
    在这里插入图片描述
    在这里插入图片描述

    4.4 创建函数

    4.4.1 创建一个通过学号sid获取学生信息的函数

    DROP FUNCTION IF EXISTS get_student_info_by_sid;
    
    DELIMITER //
    CREATE DEFINER = CURRENT_USER FUNCTION get_student_info_by_sid(id INT)
    RETURNS VARCHAR(300)
    DETERMINISTIC
    BEGIN
    RETURN (SELECT CONCAT('姓名: ', sname, ' , ', '性别: ', sgender, ' , ', '专业:', smajor)
    FROM students WHERE sid = id);
    END//
    DELIMITER ;
    -- 调用函数
    SELECT get_student_info_by_sid(8);
    

    调用函数结果:
    在这里插入图片描述
    其中DELIMITER 先定义结束符为 // , 然后又将结束符改为mysql默认的分号结束符。

    了解delimiter 关键字请点击:
    MySQL中 delimiter 关键字详解
    如果出现报错1418:

    Error Code : 1418 This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)

    参考下面:
    MySQL ERROR 1418 的解决方法

    4.4.2 自定义函数 2:要求函数体中包含其中一种流程控制语句,要求输入学生学号sid、课程编号,显示学生姓名、课程名称、成绩是否及格(即成绩>=60)

    
    DROP FUNCTION IF EXISTS get_student_scores_by_id;
    
    DELIMITER //
    CREATE DEFINER = CURRENT_USER FUNCTION get_student_scores_by_id(sid INT, cid INT)
    RETURNS VARCHAR(300)
    DETERMINISTIC
    BEGIN
    	-- 多个变量要分开声明,否则会报错
    	DECLARE score INT;
    	DECLARE name VARCHAR(20);
    	DECLARE course_name VARCHAR(20);
    	SELECT sc.score INTO score
    	FROM scores AS sc
    	WHERE sc.sid = sid AND sc.cid = cid;
    	SELECT sname INTO name FROM students AS stu WHERE stu.sid = sid;
    	SELECT cname INTO course_name FROM courses AS co WHERE co.cid = cid;
    	IF score >= 60 THEN
    		RETURN CONCAT(name, '--', course_name, '--', '及格');
    	ELSEIF score > 0 AND score < 60 THEN
    		RETURN CONCAT(name, '--', course_name, '--', '不及格');
    	ELSE
    		RETURN '找不到该学生、课程或该学生没有选课!';
    	END IF;
    END//
    DELIMITER ;
    
    -- 调用函数
    SELECT get_student_scores_by_id(1, 2);
    
    

    调用函数结果:
    在这里插入图片描述

    4.5 创建存储过程

    4.5.1 学生每选修一门课,如果该门课程成绩达到60分及以上,则把该门课程学分加到学生学分里面,输出该学生姓名、学分

    DROP PROCEDURE IF EXISTS add_scores;
    
    DELIMITER //
    CREATE DEFINER = CURRENT_USER PROCEDURE add_scores(
    	IN stu_id INT, 
    	IN co_id INT, 
    	IN s_score INT,
    	OUT name VARCHAR(20),
    	OUT s_credit_point INT
    )
    DETERMINISTIC
    BEGIN
    -- 多个变量要分开声明,否则会报错
    DECLARE points INT;
    INSERT INTO scores (sid, cid, score)
    VALUES (stu_id, co_id, s_score);
    SELECT credit_point INTO points FROM courses WHERE cid = co_id;
    IF s_score >= 60 THEN
    	UPDATE students 
    	SET credit_points = credit_points + points
    	WHERE sid = stu_id;
    END IF;
    -- 注意:多个输出值一定要用多个SELECT来赋值,否则会报错
    SELECT sname INTO name FROM students WHERE sid = stu_id;
    SELECT credit_points INTO s_credit_point FROM students WHERE sid = stu_id;
    COMMIT;
    END//
    DELIMITER ;
    
    -- 测试调用存储过程
    SELECT * FROM students WHERE sid > 10;
    CALL add_scores(11, 2, 33, @name, @s_credit_point);
    SELECT @name, @s_credit_point;
    CALL add_scores(12, 2, 88, @name, @s_credit_point);
    SELECT @name, @s_credit_point;
    
    

    调用存储过程结果:
    在这里插入图片描述

    4.6 创建触发器

    4.6.1 创建一个更新学生学分的触发器,如果该学生分数>=60,则给该学生加上这门课的学分

    语法
    create trigger triggerName
    after/before insert/update/delete on 表名 for each row #这句话在mysql是固定的 begin
    sql语句;
    end;

    
    DROP TRIGGER IF EXISTS update_credit_point;
    
    DELIMITER //
    CREATE TRIGGER update_credit_point
    AFTER INSERT ON scores FOR EACH ROW
    BEGIN 
    	DECLARE points INT;
    	SELECT co.credit_point INTO points FROM courses AS co WHERE co.cid = new.cid;
    	IF new.score >= 60 THEN
    		UPDATE students SET credit_points = credit_points + points
    		WHERE sid = new.sid;
    	END IF;
    END//
    DELIMITER ;
    
    
    -- 测试数据
    SELECT * FROM students WHERE sid < 3;
    INSERT INTO scores VALUES
    (1, 4, 77),
    (2, 4, 55);
    SELECT * FROM students;
    

    测试结果:
    在这里插入图片描述
    终于写完啦!

    展开全文
  • MFC课程设计 --学生成绩管理系统

    万次阅读 多人点赞 2018-07-26 21:12:55
    MFC课程设计 ,C++课程设计 --学生成绩管理系统 ps:因为课设完成的过程大家都不太一样,以下的代码仅供学习一下在MFC下各个控件的用法,有问题欢迎留言讨论。     实验目的 使用MFC类库编制应用程序:按钮...

    MFC课程设计 ,C++课程设计 --学生成绩管理系统

    ps:因为课设完成的过程大家都不太一样,以下的代码仅供学习一下在MFC下各个控件的用法,有问题欢迎留言讨论。

     

     

    • 实验目的
    1. 使用MFC类库编制应用程序:按钮控件、静态控件及编辑框的应用。
    2. 了解MFC类的层次结构及主要类的用法,掌握使用MFC和向导来编写Windows应用程序。
    3. 熟悉Microsoft Visual Studio2013的开发环境。
    4. 掌握在Microsoft Visual Studio2013开发环境调试程序的方法。
    5. 掌握静态控件、按钮、流动条、编辑框、列表框、组合框和对话框的创建、消息发送和控件控制等内容。
    6. 对前面所学知识的总结,通过一个比较完整的应用程序的设计,将学过的知识连贯起来,掌握开发一个实际应用程序的步骤,同时学会使用开发工具实现界面友好的应用程序。并通过本实验,掌握如何运用面向对象技术对具体的应用系统进行分析和设计。

    二、实验内容

     

    本次c++课设的学生成绩管理系统是面向学生和教师的。该系统有三种身份账号,其中学生账号可以在里面查询自己的成绩,而教师账号可以添加,删除和修改学生的成绩,而管理员账号可以添加,删除和修改学生的成绩外,还能可以添加,删除和修改登录使用的账号。

    另外,用单文档设计的学生成绩分析图形绘制。并用该学生成绩管理系统调用该画图的exe文件,实现在该学生成绩管理系统中显示学生成绩的直方图和曲线图。

    登录界面:

     

     

    学生成绩管理界面:

    (1)、设计一个学生类Student,包括数据成员:姓名、学号、五门课程(高等数学,离散数学,C++课设,大学英语,大学体育)的成绩。

    (2)、创建一个基于对话框的MFC应用程序,程序窗口的标题上有你姓名、学号和应用程序名称。使用(1)的类,实现对学生信息和成绩的输入和管理。

    (3)、创建一个单文档的MFC应用程序,读取(2)中保存的文件中的学生成绩,分别用直方图和折线方式显示所有学生某课程的成绩分布图。

    (4)创建一个登录管理界面,学生可以用学生账号登录查看成绩,教师可以使用教师账号登录查看并添加,删除,修改学生的成绩。而管理员账号可以添加,删除和修改学生和老师的登录账号,老师和学生账号只能修改自身的登录密码。

    (5)创建一个学生成绩管理主界面,上面有list控件之间将存储在文件的学生信息显示在主界面上,另外还有查找控件,组合控件进行排序,添加,删除和修改控件。还有账号管理,重新登录和退出控件。

    (6)创建一个学生信息查找后显示的学生详细信息界面,拥有教师账号的用户可以通过对这个界面信息的修改,按下“修改保存”的控件进行信息的修改。

     

     

     

     

     

     

     

    (7)点击组合框排序,按确定键后,会通过list和文件的操作,进行对应的排序。可以进行的排序为:学号,高数成绩,离散成绩,c++课设成绩,英语成绩,体育成绩。排序后的内容会直接显示在学生成绩管理的主界面list中。

     

     

    (8)用单文档对学生成绩储存的文件进行操作,并进行直方图和折线图的绘画。在学生成绩管理住界面点击统计分析,可以直接调用该单文档exe.

     

     

    (8)创建一个重新登录界面,用户可以通过重新登录的方法进行该学生成绩管理系统用户的更换。该界面需要输入学号,旧密码,新密码,再次输入新密码才能修改该账号的密码。

    (9)创建一个登录账号管理界面,只有admin的管理员账号才能进行账号的添加,修改和删除。

    三实验设备

     

    Win7操作系统

    Microsoft Visual Studio2013

     

    四、实验要求

     

    1.  使用MFC类库编制应用程序:按钮控件、静态控件及编辑框的应用。

    2.  了解MFC类的层次结构及主要类的用法,掌握使用MFC和向导来编写Windows应用程序。

    3掌握静态控件、按钮、流动条、编辑框、列表框、组合框和对话框的创建、消息发送和控件控制等内容。

    4对前面所学知识的总结,通过一个比较完整的应用程序的设计,将学过的知识连贯起来,掌握开发一个实际应用程序的步骤,同时学会使用开发工具实现界面友好的应用程序。并通过本实验,掌握如何运用面向对象技术对具体的应用系统进行分析和设计。

     

    五、实验程序

    (1)登录界面

    LoginDlg.cpp的主要关键代码

              //在主界面调用之前在BOOL CMFC课设学生成绩管理系统App::InitInstance()

    中添加

    CLoginDlg dl;

             if (IDCANCEL == dl.DoModal())

                       return FALSE;

    功能是实现先调用登录窗口。

    void CLoginDlg::OnBnClickedOk()    //点击登录的响应函数
    {
    	if (CheckSuer())               //登录账号和密码的确定是否正确
    		CDialog::OnOK();	
    	else
    	{
    		AfxMessageBox("用户名或密码错误");   //密码错误则弹出窗口提示错误
    		SetDlgItemText(IDC_NAME, "");        //重置两个编辑框
    		SetDlgItemText(IDC_PASS, "");
    		this->SetFocus();
    	}
    }
    
    bool  CLoginDlg::CheckSuer()         //账户和密码确认
    {
    	CString szName, szPass;
    	GetDlgItemText(IDC_NAME, szName);
    	GetDlgItemText(IDC_PASS, szPass);
    	szName.MakeLower();
    	
    	if (szName == "admin"&&szPass == "123")    //是否为管理员账号
    	{
    		SUser u = { "admin", "123", 1 };
    		theApp.m_us = u;                    //将登录人员的信息记录在theApp中
    		return TRUE;
    
    	}
    	SUser u;
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeRead))
    	{
    		CreatUser();
    		if (!file.Open("./user.dat", CFile::modeRead))
    			return FALSE;
    	}
    	while (file.Read(&u, sizeof(u)))
    	{
    		if (szName == u.sName&&szPass == u.sPass)
    		{
    			theApp.m_us = u;
    			return TRUE;
    		}
    	}
    	return FALSE;
    }
    void CLoginDlg::CreatUser()          //如果不存在账号和密码存储的文件,则新建一个存储文件
    {
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("用户文件创建失败");
    		return;
    	}
    }
    

    (2)学生成绩管理主界面

    BEGIN_MESSAGE_MAP(CMFC课设学生成绩管理系统Dlg, CDialogEx)
    	ON_WM_SYSCOMMAND()
    	ON_WM_PAINT()
    	ON_WM_QUERYDRAGICON()
    	ON_BN_CLICKED(IDC_ManagePower, &CMFC课设学生成绩管理系统Dlg::OnBnClickedManagepower)
    	ON_BN_CLICKED(IDC_AGAIN_LOGIN, &CMFC课设学生成绩管理系统Dlg::OnBnClickedAgainLogin)
    	ON_BN_CLICKED(IDC_STUDENT_ADD, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentAdd)
    	ON_BN_CLICKED(IDC_STUDENT_DEL, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDel)
    	ON_BN_CLICKED(IDC_STUDENT_SEEK, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentSeek)
    	ON_BN_CLICKED(IDC_STUDENT_CHANGE, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentChange)
    	ON_BN_CLICKED(IDC_BUTTON8, &CMFC课设学生成绩管理系统Dlg::OnBnClickedButton8)
    	ON_BN_CLICKED(IDC_STUDENT_IDCANCEL, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentIdcancel)
    	ON_BN_CLICKED(IDC_STUDENT_DIALOG_OKSORT, &CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDialogOksort)
    	ON_BN_CLICKED(IDC_PICTURE_ANALYSIS, &CMFC课设学生成绩管理系统Dlg::OnBnClickedPictureAnalysis)
    END_MESSAGE_MAP()
    
    
    // CMFC课设学生成绩管理系统Dlg 消息处理程序
    
    BOOL CMFC课设学生成绩管理系统Dlg::OnInitDialog()  //初始化窗口
    {
    	CDialogEx::OnInitDialog();
    	CString str = "1606100*** 卟咚君 学生成绩管理系统           用户:";    //在窗口左上角设置自己的姓名和学号(课设要求),以及本次显示登录的账号
    	str += theApp.m_us.sName;
    	SetWindowText(str);
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);     // 初始化(IDC_STUDENT_DIALOG)ListCtrl控件
    	pList->InsertColumn(0, "体育", 0, 80);    
    	pList->InsertColumn(0, "英语", 0, 80);
    	pList->InsertColumn(0, " c++", 0, 80);
    	pList->InsertColumn(0, "离散", 0, 80);
    	pList->InsertColumn(0, "高数", 0, 80);
    	pList->InsertColumn(0, "姓名", 0, 100);
    	pList->InsertColumn(0, "学号", 0, 100);
    	SortStudent(0);
    	ReadStudent(pList);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST);   //设置(IDC_STUDENT_DIALOG)CComboBox控件
    	pComb->AddString("学号");   
    	pComb->AddString("高数");
    	pComb->AddString("离散");
    	pComb->AddString("c++");
    	pComb->AddString("英语");
    	pComb->AddString("体育");
    	pComb->SetCurSel(0);
    	CComboBox* pComb1 = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST);   //获得排列组合控件的信息
    	int nSel = pComb1->GetCurSel();
    	GetDlgItem(IDC_STUDENT_ADD)->EnableWindow(theApp.m_us.nPrior);     //对应相应的身份权限设置是否屏蔽添加权限
    	GetDlgItem(IDC_STUDENT_DEL)->EnableWindow(theApp.m_us.nPrior);     //对应相应的身份权限设置是否屏蔽删除权限
    	GetDlgItem(IDC_STUDENT_CHANGE)->EnableWindow(theApp.m_us.nPrior);   //对应相应的身份权限设置是否屏蔽修改权限
    	//pComb->SetItemHeight(25,25);
    	//GetDlgItem(IDC_ManagePass)->EnableWindow(theApp.m_us.nPrior);
    	//GetDlgItem(IDC_ManagePower)->EnableWindow(theApp.m_us.nPrior);
    
    	// 将“关于...”菜单项添加到系统菜单中。
    
    	// IDM_ABOUTBOX 必须在系统命令范围内。
    	ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    	ASSERT(IDM_ABOUTBOX < 0xF000);
    
    	CMenu* pSysMenu = GetSystemMenu(FALSE);
    	if (pSysMenu != NULL)
    	{
    		BOOL bNameValid;
    		CString strAboutMenu;
    		bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
    		ASSERT(bNameValid);
    		if (!strAboutMenu.IsEmpty())
    		{
    			pSysMenu->AppendMenu(MF_SEPARATOR);
    			pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
    		}
    	}
    
    	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
    	//  执行此操作
    	SetIcon(m_hIcon, TRUE);			// 设置大图标
    	SetIcon(m_hIcon, FALSE);		// 设置小图标
    
    	// TODO:  在此添加额外的初始化代码
    
    	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
    }
    
    void CMFC课设学生成绩管理系统Dlg::OnSysCommand(UINT nID, LPARAM lParam)
    {
    	if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    	{
    		CAboutDlg dlgAbout;
    		dlgAbout.DoModal();
    	}
    	else
    	{
    		CDialogEx::OnSysCommand(nID, lParam);
    	}
    }
    
    // 如果向对话框添加最小化按钮,则需要下面的代码
    //  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
    //  这将由框架自动完成。
    
    void CMFC课设学生成绩管理系统Dlg::OnPaint()
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // 用于绘制的设备上下文
    
    		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);
    
    		// 使图标在工作区矩形中居中
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// 绘制图标
    		dc.DrawIcon(x, y, m_hIcon);
    	}
    	else
    	{
    		CDialogEx::OnPaint();
    	}
    }
    
    //当用户拖动最小化窗口时系统调用此函数取得光标
    //显示。
    HCURSOR CMFC课设学生成绩管理系统Dlg::OnQueryDragIcon()
    {
    	return static_cast<HCURSOR>(m_hIcon);
    }
    
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedManagepower()    //“账号管理”控件响应函数,调用 CPower(管理权限)类的窗口
    {
    	CPower dl;
    	dl.DoModal();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedAgainLogin()   //“重新登录”控件响应函数
    {
    	CDialog::OnCancel();                                    //关闭当前的学生成绩管理系统窗口
    	CLoginDlg dl;                                          //调用登录窗口
    	if (IDOK == dl.DoModal())                              //成功登录返回IDOK,在调用新的学生成绩管理系统窗口
    	{                                                      //登录退出则返回IDCANCEL
    		CMFC课设学生成绩管理系统Dlg dlg;
    		dlg.DoModal();
    	}
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentAdd()    //“添加”控件响应函数,调用IDD_StudentSpecificAddDlg添加窗口,添加学号和相应成绩信息
    {
    	CStudentSpecificAddDlg dl;
    	if (IDCANCEL == dl.DoModal())
    	{
    		CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);  //关闭IDD_StudentSpecificAddDlg添加窗口,读取储存学生成绩的文件刷新学生成绩管理系统窗口
    		CMFC课设学生成绩管理系统Dlg::ReadStudent(pList);
    		OnBnClickedStudentDialogOksort();
    	}
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::ReadStudent(CListCtrl* pList)    //读取储存学生成绩的文件,并加载在学生成绩管理系统窗口的CListCtrl中
    {
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		GreatStudentfile();
    		return;
    	}
    	pList->DeleteAllItems();
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		pList->InsertItem(i, u.sId);
    		pList->SetItemText(i, 1, u.sName);
    		pList->SetItemText(i, 2, u.sHigher_math);
    		pList->SetItemText(i, 3, u.sDiscrete_math);
    		pList->SetItemText(i, 4, u.sC_program);
    		pList->SetItemText(i, 5, u.sEnglish);
    		pList->SetItemText(i, 6, u.sSports);
    		i++;
    	}
    	file.Close();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::GreatStudentfile()   //创建用户登录账号储存文件
    {
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("用户文件创建失败");
    		return;
    	}
    	file.Close();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDel()  // “删除”控件响应函数
    {
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
    	Student ur;
    	int nSel = pList->GetSelectedCount();    //获取当前鼠标选择的学号数量
    	if (nSel < 1)
    	{
    		AfxMessageBox("请选择一个账户再删除!");
    		return;
    	}
    	int nSelText = pList->GetSelectionMark();   //获取当前鼠标选择的一个学号位置
    	pList->GetItemText(nSelText, 0, ur.sId, sizeof(ur.sId));
    	pList->DeleteItem(nSelText);   //删除当前鼠标选择的学号位置
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	CFile temporaryfile;
    	if (!temporaryfile.Open("./temporarystudentfile.dat", CFile::modeCreate|CFile::modeWrite| CFile::shareDenyNone))
    	{
    		GreatTemporaryStudentfile();
    		return;
    	}
    	Student u;
    	while (file.Read(&u, sizeof(u)) == sizeof(u)) //读取学生成绩储存文件,将未删除的学生信息写入临时文件temporaryfile中
    	{
    		if ((CString)u.sId == (CString)ur.sId)
    			continue;
    		temporaryfile.Write(&u, sizeof(u));
    	}
    	file.Close();
    	temporaryfile.Close();
    	if (!file.Open("./studentfile.dat", CFile::modeCreate|CFile::modeWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	if (!temporaryfile.Open("./temporarystudentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	while (temporaryfile.Read(&u, sizeof(u)) == sizeof(u))  //读取学生成绩储存文件,将临时文件temporarystudentfile.dat中学生信息写入真正存储学生信息的studentfile.dat中
    		file.Write(&u, sizeof(u));
    	CMFC课设学生成绩管理系统Dlg::ReadStudent(pList);  //更新学生成绩管理系统界面的信息
    	OnBnClickedStudentDialogOksort();
    	return;
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentSeek()   //“查找”控件对应的函数,查找学生的学号
    {
    	int nNum;
    	char str[20];
    	GetDlgItemText(IDC_STUDENT_DIALOG_ID, str, sizeof(str));  //获取编辑框的学号信息
    	if ((CString)str == "")
    	{
    		AfxMessageBox("请在学号框里输入学号!");
    		return;
    	}
    	nNum = Seek_Student(str);  //查询该学号是否存在
    	if (nNum == -1)
    	{
    		AfxMessageBox("该用户不存在!");
    	}
    	Student u;
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开!");
    		return;
    	}
    	while (file.Read(&u, sizeof(u)) == sizeof(u)) //查询该学号同学的详细信息
    	{
    		if ((CString)u.sId == (CString)str)
    		{
    			theApp.m_student = u;
    			file.Close();
    			CStudentSpecificSeekDlg dlg;  //将该学号同学的详细信息显示在详细信息窗口(IDD_STUDENT_SPECIFIC_DIALOG)
    			if (IDCANCEL == dlg.DoModal())
    			{
    				CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);  //更新学生成绩管理系统界面的信息
    				CMFC课设学生成绩管理系统Dlg::ReadStudent(pList);
    			}
    			return;
    		}
    	}
    	file.Close();
    }
    
    
    int CMFC课设学生成绩管理系统Dlg::Seek_Student(char *str)   //查询该同学是否存在学生成绩管理系统的CListCtrl中
    {
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
    	int nCount = pList->GetItemCount();
    	int i = 0;
    	while (i < nCount)
    	{
    		if (pList->GetItemText(i, 0) == (CString)str)
    		{
    			return i;
    		}
    		i++;
    	}
    	return -1;
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentChange()  //"修改“控件响应的函数,修改学生的信息
    {
    	
    	OnBnClickedStudentSeek();                                  //调用查找函数,修改在查找函数中实现
    }
    
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedButton8()          //"退出”控件响应函数,退出学生成绩管理系统
    {
    	CDialog::OnCancel();
    }
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentIdcancel()
    {
    	CDialog::OnCancel();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::GreatTemporaryStudentfile()    //创建临时存储学生信息的文件
    {
    	CFile file;
    	if (!file.Open("./temporarystudentfile.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("用户文件创建失败");
    		return;
    	}
    	file.Close();
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedStudentDialogOksort()  //排序"确定”控件响应函数,进行(学号,高数,离散,c++课设,英语,体育成绩)的排序
    {
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_STUDENT_DIALOG_SORTLIST);
    	int nSel = pComb->GetCurSel();
    	SortStudent(nSel);
    	
    }
    
    bool nsort_id(Student a, Student b)  //学号(ID)大小比较函数
    {
    	return _ttoi((CString)a.sId)<_ttoi((CString)b.sId);  //将char转换成CString,在转化成int
    }
    bool sort_higher_math(Student a, Student b)
    {
    	return _ttoi((CString)a.sHigher_math)>_ttoi((CString)b.sHigher_math);  //高数(Higher_math)大小比较函数
    }
    bool sort_discrete_math(Student a, Student b)
    {
    	return _ttoi((CString)a.sDiscrete_math) > _ttoi((CString)b.sDiscrete_math);  //离散(Discrete_math)大小比较函数
    }
    bool sort_c_program(Student a, Student b)
    {
    	return _ttoi((CString)a.sC_program) > _ttoi((CString)b.sC_program);   //c++(C_program)大小比较函数
    }
    bool sort_english(Student a, Student b)
    {
    	return _ttoi((CString)a.sEnglish) > _ttoi((CString)b.sEnglish); //英语(English)大小比较函数
    }
    bool sort_sports(Student a, Student b)
    {
    	return _ttoi((CString)a.sSports)> _ttoi((CString)b.sSports);   //英语(Sports)大小比较函数
    }
    void CMFC课设学生成绩管理系统Dlg::SortStudent(int nNum)    //对应排序对学生信息进行排序
    {
    	Student SomeStudent[1000];
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法排序!");
    		return;
    	}
    	int i = 0;
    	while (file.Read(&SomeStudent[i], sizeof(SomeStudent[i])) == sizeof(SomeStudent[i]))
    	{
    		i++;
    	}
    	file.Close();
    	int b = (CString)SomeStudent[0].sId < (CString)SomeStudent[1].sId;
    	if (nNum == 0)    //0是学号成绩排序
    		std::sort(SomeStudent, SomeStudent+i, nsort_id);  //排序是直接调用STL中的快排
    	if (nNum == 1)     //1是高数成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_higher_math);
    	if (nNum == 2)    //2是离散成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_discrete_math);
    	if (nNum == 3)    //3是C++课设成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_c_program);
    	if (nNum == 4)    //4是英语成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_english);
    	if (nNum == 5)    //5是体育成绩排序
    		std::sort(SomeStudent, SomeStudent + i, sort_sports);
    	if (!file.Open("./studentfile.dat", CFile::modeCreate | CFile::modeWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法排序!");
    		return;
    	}
    	int t = 0;
    	while (t<i)  //将排好序的信息写入学生成绩存储文件
    	{
    		file.Write(&SomeStudent[t], sizeof(SomeStudent[t]));
    		t++;
    	}
    	file.Close();
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_STUDENT_DIALOG_LIST);
    	CMFC课设学生成绩管理系统Dlg::ReadStudent(pList); //将排好序的学生信息更新到学生成绩管理系统的CListCtrl中
    
    }
    
    
    void CMFC课设学生成绩管理系统Dlg::OnBnClickedPictureAnalysis()  //"统计分析“控件响应的函数
    {
    	ShellExecute(NULL, "open", "E://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//MFCApplication1.exe", NULL, NULL, SW_SHOWNORMAL);
    	//用ShellExecute调用可以画直方图和折线图的exe文件
    }
    

    3)添加学生信息的窗口

    BEGIN_MESSAGE_MAP(CStudentSpecificAddDlg, CDialog)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_ADD_SAVE, &CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddSave)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_ADD_INCANCE, &CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddIncance)
    END_MESSAGE_MAP()
    
    
    // CStudentSpecificAddDlg 消息处理程序
    
    
    BOOL CStudentSpecificAddDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    	return TRUE;
    }
    
    
    void CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddSave()  //"添加保存:控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	Student u;
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ID, u.sId, sizeof(u.sId));  //将学号编辑框的内容写入u.sId
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_NAME, u.sName, sizeof(u.sName));  //将姓名编辑框的内容写入u.sName
    	if (IDC_STUDENG_SPECIFIC_ADD_MALE == GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_ADD_MALE, IDC_STUDENG_SPECIFIC_ADD_FEMALE))
    		u.nSex = true;
    	else
    		u.nSex = false;
    	//IDC_STUDENG_SPECIFIC_ADD_MALE为“男”控件ID,IDC_STUDENG_SPECIFIC_ADD_FEMALE为“女'控件的ID
    	//用GetCheckedRadioButton函数获取RadioButton控件的信息,GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_ADD_MALE, IDC_STUDENG_SPECIFIC_ADD_FEMALE)返回
    	//IDC_STUDENG_SPECIFIC_ADD_MALE则为男,否则为女
    
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_AGE, u.sAge, sizeof(u.sAge));  //将年龄编辑框的内容写入u.sAge
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ADDRESS, u.sAddress, sizeof(u.sAddress));  //将地址编辑框的内容写入u.sAddress
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_HIGHERMATH, u.sHigher_math, sizeof(u.sHigher_math));  //将高数编辑框的内容写入u.sHigher_math
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_DISCRETEMATH, u.sDiscrete_math, sizeof(u.sDiscrete_math));  //将离散编辑框的内容写入u.sDiscrete_math
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_CPROGRAM, u.sC_program, sizeof(u.sC_program));  //将C++课设编辑框的内容写入u.sC_program
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_ENGLISH, u.sEnglish, sizeof(u.sEnglish));   //将英语编辑框的内容写入u.sEnglish
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADD_SPORTS, u.sSports, sizeof(u.sSports));   //将体育编辑框的内容写入u.sSports
    	CFile file;
    	if (!file.Open("./studentfile.dat", CFile::modeReadWrite|CFile::shareDenyNone))
    	{
    		AfxMessageBox("添加失败,文件打不开!");
    		return ;
    	}
    	Student ur;
    	while (file.Read(&ur, sizeof(ur)))   //读取学生文件信息,看学号是否重复
    	{
    		if ((CString)ur.sId == (CString)u.sId)
    		{
    			AfxMessageBox("用户已存在!");
    			return;
    		}
    	}
    	file.SeekToEnd();   //将指针移到文件末尾
    	file.Write(&u, sizeof(u));  //在文件末尾写入新的学生信息
    	AfxMessageBox("添加保存成功!"); //提示保存成功
    	
    }
    
    
    void CStudentSpecificAddDlg::OnBnClickedStudengSpecificAddIncance()  //“退出”控件响应函数,退出添加窗口
    {
    	CDialog::OnCancel();
    	// TODO:  在此添加控件通知处理程序代码
    }
    

    4)查找和删除窗口

    BEGIN_MESSAGE_MAP(CStudentSpecificSeekDlg, CDialog)
    	ON_BN_CLICKED(IDOK, &CStudentSpecificSeekDlg::OnBnClickedOk)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_CHANGE_SAVE, &CStudentSpecificSeekDlg::OnBnClickedStudengSpecificChangeSave)
    	ON_BN_CLICKED(IDC_STUDENG_SPECIFIC_IDCACEL, &CStudentSpecificSeekDlg::OnBnClickedStudengSpecificIdcacel)
    END_MESSAGE_MAP()
    
    
    // CStudentSpecificSeekDlg 消息处理程序
    
    
    BOOL CStudentSpecificSeekDlg::OnInitDialog()
    {
    	CDialog::OnInitDialog();
    	GetDlgItem(IDC_STUDENG_SPECIFIC_CHANGE_SAVE)->EnableWindow(theApp.m_us.nPrior); //获取账号的权限信息,是否屏蔽“删除”控件
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_ID,theApp.m_student.sId);  //设置显示的学生的学号
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_NAME, theApp.m_student.sName);  //设置显示的学生的姓名
    	if (theApp.m_student.nSex==1)
    	    CheckRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE, IDC_STUDENG_SPECIFIC_MALE);
    	else
    		CheckRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE, IDC_STUDENG_SPECIFIC_FEMALE);
    	//设置显示的学生的性别
    	//用CheckRadioButton设置RadioButton的显示
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_AGE, theApp.m_student.sAge); //设置显示的学生的年龄
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_ADDRESS, theApp.m_student.sAddress); //设置显示的学生的地址
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_HIGHERMATH, theApp.m_student.sHigher_math);//设置显示的学生的高数成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_DISCRETEMATH, theApp.m_student.sDiscrete_math);//设置显示的学生的离散成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_CPROGRAM, theApp.m_student.sC_program);//设置显示的学生的c++课设成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_ENGLISH, theApp.m_student.sEnglish);//设置显示的学生的英语成绩
    	SetDlgItemText(IDC_STUDENG_SPECIFIC_SPORTS, theApp.m_student.sSports);//设置显示的学生的体育成绩
    	return TRUE;
    }
    
    
    void CStudentSpecificSeekDlg::OnBnClickedOk()  //"退出“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CDialog::OnOK();
    }
    
    
    void CStudentSpecificSeekDlg::OnBnClickedStudengSpecificChangeSave() //"修改”控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	Student u;
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ID, u.sId, sizeof(u.sId));    //将新的信息写入u(Student)中
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_NAME, u.sName, sizeof(u.sName));
    
    	if (IDC_STUDENG_SPECIFIC_MALE == GetCheckedRadioButton(IDC_STUDENG_SPECIFIC_MALE, IDC_STUDENG_SPECIFIC_FEMALE))
    		u.nSex = true;
    	else
    		u.nSex = false;
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_AGE, u.sAge, sizeof(u.sAge));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ADDRESS, u.sAddress, sizeof(u.sAddress));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_HIGHERMATH, u.sHigher_math, sizeof(u.sHigher_math));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_DISCRETEMATH, u.sDiscrete_math, sizeof(u.sDiscrete_math));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_CPROGRAM, u.sC_program, sizeof(u.sC_program));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_ENGLISH, u.sEnglish, sizeof(u.sEnglish));
    	GetDlgItemText(IDC_STUDENG_SPECIFIC_SPORTS, u.sSports, sizeof(u.sSports));
    	CFile file;
    	//file.Open("./studentfile.dat", CFile::modeWrite | CFile::shareDenyNone);
    	if ((CString)u.sId != (CString)theApp.m_student.sId)
    	{
    		AfxMessageBox("请输入同一学号!");
    		SetDlgItemText(IDC_STUDENG_SPECIFIC_ID, theApp.m_student.sId);
    		return;
    	}
    	if (!file.Open("./studentfile.dat", CFile::modeRead | CFile::shareDenyNone))
    	{
    		AfxMessageBox("修改失败,文件打不开!");
    		return;
    	}
    	int i = 0;
    	Student ur;
    	while (file.Read(&ur, sizeof(ur)))  //读取学生成绩储存文件,找到该学生信息储存的对应位置
    	{
    		if ((CString)theApp.m_student.sId == (CString)ur.sId)
    		{
    			break;
    		}
    		i++;
    	}
    	file.Close();
    	if (!file.Open("./studentfile.dat", CFile::modeWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("修改失败,文件打不开!");
    		return;
    	}
    	file.SeekToBegin(); // 重新设置file文件的写指针时期刚好在要修改的学生信息那里
    	file.Seek(i*sizeof(u), CFile::current);
    	file.Write(&u, sizeof(u));  //用新的信息对原来的信息进行覆盖,实现修改
    	AfxMessageBox("修改保存成功!");
    	file.Close();
    }
    
    
    void CStudentSpecificSeekDlg::OnBnClickedStudengSpecificIdcacel() // "退出“控件响应函数
    {
    	CDialog::OnCancel();
    	// TODO:  在此添加控件通知处理程序代码
    }
    

    (5)“账号管理”窗口

    BEGIN_MESSAGE_MAP(CPower, CDialog)
    	ON_BN_CLICKED(IDC_ManagePass, &CPower::OnBnClickedManagepass)
    	ON_BN_CLICKED(IDC_ChangePass, &CPower::OnBnClickedChangepass)
    	ON_BN_CLICKED(IDC_MANAGE_CHANGE_PASS, &CPower::OnBnClickedManageChangePass)
    	ON_BN_CLICKED(IDC_GENERAL_CHANGE_PASS, &CPower::OnBnClickedGeneralChangePass)
    	ON_BN_CLICKED(IDCANCEL, &CPower::OnBnClickedCancel)
    END_MESSAGE_MAP()
    
    
    // CPower 消息处理程序
    
    
    void CPower::OnBnClickedManagepass()  //“学号密码添加与删除”控件响应函数,调用管理员窗口,进行学号密码添加与删除
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CManagePower dl;  
    	dl.DoModal();
    }
    
    
    void CPower::OnBnClickedChangepass()
    {
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CPower::OnBnClickedManageChangePass() //“学号密码添加与删除”控件响应函数,调用管理员(CManagePower)窗口,进行学号密码的修改
    {
    	CManagePower dl;
    	dl.DoModal();
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CPower::OnBnClickedGeneralChangePass() //“学号密码修改”控件响应函数,调用密码修改(CChangePass)窗口,学生和教师权限的账号可通过这个进行学号密码的修改
    {
    	CChangePass dl;
    	dl.DoModal();
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    BOOL CPower::OnInitDialog()  //账号管理窗口的初始化,根据用户的权限是否屏蔽“学号密码添加与删除”控件
    {
    	CDialog::OnInitDialog();
    	GetDlgItem(IDC_MANAGE_CHANGE_PASS)->EnableWindow((CString)theApp.m_us.sName=="admin");
    	return TRUE;
    }
    
    
    void CPower::OnBnClickedCancel() //“退出”控件响应函数,退出账号管理窗口
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CDialog::OnCancel();
    }
    

    (6)学号密码修改窗口

    BEGIN_MESSAGE_MAP(CChangePass, CDialog)
    	ON_BN_CLICKED(IDC_OKCHANGE_PASS, &CChangePass::OnBnClickedOkchangePass)
    END_MESSAGE_MAP()
    
    
    // CChangePass 消息处理程序
    
    
    BOOL CChangePass::Check_ChangePass() //修改“确定”控件响应函数
    {
    	CString szName, szOrdedPass, szNewPassOne, szNewPasstwo; //获取要修改的学号和密码
    	GetDlgItemText(IDC_CHANGEPASS_NAME, szName);
    	GetDlgItemText(IDC_CHANGEPASS_ORDEDPASS, szOrdedPass);
    	GetDlgItemText(IDC_CHANGEPASS_NEWPASS_ONE, szNewPassOne);
    	GetDlgItemText(IDC_CHANGEPASS_NEWPASS_TWO, szNewPasstwo);
    	szName.MakeLower();
    	SUser u;
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeReadWrite))
    	{
    		return FALSE;
    	}
    	int i = 0;
    	while (file.Read(&u, sizeof(u)))   //两次输入新密码的确认
    	{
    		if (szName == (CString)u.sName&&szOrdedPass == (CString)u.sPass)
    		{
    			if (szNewPassOne != szNewPasstwo)
    			{
    				AfxMessageBox("新密码两次输入不正确!");
    				InitCCangePassDialog();
    			}
    			strcpy_s(u.sPass, szNewPassOne);
    			file.SeekToBegin();
    			file.Seek(i*sizeof(u), CFile::current);
    			file.Write(&u, sizeof(u));
    			AfxMessageBox("修改成功!");
    			InitCCangePassDialog();
    			return TRUE;
    		}
    		i++;
    	}
    	AfxMessageBox("该用户或旧密码不正确!");
    	InitCCangePassDialog();
    	return FALSE;
    }
    
    
    void CChangePass::OnBnClickedOkchangePass()  //修改“确定”控件响应函数
    {
    	Check_ChangePass();
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CChangePass::InitCCangePassDialog()  //重置学号密码修改窗口的编辑框
    {
    	SetDlgItemText(IDC_CHANGEPASS_NAME, "");
    	SetDlgItemText(IDC_CHANGEPASS_ORDEDPASS, "");
    	SetDlgItemText(IDC_CHANGEPASS_NEWPASS_ONE, "");
    	SetDlgItemText(IDC_CHANGEPASS_NEWPASS_TWO, "");
    	this->SetFocus();
    }
    (6)学号密码添加与删除窗口
    BEGIN_MESSAGE_MAP(CManagePower, CDialog)
    	ON_CBN_SELCHANGE(IDC_MANAGEPOWER_POWER, &CManagePower::OnCbnSelchangeManagepowerPower)
    	ON_EN_CHANGE(IDC_MANAGEPOWER_PASS, &CManagePower::OnEnChangeManagepowerPass)
    	ON_BN_CLICKED(IDC_ADD, &CManagePower::OnBnClickedAdd)
    	ON_BN_CLICKED(IDCANCEL, &CManagePower::OnBnClickedCancel)
    	ON_BN_CLICKED(IDC_DEL, &CManagePower::OnBnClickedDel)
    	ON_BN_CLICKED(IDC_CHANGE, &CManagePower::OnBnClickedChange)
    	ON_EN_CHANGE(IDC_MANAGEPOWER_NAME, &CManagePower::OnEnChangeManagepowerName)
    END_MESSAGE_MAP()
    
    
    // CManagePower 消息处理程序
    
    
    
    
    BOOL CManagePower::OnInitDialog() //学号密码添加与删除窗口的初始化
    {
    	CDialog::OnInitDialog();
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
    	pList->InsertColumn(0, "身份", 0, 100); //学号密码添加与删除窗口中CListCtrl(IDC_MANAGEPOWER_LIST)初始化
    	pList->InsertColumn(0, "密码", 0, 100);
    	pList->InsertColumn(0, "学号", 0, 100);
    	ReadUser(pList);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
    	pComb->AddString("学生");  学号密码添加与删除窗口中CComboBox(IDC_MANAGEPOWER_POWER)初始化
    	pComb->AddString("老师");
    	pComb->SetCurSel(0);
    	return TRUE;
    }
    
    
    void CManagePower::OnCbnSelchangeManagepowerPower()
    {
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CManagePower::OnEnChangeManagepowerPass()
    {
    	// TODO:  如果该控件是 RICHEDIT 控件,它将不
    	// 发送此通知,除非重写 CDialog::OnInitDialog()
    	// 函数并调用 CRichEditCtrl().SetEventMask(),
    	// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
    
    	// TODO:  在此添加控件通知处理程序代码
    }
    
    
    void CManagePower::OnBnClickedAdd()  //"添加“控件响应函数,添加新的用户账号
    {
    	// TODO:  在此添加控件通知处理程序代码
    	SUser u;
    	GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName)); //获取账号编辑框的信息
    	strlwr(u.sName);    //u.sName大写转小写
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST); //获取密码编辑框的信息
    	int i = 0;
    	int nCount = pList->GetItemCount(); //获取权限的信息
    	while (i < nCount)
    	{
    		if (pList->GetItemText(i, 0) == u.sName)   //检验是否存在该用户
    		{
    			AfxMessageBox("用户已存在");
    			return;
    		}
    		i++;
    	}
    	pList->InsertItem(nCount, u.sName);  //将新用户的信息添加入列表
    	GetDlgItemText(IDC_MANAGEPOWER_PASS, u.sPass, sizeof(u.sPass));
    	pList->SetItemText(nCount, 1, u.sPass);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
    	int nSel = pComb->GetCurSel();
    	if (nSel)
    		pList->SetItemText(nCount, 2, "老师");
    	else
    		pList->SetItemText(nCount, 2, "学生");
    }
    
    void CManagePower::OnBnClickedCancel() //”退出“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	OnDestroy();  //退出前进行保存
    	CDialog::OnCancel();
    }
    
    
    void CManagePower::OnDestroy()   //关闭学号密码添加与删除窗口,关闭之前先将列表的信息保存在账户信息文件中
    {
    	CDialog::OnDestroy();
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeCreate | CFile::modeWrite))
    	{
    		AfxMessageBox("保存文件时失败!");
    		return;
    	}
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
    	int i = 0;
    	int nCount = pList->GetItemCount();
    	SUser u;
    	while (i < nCount)
    	{
    		pList->GetItemText(i, 0, u.sName, sizeof(u.sName));
    		pList->GetItemText(i, 1, u.sPass, sizeof(u.sPass));
    		u.nPrior = pList->GetItemText(i, 2) == "老师";
    		file.Write(&u, sizeof(u));
    		i++;
    	}
    	file.Close();
    	AfxMessageBox("保存文件成功!");
    }
    
    
    
    
    
    void CManagePower::ReadUser(CListCtrl* pList)  //读取学生成绩存储文件,将其显示在学号密码添加与删除窗口CListCtrl中
    {
    	CFile file;
    	if (!file.Open("./user.dat", CFile::modeRead | CFile::shareDenyNone))
    		return;
    	pList->DeleteAllItems();
    	SUser u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		pList->InsertItem(i, u.sName);
    		pList->SetItemText(i, 1, u.sPass);
    		pList->SetItemText(i, 2, u.nPrior ? "老师" : "学生");
    		i++;
    	}
    	file.Close();
    }
    	
    	
    
    
    void CManagePower::OnBnClickedDel()  //”删除“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);
    	SUser u;
    	GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName));
    	strlwr(u.sName);
    	
    	int nSel = pList->GetSelectedCount(); //选择一个账户
    	if (nSel < 1&&u.sName=="")
    	{
    		AfxMessageBox("请选择一个账户再删除!");
    		return;
    	}
    	if (nSel < 1 && (CString)u.sName != "")
    	{
    		int i = 0;
    		int nCount = pList->GetItemCount();
    		SUser ur;
    		while (i < nCount)
    		{
    			pList->GetItemText(i, 0, ur.sName, sizeof(ur.sName));
    			pList->GetItemText(i, 1, ur.sPass, sizeof(ur.sPass));
    			ur.nPrior = pList->GetItemText(i, 2) == "老师";
    			if ((CString)u.sName == (CString)ur.sName)
    			{
    				pList->DeleteItem(i);
    				return;
    			}
    			i++;
    		}
    		AfxMessageBox("该账户不存在!");
    		return;
    	}
    	else
    	{
    		if (nSel >= 1 && (CString)u.sName == "")
    		{
    			int nSelText = pList->GetSelectionMark();
    			pList->DeleteItem(nSelText);
    		}
    		else
    		{
    			int nSelText = pList->GetSelectionMark();
    			SUser ur;
    			pList->GetItemText(nSelText, 0, ur.sName, sizeof(ur.sName));
    			if ((CString)ur.sName == (CString)u.sName)
    				pList->DeleteItem(nSelText);
    			else
    			{
    				AfxMessageBox("请选择同一个账户再删除!");
    				return;
    			}
    		}
    	}
    }
    
    
    void CManagePower::OnBnClickedChange() //"修改“控件响应函数
    {
    	// TODO:  在此添加控件通知处理程序代码
    	CListCtrl* pList = (CListCtrl*)GetDlgItem(IDC_MANAGEPOWER_LIST);//获取需要更改信息
    	SUser u;
    	GetDlgItemText(IDC_MANAGEPOWER_NAME, u.sName, sizeof(u.sName));
    	GetDlgItemText(IDC_MANAGEPOWER_PASS, u.sPass, sizeof(u.sPass));
    	strlwr(u.sName);
    	CComboBox* pComb = (CComboBox*)GetDlgItem(IDC_MANAGEPOWER_POWER);
    	u.nPrior = pComb->GetCurSel();
    	int nSel = pList->GetSelectedCount();
    	if (nSel < 1 && u.sName == "")
    	{
    		AfxMessageBox("请选择一个账户再!");
    		return;
    	}
    	if (nSel < 1 && (CString)u.sName != "")  //进行账户密码信息更改
    	{
    		int i = 0;
    		int nCount = pList->GetItemCount();
    		SUser ur;
    		while (i < nCount)
    		{
    			pList->GetItemText(i, 0, ur.sName, sizeof(ur.sName));
    			pList->GetItemText(i, 1, ur.sPass, sizeof(ur.sPass));
    			ur.nPrior = pList->GetItemText(i, 2) == "老师";
    			if ((CString)u.sName == (CString)ur.sName)
    			{
    				pList->DeleteItem(i);
    				pList->InsertItem(i, u.sName);
    				pList->SetItemText(i, 1, u.sPass);
    				pList->SetItemText(i, 2, u.nPrior ? "老师" : "学生");
    				return;
    			}
    			i++;
    		}
    		AfxMessageBox("该账户不存在!");
    		return;
    	}
    	else
    	{
    		if (nSel >= 1 && (CString)u.sName == "")
    		{
    			int nSelText = pList->GetSelectionMark();
    			SUser ur;
    			pList->GetItemText(nSelText, 0, ur.sName, sizeof(ur.sName));
    			pList->DeleteItem(nSelText);
    			pList->InsertItem(nSelText, ur.sName);
    			pList->SetItemText(nSelText, 1, u.sPass);
    			pList->SetItemText(nSelText, 2, u.nPrior ? "老师" : "学生");
    		}
    		else
    		{
    			int nSelText = pList->GetSelectionMark();
    			SUser ur;
    			pList->GetItemText(nSelText, 0, ur.sName, sizeof(u.sName));
    			if ((CString)ur.sName == (CString)u.sName)
    			{
    				pList->DeleteItem(nSelText);
    				pList->InsertItem(nSelText, ur.sName);
    				pList->SetItemText(nSelText, 1, u.sPass);
    				pList->SetItemText(nSelText, 2, u.nPrior ? "老师" : "学生");
    			}
    			else
    			{
    				AfxMessageBox("请选择同一个账户再删除!");
    				return;
    			}
    		}
    	}
    
    }
    

    (7)用单文档读取学生成绩文件,进行直方图和折线图的绘画

    void CMFCApplication1View::OnDraw(CDC* pDC)
    {
    	CMFCApplication1Doc* pDoc = GetDocument();
    	ASSERT_VALID(pDoc);
    	if (!pDoc)
    		return;
    }
    
    // CMFCApplication1View 打印
    
    BOOL CMFCApplication1View::OnPreparePrinting(CPrintInfo* pInfo)
    {
    	// 默认准备
    	return DoPreparePrinting(pInfo);
    }
    
    void CMFCApplication1View::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO:  添加额外的打印前进行的初始化过程
    }
    
    void CMFCApplication1View::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
    {
    	// TODO:  添加打印后进行的清理过程
    }
    
    
    // CMFCApplication1View 诊断
    
    #ifdef _DEBUG
    void CMFCApplication1View::AssertValid() const
    {
    	CView::AssertValid();
    }
    
    void CMFCApplication1View::Dump(CDumpContext& dc) const
    {
    	CView::Dump(dc);
    }
    
    CMFCApplication1Doc* CMFCApplication1View::GetDocument() const // 非调试版本是内联的
    {
    	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMFCApplication1Doc)));
    	return (CMFCApplication1Doc*)m_pDocument;
    }
    #endif //_DEBUG
    
    
    // CMFCApplication1View 消息处理程序
    
    
    void CMFCApplication1View::DrawScore(CDC* pDC, int * fScore, int nNum) //画直方图函数
    {
    	// fScore是成绩数组指针,nNum是学生人数
    	int nScoreNum[] = { 0, 0, 0, 0, 0 };  // 各成绩段的人数的初 始值 
    	// 下面是用来统计各分数段的人数   
    	for (int i = 0; i < nNum; i++)
    	{
    		int nSeg = (int)(fScore[i]) / 10; // 取数的"十"位上的值   
    		if (nSeg < 6) nSeg = 5; // <60分    
    		if (nSeg == 10) nSeg = 9;// 当为100分,算为>90分数段   
    		nScoreNum[nSeg - 5] ++;   // 各分数段计数   
    	}
    	int nSegNum = sizeof(nScoreNum) / sizeof(int); // 计算有多少个分数段
    
    	// 求分数段上最大的人数 
    	int nNumMax = nScoreNum[0];
    	for (int i = 1; i < nSegNum; i++)
    	{
    		if (nNumMax < nScoreNum[i])
    			nNumMax = nScoreNum[i];
    	}
    	CRect rc;
    	GetClientRect(rc);
    	rc.DeflateRect(180, 40);      // 缩小矩形大小  
    	int nSegWidth = rc.Width() / nSegNum;   // 计算每段的宽度  
    	int nSegHeight = rc.Height() / nNumMax;   // 计算每段的单位高度  
    	COLORREF crSeg = RGB(0, 0, 192);  // 定义一个颜色变量   
    	CBrush brush1(HS_FDIAGONAL, crSeg);
    	CBrush brush2(HS_BDIAGONAL, crSeg);
    	CPen   pen(PS_INSIDEFRAME, 2, crSeg);
    	CBrush* oldBrush = pDC->SelectObject(&brush1);   // 将brush1选入设备环境   
    	CPen* oldPen = pDC->SelectObject(&pen);  // 将pen选 入设备环境  
    	CRect rcSeg(rc);
    	rcSeg.right = rcSeg.left + nSegWidth;   // 使每段的矩形宽度等于nSegWidth  
    	CString strSeg[] = { (CString)"<60", (CString)"60-70", (CString)"70-80", (CString)"80-90", (CString)">=90" };
    	CRect rcStr;
    	for (int i = 0; i<nSegNum; i++)
    	{  // 保证相邻的矩形填充样式不相同    
    		if (i % 2)
    			pDC->SelectObject(&brush2);
    		else
    			pDC->SelectObject(&brush1);
    		rcSeg.top = rcSeg.bottom - nScoreNum[i] * nSegHeight - 2;  // 计算每段矩形的高度   
    		pDC->Rectangle(rcSeg);
    		if (nScoreNum[i] > 0)
    		{
    			CString str;
    			str.Format((CString)"%d人", nScoreNum[i]);
    			pDC->DrawText(str, rcSeg, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    		}
    		rcStr = rcSeg;
    		rcStr.top = rcStr.bottom + 2;
    		rcStr.bottom += 20;
    		pDC->DrawText(strSeg[i], rcStr, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
    		rcSeg.OffsetRect(nSegWidth, 0);  // 右移矩形   
    	}
    	pDC->SelectObject(oldBrush);  // 恢复原来的画刷属性   
    	pDC->SelectObject(oldPen);    // 恢复原来的画笔属性 
    
    	CDC* pControlDC = pDC;
    	pControlDC->SelectStockObject(BLACK_BRUSH);//设置画刷
    	CString str;
    	pControlDC->MoveTo(180, 40);  //画y轴
    	pControlDC->LineTo(180,380);
    	pControlDC->MoveTo(180, 380);//画x轴
    	pControlDC->LineTo(900, 380);
    }
    
    
    int CMFCApplication1View::OnCreate(LPCREATESTRUCT lpCreateStruct)// 创建各个成绩显示控件
    {
    	if (CView::OnCreate(lpCreateStruct) == -1)
    		return -1;
    	m_button1.Create((CString)"高等数学(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 10, 120, 40),            //按钮大小
    		this,                          //按钮父指针
    		IDC_HIGGER_MATH);                      //该按钮对应的ID号
    	m_button1.ShowWindow(SW_SHOWNORMAL);
    	m_button2.Create((CString)"离散数学(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 60,120, 90),            //按钮大小
    		this,                          //按钮父指针
    		IDC_DISCRETE_MATH);                      //该按钮对应的ID号
    	m_button2.ShowWindow(SW_SHOWNORMAL);
    	m_button3.Create((CString)"c+课设(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 110, 120, 140),            //按钮大小
    		this,                          //按钮父指针
    		IDC_C_PROGRAM);                      //该按钮对应的ID号
    	m_button3.ShowWindow(SW_SHOWNORMAL);
    	m_button4.Create((CString)"大学英语(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 160, 120, 190),            //按钮大小
    		this,                          //按钮父指针
    		IDC_ENGLISH);                      //该按钮对应的ID号
    	m_button4.ShowWindow(SW_SHOWNORMAL);
    	m_button5.Create((CString)"大学体育(直方)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(10, 210, 120, 240),            //按钮大小
    		this,                          //按钮父指针
    		IDC_SPORTS);                      //该按钮对应的ID号
    	m_button5.ShowWindow(SW_SHOWNORMAL);
    	// TODO:  在此添加您专用的创建代码
    
    	m_button6.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 10, 170, 40),            //按钮大小
    		this,                          //按钮父指针
    		IDC_HIGGER_MATH_LINE);                      //该按钮对应的ID号
    	m_button6.ShowWindow(SW_SHOWNORMAL);
    	m_button7.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 60, 170, 90),            //按钮大小
    		this,                          //按钮父指针
    		IDC_DISCRETE_MATH_LINE);                      //该按钮对应的ID号
    	m_button7.ShowWindow(SW_SHOWNORMAL);
    	m_button8.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 110, 170, 140),            //按钮大小
    		this,                          //按钮父指针
    		IDC_C_PROGRAM_LINE);                      //该按钮对应的ID号
    	m_button8.ShowWindow(SW_SHOWNORMAL);
    	m_button9.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120,160 , 170, 190),            //按钮大小
    		this,                          //按钮父指针
    		IDC_ENGLISH_LINE);                      //该按钮对应的ID号
    	m_button9.ShowWindow(SW_SHOWNORMAL);
    	m_button10.Create((CString)"(折线)",//按钮标题
    		WS_CHILD | WS_VISIBLE | WS_BORDER,//按钮风格
    		CRect(120, 210, 170, 240),            //按钮大小
    		this,                          //按钮父指针
    		IDC_SPORTS_LINE);                      //该按钮对应的ID号
    	m_button10.ShowWindow(SW_SHOWNORMAL);
    	return 0;
    }
    void CMFCApplication1View::OnClickButton_higher_math_show() //高数成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sHigher_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_discrete_math_show()  //离散成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sDiscrete_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_c_program_show()  //C++成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sC_program);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_english_show() //英语成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sEnglish);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_sports_show()//体育成绩直方图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sSports);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	DrawScore(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::Drawlist(CDC* pDC, int* fScore, int nNum)//画折线图
    { 
    	// fScore是成绩数组指针,nNum是学生人数
    	int nScoreNum[] = { 0, 0, 0, 0, 0 };  // 各成绩段的人数的初 始值 
    	// 下面是用来统计各分数段的人数   
    	for (int i = 0; i < nNum; i++)
    	{
    		int nSeg = (int)(fScore[i]) / 10; // 取数的"十"位上的值   
    		if (nSeg < 6) nSeg = 5; // <60分    
    		if (nSeg == 10) nSeg = 9;// 当为100分,算为>90分数段   
    		nScoreNum[nSeg - 5] ++;   // 各分数段计数   
    	}
    	CDC* pControlDC = pDC;
    	pControlDC->SelectStockObject(BLACK_BRUSH);//设置画刷
    	CString str;
    	CString strSeg[] = { (CString)"<60", (CString)"60-70", (CString)"70-80", (CString)"80-90", (CString)">=90" };
    	pControlDC->MoveTo(180, 40);//画线的开始位置
    	pControlDC->LineTo(180, 380);
    	pControlDC->MoveTo(180, 380);//画线的开始位置
    	pControlDC->LineTo(900, 380);
    	pControlDC->MoveTo(180, 380);
    	for (int i = 0; i < 5; i++)
    	{
    		pControlDC->SetPixel(0, 290, RGB(0, 0, 255));  //设置点的位置及颜色
    		pControlDC->LineTo(i*140+220, 380 - (380*nScoreNum[i]/nNum));//换两点之间的线
    		str.Format("%d人", nScoreNum[i]);
    		pControlDC->TextOut(i * 140 + 220,380 - (380 * nScoreNum[i] / nNum)-20, str);//在线的上方输出文字
    		pControlDC->TextOut(i * 140 + 220, 390, strSeg[i]);
    	}
    }
    void CMFCApplication1View::OnClickButton_higher_math_listshow()//高数成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sHigher_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_discrete_math_listshow()//离散成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sDiscrete_math);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_c_program_listshow()//c++课设成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sC_program);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_english_listshow()//英语成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sEnglish);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    void CMFCApplication1View::OnClickButton_sports_listshow()//体育成绩折线图控件按钮对应函数
    {
    	CFile file;
    	if (!file.Open("e://打编码//MFC//MFC课程设计-学生成绩管理系统//MFC课设-学生成绩管理系统//Debug//studentfile.dat", CFile::modeReadWrite | CFile::shareDenyNone))
    	{
    		AfxMessageBox("文件无法打开,无法画图!");
    		return;
    	}
    	Student u;
    	int i = 0;
    	while (file.Read(&u, sizeof(u)) == sizeof(u))
    	{
    		m_Num[i] = _ttoi((CString)u.sSports);
    		i++;
    	}
    	InvalidateRect(NULL);
    	UpdateWindow();
    	Drawlist(GetDC(), m_Num, i);
    	file.Close();
    }
    

    六.实验中的问题和提高

    这个学生成绩管理系统中的安全措施并不完善,整个软件也没有加壳,以至于这个软件可以直接被脱壳并找出管理员的登录账号和密码,我目前的能力水平有限,还不能对软件进行加壳加密操作。

    这个学生成绩管理系统的用户界面还不是很好看,使用的方面和一般的登录界面还是有点违和感。

    七、总结心得

    (1)刚开始的课设制作的时候,出现了很多变量的设置,变量一多,就容易搞混,后来,我统一使用了微软标准命名法进行控件和窗口ID以及函数,类,变量的命名。这样在多个窗口的界面开发的过程中才不容易搞混。

    (2)在修改文件内容的时候,我想使用file.Seek(-sizeof(u),CFile:: current)进行写指针向前移动,但是出现了内存溢出的问题。我查不出问题出现在那里,后来使用了SeekToBegin()

    和file.Seek(i*sizeof(u),CFile:: current)才解决问题,可以在学生成绩的存储文件直接进行覆盖修改。

    (3)之前学会了GetDlgItemText()的用法,后来在MFC类库中查询到还有SetDlgItemText()的用法,可以直接在编辑框控件中提取信息,而不用设置变量。

    (4)在RadioButton控件的使用中,我不知道如何提取按键和设置按键的信息,后来在网上查到GetCheckedRadioButton(IDC,IDC)和CheckRadioButton(IDC,IDC,IDC)这两个函数才解决问题。

    (5)这个学生成绩管理系统的设置,比原本的实验要求高出了很多。我添加了登录管理系统在里面。这个学生管理系统即使面对教师的,也是面对学生的。学生可以快速查询自己的成绩,而教师还能添加,删除和修改学生的成绩,而学生和老师账户可以通过管理员账号添加,删除,和修改。

    (6)我在排序中重新定义了六种不同对象比较大小的方法,然后调用STL中的快排函数实行快排。与一般的冒泡之类的排序方法不同的是,快排是通过不断二分插入的方法进行排序的,时间复杂度为nlogn,大大节省了排序时间。

    (7)由于我是在一个单文档中通过按钮消息映射绘制五种直方图和五种折线图。在清空界面的时候,我调用了InvalidateRect(NULL)这个函数实行清空操作,但是却出现了连自己将要绘制的图形也清空了的现象,后来添加了UpdateWindow()这个函数才得以解决。

    (8)在运用单文档读取文件信息绘制直方图和折线图的时候,要细心修改自己设置的矩形和顶点的参数,以及移动时的参数,使得绘图界面美观整齐。

    (9)在学生管理系统中,我设置了统计分析这个控件,调用了ShellExecute这个函数,然后这个函数可以调用我画图的exe文件,因此,我可以在学生管理系统中直接显示学生成绩的直方图和折线图。

    (10)大总结:通过对学生成绩管理系统的可视化编程,了解了开发一个实际应用程序的步骤,同时学会使用开发工具实现界面友好的应用程序。通过本实验,掌握如何运用面向对象技术对具体的应用系统进行分析和设计。了解了MFC类的层次结构及主要类的用法,掌握使用MFC和向导来编写Windows应用程序。明白了控件是Windows图形用户界面的主要组成部分之一,掌握静态控件、按钮、流动条、编辑框、列表框、组合框和对话框的创建、消息发送和控件控制的基本用法。看着同学们不断的完成自己的课设,我还是坚持将这个学生成绩管理系统做的更好,通过加入登录和权限限制,让它不仅能服务与老师,同时也能运用于学生,并实行五门成绩的管理和统计绘图。在不断地网上查询资料和在类库中了解函数的方法,才终于完成了这个学生成绩管理系统。

     

     

     

     

     

     

     

     

     

    展开全文
  • C语言开发简单的学生成绩管理系统(附源码)

    万次阅读 多人点赞 2019-04-15 21:08:22
    学生成绩管理系统 开发语言:C语言 开发工具:Visual Studio 2019 开发时间:2019.4.14 开发者:summer @一、系统使用展示 @二、系统功能 @三、菜单 @四、录入学生信息 @五、打印学生信息 @六、保存学生信息 @七、...
  • 课程设计:c++实现学生成绩管理系统

    万次阅读 多人点赞 2020-11-28 10:59:08
    学生成绩管理系统课程设计,作为计算机科学专业学生的一门必修课,印象非常深刻,上机,编码,写报告,答辩,最后很多人勉强完成了功课,但是却很少能学到东西,算是一种遗憾吧,即使我们毕业了,仍然会想回去再做一...
  • C语言实现学生成绩管理系统设计

    万次阅读 多人点赞 2017-07-22 11:19:30
    本系统有**增加学生记录、修改学生记录、删除学生记录、按姓名查询学生记录、按C语言成绩学生进行排序、退出系统**6大功能。 能够对学生的姓名,学号,c语言成绩做相应的操作。 在检测到输入成绩大于55时,会...
  • 基于C语言的学生成绩处理

    千次阅读 2017-06-26 18:43:33
    学生成绩处理#include<stdio.h> #include /*定义结构头类型*/ typedef struct { char sno[10]; char name[16]; int score[4]; int total; int mc; }student; /*信息录入程序*/ void sr(student stud[], i
  • 学生成绩管理系统是针对学校人事处的大量业务处理而开发的管理软件,主要用于学校学生成绩、信息管理,总体任务是实现学生信息关系的系统化、科学化、规范化和自动化,其主要任务是用计算机对学生各种信息进行日常...
  • 【前言:如题,本文中涉及的项目是去年应学妹要求帮忙写的,纯C语言,在...同时,给需要完成类似课程设计学生一个参考,但是应注意理解其中的知识点,而不应复制粘贴草草了事。】问题描述:  学期考试结束,统计
  • 学生成绩管理设计要求

    千次阅读 2005-04-30 05:21:00
    2.课程设计报告书要求(学生成绩管理系统)(1)封面《C++课程设计》课程设计题目:学生成绩管理系统指导教师:周志德学生班级:网络30331学生姓名:包文广 学生学号:(2)学生成绩管理系统需求与功能分析学生...
  • //学生信息及成绩处理系统 #include &lt;iostream&gt; #include &lt;Cmath&gt; #include &lt;cstdlib&gt; #include &lt;cstring&gt; using namespace std; class Stu { private: ...
  • 学生成绩管理系统 — - 数据库设计2 详细文档已经分享 一、需求分析 能够进行数据库的数据定义、数据操纵、数据控制等处理功能,进行联机处理的相应时间要短。 具体功能应包括:系统应该提供课程安排数据的插入、...
  • MySQL学生成绩管理系统设计实验报告

    千次阅读 多人点赞 2020-12-01 21:46:15
    主要介绍学生成绩管理系统项目开发的背景、目的、对象以及研究内容。 1.1项目背景 每个学校都需要在期末进行考试成绩的统计分析工作,而这些工作都必须在考试结束后一个星期的时间内完成。大量的成绩数据的统计工作...
  • 学生成绩链表处理 (10 分)

    千次阅读 2019-05-19 22:13:55
    学生成绩链表处理 (10 分) 本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。 函数接口定义: struct stud_node *createlist(); struct stud_node *...
  • Java课程设计学生成绩管理系统

    千次阅读 多人点赞 2020-12-27 14:22:39
    设计开发一个学生成绩管理系统 (1)根据实现的功能,划分出合理的对象类,明确各个对象类之间的关系。为 各个对象类设计正确的域和方法,为每个方法设计合理的方法体。同时,为对象类及内部的域和方法运用正确的...
  • 目录 算每个人的平均成绩 求每个学科的平均成绩 总平均分每个分数段的人数以及百分比 ...学生成绩表 名字 语文 数学 英语 lh 92 68 70 zyt 94 88 75 ls 96 78 ...
  • 学生成绩管理系统【C语言程序设计

    万次阅读 多人点赞 2017-09-06 14:47:17
    一、功能实现: 0、浏览学生信息 1、输入学生信息 2、增加学生信息 3、修改学生信息 4、删除学生信息 5、按学号查询 6
  • 数据结构课程设计学生成绩管理系统)

    千次阅读 多人点赞 2019-06-17 09:06:29
    //查看单个学生成绩DAO (按学号) void FindInNumber(LinkList *head,int number) { int ok; LinkList *p; p=head->next; while(p!=NULL && p->number!=number) { p=p->next; } if(p!=NULL) { printf(...
  • 学生成绩统计系统 题目要求: 学期考试结束,统计有每班每个人的平均成绩,每门课的平均成绩,并按照个人平均成绩从高到低的顺序输出成绩, 输出不及格人名单。输入输出格式自定 假设某班有30人 考试课程自定 将所有...
  • 汇编程序设计--学生成绩管理系统

    千次阅读 2017-11-26 20:40:14
    学生成绩管理系统——汇编程序设计题目要求一个学生的信息包括姓名、班级、学号、成绩,其中成绩需要精确到1位小数。实现以下功能: (1) 可以录入学生成绩(十进制形式); (2) 可以按要求(如学号或成绩)...
  • C语言及程序设计 实践参考——学生成绩统计
  • 课程设计学生成绩管理系统

    千次阅读 2016-12-27 15:45:00
    *文件名称:学生成绩管理系统 *文件标识:无 *内容摘要:实现学成成绩的输入、插入、删除、修改、排序和输出 *其他内容:无 *当前版本:codeblocks *完成日期:2016.12.27 *版本号:codeblocks *创作人:邹晓琳 ****...
  • 2-2 学生成绩链表处理 (20 分)

    千次阅读 2019-09-22 18:19:20
    2-2学生成绩链表处理(20分) 本题要求实现两个函数,一个将输入的学生成绩组织成单向链表;另一个将成绩低于某分数线的学生结点从链表中删除。 函数接口定义: struct stud_node *createlist(); struct stud_node...
  • C语言习题5.21--学生成绩处理

    千次阅读 2015-12-27 16:55:01
    期末考试快到了,为了下学期开始的评优,院长给老师下达了任务--做一个统计学生成绩的程序,给他老人家省省事。任务内容是: 编写一个函数void calcscore(int n),在函数中输入n个人的成绩,计算最高分,最低分...
  • 返回:贺老师课程教学链接【项目1-学生成绩统计】 每位同学的信息学号、姓名、C、高数、英语成绩。定义一个学生成绩的结构体数组,其中的数据成员包括学号(char num[13])、姓名(name)、三门课的成绩(grade)、...
  • 【任务1】学生成绩处理:保存为二进制文件 ASCII 文件score.dat 中保存的是100 名学生的姓名和C++课、高 数和英语成绩。 (1)定义学生类,其中包含姓名、C++课、高数和英语成绩及总 分、均分数据成员,成员...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 36,237
精华内容 14,494
关键字:

学生成绩处理设计方法