精华内容
下载资源
问答
  • 用C语言链表编写学生成绩管理系统

    万次阅读 多人点赞 2018-09-06 20:04:12
    一、设计题目:学生成绩管理系统 二、目的与要求 每位学生记录包含有学号、姓名、性别、出生日期、三门功课的成绩(高等数学、大学英语、C语言)、总分和平均分 系统菜单: (1)录入学生记录 (2)添加学生...

    本代码供读者学习使用,请不要随意转载。

    一、设计题目:学生成绩管理系统

    二、目的与要求
    每位学生记录包含有学号、姓名、性别、出生日期、三门功课的成绩(高等数学、大学英语、C语言)、总分和平均分
    系统菜单:
    (1)录入学生记录
    (2)添加学生记录
    (3)删除学生记录
    (4)修改学生记录(要求输入密码)
    (5)查找学生记录(按学号、按姓名)
    (6)按总分对记录进行降序排列
    (7)将当前结果显示或打印,重新保存进数据文件中
    (8)输出所有学生信息
    (9)计算班级平均分
    (10)修改管理员密码(未保存至文件,程序关闭后失效)
    (11)C语言挂科人数
    (0)结束程序

    #include<stdio.h>
    #include<stdlib.h> 
    #include<string.h>
    #include<malloc.h>
    #include<math.h>
    #define LEN sizeof(struct student)
     struct student
    {
    	struct student *next;
    	long num;
    	char name[8];
    	char sex[4];
    	int year;
    	int month;
    	int day;
    	float c;
    	float math;
    	float eng;
    	float sum;
    };
    
    int n;
    struct student * creat()          //建立基础的学生信息库 
    {
    	struct student * head,*p1,*p2;
    	n=0;
    	p1=p2=(struct student *)malloc(LEN);
    	printf("输入学生的学号为0时,停止录入.\n");
            printf("请输入学生学号:");
    		scanf("%ld",&p1->num);
    		if(p1->num!=0)
    		{
    		printf("请输入学生姓名:");scanf("%s",p1->name);
    		printf("请输入学生性别:");scanf("%s",p1->sex); 
    	 printf("请输入学生生日:\n");
    	 printf("年:");scanf("%d",&p1->year);
    	 printf("月:");scanf("%d",&p1->month);
    	 printf("日:");scanf("%d",&p1->day);
    	    printf("c语言:");scanf("%f",&p1->c);
    	    printf("高数:");scanf("%f",&p1->math);
    	    printf("英语:");scanf("%f",&p1->eng);
    	    p1->sum=p1->c+p1->eng+p1->math;
    		printf("\n");
    	}
    	while(p1->num!=0)
    	{
    		n=n+1;
    		if(n==1)
    		{
    			head=p1;
    		}
    		else
    		{
    			p2->next=p1;
    		}
    		p2=p1;
    		p1=(struct student *)malloc(LEN);
                printf("请输入学生学号:");
    	scanf("%ld",&p1->num);
    	if(p1->num!=0)
    	{
    	printf("请输入学生姓名:");scanf("%s",p1->name);
    	printf("请输入学生性别:");scanf("%s",p1->sex);
    	 printf("请输入学生生日:\n");
    	 printf("年:");scanf("%d",&p1->year);
    	 printf("月:");scanf("%d",&p1->month);
    	 printf("日:");scanf("%d",&p1->day);
    	    printf("c语言:");scanf("%f",&p1->c);
    	    printf("高数:");scanf("%f",&p1->math);
    	    printf("英语:");scanf("%f",&p1->eng);
    	    p1->sum=p1->c+p1->eng+p1->math;
    		printf("\n");
    	}
    	}
         p2->next=NULL;
    	return head;
    }
    
    struct student * del(struct student *head,long num) //删除学生信息 
    {
    	struct student  *p1,*p2;
    	if(head==NULL)
    	{
    		printf("\nlist null!\n");
    		return head;
    	}
    	p1=head;
    	while(num!=p1->num&&p1->next!=NULL)
    	{
    		p2=p1;p1=p1->next;
    	}
    		if(num==p1->num)
    		{
    			if(p1==head)
    				head=p1->next;
    			else
    				p2->next=p1->next;
    			printf("你删除的学生信息为:\n");
    			printf("学号:%ld\n",p1->num);
    					printf("姓名:%s\n",p1->name);
    					printf("性别:%s\n",p1->sex);
    					printf("生日:\n");
    					printf("年:%d\n",p1->year);
    					printf("月:%d\n",p1->month);
    					printf("日:%d\n",p1->day);
    					printf("c语言:%5.2f\n",p1->c);
    					printf("高数:%5.2f\n",p1->math);
    					printf("英语:%5.2f\n",p1->eng);
    					p1->sum=p1->c+p1->math+p1->eng;
    			        printf("总分:%5.2f\n",p1->sum);
    					printf("\n");
    			n=n-1;
    		}
    			else
    				printf("输入有误!\n");
    	    return head;
    }
    
    struct student * insert (struct student *head,struct student *stud) //添加学生信息 
    {
    	struct student * p0,*p1,*p2;
    	p1=head;
    	p0=stud;
    	if(head==NULL)
    	{
    		head=p0;
    		p0->next=NULL;
    	}
    	else
    		while((p0->num>p1->num)&&(p1->next!=NULL))
    		{
    			p2=p1;
    			p1=p1->next;
    		}
    		if(p0->num<=p1->num)
    		{
    			if(head==p1)
    				head=p0;
    			else
    				p2->next=p0;
    			p0->next=p1;
    		}
    		else
    		{
    			p1->next=p0;
    			p0->next=NULL;
    		}
    		n=n+1;
    		return head;
    }
    
    
    
              
    void sort(struct student  *head) //排序 
    {
        struct student *p, *q, *max;
        long temp1;
        char temp2[4],temp9[4];
        int temp3,temp4,temp5;
        float temp,temp6,temp7,temp8;
        p = head;
        while (p != NULL)
        {
            max = p;
            q = p->next;
            while (q != NULL)
            {
                if (max->sum < q->sum)
                    max = q;
                q = q->next;
            }
            // 交换值
            if (max != p)
            {
                temp = max->sum;max->sum = p->sum;p->sum = temp;
                temp1=max->num;max->num=p->num;p->num=temp1;
                strcpy(temp2,max->name);strcpy(max->name,p->name);strcpy(p->name,temp2);
                temp3=max->year;max->year=p->year;p->year=temp3;
                temp4=max->month;max->month=p->month;p->month=temp4;
                temp5=max->day;max->day=p->day;p->day=temp5;
                temp6=max->c;max->c=p->c;p->c=temp6;
    			temp7=max->math;max->math=p->math;p->math=temp7; 
                temp8=max->eng;max->eng=p->eng;p->eng=temp8;
                strcpy(temp9,max->sex);strcpy(max->sex,p->sex);strcpy(p->sex,temp9);
            }
            p = p->next;
        }
    printf("排序以后的学生信息为:\n"); 
    struct student *p1;
      p1 = head;
    int count=1;
    while(p1!=NULL)
    {
        printf("第%d名:\n",count);
    	printf("学号:%ld   ",p1->num);
    					printf("姓名:%s   ",p1->name);
    					printf("生日:");
    					printf("%d.",p1->year);
    					printf("%d.",p1->month);
    					printf("%d   ",p1->day);
    					printf("c语言:%5.3f   ",p1->c);
    					printf("高数:%5.3f   ",p1->math);
    					printf("英语:%5.3f   ",p1->eng);
    	printf("总分:%4.2f   ",p1->sum);
    	printf("\n");
    	count++;
    	p1=p1->next;   
    }
    }
    
    float ave(struct student * head)//求平均数
    {
    	int i;
    	float ave,sum=0;
    	struct student *p;
    	p=head;
    	for(i=0;p!=NULL;i++)
    	{
    		sum=sum+p->sum;
    		p=p->next;
    	}
    	ave=sum/i;
    	return ave;
    }
    
    void change(struct student *head,long num)//修改学生数据 
    {
    	struct student *p;
    	p=head;
    	for(;p!=NULL;)
    	{
    		if(p->num==num)
    		{
    			printf("请输入学生姓名:");scanf("%s",p->name);
    			printf("请输入学生性别:");scanf("%s",p->sex);
    	 printf("请输入学生生日:\n");
    	 printf("年:");scanf("%d",&p->year);
    	 printf("月:");scanf("%d",&p->month);
    	 printf("日:");scanf("%d",&p->day);
    	    printf("c语言:");scanf("%f",&p->c);
    	    printf("高数:");scanf("%f",&p->math);
    	    printf("英语:");scanf("%f",&p->eng);
    	    p->sum=p->c+p->eng+p->math;
    		printf("\n");
    		break;
    		}
    		else
    		{
    			p=p->next;
    		 } 
    	}
    }
    
    void filein(struct student *head)//保存到文件中 
    {
    	FILE *fp;
    	struct student *p;
    	if((fp=fopen("D:\\20161181\\23\\student.dat","wb"))==NULL)//打开文件 
    	{
    		printf("can't open.\n");
    		exit(0);
    	}
    	p=head; 
    	while(p!=NULL)                //将链表的内容存储到文本文件中 
    	{
            fwrite(p,LEN,1,fp);
    		printf("\n");
    		p=p->next;
    	}
    	fclose(fp);
    	printf("成功保存至D:\\20161181\\23\\student.dat\n");
    }
    struct student *fileout(struct student *head)
    {
    	FILE *fp;
    	struct student *p,*s;
    	if((fp=fopen("D:\\20161181\\23\\student.dat","rb"))==NULL)
    		return NULL;
    	else if(fgetc(fp)==EOF)
    		return NULL;
    	rewind(fp);
    	head=(struct student *)malloc(LEN);
    	fread(head,LEN,1,fp);
    	p=head;
    	while(!feof(fp))
    	{
    		s=(struct student *)malloc(LEN);
    		if(fread(s,LEN,1,fp)==0)
    			break;
    		p->next=s;
    		p=s;
    		p->next=NULL;
    	}
    	return head;
    	fclose(fp);
    
    }
    
    struct student * locate(struct student *head,long num1)//按学号查找
    {
     struct student *p1,*p2;
              p1=head;
              if(head==NULL)    //空链表时返回
              {
                    printf("/n链表为空!/n");
                    return(head);
              }
              else
              {
                    while(num1!=p1->num && p1->next!=NULL)
                    {
                        p2=p1;
                        p1=p1->next;
                    }
    	if(p1->num==num1)//比较输入学号是否与链表中学生学号匹配 
    		{
    		    printf("查找的学生信息为:\n");
    			printf("学号:%ld\n",p1->num);
    			printf("姓名:%s\n",p1->name);
    			printf("性别:%s\n",p1->sex);		                    		 					
    			printf("生日:\n");		                    
    			printf("年:%d\n",p1->year);		                   
    			printf("月:%d\n",p1->month);	                    
    			printf("日:%d\n",p1->day);	                    
    			printf("c语言:%5.3f\n",p1->c);		                    
    			printf("高数:%5.3f\n",p1->math);		                    
    			printf("英语:%5.3f\n",p1->eng);
    			p1->sum=p1->c+p1->eng+p1->math;
    			printf("总分:%5.2f\n",p1->sum);	                   
    			printf("\n");		                   
    		    return head;
    		}
    	else
    	{
    		printf("无该学生数据\n");
    		return head;
    	}
    }
           }
      struct student * locate1(struct student *head)//按姓名查找
    {
    	char name[10];
    	printf("请输入要查询学生的姓名:");
    	scanf("%s",name); 
     struct student *p1,*p2;
              p1=head;
              if(head==NULL)    //空链表时返回
              {
                    printf("/n链表为空!/n");
                    return(head);
              }
              else
              {
                    while(strcmp(name,p1->name)!=0 && p1->next!=NULL)
                    {
                        p2=p1;
                        p1=p1->next;
                    }
    	if(strcmp(name,p1->name)==0)//比较输入姓名与链表中学生姓名是否匹配 
    		{
    		    printf("查找的学生信息为:\n");
    			printf("学号:%ld\n",p1->num);
    			printf("姓名:%s\n",p1->name);
    			printf("性别:%s\n",p1->sex);		                    		 					
    			printf("生日:\n");		                    
    			printf("年:%d\n",p1->year);		                   
    			printf("月:%d\n",p1->month);	                    
    			printf("日:%d\n",p1->day);	                    
    			printf("c语言:%5.3f\n",p1->c);		                    
    			printf("高数:%5.3f\n",p1->math);		                    
    			printf("英语:%5.3f\n",p1->eng);
    			p1->sum=p1->c+p1->eng+p1->math;
    			printf("总分:%5.2f\n",p1->sum);	                   
    			printf("\n");		                   
    		    return head;
    		}
    	else
    	{
    		printf("无该学生数据\n");
    		return head;
    	}
    }
           }
    
    	
    
          //输出学生信息 
     void print(struct student *head)
     {
     	struct student *p;
     	p=head;
     	printf("现在链表里的数据为:\n");
    				while(p!=NULL)
    				{
    				    printf("学号:%ld   ",p->num);
    					printf("姓名:%s   ",p->name);
    					printf("性别:%s   ",p->sex);
    					printf("生日:%d.",p->year);
    					printf("%d.",p->month);
    					printf("%d   ",p->day);
    					printf("c语言:%5.2f   ",p->c);
    					printf("高数:%5.2f   ",p->math);
    					printf("英语:%5.2f   ",p->eng);
    					printf("总分:%5.2f   ",p->sum);
    					printf("\n");
    					p=p->next;
    				}
    				printf("\n");
    }
    void sum(struct student *head)
    {
    	int n=0;
    	struct student *p,*p1;
    	p=head;
    	while(p!=NULL)
    	{
    	if(p->c<60)
    	{
    		n++;	
    	}
    	p=p->next; 
        }
        if(n==0)
    	{ 
    	printf("(o^.^o)本次C语言无人挂科.\n");
        }
    if(n>0)
     { 
     printf("本次C语言挂科人数有%d人\n\n",n);
     printf("挂科人员的学号,姓名如下\n\n");
     }
     p1=head;
     while(p1!=NULL&&p1->c<60)
     {
     	printf("学号:%ld  ",p1->num);
     	printf("姓名:%s\n",p1->name);
     	p1=p1->next;
     }
    
    printf("\n");
    }
    int main()
    {
    	int choose,n;
    	long number,e;
    	char name[6];
    	struct student *head,*p;
    	 char password[10]={"123456"};
    	 char password1[10],password2[10],password3[10],password4[10],num[12];
    	printf("请输入进入学生成绩管理系统的管理员代号和密码:\n系统默认登录密码为:123456.\n管理员代号:");
            scanf("%s",num);
    		printf("密码:"); 
    		scanf("%s",password1);
    		printf("\n");
    	for(;;)
    	{
    		if(strcmp(password1,password)!=0)
    		{
    	printf("输入错误,请重新输入:\n管理员代号:");
    	    scanf("%s",num);
    		printf("\n密码:"); 
    		scanf("%s",password1);
    		printf("\n");
    	    }
    	    else
    	    {
    	    printf("%s管理员成功登陆\n",num); 
    	    
    	    break;
    		}	
    	}
    	        printf("★★★★欢迎使用学生成绩管理系统★★★★\n\n");
    	        printf("---------------------------------------\n");
    	        printf("\t0.退出程序\n\t1.录入学生记录\n\t2.添加学生记录\n");
    			printf("\t3.删除学生记录\n\t4.修改学生记录\n");
    			printf("\t5.查找学生记录\n\t6.按总分对学生记录进行降序排序\n");
    			printf("\t7.将数据保存至文件\n\t8.输出所有学生信息\n\t9.计算班级平均分\n");
    			printf("\t10.修改管理员密码\n\t11.统计C语言挂科人数\n");
    			system("pause");
    			system("cls");
    			head=fileout(head);
    			choose=-1;
    			while(choose!=0)
    			{
    				printf("★★★★欢迎使用学生成绩管理系统★★★★\n");
    				printf("---------------------------------------\n");
    	            printf("\t0.退出程序\n\t1.录入学生记录\n\t2.添加学生记录\n");
    			    printf("\t3.删除学生记录\n\t4.修改学生记录\n");
    			    printf("\t5.查找学生记录\n\t6.按总分对学生记录进行降序排序\n");
    			    printf("\t7.将数据保存至文件\n\t8.输出所有学生信息\n\t9.计算班级平均分\n");
    			    printf("\t10.修改管理员密码\n\t11.统计C语言挂科人数\n");
    				printf("请输入一个数字:\n");
    				scanf("%d",&choose);
    				system("cls");
    				switch(choose)
    				{
    					case 0:
    						printf("\n\n");
    						printf("★★★★期待您的下次使用★★★★");
    						
    						printf("\n\n");
    						break;
    					case 1:
    					 head=creat();
    					 system("pause");
    					 system("cls");
    					 break;
    					 case 2:
    					 	p=(struct student *)malloc(LEN);
    	                    printf("请输入要添加学生学号\n"); 
    					 	printf("学号:\n");
    	                    scanf("%ld",&p->num);
    	                    if(p->num!=0)
    	                    {
    					 		printf("请输入学生姓名:");scanf("%s",p->name);
    					 		printf("请输入学生性别:");scanf("%s",p->sex);
    	                        printf("请输入学生生日:\n");
    	 						printf("年:");scanf("%d",&p->year);
    	 						printf("月:");scanf("%d",&p->month);
    	 						printf("日:");scanf("%d",&p->day);
    	    					printf("c语言:");scanf("%f",&p->c);
    	   		 				printf("高数:");scanf("%f",&p->math);
    	    					printf("英语:");scanf("%f",&p->eng); 
    	    					p->sum=p->c+p->eng+p->math;
    	    					head=insert(head,p);
    	    				}
    	    				system("pause");
    	    				system("cls");
    					 	break;
    					 	case 3:
    					 		printf("输入您要删除的学号:\n");
    					 		scanf("%ld",&e);
    					 		if(e!=0)
    					 		head=del(head,e);
    					 		system("pause");
    					 		system("cls");
    					 	    break;
    					 		case 4:
    					 			int num;
    					 			printf("请输入密码:\n");
    					 			scanf("%s",password4);
    					 			while(strcmp(password,password4)!=0)
    					 			{
    					 					printf("输入错误,请重输:\n");
    					 					scanf("%s",password4);
    								} 
    									 printf("输入密码正确!\n");
    									 printf("请输入要修改学生学号:");
    									 scanf("%ld",&num);
    									 change(head,num); 
    								    system("pause");
    								    system("cls");
    					 				break;
    					 				case 5:
    					 					int ch;
    					 					printf("输入您要查找的学生的内容:\n1.按学号查找\n2.按姓名查找\n");
    					 					scanf("%d",&ch);
    					 					if(ch==1)
    					 					{
    					 						printf("请输入要查询学生学号:");
    					 					scanf("%ld",&number);
    					 					head=locate(head,number);
    					                    printf("\n");
    										}
    										if(ch==2)
    										{
    											head=locate1(head);
    											printf("\n");
    										}
    					                    system("pause");
    					                    system("cls");
    					                    break;
    					 				case 6:
    					 					sort(head);
    					 					system("pause");
    					 					system("cls");
    					 					break;
    					 					case 7:
    					 						filein(head); 
    					 						system("pause");
    					 						system("cls");
    					 						break;					
    					case 8:
    						print(head);
    						system("pause");
    						system("cls");
    						break;
    						case 9:
    							
    							float aver;
    							aver=ave(head);
    							printf("该班平均分为:%4.2f\n",aver);
    							system("pause");
    							system("cls");
    							break;
    							case 10:
    						printf("旧密码:");
    						scanf("%s",password1);
    						printf("新密码:");
    						scanf("%s",password2);
    						printf("请您确认新密码:"); 
    						scanf("%s",password3);
    						for(;;)
    						{
    							if(strcmp(password,password1)!=0)
    							{
    							printf("输入的旧密码有误\n");
    							printf("旧密码:");
    						scanf("%s",password1);
    						printf("新密码:");
    						scanf("%s",password2);
    						printf("请确认新密码:"); 
    						scanf("%s",password3);
    						    }
    							if(strcmp(password2,password3)!=0)
    							{
    							printf("输入的新密码与确认的新密码不一致\n");
    							printf("旧密码:");
    						scanf("%s",password1);
    						printf("新密码:");
    						scanf("%s",password2);
    						printf("请确认新密码:"); 
    						scanf("%s",password3);
    						    }
    						    if(strcmp(password1,password)==0&&strcmp(password2,password3)==0)
    						    {
    						    	printf("成功修改密码.\n");
    						    	break; 
    							}
    						}
    						strcpy(password,password2);
    						system("pause");
    						system("cls");
    						break;
    						case 11:
    							sum(head);
    							system("pause");
    							system("cls");
    							break;
    				}
    			}
    	return 0;
     }
    
    

    1.先输入系统规定密码123456进入学生成绩管理系统。进入后能看到以下界面。
    主界面
    2.按照下图信息进行学生信息的录入。
    学生信息录入
    3.按3删除学号为3的学生信息。
    这里写图片描述
    再按8看看链表中的数据是不是被删除了。
    这里写图片描述
    4.按2添加学生为3的学生信息。
    这里写图片描述
    按8看看添加的效果,程序是按照学号排序的方式插入的。
    这里写图片描述

    5.按数字5查找学生记录。(两种方式。1.按照学号查询 2.按照姓名查询)
    1.按照学号查询
    这里写图片描述
    2.按照姓名查询
    这里写图片描述

    6.按数字6根据总分对学生成绩进行排序。
    这里写图片描述

    7.按数字9计算班级平均分
    8.按数字10进行密码修改(由于未存入文件,再次打开仍然要输入原始密码,此项密码修改只针对第4项功能的修改学生记录时的密码输入)
    这里写图片描述
    9.按数字4进行学生记录的修改(需要输入上次修改密码)
    这里写图片描述

    可以看到原始密码123456已经失效。
    9.按数字11统计C语言挂科人数。
    有挂科人员时,会输出挂科人员的学号和姓名。
    这里写图片描述
    10.按数字7将学生信息保存至文件(文件路径为D:\20161181\23\stu.dat)。
    第二次打开程序时,原有数据会丢失,由于没有做读取文件的功能。

    读者可以自行完善文件的读取功能

    这里写图片描述
    11.按数字0退出程序。

    经测试,上述代码未出现问题。

    关注公众号,获取更多资源。在后台回复学生成绩管理系统,即可获取源码。
    在这里插入图片描述

    每天进步一点点,开心也多一点点

    展开全文
  • 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图形用户界面的主要组成部分之一,掌握静态控件、按钮、流动条、编辑框、列表框、组合框和对话框的创建、消息发送和控件控制的基本用法。看着同学们不断的完成自己的课设,我还是坚持将这个学生成绩管理系统做的更好,通过加入登录和权限限制,让它不仅能服务与老师,同时也能运用于学生,并实行五门成绩的管理和统计绘图。在不断地网上查询资料和在类库中了解函数的方法,才终于完成了这个学生成绩管理系统。

     

     

     

     

     

     

     

     

     

    展开全文
  • 完成对学生信息的管理功能:增加,删除,修改,查找(本演示项目目的是为了入门SpringBoot,所以不会花费时间在前端界面上,所以开发出程序为api接口,使用 postman 可以很方便的发送各种请求到一些接口来...

    本博客讲解了如何一些spring Boot 的入门知识,使用spring boot 开发简单的学生管理系统后台处理逻辑(前端没有实现,应用以接口api 方式进行调用),另外本人在本科三年级曾带领班级进行软件工程项目实战,开发高校教务管理系统,里面的功能比较全面,前后端都相对来说很完善(前端还有手机端页面) ,后端同样使用spring boot 技术,前端使用 vue.js ,数据库使用mysql。 其中本人负责选课系统的设计与开发,注释非常清晰明了,十分利于初学者学习spring boot ,欢迎参考,点击跳转


    开发环境

    • JDK:Java 1.8

    • 技术栈:SpringBoot 2.13

    • 数据库: MySQL 8

    • IDE:JetBrains Intelij IDEA

    实现功能

    完成对学生信息的管理功能:增加,删除,修改,查找(本演示项目目的是为了入门SpringBoot,所以不会花费时间在前端界面上,所以开发出程序为api接口,使用 postman 可以很方便的发送各种请求到一些接口来验证程序的正确性)

    建立工程

    图文教程请移步:Spring Boot入门项目一:使用Intelij Idea创建一个Spring Boot工程

    开发过程

    • 确定系统功能

      1. 学生数据的增加,添加一条学生的数据到数据库

      2. 全部学生数据浏览(无条件查看所有学生的数据信息)

      3. 根据学号来查找学生信息

      4. 更新学生信息:根据学号查找到学生,然后更新学生的信息

      5. 删除学生的信息:根据学号来进行删除

    • 完善开发环境

      本项目使用了Hibernate,需要添加依赖到pom文件中,打开按照上面链接创建的工程,在pom.xml 文件中添加如下信息到 <dependencies></dependencies>中:

      <dependency>
      	<groupId>org.springframework.boot</groupId>
      	<artifactId>spring-boot-starter-data-jpa</artifactId>
      </dependency>
      <dependency>
      	<groupId>mysql</groupId>
      	<artifactId>mysql-connector-java</artifactId>
      </dependency>
      
    • 数据库环境初始化

      初始化一个数据库,用来存储学生的信息,这里使用的是MySQL 8 的版本,建立的过程如下所示:(我使用的是Navicat连接工具,其他的也可以)

      • 在连接的数据库上右键选择新建数据库:

      • 填入以下信息来创建一个空的数据库:

      • 创建数据表 student

        这里使用Spring Boot 中的数据库实体来创建。

        打开项目 resources 文件夹下的 application.properties 文件,写入如下信息

        #这里是项目的配置文件
        # 设置项目运行的端口:
        
        server.port=8080
        
        # 这里是数据库连接驱动的设置,设置了一些连接参数来使连接有效。
        # 数据库的连接驱动
        spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
        # 连接数据库的地址,注意,我这里数据库的端口是3308,我自己配置的,默认情况下是3306端口,请根据自己的情况修改
        spring.datasource.url=jdbc:mysql://127.0.0.1:3308/dbgirl?serverTimezone=UTC&useSSL=false
        # 连接的账号和密码,也要根据自己情况去修改。
        spring.datasource.username=root
        spring.datasource.password=root
        
        # 这里配置的是hibernate 框架的信息,数据库的访问使用了 hibernate 框架。
        # 这里是数据库的连接类型信息,选择的是mysql 数据库。
        spring.jpa.database=mysql
        # 这里的参数有五种,常用的就是 create 和 update ,区别在于create 在每一次启动应用的时候都会重新创建数据库,并把之前的数据全部删掉,而update 则是采用增量的方式来进行创建,只更新修改的了部分,保留未修改部分的数据
        spring.jpa.hibernate.ddl-auto=update
        spring.jpa.show-sql=true
        

        为了进一步的专注于Spring Boot 的入门知识,这里不采用 规范的分层模型,只实现所有的功能,至于分层 ,后面有机会会进行讲解。

        首先创建一个类,名称为 StudentForm,作为一个数据库中数据表的映射,描述数据表的信息

        StudentForm 代码如下:

        package com.example.demo;
        
        import javax.persistence.Entity;
        import javax.persistence.GeneratedValue;
        import javax.persistence.Id;
        import javax.validation.constraints.NotEmpty;
        
        @Entity
        public class StudentForm {
            @Id
            @GeneratedValue
            private Integer id;
            @NotEmpty
            private String account;
            private String password;
            private String name;
            private Integer age;
        
            public StudentForm() {
        
            }
        
            public Integer getId() {
                return id;
            }
        
            public void setId(Integer id) {
                this.id = id;
            }
        
            public String getAccount() {
                return account;
            }
        
            public void setAccount(String account) {
                this.account = account;
            }
        
            public String getPassword() {
                return password;
            }
        
            public void setPassword(String password) {
                this.password = password;
            }
        
            public String getName() {
                return name;
            }
        
            public void setName(String name) {
                this.name = name;
            }
        
            public Integer getAge() {
                return age;
            }
        
            public void setAge(Integer age) {
                this.age = age;
            }
        
            @Override
            public String toString() {
                return "StudentForm{" +
                        "id=" + id +
                        ", account='" + account + '\'' +
                        ", password='" + password + '\'' +
                        ", name='" + name + '\'' +
                        ", age=" + age +
                        '}';
            }
        }
        

        保存之后启动程序,启动成功的话会发现在数据库中已经创建好了一个数据表 student_form 表:

        至此数据库环境初始化的工作就完成了。

    • 数据库接口定义

      数据库接口的编写是为了为应用程序提供一系列查询,修改,增加,删除的功能,其他类可以调用方法来操作数据库。由于使用了 Hibernate 框架,所以这一工作变得非常简单:新建一个数据库接口类:DBUtils,代码如下:

      package com.example.demo;
      
      import org.springframework.data.jpa.repository.JpaRepository;
      
      public interface DBUtils extends JpaRepository {
      	public StudentForm findByAccount(String account);
      }
      
    • 业务逻辑编写

      初始化了数据库环境,定义了数据库访问接口,下面就是业务逻辑的编写了,还记得任务么:实现增删查改,接下来就编写这些业务功能代码:
      首先创建一个类专门用于这些业务逻辑的实现,创建一个 StudentController 类。代码如下:(这段代码只定义了格式,没有实现功能,后面后实现,实际上具体的项目中也是先定义好这些然后再进行开发的,按照这个流程来开发比较清楚。)

      package com.example.demo;
      
        import org.springframework.beans.factory.annotation.Autowired;
      
        import org.springframework.validation.BindingResult;
      
        import org.springframework.web.bind.annotation.*;
      
        import javax.validation.Valid;
      
        import java.util.List;
      
        @RestController
      
        public class StudentController {
      
        @Autowired
        private DBUtils dbUtils;
        /**
      
        * 获得所有的学生的api 接口:
        * @return 返回结果列表
      
          */
      
          @GetMapping(value = "/students")
      
          public List getStudentForms(){
      
          return null;
      
          }
      
          /**
        * 根据 account 来获得 一个学生的信息:
        * @param account 学号信息
        * @return 返回查询的结果;
      
          */
      
          @GetMapping(value = "/students/{account}")
      
          public StudentForm getStudentFormById(@PathVariable("account") Integer account){
      
          return null;
      
          }
      
          /**
        * 增加一个新的学生信息到数据库:
        * @param studentForm 前端传过来的参数
        * @param bindingResult 可以理解为异常捕获类
        * @return
      
          */
      
          @PostMapping(value = "/students/add")
      
          public Object addStudentForm(@Valid StudentForm studentForm, BindingResult bindingResult){
      
          }
      
          @PostMapping(value = "/students/update")
      
          public StudentForm updateStudentFormById(){
      
          return null;
      
          }
      
          /**
        * 删除指定ID的学生信息
        * @param id
        * @return
      
          */
      
          @PostMapping(value ="/students/delete")
      
          public String deleteById(@RequestParam(value = "id") Integer id){
      
          return null;
      
          }
      
        }
      

      到了这里大家可能会有疑问,因为出现了很多之前没见过的东西,那就是 @+[一个名称] ,这个就是一个注解,关于注解是什么,其实就是类似于spring 项目中的XML配置文件,只不过使用注解的方式更加的简单,不用配置一大堆XML文件,很方便,在这里简单的说一下之前代码中出现的注解的意思,更多注解的信息我后续会出文章继续讲解:

      注解 使用方法
      @Entity 一个数据库实体注解,有这个注解的类代表和数据库中的某一个表相对应,这个类中的所有属性就是数据表中的所有字段,都是一一对应的,此外这个注解经常和@Table(name=“数据表名称”) 来一起使用,如果数据表名称和这个类的名称一致的话,那就可以省略@Table(name=“数据表名称”) 的注解
      @Id 表示该属性为主键,数据表的主键就是可以唯一标识数据表中一行书库的一个属性组。
      @GeneratedValue 表示该属性是一个自增属性,在插入的时候自动怎家,通常是 Integer 类型
      @NotEmpty 表示这个属性不可以为空,这是数据库字段的约束,此外还有很多约束,后面会出文章讲解
      @RestController @RestController 是一个结合了 @ResponseBody 和 @Controller 的注解,@Responsebody 注解表示该方法的返回的结果直接写入 HTTP 响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用 @RequestMapping 后,返回值通常解析为跳转路径,加上@Responsebody 后返回结果不会被解析为跳转路径,而是直接写入HTTP 响应正文中。
      @Autowired 注解在类上,表示这是一个控制层bean
      @GetMapping GetMapping(value=“url地址”) 指定url 地址,添加一个get请求方法,这样就可以用注解的方法来实现get请求的监听了
      @PostMapping 和GetMapping 类似,就是监听的是一个Post 请求
      @RequestParam 请求的参数,从前端传过来的参数,可以通过这个来获取
      @PathVariable 类似于RequestParam,只不过请求的URL稍有不同,可以看例子使用
      @Valid 这是一个校验的注解,在数据库实体类上定义的约束会会进行校验,不合格会返回一定的提示信息,保证数据库的完整性。
    • 具体功能实现

      • 添加一个学生的信息到数据库

        代码实现:

        /**
             * 增加一个新的学生信息到数据库:
             * @param studentForm 前端传过来的参数
             * @param bindingResult  可以理解为异常捕获类
             * @return
             */
            @PostMapping(value = "/students/add")
            public Object addStudentForm(@Valid StudentForm studentForm, BindingResult bindingResult){
                if(bindingResult.hasErrors()){
                    System.out.println(bindingResult.getFieldError().getDefaultMessage());
                    return "不符合条件,插入失败,请检查是不是有正确的请求参数";
                }
                dbUtils.save(studentForm);
                return studentForm;
            }
        
      • 查询所有学生的信息

        /**
         * 获得所有的学生的api 接口:
         * @return 返回结果列表
         */
         @GetMapping(value = "/students")
         public List getStudentForms(){
         return dbUtils.findAll();
         }
        
      • 根据学号查询一个学生的信息

        /**
             * 根据 account 来获得 一个学生的信息:
             * @param account  学号信息
             * @return 返回查询的结果;
             */
            @GetMapping(value = "/students/{account}")
            public Object getStudentFormById(@PathVariable("account") String account){
                StudentForm student=dbUtils.findByAccount(account);
                if(student!=null)
                    return student;
                else{
                    return "查找失败:当前学号的学生没有!";
                }
            }
        
      • 根据更新一个学生信息

          /**
               * 根据Id 来更新一个学生的信息
               * @param id  学生id 号码(必选)
               * @param age  年龄(可选)
               * @param name  姓名(可选)
               * @param password  密码(可选)
               * @param account  账号(可选)
               * @return
               */
              @PostMapping(value = "/students/update")
              public Object updateStudentFormById(@RequestParam("id") Integer id,
                                                       @RequestParam(value = "age",required = false,defaultValue = "-1") Integer age,
                                                       @RequestParam(value = "name",required = false,defaultValue = "null") String name,
                                                       @RequestParam(value = "password",required = false,defaultValue = "null") String password,
                                                       @RequestParam(value = "account",required = false,defaultValue = "null") String account){
                  Optional studentC=dbUtils.findById(id);
                  if(studentC.isPresent()){
                      StudentForm student=studentC.get();
                      if(age!=-1){
                          student.setAge(age);
                      }
                      if(!name.equals("null")){
                          student.setName(name);
                      }
                      if(!account.equals("null")){
                          student.setAccount(account);
                      }
                      if(!password.equals("null")){
                          student.setPassword(password);
                      }
                      dbUtils.save(student);
                      return  student;
                  }
                  return  "修改失败,没有找到学生信息!";
              }
        
      • 根据ID删除一个学生的信息

        /**
             * 删除指定ID的学生信息
             * @param id
             * @return
             */
            @PostMapping(value ="/students/delete")
            public String deleteById(@RequestParam(value = "id") Integer id){
                Optional studentC=dbUtils.findById(id);
                if(studentC.isPresent()){
                    StudentForm student=studentC.get();
                    dbUtils.deleteById(id);
                    return "{'msg':'删除成功','object':'"+student.toString()+"'}";
                }
                return "没有办法删除:找不到要删除的信息!";
            }
        
    • 完整业务逻辑代码

      
      package com.example.demo;
      
      import org.springframework.beans.factory.annotation.Autowired;
      
      import org.springframework.validation.BindingResult;
      
      import org.springframework.web.bind.annotation.*;
      
      import javax.validation.Valid;
      
      import java.util.List;
      
      import java.util.Optional;
      
      @RestController
      
      public class StudentController {
      
          @Autowired
          private DBUtils dbUtils;
          /**
           * 获得所有的学生的api 接口:
           * @return 返回结果列表
           */
          @GetMapping(value = "/students")
          public List getStudentForms(){
              return dbUtils.findAll();
          }
      
          /**
           * 根据 account 来获得 一个学生的信息:
           * @param account  学号信息
           * @return 返回查询的结果;
           */
          @GetMapping(value = "/students/{account}")
          public Object getStudentFormById(@PathVariable("account") String account){
              StudentForm student=dbUtils.findByAccount(account);
              if(student!=null)
                  return student;
              else{
                  return "查找失败:当前学号的学生没有!";
              }
          }
      
          /**
           * 增加一个新的学生信息到数据库:
           * @param studentForm 前端传过来的参数
           * @param bindingResult  可以理解为异常捕获类
           * @return
           */
          @PostMapping(value = "/students/add")
          public Object addStudentForm(@Valid StudentForm studentForm, BindingResult bindingResult){
              if(bindingResult.hasErrors()){
                  System.out.println(bindingResult.getFieldError().getDefaultMessage());
                  return "不符合条件,插入失败,请检查是不是有正确的请求参数";
              }
              dbUtils.save(studentForm);
              return studentForm;
          }
      
          /**
           * 根据Id 来更新一个学生的信息
           * @param id  学生id 号码(必选)
           * @param age  年龄(可选)
           * @param name  姓名(可选)
           * @param password  密码(可选)
           * @param account  账号(可选)
           * @return
           */
          @PostMapping(value = "/students/update")
          public Object updateStudentFormById(@RequestParam("id") Integer id,
                                                   @RequestParam(value = "age",required = false,defaultValue = "-1") Integer age,
                                                   @RequestParam(value = "name",required = false,defaultValue = "null") String name,
                                                   @RequestParam(value = "password",required = false,defaultValue = "null") String password,
                                                   @RequestParam(value = "account",required = false,defaultValue = "null") String account){
              Optional studentC=dbUtils.findById(id);
              if(studentC.isPresent()){
                  StudentForm student=studentC.get();
                  if(age!=-1){
                      student.setAge(age);
                  }
                  if(!name.equals("null")){
                      student.setName(name);
                  }
                  if(!account.equals("null")){
                      student.setAccount(account);
                  }
                  if(!password.equals("null")){
                      student.setPassword(password);
                  }
                  dbUtils.save(student);
                  return  student;
              }
              return  "修改失败,没有找到学生信息!";
          }
      
          /**
           * 删除指定ID的学生信息
           * @param id
           * @return
           */
          @PostMapping(value ="/students/delete")
          public String deleteById(@RequestParam(value = "id") Integer id){
              Optional studentC=dbUtils.findById(id);
              if(studentC.isPresent()){
                  StudentForm student=studentC.get();
                  dbUtils.deleteById(id);
                  return "{'msg':'删除成功','object':'"+student.toString()+"'}";
              }
              return "没有办法删除:找不到要删除的信息!";
          }
      
      }
      
    • 使用postman 来进行程序接口检查

      • 增加一个学生到数据库

      • 查看所有同学信息

      • 通过学号查看信息

      • 通过 ID更新信息

      • 通过ID删除信息

    至此,这个学生管理系统基础的功能就开发完毕了,关于Spring Boot 也应该入门了,后续会有关于SpringBoot 的其他讲解,敬请期待!

    展开全文
  • C语言编写学生信息管理系统————适用于广大新手学习编写思路:(1)明确目的后,先写main()函数,使程序能通过输入的指令调用相应的函数,来实现所需的功能。(2)接着写数据输入函数write():通过文件的打开...

    C语言编写学生信息管理系统————适用于广大新手学习

    编写思路:

    (1)明确目的后,先写main()函数,使程序能通过输入的指令调用相应的函数,来实现所需的功能。

    (2)接着写数据输入函数write():通过文件的打开、输入,将要输入的信息保存进文件,再关闭。

    (3)接着写数据输出函数output():通过文件的打开、读取及打印到屏幕上,将文件的信息打印到屏幕上,最后将文件关闭。

    (4)接下来写程序首界面函数face():设计界面并通过循环实现。

    (5)接着写数据查找函数seek():先将你要查找的数据的学号赋予temp,通过文件的打开、读取,将数据读取出来,然后将读取出来的数据按顺序一一与temp对比,当两个相等时输出,若不相等,则输出“无此数据”,最后将文件关闭;

    (6)再写数据排序函数sort():将文件打开,通过冒号排序法,按数据的学号大小进行排序,然后再将数据写入文件,最后将文件关闭;

    (7)然后写数据删除函数sdelete():将要删除的数据的学号赋值给temp,然后通过文件的打开、读取,将数据读取出来,然后将读取出来的数据按顺序一一与temp对比,当两个相等时,该数据后面的数据往前移一位,即ob[i]=ob[i+1],将其覆盖,并使总数据数减1,最后将文件关闭;

    (8)接着写数据插入函数insert():将文件打开,判断文件中是否已有数据,若有,则继续执行插入功能。插入:将要插入的位置及后面的数据都往后挪,总数据个数n加一,再将输入的数据覆盖掉要插入位置的数据,再将数据写入文件,最后关闭文件。

    (9)接着写数据个数n的起始化函数initaln():判断是否存在文件,若不存在,则创建一个文件在D盘,若存在,则打开文件,将数据读取出来,计算出数据个数n最后再将文件关闭;

    (10)最后写退出系统函数quit():由于在主函数中运用死循环来多次调用函数,所以需要一个程序来退出系统。该函数主要有退出界面设计和退出指令exit(0)完成。

    详情代码请看:

    点击打开链接


    展开全文
  • 学生成绩管理管理系统

    万次阅读 多人点赞 2020-06-23 15:18:26
    学生成绩管理管理系统 一,需求分析 1、编写目的 为了明确软件需求、安排项目规划与进度、组织软件开发与测试,撰写本文档。本文档供项目经理、设计人员、开发人员参考。 2、项目背景 使用计算机对学生信息进行管理...
  • Java+学生信息管理系统+GUI+文件

    万次阅读 多人点赞 2019-07-05 20:10:03
    系统可实现学生信息的增加,删除,修改,查询,并将学生信息存储在文件中 其中, 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以...
  • 学生成绩管理系统设计》 二、实训目的 (1)掌握结构化程序设计的基本方法,基本掌握面向对象程序设计的基本思路和方法。 (2)掌握C++的基本概念和基础知识。 (3)通过训练能够读懂较为复杂的C++语言源程序...
  • 学生管理系统需求分析

    万次阅读 2019-10-05 10:22:49
    本文档描述了学生管理系统的功能和性能的要求,将作为对该项目在概要设计阶段的设计输入。 本文档的预期读者包括: 设计开发人员 项目管理人员 测试人员 用户 1.2 项目范围 该文档的目的是解决整个项目系统中“做...
  • 学生管理系统的设计与实现 - 顺序表

    万次阅读 多人点赞 2017-05-26 00:05:41
    实验题目:学生管理系统的设计与实现 实验环境:Visual C++ 6.0或其他C++环境 一、实验目的 1、掌握重要的排序算法――直接插入排序和快速排序; 2、掌握折半查找算法。 3、综合运用所学数据结构知识,提高解决...
  • 学生学籍管理系统

    万次阅读 多人点赞 2013-07-05 12:28:15
    我们小组所设计的学生学籍管理数据库系统主要分为两大模块层面,一是:学生登录层面,二是:教师登录层面。不同层面根据不同用户的需求所实现的功能不同,这样能够更人性化地贴合个体的使用,最大程度地提升系统的...
  • 学生信息管理系统需求规格

    千次阅读 2019-10-28 21:24:08
    学生信息管理系统需求规格 桂林理工大学 软件工程 评审日期: 2019 年 9 月 26日 目录 目录 1.导言 5 1.1 编写目的 5 1.2 项目范围 5 1.3 参考资料 5 1.4 版本更新信息 6 2.项目介绍 6 2.1 项目背景 6 2.2 项目...
  • java课程设计 学生管理系统

    千次阅读 2019-01-18 00:22:00
    java课程设计 学生管理系统 学生成绩管理系统 可实现功能 学生管理系统 查询学生信息:姓名、学号、性别、出生年月日。(学号自动生成且唯一) 查询学生成绩:每个人都有数学、Java与体育与选修课 查询...
  • JAVA 实现简单的学生成绩管理系统

    万次阅读 多人点赞 2018-04-15 10:27:23
    2.掌握简单的信息管理系统的设计与实现。二、实验环境实验建议在安装了以下软件的计算机上完成:1.Windows xp/win7/win8/win10操作系统2.JDK 1.6以上版本3.Eclipse或NetBeans IDE或EditPlus或其它开发工具三、实验...
  • 软件工程项目学生管理系统

    千次阅读 2020-05-06 09:59:22
    软件工程项目 学生管理系统 专业: 姓名: 年级: 学号 : 目录 1 设计任务与目的 3 1.1 项目计划 3 2 需求分析 3 2....
  • 学生作业信息管理系统

    万次阅读 多人点赞 2018-06-23 00:36:18
        其次,答题信息管理系统可以大大提高老师与学生之间的在家庭作业和考核之间交流的效率,同时由于对题目以及学生成绩进行了数字化,可以对学生成绩及老师教学效果进行大数据分析。     最...
  • Node.js学生管理系统(Express+MongoDB)

    千次阅读 多人点赞 2018-08-12 11:00:22
    如果想看用其他数据持久化案例(如MySQL数据库),可以点击 Node学生管理案例  目录 一、完成功能:实现对“学生信息”的增删改查。并且实现了数据持久化。 数据库为MongoDB。 二、使用到的技术:基于Express...
  • Node.js学生管理系统(Express+MySQL)

    千次阅读 多人点赞 2018-08-12 14:59:20
    如果想看用其他数据持久化案例(如MongoDB数据库),可以点击 Node学生管理案例  目录 一、完成功能:实现对“学生信息”的增删改查。并且实现了数据持久化。 数据库为MySQL。 二、使用到的技术:基于Express...
  • 基于springboot的学生信息管理系统

    万次阅读 热门讨论 2019-07-10 10:00:56
    系统使用 MySQL作为数据库,MySQL数据库是一款开源的免费的关系型数据库,功能非常强大,拥有图形用户界面,一般应用于大型的公司作为数据存储。由于开源并且是免费的,因此广受大家的青睐[1]。 (2) SpringBoot ...
  • MySQL学生成绩管理系统设计实验报告

    千次阅读 多人点赞 2020-12-01 21:46:15
    一、概述 主要介绍学生成绩管理系统项目开发的背景、目的、对象以及研究内容。 1.1项目背景 每个学校都需要在期末进行考试成绩的统计分析工作,而这些工作都...1.2编写目的 开发出一个操作简便、界面友好、灵活实用、
  • 用JDBC+GUI做的一个简单的学生管理系统

    千次阅读 多人点赞 2018-04-17 20:14:46
    刚学完JDBC不久,做了一个简单的学生管理系统,可能还有不完善的地方,望各路大神见谅。废话不多说,我先贴个图让大家让大家瞅瞅,觉得是你想要的再看下去吧。我是以管理者的身份去做的,适合初学者去学习。在做之前...
  • 学生宿舍信息管理系统

    千次阅读 多人点赞 2020-12-31 15:20:16
    本系统专门针对学校的公寓管理而开发的一个功能齐全、操作简单的学生公寓管理系统。适合学校的宿舍管理人员使用。本系统实现以下基本功能:管理员可以对公寓进行全程管理,不仅可以管理学生,还可以管理寝室人员及...
  • Java实现学生信息管理系统

    万次阅读 多人点赞 2021-03-28 11:12:43
    学生信息管理系统,要求完成以下基本任务: 1.有良好程序风格(文档注释,函数注释,语句注释)。 2.将功能补充完全(基于文件处理,完成刷新和保存功能)。 3.将学生信息改为更好的数据组织,而非离散形式...
  • Java学生成绩管理系统

    万次阅读 多人点赞 2019-09-21 09:32:45
    目录 引言 开发环境 所用技术 项目目录 数据库设计 功能介绍 源码下载 更多优质练手项目 Java个人博客项目 JavaWeb练手项目ATM机 Java图书管理系统 Java电子发票管理系统 引言 这是当时刚学完SpringMVC、Spring-Data...
  • 学生学籍管理系统可行性分析报告

    千次阅读 多人点赞 2020-04-28 21:46:14
    1.1编写目的 通过对学生学籍管理系统项目进行一系列的详细调查研究,明确了该系统项目的实现在技术、经济和社会因素方面的可行性,阐述为了合理地达到项目目标的实现报告,对软件开发中将要面临的问题及其解决方案...
  • JavaWeb学习案例——学生管理系统

    千次阅读 2019-12-26 10:47:01
    JavaWeb学习案例——学生管理系统 引入jar包: 1、 c3p0-0.9.1.2.jar // 第三方数据库连接池 2、commons-dbutils-1.4.jar // 第三方数据库操作方法封装 3、jstl.jar // jsp中jstl语法引入 4、mysql-connector-...
  • 要注意每一步的目的与意义,最终设计好一个完整的产品管理系统。 5.简单修改的宿舍管理系统: #include"stdio.h" #include"stdlib.h" #include"string.h" #include"conio.h" #define PAGE 3 #...
  • 广州大学MFC实验报告——学生成绩管理系统

    千次阅读 多人点赞 2019-06-08 10:33:38
    一、实验目的 本实验是对前面所学知识的总结,通过一个比较完整的应用程序的设计,将学过的知识连贯起来,掌握开发一个实际应用程序的步骤,同时学会使用开发工具实现界面友好的应用程序。并通过本实验,掌握如何...
  • 学生信息管理系统总结

    千次阅读 2019-06-25 19:02:14
    综合运用J2SE有关知识开发【学生信息管理系统】。主要涉及程序控制结构、面向对象编程、图形用户界面、Java数据库应用、MySQL数据库这几个方面的内容。通过本项目的开发,了解系统开发的一般流程,初步了解MVC模式与...
  • 学生管理系统的设计与实现(c语言版本数据结构)

    千次阅读 多人点赞 2020-07-09 18:54:04
    文章目录学生管理系统的设计与实现1、需求分析1.1 实验目的:1.2 实验内容:1.3实验要求:1.4概要设计:2、概要设计2.1所用数据结构的定义及其相关说明(相关结构体或类的定义及其含义)2.2、各子程序调用关系2.3、各...
  • 那么今天就给大家带来一个链表版本的学生成绩管理系统,希望对大家的学习有所帮助,这个项目采用链表这一数据结构最为底层的存储框架,然后是用文件对数据进行一个永久存储,达到了数据持久化的目的 以上是代码...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,352
精华内容 9,740
关键字:

学生管理系统编写目的