精华内容
下载资源
问答
  • 2021-07-28 23:11:01

    C语言-学生成绩管理系统

    全部代码如下:

    #include<stdlib.h>
    #include<stdio.h>
    #include<string.h>
    #include<conio.h> 
    
    #define MAXSIZE 100
    
    void display();         // 主界面展示函数
    
    void isert();           // 插入学生信息函数
    
    void show();            // 学生信息显示示函数
    
    void find();            // 主查询函数
    void findById();        // 通过学号查询学生
    void findByName();      // 通过姓名查询学生
    
    void modify();          // 主修改函数(包括通过学号修改与删除函数)
    void modifyById();      // 通过Id修改学生信息
    void deleteById();      // 通过Id删除学生信息
    
    void sort();            // 主排序函数
    void sortByAvg();       // 平均分排序函数
    void sortByScore1();    // 成绩1排序函数
    void sortByScore2();    // 成绩2排序函数
    void sortByScore3();    // 成绩3排序函数
    
    void save();            // 文件保存函数
    void load();            // 文件加载函数
    
    void shutdown();        // 退出函数
    
    // 学生信息结构体
    struct student{
      	int id;                         //学号
      	char name[20];                  //姓名
      	char sex[4];                    //性别
      	double score1;                  //成绩1
      	double score2;                  //成绩2
      	double score3;                  //成绩3
      	double ave;                     //平均分         
    };
    
    // 定义队列的结构体
    typedef struct Squeue {
    	struct student data[MAXSIZE];
    	int front;
    	int rear;
    }Squeue;
    
    // 初始化队列
    void InitQueue(Squeue* qu)
    {
    	qu->front = qu->rear = 0;
        for (int i = 0; i < MAXSIZE; i++) {
            qu->data[i].id = 0;
            strcpy(qu->data[i].name, "NULL");
            strcpy(qu->data[i].sex, "NULL");   // 解决表达式必须是可修改的左值(字符串不能直接赋值)
            qu->data[i].score1 = 0.0;
            qu->data[i].score2 = 0.0;
            qu->data[i].score3 = 0.0;
            qu->data[i].ave = 0.0;
        }
    }
    
    // 判断队列是否为空
    int isQueueEmpty(Squeue* qu)
    {
    	if (qu->front == qu->rear)
    	{
    		return 1;
    	}
    	else
    	{
    		return 0;
    	}
    }
    
    // 元素入队操作
    int EnQueue(Squeue* qu, struct student s)
    {
    	//若队满则无法入队
    	if ((qu->rear + 1) % MAXSIZE == qu->front)
    	{
    		return 0;
    	}
    	qu->data[qu->rear].id = s.id;
        strcpy(qu->data[qu->rear].name,  s.name);
        strcpy(qu->data[qu->rear].sex, s.sex);
        qu->data[qu->rear].score1 = s.score1;
        qu->data[qu->rear].score2 = s.score2;
        qu->data[qu->rear].score3 = s.score3;
        s.ave = (s.score1 + s.score2 + s.score3) / 3;
        qu->data[qu->rear].ave = s.ave;
        qu->rear = (qu->rear + 1) % MAXSIZE;
        return 1;
    }
    
    // 元素出队操作
    int Dequeue(Squeue* qu)
    {
    	//若队空则无法出队
    	if (qu->front == qu->rear)
    	{
    		return 0;
    	}
    	qu->front = (qu->front + 1) % MAXSIZE;
    	return 1;
    }
    
    // 系统主函数入口
    int main(){
    
        int flag = 1;
        int choice;
    
        Squeue *Q;
        Q = (Squeue*)calloc(20,sizeof(Squeue));
        InitQueue(Q);
    
        load(Q);    //完成数据的预读取
    
        while (flag) {
    
            display();
    
            printf("\t请在0-9之间做出选择:");
    
            fflush(stdin);          //清除输入设备的缓冲
            scanf("%d", &choice);
    
            switch (choice)
            {
                case 1:
                     system("cls");
                     insert(Q);
                     break;
    
                case 2:
                     system("cls");
                     show(Q);
                     break;
    
                case 3:
                     system("cls");
                     sort(Q);
                     break;
    
                case 4:
                     system("cls");
                     modify(Q);
                     break;
    
                case 5:
                     system("cls");
                     find(Q);
                     break;     
    
                case 6:
                    save(Q);
                    shutdown();
    
                default:
                     system("cls");
                     continue;              
            }
    
        }
        return 0;
    }
    
    // 主页面展示函数
    void display() {
        printf("\t************学 生 管 理 系 统**********\n");
        printf("\t1.录入学生信息\n");
    	printf("\t2.显示学生信息\n");
    	printf("\t3.学生成绩排序\n");
    	printf("\t4.编辑学生信息\n");
    	printf("\t5.查询学生成绩\n");
    	printf("\t6.退出\n");
        printf("\t************学 生 管 理 系 统**********\n");
    }
    
    // 插入学生信息函数
    void insert(Squeue *Q) {
        int i = 0;
        char ch;
        do
        {
             struct student s;
             printf("\n");
             printf("\t正在录入第%d个学生的信息", i + 1);
    
             printf("\n");
             printf("\t输入学生学号:");
             scanf("%d", &s.id);
             fflush(stdin);
    
             printf("\n");
             printf("\t输入学生姓名:");
             fflush(stdin);
             gets(s.name);
    
             printf("\n");
             printf("\t输入学生性别:");
             fflush(stdin);
             gets(s.sex);
    
             printf("\n");
             printf("\t输入学生成绩1:");
             scanf("%lf", &s.score1);
             fflush(stdin);
    
             printf("\n");
             printf("\t输入学生成绩2:");
             fflush(stdin);
             scanf("%lf", &s.score2);
    
             printf("\n");
             printf("\t输入学生成绩3:");
             fflush(stdin);
             scanf("%lf", &s.score3);
    
             printf("\n");
    
             EnQueue(Q,s);
             i++;
    
             printf("\t是否继续输入?(Y/N)");
             fflush(stdin);
             ch = getch();
             system("cls");
    
       }while(ch != 'n' && ch != 'N');
       system("cls");
    }
    
    // 学生信息显示示函数
    void show(Squeue *Q) {
        int i;
      	char choice;
      	do{
            printf("\n");
            printf("\t班级学生信息列表\n");
    
          	printf("\t学号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n");
          	for(i = Q->front; i < Q->rear; i++){
                if(Q->data[i].id == 0) {  // 解决删除时候最后元素异常显示问题
                    continue;
                }  
                printf("\t%d\t%s\t%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", Q->data[i].id, Q->data[i].name, Q->data[i].sex, Q->data[i].score1, Q->data[i].score2, Q->data[i].score3, Q->data[i].ave);
            }
    
          	printf("\t\t\t按任意键返回主菜单\a");
          	fflush(stdin);
    
          	choice = getch();
    
       	}while(!choice);
     	system("cls");
    }
    
    // 文件保存函数
    void save(Squeue *Q) {
        FILE *fp;
        int i;
    
        if((fp = fopen("D://Student.txt", "w")) == NULL)
        {
            printf("\n保存失败!");
            shutdown();
        }
        
        for(i = Q->front; i < Q->rear; i++)
         {
            if(Q->data[i].id == 0) {  // 解决删除时候最后元素异常显示问题
                continue;
            }  
            fprintf(fp, "%d %s %s %lf %lf %lf %lf\t", Q->data[i].id, Q->data[i].name, Q->data[i].sex, Q->data[i].score1, Q->data[i].score2, Q->data[i].score3, Q->data[i].ave);
            //fwrite(&Q->data[i], sizeof(struct student), 1, fp);
         }
    
         fclose(fp);
         printf("学生信息已自动保存!\n");
    }
    
    // 文件加载函数
    void load(Squeue *Q) {
        FILE *fp;
      	int i;
      	
      	if((fp = fopen("D://Student.txt", "r")) == NULL)        // 需要提前准备好文件
        {
           printf("找不到文件!\n");
           shutdown();
        }
    
        fseek(fp, 0, SEEK_SET);
    
        for(i = Q->front; i < MAXSIZE && !feof(fp); i++)
        {
            fscanf(fp, "%d %s %s %lf %lf %lf %lf\t", &Q->data[i].id, Q->data[i].name, Q->data[i].sex, &Q->data[i].score1, &Q->data[i].score2, &Q->data[i].score3, &Q->data[i].ave);
            //fread(&Q->data[i], sizeof(struct student), 1, fp);
            Q->rear++;          // 解决文件读取异常情况,指针未后移
        }
    
     	fclose(fp);
    }
    
    // 主查询函数
    void find(Squeue *Q){
        int choice;
        int flag = 1;  // 设置标志位,结束循环
        do{
            printf("\n");
            printf("\t学生查询系统\n");  
            printf("\t1.按照学生学号查询\n");
            printf("\t2.按照学生姓名查询\n");
            printf("\t3.返回主菜单\n");
            printf("\t请输入要选择的功能:");
            fflush(stdin);
            scanf("%d", &choice);
            switch(choice)
                {
                case 1:
                    system("cls");
                    findById(Q);
                    break;
                case 2:
                    system("cls");
                    findByName(Q);
                    break;
                case 3:
                    system("cls");
                    flag = 0;
                    break;
                default:
                    system("cls");
                    find(Q);
                    break;
                }
            }while(flag);
            system("cls");
    }
    
    // 通过学号查询学生
    void findById(Squeue *Q){
        int i;
        int choice;
        char as;
        do{
            printf("\n");
            printf("\t输入要查询的学生学号:\a");
            fflush(stdin);
            scanf("%d", &choice);
    
            for(i = Q->front; i < Q->rear; i++) {
                if(choice == Q->data[i].id)
                {
                    printf("\t学号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n");
                    printf("\t%d\t%s\t%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", Q->data[i].id, Q->data[i].name, Q->data[i].sex, Q->data[i].score1, Q->data[i].score2, Q->data[i].score3, Q->data[i].ave);
                }
            }
    
            printf("\t按任意键返回主菜单");
            fflush(stdin);
            as = getch();
         }while(!as);
        system("cls");
    }
    
    // 通过姓名查询学生
    void findByName(Squeue *Q){
        int i;
        char str[20],as;
        do{
            printf("\n");
            printf("\t输入要查询的学生姓名:");
            fflush(stdin);
            gets(str);
    
            for(i = Q->front; i < Q->rear; i++) {
                if(!strcmp(Q->data[i].name,str))
                {
                    printf("\t学号\t姓名\t性别\t成绩1\t成绩2\t成绩3\t平均值\n");
                    printf("\t%d\t%s\t%s\t%.2lf\t%.2lf\t%.2lf\t%.2lf\n", Q->data[i].id, Q->data[i].name, Q->data[i].sex, Q->data[i].score1, Q->data[i].score2, Q->data[i].score3, Q->data[i].ave);
                }
            }
    
            printf("\t按任意键返回主菜单");
            fflush(stdin);
            as=getch();
         }while(!as);
        system("cls");
    }
    
    // 主修改函数(包括通过学号修改与删除函数)
    void modify(Squeue *Q){
        int choice;
        int flag = 1;  // 设置标志位,结束循环
        do{
            printf("\n");
            printf("\t学生修改系统\n");  
            printf("\t1.按照学号修改学生\n");
            printf("\t2.按照学号删除学生\n");
            printf("\t3.返回主菜单\n");
            printf("\t请输入要选择的功能:");
            fflush(stdin);
            scanf("%d", &choice);
            switch(choice)
                {
                case 1:
                    system("cls");
                    modifyById(Q);
                    break;
                case 2:
                    system("cls");
                    deleteById(Q);
                    break;
                case 3:
                    system("cls");
                    flag = 0;
                    break;
                default:
                    system("cls");
                    modify(Q);
                    break;
                }
            }while(flag);
            system("cls");
    }
    
    // 通过Id修改学生信息
    void modifyById(Squeue *Q){
        int i;
        int SearchId;
    
        printf("\t输入要修改的学生学号:");
      	fflush(stdin);
      	scanf("%d", &SearchId);
    
        for(i = Q->front; i < Q->rear; i++)
      	{
         	if(Q->data[i].id == SearchId){
                printf("\n");
                system("cls");
            	struct student stu;
            	printf("\t输入修改后学生信息\n");
    
            	Q->data[i].id = SearchId;
    
                printf("\t输入学生姓名:");
                fflush(stdin);
                gets(stu.name);
                strcpy(Q->data[i].name, stu.name);
                printf("\n");
    
            	printf("\t输入学生性别:");
            	fflush(stdin);
            	gets(stu.sex);
            	strcpy(Q->data[i].sex, stu.sex);
                printf("\n");
    
            	printf("\t输入学生成绩1:");
            	fflush(stdin);
            	scanf("%lf", &stu.score1);
            	Q->data[i].score1 = stu.score1;
                printf("\n");
    
            	printf("\t输入学生成绩2:");
            	fflush(stdin);
            	scanf("%lf", &stu.score2);
            	Q->data[i].score2 = stu.score2;
                printf("\n");
    
            	printf("\t输入学生成绩3:");
            	fflush(stdin);
            	scanf("%lf", &stu.score3);
            	Q->data[i].score3 = stu.score3;
                printf("\n");
    
    			system("cls");
                printf("\t修改成功,系统自动跳转!\n");
                show(Q);
                break;
           	}
      	}
      	printf("\t删除失败!查无此人,系统自动跳转!");
        modify(Q);
    }
    
    // 通过Id删除学生信息
    void deleteById(Squeue *Q){
        int num;
        printf("\t输入要删除学生的学号:");
        fflush(stdin);
        scanf("%u",&num);
        for(int i = Q->front; i < Q->rear; i++){
            if(Q->data[i].id == num){
                for (int j = i; j < Q->rear; j++)
                {
                    Q->data[j] = Q->data[j + 1];
                }
                printf("\t删除成功!自动跳转查询全部学生页面!");
                show(Q);
                break;
            }
        }
        printf("\t删除失败!查无此人,系统自动跳转!");
        modify(Q);
    }
    
    // 主排序函数
    void sort(Squeue *Q) {
        int choice;
        int flag = 1;  // 设置标志位,结束循环
        do{
            printf("\n");
            printf("\t学生排序系统\n");  
            printf("\t1.按照平均分排序\n");
            printf("\t2.按照成绩1排序\n");
            printf("\t3.按照成绩2排序\n");
            printf("\t4.按照成绩3排序\n");
            printf("\t5.返回主菜单\n");
            printf("\t请输入要选择的功能:");
            fflush(stdin);
            scanf("%d", &choice);
            switch(choice)
                {
                case 1:
                    system("cls");
                    sortByAvg(Q);
                    break;
                case 2:
                    system("cls");
                    sortByScore1(Q);
                    break;
                case 3:
                    system("cls");
                    sortByScore2(Q);
                    break;
                case 4:
                    system("cls");
                    sortByScore3(Q);
                    break;        
                case 5:
                    system("cls");
                    flag = 0;
                    break;
                default:
                    system("cls");
                    sort(Q);
                    break;
                }
            }while(flag);
            system("cls");
    }
    
    // 平均分排序函数
    void sortByAvg(Squeue *Q) {
        struct student temp;   // 临时变量学生
        int i, j;
        for(i = Q->front; i < (Q->rear - 1); i++){
            for(j = Q->front; j < (Q->rear - i - 1); j++){
                if(Q->data[j].ave < Q->data[j + 1].ave){
                    temp = Q->data[j];
                    Q->data[j] = Q->data[j + 1];
                    Q->data[j + 1] = temp;
                }
            }
        }
        show(Q);
    }
    
    // 成绩1排序函数
    void sortByScore1(Squeue *Q) {
        struct student temp;   // 临时变量学生
        int i, j;
        for(i = Q->front; i < (Q->rear - 1); i++){
            for(j = Q->front; j < (Q->rear - i - 1); j++){
                if(Q->data[j].score1 < Q->data[j + 1].score1){
                    temp = Q->data[j];
                    Q->data[j] = Q->data[j + 1];
                    Q->data[j + 1] = temp;
                }
            }
        }
        show(Q);
    }
    
    // 成绩2排序函数
    void sortByScore2(Squeue *Q) {
        struct student temp;   // 临时变量学生
        int i, j;
        for(i = Q->front; i < (Q->rear - 1); i++){
            for(j = Q->front; j < (Q->rear - i - 1); j++){
                if(Q->data[j].score2 < Q->data[j + 1].score2){
                    temp = Q->data[j];
                    Q->data[j] = Q->data[j + 1];
                    Q->data[j + 1] = temp;
                }
            }
        }
        show(Q);
    }
    
    // 成绩3排序函数
    void sortByScore3(Squeue *Q) {
        struct student temp;   // 临时变量学生
        int i, j;
        for(i = Q->front; i < (Q->rear - 1); i++){
            for(j = Q->front; j < (Q->rear - i - 1); j++){
                if(Q->data[j].score3 < Q->data[j + 1].score3){
                    temp = Q->data[j];
                    Q->data[j] = Q->data[j + 1];
                    Q->data[j + 1] = temp;
                }
            }
        }
        show(Q);
    }
    
    // 退出函数
    void shutdown() {
        exit(0);
    }
    
    更多相关内容
  • Python编写的学生成绩管理系统具有可视化界面
  • 2.管理用户查看学生整体对应学科的成绩信息 3.管理用户修改某个学生对应学科的成绩信息 4.管理用户增加某个学生对应学科的成绩信息 5.管理用户删除某个学生对应学科的成绩信息 成绩公示用户模块: 1.学生...
  • 学生管理系统的前端界面设计,成绩,名称等页面互相链接
  • 成绩管理系统V1.0 版本说明: 1.开发工具vs2012,数据库MSsql2005 2.数据库的连接字符串在web.config文件中,数据库文件在App_Data文件夹下,附加后,修改连接字符串为本地数据库的密码即可 3.程序入口为login.aspx,...
  • 基于python图形化界面学生成绩管理系统.pdf
  • 1.学生成绩管理系统分为三个用户角色,登录界面可以选择三种不同的角色进行登录系统 2.管理员角色登录系统可以有以下功能: 管理考试信息:可以对考试批次信息进行增删改查操作 管理教师信息:可以对教师个人信息...
  • 对于信息管理系统的一系列要求,对系统提出以下要求: (1)需要进行身份认证登录。学生登录系统后可以进行信息更换、增加、删除,并查询自己的考试成绩;后台操作人员登录系统后,可以根据操作人员所属角色进行指定...
  • 在压缩包下有完整的基于Java Web的学生成绩管理系统,设计的数据表、数据库后台代码实现(包括存储过程、触发器、用户自定义函数)、管理系统功能展示页面图片以及系统设计报告。在该系统中有三个权限:管理员、教师...
  • 学生成绩管理系统的开发主要包括前台用户界面的开发和后台数据库的开发,对于后台数据库的建立和维护要求建立起数据一致性和完整性强、数据安全性好的数据库。而对于前端应用程序的开发则要求应用程序能提供强大的...
  • 学生成绩管理系统,功能分为: (1)添加功能:程序能够添加不同学生的记录,提供选择界面用户选择所要添加的类别,要求学号要唯一,如果添加了重复学号的记录时,则提示数据添加重复并取消添加。 (2)查询功能:...
  • ·按课程录入学生成绩 ·按学生录入成绩 院系信息管理。 ·数据查询 ·学生基本信息浏览 ·课程基本信息浏览 ·学生基本信息查询 ·课程基本信息查询 ·学生成绩信息查询 ·课程成绩信息查询 以上查询提供...
  • 5.2 系统界面的搭建与登录的实现 5.2.1 系统界面的设计与实现 5.2.2 登录功能实现 5.3 学生功能实现 5.4 教师功能实现 5.4.1 成绩功能实现 5.4.2 其他信息查询 5.5 管理员功能实现 5.6 本章小结 第六章 ...
  • Python学生成绩管理系统基于tkinter带界面,一个带有登录界面具有增减改查功能的学生成绩管理系统,管理员用户名及密码均为admin,学生信息、成绩信息保存在students.txt中。main.py主程序,Login.py用户登录验证,db...
  • 一款学生成绩管理系统永久免费版源码 v6.0.8,系统不但有学生信息管理,而且还有老师的管理,和留言板等功能。 更新说明: 1、锁定考试项目以后还能录成绩的BUG 2、写留言版对齐问题 3、任课教师录成绩会显示不同...
  • 系统针对中小学成绩管理的实际情况,操作简单,功能实用,设置灵活,能充分满足中小学教师与班主任管理成绩的需要。 利用该系统你能进行成绩表管理,包括建表、浏览、追加、修改、删除、查询、排序、统计分析等等...
  • E23 A BCD English ID name 009937538743664 15 6 9 3 53 8436 4 3 504789548354664 4687775582 56 4 458566664 4 5 5 6 6 6 4 謹ss粋壽蠶鬻SI 1-2 34567891011I 12 1-1 13I1 41 51 61 7 Fil* Ueit Sal?...
  • C++学生成绩管理系统

    2020-10-20 20:11:11
    (1)整个系统均用C/C++语言实现。...(4)各模块功能相互独立,通过用户界面的设计实现控制(如将功能模块编号,通过数字键的选择实现相应的控制) 。 (5)在确保整个程序已经完成的条件下再完善程序的次要功能。
  • 学生成绩管理系统的应用也为今天的民办教育在未来市场的竞争力有所提高。 (4)学生成绩管理是一个非常繁琐与复杂的一项工作,一个原因就是工作量大,不好管。对于一个学校而言,管理好学生的成绩,是非常重要的...
  • JAVA实现学生信息管理系统+图形用户界面(GUI)
  • 1. 登录界面:教师端和学生端 2.新用户注册 3.学生端 (1)显示学生姓名及日期 (2) 修改密码 (3) 查询、修改个人信息等 4.教师端 ... (2) 学生成绩管理 添加成绩 删除成绩 修改成绩 查询成功
  • 管理系统界面设计 包括:学籍的录入,更改,删除。成绩的录入、修改、删除。...还有学生的图形用户界面能看到自己的成绩及学籍信息。 后续你们可以在登录时实现用户分类意思就是登录之后直接跳转到应该的界面。
  • 学生成绩管理系统主要包括前台用户界面的开发和后台数据库的开发,重点在于后台数据库的开发。要求建立起完整性强、数据一致性和数据安全性好的数据库。在前端用户界面的开发和设计则要求应用程序能提供强大的数据...
  • 基于Web的学生成绩管理系统

    千次阅读 2021-03-19 16:50:30
    本次课程设计课题为学生成绩管理系统,该学生成绩管理系统主要包括前台用户界面的开发和后台数据库的开发,重点在于后台数据库的开发。要求建立起完整性强、数据一致性和数据安全性好的数据库。在前端用户界面的开发...
    源码及论文下载:
    http://www.byamd.xyz/tag/java/
    
    

    摘 要

    本次课程设计课题为学生成绩管理系统,该学生成绩管理系统主要包括前台用户界面的开发和后台数据库的开发,重点在于后台数据库的开发。要求建立起完整性强、数据一致性和数据安全性好的数据库。在前端用户界面的开发和设计则要求应用程序能提供强大的数据操纵功能,同时也要具备界面友好、使用简单方便等特点。之后需要将数据通过界面操作输入到系统的数据库里面。

    本系统主要运用MySQL为后台数据库,web作为前台技术,以eclipse为开发工具,系统实现了老师管理、学生管理、班级管理、课程管理、学生成绩报表等必需的功能,做到操作简单,界面友好,运行比较稳定,可适用于大学院校大学生成绩管理。

    关键词:学生成绩管理 ,java EE,MySQL数据库 ,eclipse

    **
    **

    Abstract

    This course design topic for the student achievement management system, the student achievement management system mainly includes the development of the foreground user interface and the backstage database, the emphasis is on the development of the background database. It is required to establish a database with strong integrity, data consistency and data security. In the front-end user interface development and design requires that the application program can provide powerful data manipulation function, and also has the characteristics of friendly interface, simple and convenient use. After that, we need to input the data into the database of the system through the interface operation.

    This system mainly uses MySQL as the background database, web as the foreground technology and eclipse as the development tool. The system realizes the necessary functions such as teacher management, student management, class management, course management, student score report and so on. It has the advantages of simple operation, friendly interface and stable operation, which can be applied to the management of College Students’ scores.

    Key words: student achievement management, Java EE, MySQL database, eclipse

    第一章 绪 论

    1.1研究的背景及意义

    1.1.1选题的背景

    随着教育事业的不断发展, 学校的规模不断扩大, 学生数量及其信息量的急剧增加, 有关学生的各种信息处理也随之展开。学生成绩管理信息系统应运而生了,它可用来管理学生信息与提高系统管理工作的效率。学生成绩管理系统把 eclipse(前台开发)与 MYSQL(后台管理)有机地结合,完成学生信息的规范管理、科学统计和快速查询,从而可大大减少该管理上的工作量。

    数据库在一个信息管理系统中占有非常重要的地位,数据库结构设计的好坏将直接对应用系统的效率以及实现的效果产生影响。 合理的数据库结构设计可以提高数据库存储的效率, 保证数据的完整性和一致性。同时,合理的数据结构也将有利于程序的顺利实现。

    1.2系统目标

    该系统主要建立一个基于B/S模式的实验室信息管理系统,用户和管理员不需要下载客户端就可以通过浏览器访问学生管理系统,快捷方便,从网页获取当前的学生信息,及时的更新信息,修改信息,保证信息的正确性和时效性,从而更好、更快捷、更便利的管理学 生信息,实现学生信息的直观可视化和及时可靠化,本系统主要针对与系统相关的两类用 户实现信息的管理:

    1.对于管理员:可以登陆到管理员页面,可以方便的进行班级信息管理、成绩信息管理、用户管理和系统管理。

    2.对于教师:教师可以通过登录进入普通用户界面以后进行班级信息管理、成绩信息管理和系统管理,但是无法修改其他的用户的信息。

    3.对于学生:学生可以通过登录进入普通用户界面以后进行班级信息查询、成绩信息查询。

    1.3组员分工

    题目学生成绩管理系统
    项目组成员个人项目描述自我评定
    1、前台web页面搭建及页面设计2、负责通过jdbc实现前后端链接调用3、使用navicat工具对数据库具体实施
    1、对学生成绩管理系统进行需求分析和具体系统功能设计2、构建思维导图、数据库表结构、视图文件,E-R图3、数据系统测试与维护4、使用navicat工具对数据库具体实施。

    注:排名不分先后

    **
    **

    第二章 需求分析

    2.1功能需求分析

    本课题为学校成绩管理系统,目的在于可以让教师更方便、快捷的增添、删除、修改学生的相关信息,让学生能够更加方便的查询自己的选课及课程成绩情况,并且支持管理员的后台信息管理。

    (1)用户添加功能,可以在本系统中添加管理员、教师、学生等不同权限级别的用户。

    (2)用户登录功能,实现不同权限级别用户的登录。

    (3)后台管理,实现学生信息管理、教师信息管理、课程信息管理、年级信息管理、班级信息管理等功能。

    (4)成绩管理,实现成绩录入、成绩统计、报表操作等功能。

    (5)数据库管理,实现MySQL数据库的初始化操作、数据库备份操作、数据库恢复等功能。

    根据需求分析得出学生成绩管理系统功能结构图。如图2.1-1所示:

    img

    图2.1-1 学生成绩管理系统功能结构图

    2.2 技术应用

    2.2.1 MySQL技术的应用

    MySQL 是一种快速易用的 RDBMS,很多企业(不分规模大小)都在使用它来构建自己的数据库。MySQL 由一家瑞典公司 MySQL AB 开发、运营并予以支持。它之所以非常流行,原因在于具备以下这些优点:

    (1)基于开源许可发布,无需付费即可使用。

    (2)自身的功能非常强大,足以匹敌绝大多数功能强大但却价格昂贵的数据库软件。

    (3)使用业内所熟悉的标准SQL数据库语言。

    (4)可运行于多个操作系统,支持多种语言,包括 PHP、PERL、C、C++ 及 Java 等语言。

    (5)非常迅速,即使面对大型数据集也毫无滞涩。

    (6)非常适用于 PHP 这种 Web 开发者最喜欢使用的语言。

    (7)支持大型数据库,最高可在一个表中容纳 5千多万行。每张表的默认文件大小限制为 4GB,不过如果操作系统支持,你可以将其理论限制增加到 800 万 TB。

    (8)可以自定义。开源 GPL 许可保证了程序员可以自由修改 MySQL,以便适应各自特殊的开发环境。

    2.2可行性分析

    2.2.1 技术可行性

    本系统是以Java EE为基础并结合MySQL语言进行开发的一款学生成绩管理系统。

    在Java EE开发方面,小组成员已经有一定的Java EE基础,已经熟练地掌握了web界面创建、easy ui 的使用。

    在数据库方面,小组成员使用MySQL关系型数据库来实现学生成绩管理系统中的各种数据的增、删、改、查等操作,严谨的使用MySQL的各种关系型语句并且与web界面相结合。

    2.2.2 操作可行性

    本学生成绩管理系统采用Java-EE技术实现了浏览器下的GUI界面。小组通过协作共同完成了GUI界面的规划,以及管理员、教师端、学生端等各种不同权限级用户的操作,使得任何用户都可以方便的在WEB界面下通过点击所需要的相关功能来实现相应权限所对应的各种操作。

    2.2.3 社会效益可行性

    本系统的设计完全基于免费、开源。我们旨在让该系统能够真正的应用到学校对学生成绩的管理当中,任何用户都可以免费的下载、使用并且可以参考、修改本系统的源代码,增加所需要的功能。

    2.3系统分析

    本课题为实现更加实用的学生成绩管理系统,对此系统做了详细的系统分析。包括系统的可行性分析和系统功能模块分析等。

    2.3.1软件体系结构

    学生成绩管理系统是对学生成绩信息的管理和维护,是以数据为中心的体系结构,依靠数据联通各个部分,使之协调工作。

    2.3.1.1体系结构示意图

    img 图2.3.1-1 学生成绩管理系统的体系结构示意图

    2.3.1.2 数据流图

    为了提高系统安全性,增加了用户身份验证环节。根据该系统的数据关系,整理出了图2.3.1-2所示的数据流图。本数据流图采用了事务分析的方法。

    img

    图2.3.1-2 学生成绩管理系统数据流图

    2.3.1.3 学生成绩管理系统功能思维导图

    从软件的整体布局考虑增加了系统初始化模块和菜单显示模块,用以完成系统运行环境的搭建,图3.1-3是对图3.1-2的数据流图进行分析和分解得到的功能思维导图。

    img

    图2.3.1-3 学生成绩管理系统功能思维导图

    2.4老师模块分析

    2.4.1模块结构

    由同组成员根据功能和数据流图可以得出教师服务子系统的软件结构图,如图2.4.1所示

    img

    图2.4.1教师服务系统软件结构图

    2.5学生模块分析

    2.5.1模块结构

    由同组成员根据功能和数据流图可以得出学生服务子系统的软件结构图,如图2.5.1所示

    img

    图2.5.1学生服务系统软件结构图

    2.6报表输出模块分析

    2.6.1功能描述

    基于HTTP servlet和DAO 方法实现了报表输出功能。可以通过选择某一年级的某一个班级,打印出该班级从入学到现在的所有学生的课程成绩到一个EXCEL表中。

    2.6.2具体实现代码

    public void exportScore(HttpServletResponse response, Exam exam) {

    ​ //获取需要导出的数据

    ​ List<Map<String, Object>> list = dao.getScoreList(exam);

    ​ //获取考试信息

    ​ Exam em = (Exam) dao.getObject(Exam.class, “SELECT name, time FROM exam WHERE id=?”, new Object[]{exam.getId()});

    ​ //设置文件名

    ​ String fileName = em.getName()+".xls";

    ​ //定义输出类型

    ​ response.setContentType(“application/msexcel;charset=utf-8”);

    ​ //设定输出文件头

    ​ try {

    ​ response.setHeader(“Content-Disposition”, “attachment; filename=”+URLEncoder.encode(fileName, “UTF-8”));

    ​ } catch (UnsupportedEncodingException e1) {

    ​ e1.printStackTrace();

    ​ }

    ​ //获取导出的课程

    ​ List courseList = getColumn(exam);

    ​ //表头长度

    ​ int len = 2 + courseList.size();

    ​ if(exam.getType() == Exam.EXAM_GRADE_TYPE){

    ​ len += 1;

    ​ }

    ​ //设置excel的列名

    ​ String[] headers = new String[len];

    ​ headers[0] = “姓名”;

    ​ headers[1] = “学号”;

    ​ int index = 2;

    ​ for(Object obj : courseList){

    ​ Course course = (Course) obj;

    ​ headers[index++] = course.getName();

    ​ }

    ​ if(exam.getType() == Exam.EXAM_GRADE_TYPE){

    ​ headers[len-1] = “总分”;

    ​ }

    ​ ExcelTool et = new ExcelTool<>();

    ​ //导出

    ​ try {

    ​ et.exportMapExcel(headers, list, response.getOutputStream());

    ​ } catch (Exception e) {

    ​ e.printStackTrace();

    ​ }

    ​ }

    **
    **

    第三章 数据库设计

    3.1概念结构设计

    3.1.1设计思路

    概念模型是数据库系统的核心和基础。概念设计阶段的主要任务和目标是根据需求分析的结果找出所有数据实体,画出对应的E-R图。对于较复杂的系统,通常首先要根据各个用户对数据和使用权限的不同画出各自对应的局部E-R图,然后把各个局部E-R综合起来形成系统的整体ER图。所以就针对本系统来说,根据实际业务,首先抽象班级信息管理、成绩管理、用户等实体,再根据业务的需求分析出各个实体所拥有的属性,并以此设计出系统的概念模型。

    3.1.1.1 管理员用户E-R图

    img

    图 3.1.1-1管理员用户E-R图

    3.1.1.2 教师教授科目及班级E-R图

    img

    图3.1.1-2教师科目班级E-R图

    3.1.1.3 教师学生E-R图

    img

    图3.1.1-3教师学生E-R图

    3.1.1.4 年级科目E-R图

    img

    图3.1.1-4年级科目E-R图

    3.1.1.5 学生成绩E-R图

    img

    图3.1.1-5学生成绩E-R图

    3.1.1.6 学生科目E-R图

    img

    图3.1.1-6学生科目E-R图

    3.1.1.7 全局E-R图

    img

    图3.1.1-7全局E-R图

    3.1.1.8 UML E-R图

    img

    图3.1.1-8UML E-R图

    3.2逻辑结构设计

    3.2.1设计思路

    逻辑设计阶段的主要任务和目标是根据概念设计的结果设计出数据库的逻辑结构模式,包括全局模式和各个外模式。对于本系统来说,管理员在使用本系统时,用账号和密码进行登陆操作,进入系统主页面。本系统包括班级信息管理、成绩信息管理、用户管理和系统管理,普通用户不具有用户管理这个模块。管理员可以通过系统对每个大模块下的小模块进行增、改、删、查等操作。

    3.3物理结构设计

    3.3.1存取方式

    数据库结构的物理设计是指对一个给定的逻辑数据模型选取一个最适合应用环境的物理结构的过程,主要是设计表结构。系统数据库设计中,实体对应于表,实体的属性对应于表的列,实体之间的关系成为表的约束。基本上是将逻辑设计中的实体转换成物理设计中的表,而本系统也是如此是通过关系表的形式存取数据。

    3.3.2存储结构

    数据库名:ssms

    序号表名标签说明功能说明
    1clazz班级表存储班级信息
    2clazz_course_teacher班级科目老师表存储老师授课班级及科目的信息
    3course科目表存储科目信息
    4escore成绩表存储成绩信息
    5exam考试表存储考试信息
    6grade年级表存储年级信息
    7grade_course年级科目表存储年级学习科目信息
    8student学生表存储学生信息
    9system系统表存储学生信息
    10teacher老师表存储老师信息
    11user用户表存储用户信息

    表名:clazz

    类型长度小数点允许空值
    idint110
    namevarchar500
    gradeidint110

    表名:clazz_course_teacher

    类型长度小数点允许空值
    idint110
    clazzidint110
    gradeidint110
    courseidint110
    teacheridint110

    表名:course

    类型长度小数点允许空值
    idint110
    namevarchar500

    表名:escore

    类型长度小数点允许空值
    idint110
    examidint110
    clazzidint110
    studentidint110
    gradeidint110
    courseidint110
    scoreint50

    表名:exam

    类型长度小数点允许空值
    idint110
    namevarchar500
    timedate00
    remarkvarchar2000
    typetinyint20
    gradeidint110
    clazzidint110
    courseidint110

    表名:grade

    类型长度小数点允许空值
    idint110
    namevarchar500

    表名:grade_course

    类型长度小数点允许空值
    idint110
    gradeidint110
    courseidint110

    表名:student

    类型长度小数点允许空值
    idint110
    numbervarchar200
    namevarchar200
    sexvarchar40
    phonevarchar200
    qqvarchar200
    photomediumblob00
    clazzidint110
    gradeidint110

    表名:system

    类型长度小数点允许空值
    idint110
    schoolNamevarchar1000
    forbidTeachertinyint20
    forbidStudenttinyint20
    noticeTeachervarchar5000
    noticeStudentvarchar5000

    表名:teacher

    类型长度小数点允许空值
    idint110
    numbervarchar200
    namevarchar200
    sexvarchar40
    phonevarchar200
    qqvarchar200
    photomediumblob00

    表名:user

    类型长度小数点允许空值
    idint110
    accountvarchar300
    passwordvarchar300
    namevarchar200
    typetinyint10

    3.4数据库实施

    3.4.1数据库连接

    JDBC是一种用于执行SQL语句的JavaAPI,可为多种数据库提供连接接口。JDBC要先将驱动包mysql-connector-java-5.1.7-bin.jar加入项目。之后利用连接池进行前后端连接。

    JDBC连接数据库步骤:

    第一步:加载驱动

    第二步:连接数据库

    第三步:使用语句操作数据库

    第四步:关闭数据连接,释放资源

    将JDBC加入eclipse项目中,利用数据库连接池进行前后端连接。

    img

    图3.4.1mysql-connector-java-5.1.7-bin.jar

    连接池代码如下:

    ​ <propertyname=“driverClass”>com.mysql.jdbc.Driver

    ​ <propertyname=“jdbcUrl”>jdbc:mysql://localhost:3306/ssms?characterEncoding=utf-8

    ​ root

    ​ ftx19981014

    3.4.2连接数据库主要代码

    public class MysqlTool {

    ​ private static ComboPooledDataSource dataSource = null;

    ​ private static ThreadLocaltl=

    new ThreadLocal();

    ​ static {

    ​ dataSource = new ComboPooledDataSource();

    ​ }

    ​ public static DataSource getDataSource(){

    ​ return dataSource;

    ​ }

    ​ public static Connection getConnection(){

    ​ Connection conn = tl.get();

    ​ try {

    ​ if(conn == null){

    ​ conn = dataSource.getConnection();

    ​ }

    ​ } catch (SQLException e) {

    ​ e.printStackTrace();

    ​ }

    ​ tl.set(conn);

    ​ return conn;

    ​ }

    ​ /*** 开始事务* @throws SQLException*/

    ​ public static void startTransaction(){

    ​ Connection conn = getConnection();

    ​ try {

    ​ conn.setAutoCommit(false);

    ​ } catch (SQLException e) {

    ​ e.printStackTrace();

    ​ }

    ​ }

    ​ /回滚事务 @throws SQLException/

    ​ public static void rollback(){

    ​ Connection conn = getConnection();

    ​ try {

    ​ conn.rollback();

    ​ } catch (SQLException e) {

    ​ e.printStackTrace();

    ​ }

    ​ }

    ​ /**

    ​ * 提交事务

    ​ * @throws SQLException

    ​ */

    ​ public static void commit(){

    ​ Connection conn = getConnection();

    ​ try {

    ​ conn.commit();

    ​ System.out.println(“数据库链接成功!”);

    ​ } catch (SQLException e) {

    ​ System.out.println(“数据库链接失败!”);

    ​ e.printStackTrace();

    ​ }

    ​ }

    ​ /*** 关闭Connection,并移除线程中的连接

    ​ */

    ​ public static void closeConnection(){

    ​ close(getConnection());

    ​ tl.remove();

    ​ }

    ​ public static void close(Connection conn){

    ​ try {

    ​ if(conn != null){

    ​ conn.close();

    ​ }

    ​ } catch (SQLException e) {

    ​ e.printStackTrace();

    ​ }

    ​ }

    ​ public static void close(Statement stm){

    ​ try {

    ​ if(stm != null){

    ​ stm.close();

    ​ }

    ​ } catch (SQLException e) {

    ​ e.printStackTrace();

    ​ }

    ​ }

    ​ public static void close(ResultSet rs){

    ​ try {

    ​ if(rs != null){

    ​ rs.close();

    ​ }

    ​ } catch (SQLException e) {

    ​ e.printStackTrace();

    ​ }

    ​ }

    }

    **
    **

    第四章 系统实现与测试分析

    4.1系统开发环境

    4.1.1软件运行环境建议

    (1)操作系统:Windows 7, Windows 10,

    (2)数据库软件:Navicat Premium: 用于专业人员管理数据库数据

    (3)Java环境:Java EE

    4.2系统实现

    学生成绩管理系统界面设计

    界面设计是为了满足系统专业化标准化的需求而产生的对系统的使用界面进行美化优化规范化的设计分支。具体包括框架设计,按钮设计,面板设计,菜单设计,标签设计,图标设计,滚动条及状态栏设计等等。

    4.2.1用户登录界面设计

    用户登录界面图如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CzG8j8Ui-1612610048274)(E:%5Ccode%5C8%E5%9B%BE%E7%89%87%5Cimages%5Cwps16-1612606992289.png)]img

    图4.2-1用户登录界面设计图

    4.2.2管理员主界面设计

    管理员主界面图如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2800vVt8-1612610048282)(E:%5Ccode%5C8%E5%9B%BE%E7%89%87%5Cimages%5Cwps18.png)]img

    图4.2-2管理员主界面设计图

    4.2.3老师主界面设计

    老师主界面图如下:

    imgimg

    图4.2-3老师主界面设计图

    4.2.4学生主界面设计

    学生主界面图如下:

    imgimg

    图4.2-4学生主界面设计图

    4.2.5添加用户设计

    添加用户图如下:

    img

    图4.2-5添加用户设计图

    4.2.6修改用户界面设计

    修改用户界面图如下:

    img

    图4.2-6修改用户界面设计图

    4.2.7增加年级界面设计

    增加年级界面图如下:

    img

    图4.2-7增加年级界面设计图

    4.2.8添加考试界面设计

    添加界面图如下:

    img

    图4.2-8添加考试界面设计图

    4.2.9登记成绩界面设计

    登记成绩界面图如下:

    img

    图4.2-9登记成绩界面设计图

    4.2.10查看成绩界面设计

    查看成绩界面图如下:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W9PFQUPb-1612610048315)(E:%5Ccode%5C8%E5%9B%BE%E7%89%87%5Cimages%5Cwps29-1612606992290.png)]

    图4.2-10查看成绩界面设计图

    4.2.11导出成绩界面设计

    导出成绩界面图如下:

    imgimg

    图4.2-11导出成绩界面设计图

    4.3测试设计

    4.3.1测试分析

    为了发现和报告学生成绩管理系统的错误和缺陷。通过测试,确保本系统的功能、互操作性等符合软件的设计要求,满足用户的使用要求。通过分析错误产生的原因和错误的分布特征,可以帮助项目管理者发现当前所采用的软件过程的缺陷,以便对系统进行升级时进行改进。

    4.3.2用户登录测试要点

    (1)测试要点:用户名和密码,以及对应用户的权限是否正常。

    (2)测试过程:登录系统,观察用户名和密码是否为真,验证码是否正确以及观察用户登录后的界面显示。若为真,进入系统;若为假,提示重新输入用户信息。

    (3)测试结果:经过实际测试,进入系统后,界面功能显示与用户权限所允许的功能相对应,说明用户登录功能一切正常。

    4.3.3修改学习名称及教师学生通知和禁止登录功能测试要点

    (1)测试要点:测试所有功能是否正常。

    (2)测试过程:输入老师学生通知,开启禁止登录功能,然后登录老师学生账号,查看是否显示正常。

    (3)测试结果:经过实际测试,在测试过程中老师学生通知显示正常,禁止登录功能正常。

    **
    **

    第五章 总结

    在这次学生成绩管理系统数据库课程设计中,通过使用eclipse和MySQL数据库进行系统设计,前端显示采用了web技术进行布局设置和调整,数据库采用的是MySQL数据库5.1版本,并学会使用Java EE通过JDBC驱动连接MySQL数据库,数据库并搭配图形化界面软件Navicat来进行操作数据库,并与前端数据请求进行响应。

    通过此次课程设计,使我更加扎实的掌握了有关数据库设计等方面的知识,也巩固了web与Java EE等方面的知识。在系统的设计过程中我们小组虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,同时也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。

    这次课设提高自己的动手能力并熟悉了数据库的简单操作,体验了一个系统开发的过程,加强了理论与实践结合的能力。

    在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识,收获颇丰。

    附录

    参考文献

    [1] 李运莉.《web数据库应用系统性能优化》.人民邮电出版社,2011年

    [2] 王家华.《软件工程》.东北大学出版社,2017年

    [3] 魏善沛.《数据库系统概论》. 清华大学出版社,2016年

    [4] 库俊国.《基于J2EE技术的Web应用体系研究及实践》.人民邮电出版社,2014年

    展开全文
  • C语言实现学生成绩管理系统(EasyX图形界面)

    万次阅读 多人点赞 2021-07-18 19:18:14
    学生成绩管理系统学生成绩管理系统效果图流程&注意要点代码实现 学生成绩管理系统 效果图 流程&注意要点 核心部分——EasyX显示图形界面,结构体数组和文件操作负责对数据进行各种操作。 只要一进去程序就...

    本文首发于2021年7月18日19:21:06。

    注意:直接复制代码会无法运行,因为没有资源文件(图片、文本文件),从下面的github链接或交流群中下载代码或注释指定代码,有关此问题,例如:无法运行等,一律不予回复。望周知。(20220611注)


    我的小站——半生瓜のblog

    代码文件下载链接——链接


    在这里插入图片描述

    学生成绩管理系统

    效果图

    在这里插入图片描述

    结构图

    在这里插入图片描述

    流程图

    在这里插入图片描述

    流程&注意要点

    • 核心部分——EasyX显示图形界面,结构体数组和文件操作负责对数据进行各种操作。
    • 只要一进去程序就对存储数据的文件进行读取,如果有数据直接读到学生结构体数组里面,得到当前结构体数组中的数据数量(几个人),并将所有数据打印到屏幕上。
    • 管理员用户
      • 输入密码验证——读取文件——验证用户输入是否正确。
      • 显示所有数据——如果通过文件读到了数据会被打印到屏幕上,反之。如果没有读到数据,在添加数据之前都会在屏幕上显示"当前记录为空!"。
        • 各种方式的排序——对当前结构体数组中成员的数据,依照"按xx排序",重新排序,均采用冒泡排序。其中值得注意的是,貌似EasyX的InputBox只能将你输入的内容保存到字符数组中,所以你需要将录入的成绩数据通过atof函数转化为浮点型,这里我采用的方法是: 先按照结构体数组中数据的存储顺序将每个人的某科成绩转化浮点型存储到一个成绩结构体数组中(在写这句话的时候想到,感觉也可以直接将各科的成绩存储到一个结构体数组中,然后在进行比较,可以缩减一下代码量),然后利用冒泡循环对这个存成绩的结构体数组进行重新排序,要注意的是这个存成绩的结构体数组中元素交换位置的同时存学生各种数据结构体数组中的元素也要交换位置,这两个的数据的存储顺序是一样的,就是说一个结构体数组辅助另一个结构体数组进行排序,两个结构体需要同时发生变化。
      • 增删查改界面
        • 增——添加数据,以学号区分不同的人,姓名可以相同,但是学号每个是单独的一个,如果输入的学号已经存在,则弹窗提示,进行重新输入,直到输入通过限制条件,通过对输入的学号进行遍历,看看它是不是由纯数字组成,如果不是则弹窗提示输入格式错误,进行重新输入,直到格式正确为止。其中学生姓名不做输入格式限制,成绩同学号。完成全部输入之后进行数据保存,当前结构体人数++。如果添加的时候学号和姓名都是空的则判断为无效输入,操作无效。
        • 查——查找数据,(删除数据和修改数据都要依靠查找数据来进行操作,只有先找到结构体里面确实这个人,能对他的数据进行操作),通过输入学号或者姓名来查找一个人,在结构体数组中进行遍历来查找,找到则返回该同学在结构体数组对应的下标,然后将该同学的数据输入到屏幕上。反之,弹窗提示"查无此人"。
        • 删——删除数据进行查找,找到了就弹窗提示是否确认删除,确认删除就利用循环,从要删除的这个人在结构体数组中的下标开始,依次后面的一个数据覆盖到前面,完成后,结构体数组成员数量–。弹窗提示删除成功。
        • 改——修改数据,同样进行查找,找到了,InputBox提示输入新的数据,注意:与上面录入数据不同的是,这里新输入的学号需要先保存到临时创建的一个字符数组中,不能直接就存到要修改学生在结构体数组中对应的数据位置,因为如果是这样的话,下面在进行判断学号是否已经存在的时候就肯定是存在的了,需要在判断是否重复后,如果数据不重复,再把新输入的学号赋给要修改的变量,还需要注意的是:如果用户输入的新学号和原来的一样是可以的,所以这里需要多加一个判断,否则也会因为检查到数据重复而不能进行下一步。
    • 普通用户
      • 显示全部数据及各种排序还有查找同上。
      • 需要注意的是:管理员用户和普通用户公用界面,例如:显示全部数据和查找的输入界面,点击返回键后的跳转需要加以判。宏定义一个全局整型变量,从哪点进来的就在这句之前给它赋一个新值,条件判断语句加以判断。
    • 缺陷
      • 数据显示无法分页,只能在有限的一个界面中最多显示17条数据。
      • 代码量还可以再优化。
      • 代码没有分开编写,全部堆在一个.cpp文件中。

    代码实现

    #include<stdio.h>
    #include<stdlib.h>
    #include<graphics.h>
    #include<string.h>
    #include<ctype.h>//检测字符
    
    
    #define RecordNums 15//结构体数组数量
    
    int NowStudentNums = 0;//当前记录人数
    
    
    //不使用数据结构
    //用结构体数组和文件操作来实现
    
    //学生结构体定义
    typedef struct Student
    {
    	char s_Num[64];//学号
    	char s_Name[64];//姓名
    	char s_Chinese[64];//语
    	char s_Math[64];//数
    	char s_English[64];//英
    	double s_SumScore;//总分
    }Student;
    
    
    //创建学生结构体数组
    Student StuArry[RecordNums];
    
    //创建成绩结构体
    typedef struct Score
    {
    	double SuScore;//subject score
    }Score;
    
    //创建成绩结构体——大小同学生结构体数组
    Score SoArry[RecordNums];
    
    //创建管理员结构体
    typedef struct Admin
    {
    	char UserName[64];
    	char PassWord[64];
    }Admin;
    
    //创建一个管理员用户
    Admin AdminUser;
    
    //显示全部数据的页面跳转标识
    int FlagAI = -1;
    //查询找到页面跳转标识
    int FlagFPT = -1;
    /*
    			MainSteps
    	1.先搭处图形窗口的大致形态
    	2.逐步实现里面的内容
    */
    
    /*
    	图形界面实现
    */
    
    //前置声明——查看请跳转到下面查看具体说明
    void AdminPage();
    void AdminSignIn();
    void CommonUserPage();
    void SaveInfor();
    void ReadInfor();
    void ShowAllInfor();
    void InputInfor();
    void S1mplePrint();
    void AdDeSeMoPage();
    void DeleteStuInfor();
    int ReturnPosi();
    void ModifyStudInfor();
    void PrintFoudInfor();
    void DeSomeStu();
    void SortAcChinese();
    void SortAcMath();
    void SortAcEnglish();
    void SortAcSumScore();
    bool ScoreFormat(char PerSuSc[]);
    //首页
    void FirstPage()
    {
    	//只要进入程序就读取数据——获取当前NowStudentNums
    	ReadInfor();
    
    	//窗口大小
    	initgraph(760, 760);
    	//鼠标操作1
    	MOUSEMSG m1;
    
    
    	cleardevice();
    	IMAGE picture1;
    	loadimage(&picture1, "./firstbc.jpg", 760, 760);
    	putimage(0, 0, &picture1);
    	setbkmode(TRANSPARENT);
    
    
    	
    
    	setfillcolor(GREEN);
    
    
    	//大标题
    	char FirstTitle[20] = { "学生成绩管理系统" };
    	settextstyle(60, 0, "黑体");
    	outtextxy(150, 100, FirstTitle);
    
    	//三个选项的背景
    	fillrectangle(230, 445, 560, 490);
    	fillrectangle(230, 505, 560, 550);
    	fillrectangle(230, 565, 560, 610);
    
    	setbkmode(TRANSPARENT);
    
    	//三个选项的文字
    	settextstyle(40, 0, "黑体");
    
    	//三个选项
    	char FirstSelect1[20] = { "管理员操作界面" };
    	char FirstSelect2[20] = { "普通用户操作界面" };
    	char FirstSelect3[20] = { "退出程序" };
    	outtextxy(240, 450, FirstSelect1);
    	outtextxy(240, 510, FirstSelect2);
    	outtextxy(240, 570, FirstSelect3);
    
    	//进入主界面选项操作界面
    	while (1)
    	{
    		m1 = GetMouseMsg();//获取鼠标操作
    		if (m1.x >= 230 && m1.x <= 560 && m1.y >= 445 && m1.y <= 490)//管理员界面
    		{
    			setlinecolor(RED);
    			rectangle(230, 445, 560, 490);
    			if (m1.uMsg == WM_LBUTTONDOWN)
    			{
    				//加入管理员登录
    				AdminSignIn();
    			}
    		}
    		else if (m1.x >= 230 && m1.x <= 560 && m1.y >= 505 && m1.y <= 550)//普通用户界面
    		{
    			setlinecolor(RED);
    			rectangle(230, 505, 560, 550);
    			if (m1.uMsg == WM_LBUTTONDOWN)
    			{
    				cleardevice();
    				CommonUserPage();
    			}
    		}
    		else if (m1.x >= 230 && m1.x <= 560 && m1.y >= 565 && m1.y <= 610)//退出
    		{
    			setlinecolor(RED);
    			rectangle(230, 565, 560, 610);
    			if (m1.uMsg == WM_LBUTTONDOWN)
    			{
    				exit(0);
    			}
    		}
    		//鼠标不在上面悬停
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(230, 445, 560, 490);
    			rectangle(230, 505, 560, 550);
    			rectangle(230, 565, 560, 610);
    		}
    	}
    
    }
    
    //管理员界面
    void AdminPage()
    {
    	initgraph(760, 760);
    	//先清除一下
    	cleardevice();
    	//定义第二个鼠标操作
    	MOUSEMSG m2;
    
    
    
    	cleardevice();
    	IMAGE picture1;
    	loadimage(&picture1, "./firstbc.jpg", 760, 760);
    	putimage(0, 0, &picture1);
    	setfillcolor(GREEN);
    	setbkmode(TRANSPARENT);
    
    	char SecondTitle1[5] = { "管" };
    	char SecondTitle2[5] = { "理" };
    	char SecondTitle3[5] = { "员" };
    	char SecondTitle4[5] = { "操" };
    	char SecondTitle5[5] = { "作" };
    	char SecondTitle6[5] = { "界" };
    	char SecondTitle7[5] = { "面" };
    
    
    	settextstyle(50, 0, "黑体");
    	outtextxy(50, 150, SecondTitle1);
    	outtextxy(50, 210, SecondTitle2);
    	outtextxy(50, 270, SecondTitle3);
    	outtextxy(50, 330, SecondTitle4);
    	outtextxy(50, 390, SecondTitle5);
    	outtextxy(50, 450, SecondTitle6);
    	outtextxy(50, 510, SecondTitle7);
    
    
    	setbkmode(TRANSPARENT);
    
    
    	//三个选项的背景
    	fillrectangle(230, 240, 560, 285);
    	fillrectangle(230, 370, 560, 415);
    	fillrectangle(230, 500, 560, 545);
    
    	setbkmode(TRANSPARENT);
    
    	//三个选项的文字
    	settextstyle(40, 0, "黑体");
    
    	//三个选项
    	char SecondSelect1[20] = { "显示所有数据" };
    	char SecondSelect2[20] = { "增删查改数据" };
    	char SecondSelect3[20] = { "返回" };
    
    
    	outtextxy(270, 240, SecondSelect1);
    	outtextxy(270, 370, SecondSelect2);
    	outtextxy(350, 500, SecondSelect3);
    
    
    	//进入主界面选项操作界面
    	while (1)
    	{
    		m2 = GetMouseMsg();//获取鼠标操作
    		if (m2.x >= 230 && m2.x <= 560 && m2.y >= 240 && m2.y <= 285)
    		{
    			setlinecolor(RED);
    			rectangle(230, 240, 560, 285);
    			if (m2.uMsg == WM_LBUTTONDOWN)
    			{
    				//显示所有数据
    				FlagAI = 1;
    				cleardevice();
    				ShowAllInfor();
    
    			}
    		}
    		else if (m2.x >= 230 && m2.x <= 560 && m2.y >= 370 && m2.y <= 415)
    		{
    			setlinecolor(RED);
    			rectangle(230, 370, 560, 415);
    			if (m2.uMsg == WM_LBUTTONDOWN)
    			{
    				//增删查改界面
    				cleardevice();
    				AdDeSeMoPage();
    			}
    		}
    		else if (m2.x >= 230 && m2.x <= 560 && m2.y >= 500 && m2.y <= 545)
    		{
    			setlinecolor(RED);
    			rectangle(230, 500, 560, 545);
    			if (m2.uMsg == WM_LBUTTONDOWN)
    			{
    				//返回
    				cleardevice();
    				FirstPage();
    			}
    		}
    		//鼠标不在上面悬停
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(230, 240, 560, 285);
    			rectangle(230, 370, 560, 415);
    			rectangle(230, 500, 560, 545);
    		}
    	}
    
    }
    
    //普通用户界面
    void CommonUserPage()
    {
    	initgraph(760, 760);记得删
    
    	//先清除一下
    	cleardevice();
    	//定义第二个鼠标操作
    	MOUSEMSG m3;
    
    	cleardevice();
    	IMAGE picture1;
    	loadimage(&picture1, "./firstbc.jpg", 760, 760);
    	putimage(0, 0, &picture1);
    	setbkmode(TRANSPARENT);
    
    
    
    	setfillcolor(GREEN);
    
    
    	char SecondTitle1[5] = { "普" };
    	char SecondTitle2[5] = { "通" };
    	char SecondTitle3[5] = { "用" };
    	char SecondTitle4[5] = { "户" };
    	char SecondTitle5[5] = { "操" };
    	char SecondTitle6[5] = { "作" };
    	char SecondTitle7[5] = { "界" };
    	char SecondTitle8[5] = { "面" };
    
    
    	settextstyle(50, 0, "黑体");
    	outtextxy(50, 150, SecondTitle1);
    	outtextxy(50, 210, SecondTitle2);
    	outtextxy(50, 270, SecondTitle3);
    	outtextxy(50, 330, SecondTitle4);
    	outtextxy(50, 390, SecondTitle5);
    	outtextxy(50, 450, SecondTitle6);
    	outtextxy(50, 510, SecondTitle7);
    	outtextxy(50, 570, SecondTitle8);
    
    
    	setbkmode(TRANSPARENT);
    
    
    	//三个选项的背景
    
    	fillrectangle(230, 240, 560, 285);
    	fillrectangle(230, 370, 560, 415);
    	fillrectangle(230, 500, 560, 545);
    
    	setbkmode(TRANSPARENT);
    
    	//三个选项的文字
    	settextstyle(40, 0, "黑体");
    
    	//三个选项
    	char ThirdSelect1[20] = { "显示所有数据" };
    	char ThirdSelect2[20] = { "查询数据" };
    	char ThirdSelect3[20] = { "返回" };
    
    
    
    	outtextxy(270, 240, ThirdSelect1);
    	outtextxy(310, 370, ThirdSelect2);
    	outtextxy(350, 500, ThirdSelect3);
    
    
    
    
    	//进入主界面选项操作界面
    	while (1)
    	{
    		m3 = GetMouseMsg();//获取鼠标操作
    		if (m3.x >= 230 && m3.x <= 560 && m3.y >= 240 && m3.y <= 285)//选项1
    		{
    			setlinecolor(RED);
    			rectangle(230, 240, 560, 285);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				//显示所有数据
    				FlagAI = -1;
    				cleardevice();
    				ShowAllInfor();
    			}
    		}
    		else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 370 && m3.y <= 415)//选项2
    		{
    			setlinecolor(RED);
    			rectangle(230, 370, 560, 415);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				//查询数据
    				FlagFPT = -1;
    				PrintFoudInfor();
    				CommonUserPage();
    			}
    		}
    		else if (m3.x >= 230 && m3.x <= 560 && m3.y >= 500 && m3.y <= 545)//选项3——返回
    		{
    			setlinecolor(RED);
    			rectangle(230, 500, 560, 545);
    			if (m3.uMsg == WM_LBUTTONDOWN)
    			{
    				cleardevice();
    				FirstPage();
    			}
    		}
    		//鼠标不在上面悬停
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(230, 240, 560, 285);
    			rectangle(230, 370, 560, 415);
    			rectangle(230, 500, 560, 545);
    		}
    	}
    }
    
    /*
    	//功能实现//
    */
    
    
    //录入信息——通过弹窗输入&系统自动计算总分
    void InputInfor()
    {
    	//InputBox中的数字参数——限制输入内容的位数
    
    
    	//名字可以重复但是学号不能重复
    	//通过循环来检查是否有重复的
    
    	//输入学号
    	while (1)
    	{
    		TCHAR InputWindow0[] = _T("请输入该学生的学号");
    		InputBox(StuArry[NowStudentNums].s_Num, 9, InputWindow0);
    
    		int FlagInput2 = 0;
    		//计算输入的字符串长度
    		int nums = strlen(StuArry[NowStudentNums].s_Num);
    		//判断输入的是否是纯数字
    		for (int i = 0; i < nums; i++)
    		{
    			if (StuArry[NowStudentNums].s_Num[i] >= '0' && StuArry[NowStudentNums].s_Num[i] <= '9')//如果不是数字
    			{
    
    			}
    			else
    			{
    				FlagInput2 = 1;
    				HWND hwndInput2 = GetHWnd();
    				int isok = MessageBox(hwndInput2, "输入格式有误,请重新输入", "提示", MB_OK);
    				break;
    			}
    		}
    		//判断输入的是否是纯数字
    		for (int e = 0; e < nums; e++)
    		{
    			if (StuArry[NowStudentNums].s_Num[e] >= '0' && StuArry[NowStudentNums].s_Num[e] <= '9')//如果不是数字
    			{
    
    			}
    			else
    			{
    				FlagInput2 = 1;
    				HWND hwndInput2 = GetHWnd();
    				break;
    				int isok = MessageBox(hwndInput2, "输入格式有误,请重新输入", "提示", MB_OK);
    				
    			}
    		}
    
    		if (FlagInput2 == 0)
    		{
    			//判断是否输入重复
    			int FlagInput1 = 0;
    			for (int i = 0; i < NowStudentNums; i++)
    			{
    				if (strcmp(StuArry[NowStudentNums].s_Num, StuArry[i].s_Num) == 0)
    				{
    					FlagInput1 = 1;
    				}
    			}
    			if (FlagInput1 == 1)
    			{
    				HWND hwndInput1 = GetHWnd();
    				int isok = MessageBox(hwndInput1, "该学生已经存在,请重新输入", "提示", MB_OK);
    			}
    			if (FlagInput1 == 0)
    			{
    				break;
    			}
    		}
    	}
    
    
    
    
    	//输入姓名
    	TCHAR InputWindow1[] = _T("请输入该学生的姓名");
    	InputBox(StuArry[NowStudentNums].s_Name, 10, InputWindow1);
    
    
    
    
    	//输入语文成绩
    	while (1)
    	{
    		TCHAR InputWindow2[] = _T("请输入该学生的语文成绩");
    		InputBox(StuArry[NowStudentNums].s_Chinese, 4, InputWindow2);
    
    		if (ScoreFormat(StuArry[NowStudentNums].s_Chinese))//为真跳出循环
    		{
    			break;
    		}
    		
    	}
    	
    
    
    
    
    	//输入数学成绩
    	while (1)
    	{
    		TCHAR InputWindow3[] = _T("请输入该学生的数学成绩");
    		InputBox(StuArry[NowStudentNums].s_Math, 4, InputWindow3);
    
    		if (ScoreFormat(StuArry[NowStudentNums].s_Math))//为真跳出循环
    		{
    			break;
    		}
    
    	}
    	
    
    	//输入英语成绩
    	while (1)
    	{
    		TCHAR InputWindow4[] = _T("请输入该学生的英语成绩");
    		InputBox(StuArry[NowStudentNums].s_English, 4, InputWindow4);
    
    		if (ScoreFormat(StuArry[NowStudentNums].s_English))//为真跳出循环
    		{
    			break;
    		}
    
    	}
    
    
    
    
    	//计算总分
    	StuArry[NowStudentNums].s_SumScore =
    		atof(StuArry[NowStudentNums].s_Chinese) +
    		atof(StuArry[NowStudentNums].s_Math) +
    		atof(StuArry[NowStudentNums].s_English);
    
    	//保存数据
    	SaveInfor();
    }
    
    //判断输入的分数格式是否正确
    bool ScoreFormat(char PerSuSc[])
    {
    	//判断输入的是否是纯数字
    	int nums = strlen(PerSuSc);
    	//判断输入的是否是纯数字
    	for (int i = 0; i < nums; i++)
    	{
    		if (PerSuSc[i] >= '0' && PerSuSc[i] <= '9')//如果不是数字
    		{
    		}
    		else
    		{
    			HWND hwndInput5 = GetHWnd();
    			int isok = MessageBox(hwndInput5, "输入格式有误,请重新输入", "提示", MB_OK);
    			return false;
    		}
    	}
    	return true;
    }
    
    //增删查改界面
    void AdDeSeMoPage()
    {
    
    
    	//鼠标操作
    	MOUSEMSG SL;
    
    	//默认将会按照总分排序
    
    
    	initgraph(860, 760);
    
    	
    	cleardevice();
    	IMAGE picture2;
    	loadimage(&picture2, "./secondbc.jpg", 860, 760);
    	putimage(0, 0, &picture2);
    	setbkmode(TRANSPARENT);
    
    
    
    
    	setfillcolor(GREEN);
    	fillrectangle(690, 90, 850, 140);//增
    	fillrectangle(690, 190, 850, 240);//删
    	fillrectangle(690, 290, 850, 340);//查
    	fillrectangle(690, 390, 850, 440);//改
    	fillrectangle(690, 490, 850, 540);//清空
    	fillrectangle(690, 590, 850, 640);//返回
    
    	//表头文字部分
    	setbkmode(TRANSPARENT);
    	settextstyle(30, 0, "黑体");
    	outtextxy(0, 0, "排名");
    	outtextxy(80, 0, "学号");
    	outtextxy(200, 0, "姓名");
    	outtextxy(300, 0, "语文");
    	outtextxy(400, 0, "数学");
    	outtextxy(500, 0, "英语");
    	outtextxy(600, 0, "总分");
    	outtextxy(740, 0, "选项");
    	outtextxy(740, 100, "添加");
    	outtextxy(740, 200, "删除");
    	outtextxy(740, 300, "查找");
    	outtextxy(740, 400, "修改");
    	outtextxy(740, 500, "清空");
    	outtextxy(740, 600, "返回");
    
    
    	//打印当前已经有的信息——记录为空的提示也在这里面
    	S1mplePrint();
    
    	//进入鼠标操作环节
    	while (1)
    	{
    		SL = GetMouseMsg();
    		if (SL.x >= 690 && SL.x <= 850 && SL.y >= 90 && SL.y <= 140)
    		{
    
    			setlinecolor(RED);
    			rectangle(690, 90, 850, 140);
    			if (SL.uMsg == WM_LBUTTONDOWN)
    			{
    				//添加
    				InputInfor();
    				cleardevice();
    				//完成操作重新载入——刷新
    				AdDeSeMoPage();
    			}
    		}
    		else if (SL.x >= 690 && SL.x <= 850 && SL.y >= 190 && SL.y <= 240)
    		{
    
    			setlinecolor(RED);
    			rectangle(690, 190, 850, 240);
    			if (SL.uMsg == WM_LBUTTONDOWN)
    			{
    				//删除
    				DeSomeStu();
    				//完成操作重新载入——刷新
    				AdDeSeMoPage();
    			}
    		}
    		else if (SL.x >= 690 && SL.x <= 850 && SL.y >= 290 && SL.y <= 340)
    		{
    
    			setlinecolor(RED);
    			rectangle(690, 290, 850, 340);
    			if (SL.uMsg == WM_LBUTTONDOWN)
    			{
    				FlagFPT = 1;
    				//查询
    				PrintFoudInfor();
    				//完成操作重新载入——刷新
    				AdDeSeMoPage();
    			}
    		}
    		else if (SL.x >= 690 && SL.x <= 850 && SL.y >= 390 && SL.y <= 440)
    		{
    			setlinecolor(RED);
    			rectangle(690, 390, 850, 440);
    			if (SL.uMsg == WM_LBUTTONDOWN)
    			{
    				//修改
    				ModifyStudInfor();
    				//完成操作重新载入——刷新
    				AdDeSeMoPage();
    			}
    		}
    		else if (SL.x >= 690 && SL.x <= 850 && SL.y >= 490 && SL.y <= 540)
    		{
    			setlinecolor(RED);
    			rectangle(690, 490, 850, 540);
    			if (SL.uMsg == WM_LBUTTONDOWN)
    			{
    				//确保误删——弹窗加以提示
    				HWND hwndDel = GetHWnd();
    				int isok = MessageBox(hwndDel, "确认清空?", "提示", MB_OKCANCEL);
    				if (isok == IDOK)
    				{
    					//调用清空函数
    					DeleteStuInfor();
    					//完成操作重新载入——刷新
    					AdDeSeMoPage();
    					//弹窗提示
    					int tips1 = MessageBox(hwndDel, "清空成功!", "提示", MB_OK);
    				}
    				else if (isok == IDCANCEL)
    				{
    					//点击取消不做反应
    				}
    			}
    		}
    		else if (SL.x >= 690 && SL.x <= 850 && SL.y >= 590 && SL.y <= 640)
    		{
    			//返回
    			setlinecolor(RED);
    			rectangle(690, 590, 850, 640);
    			if (SL.uMsg == WM_LBUTTONDOWN)
    			{
    				cleardevice();
    				//完成操作重新载入——刷新
    				AdminPage();
    
    
    				//辅助测试——显示当前人数
    				/*char temptps[5];
    				sprintf(temptps, "%d", NowStudentNums);
    
    
    				HWND hwndTemp = GetHWnd();
    				int tips2 = MessageBox(hwndTemp, temptps, "提示", MB_OK);*/
    			}
    		}
    		//鼠标不悬停
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(690, 90, 850, 140);//增
    			rectangle(690, 190, 850, 240);//删
    			rectangle(690, 290, 850, 340);//查
    			rectangle(690, 390, 850, 440);//改
    			rectangle(690, 490, 850, 540);//清空
    			rectangle(690, 590, 850, 640);//返回
    
    		}
    	}
    }
    
    //保存数据到文件中
    void SaveInfor()
    {
    
    
    	//如果学号和姓名都不是空的才写入文件
    	if (strlen(StuArry[NowStudentNums].s_Num) != 0 && strlen(StuArry[NowStudentNums].s_Name) != 0)
    	{
    		FILE* fp = fopen("StudentInforFile.txt", "a");
    		if (fp == NULL)
    		{
    			return;
    		}
    		fprintf(fp, "%s\t%s\t%s\t%s\t%s\t%lf\n",
    			StuArry[NowStudentNums].s_Num,
    			StuArry[NowStudentNums].s_Name,
    			StuArry[NowStudentNums].s_Chinese,
    			StuArry[NowStudentNums].s_Math,
    			StuArry[NowStudentNums].s_English,
    			StuArry[NowStudentNums].s_SumScore);
    		fclose(fp);
    		//保存完毕人数++
    		NowStudentNums++;
    	}
    
    
    
    }
    
    //抹除全部数据再保存——主要用于修改功能
    void SaveInforModi()
    {
    	//先删掉,但是不将人数置空所以不能调用之前的删除函数
    	remove("StudentInforFile.txt");
    	//如果学号和姓名都不是空的才写入文件
    	FILE* fp = fopen("StudentInforFile.txt", "a");
    	if (fp == NULL)
    	{
    		return;
    	}
    	for (int i = 0; i < NowStudentNums; i++)
    	{
    		if (strlen(StuArry[i].s_Num) != 0 && strlen(StuArry[i].s_Name) != 0)
    		{
    
    			fprintf(fp, "%s\t%s\t%s\t%s\t%s\t%lf\n",
    				StuArry[i].s_Num,
    				StuArry[i].s_Name,
    				StuArry[i].s_Chinese,
    				StuArry[i].s_Math,
    				StuArry[i].s_English,
    				StuArry[i].s_SumScore);
    		}
    	}
    
    	fclose(fp);
    }
    
    //读取文件中的信息-同步到当前结构体数组中,并同步得到NowStudentNums
    void ReadInfor()
    {
    	FILE* fp = fopen("StudentInforFile.txt", "r");
    	if (fp == NULL)
    	{
    		return;
    	}
    	//将文件中的数据读取到当前的结构体数组中
    	for (int i = 0; i < RecordNums; i++)
    	{
    
    		fscanf(fp, "%s\t%s\t%s\t%s\t%s\t%lf\t\n",
    			StuArry[i].s_Num,
    			StuArry[i].s_Name,
    			StuArry[i].s_Chinese,
    			StuArry[i].s_Math,
    			StuArry[i].s_English,
    			&StuArry[i].s_SumScore);
    	}
    
    	int FileStudentNums = 0;//辅助先得到文件中的人数
    
    	//读取出文件中数据的人数个数
    	for (int k = 0; k < RecordNums; k++)
    	{
    		if (strlen(StuArry[k].s_Name) != 0)
    		{
    			//当前人数——FileStudentNums不能设全局变量,否则多次读取的时候会出现问题
    			NowStudentNums = ++FileStudentNums;
    		}
    	}
    	fclose(fp);
    }
    
    //彻底清空——删除文件
    void DeleteStuInfor()
    {
    	//删除文件
    	remove("StudentInforFile.txt");
    	//置空当前人数
    	NowStudentNums = 0;
    }
    
    //通用的单纯在屏幕上的对应位置打印出结构体中的每一个元素
    void S1mplePrint()
    {
    	//如果为空就不往下执行
    	if (NowStudentNums == 0)
    	{
    
    		settextstyle(50, 0, "黑体");
    		outtextxy(200, 200, "当前记录为空!");
    		return;
    	}
    
    	for (int q = 1; q <= NowStudentNums; q++)
    	{
    
    
    		//顺序
    		settextstyle(30, 0, "黑体");
    		char Nums[5];
    		sprintf(Nums, "%d", q);
    
    		//缩放字体
    		settextstyle(25, 0, "黑体");
    		//学号
    
    		outtextxy(80, 40 + 40 * q, StuArry[q - 1].s_Num);
    		//姓名
    		outtextxy(200, 40 + 40 * q, StuArry[q - 1].s_Name);
    		//语文成绩
    		outtextxy(300, 40 + 40 * q, StuArry[q - 1].s_Chinese);
    		//数学成绩
    		outtextxy(400, 40 + 40 * q, StuArry[q - 1].s_Math);
    		//英语成绩
    		outtextxy(500, 40 + 40 * q, StuArry[q - 1].s_English);
    		//输出总分
    		if (strlen(StuArry[q - 1].s_Name) != 0)
    		{
    			outtextxy(0, 40 + 40 * q, Nums);
    			char SuSo[20];
    			sprintf(SuSo, "%.2f", StuArry[q - 1].s_SumScore);//小数点后保留两位
    			outtextxy(600, 40 + 40 * q, SuSo);
    		}
    	}
    }
    
    //显示所有数据-通用
    void ShowAllInfor()
    {
    
    	//鼠标操作
    	MOUSEMSG SA;
    	initgraph(860, 760);
    	//默认只是打印数据到屏幕上
    	cleardevice();
    	IMAGE picture2;
    	loadimage(&picture2, "./secondbc.jpg", 860, 760);
    	putimage(0, 0, &picture2);
    
    	setfillcolor(GREEN);
    	setbkmode(TRANSPARENT);
    
    
    
    
    	fillrectangle(690, 90, 850, 140);
    	fillrectangle(690, 190, 850, 240);
    	fillrectangle(690, 290, 850, 340);
    	fillrectangle(690, 390, 850, 440);
    	fillrectangle(690, 590, 850, 640);
    
    
    
    	//表头文字部分
    	setbkmode(TRANSPARENT);
    	settextstyle(30, 0, "黑体");
    	outtextxy(0, 0, "排名");
    	outtextxy(80, 0, "学号");
    	outtextxy(200, 0, "姓名");
    	outtextxy(300, 0, "语文");
    	outtextxy(400, 0, "数学");
    	outtextxy(500, 0, "英语");
    	outtextxy(600, 0, "总分");
    	outtextxy(700, 0, "排序方式");
    	outtextxy(700, 100, "按语文排序");
    	outtextxy(700, 200, "按数学排序");
    	outtextxy(700, 300, "按英语排序");
    	outtextxy(700, 400, "按总分排序");
    
    	outtextxy(740, 600, "返回");
    
    	S1mplePrint();//默认只是单纯的打印
    
    	while (1)
    	{
    		SA = GetMouseMsg();
    		if (SA.x >= 690 && SA.x <= 850 && SA.y >= 90 && SA.y <= 140)
    		{
    			//按语文排
    			setlinecolor(RED);
    			rectangle(690, 90, 850, 140);
    			if (SA.uMsg == WM_LBUTTONDOWN)
    			{
    				SortAcChinese();
    				//刷新重新载入
    				ShowAllInfor();
    
    			}
    		}
    		else if (SA.x >= 690 && SA.x <= 850 && SA.y >= 190 && SA.y <= 240)
    		{
    			//按数学排
    			setlinecolor(RED);
    			rectangle(690, 190, 850, 240);
    			if (SA.uMsg == WM_LBUTTONDOWN)
    			{
    				SortAcMath();
    				//刷新重新载入
    				ShowAllInfor();
    			}
    		}
    		else if (SA.x >= 690 && SA.x <= 850 && SA.y >= 290 && SA.y <= 340)
    		{
    			//按英语排
    			setlinecolor(RED);
    			rectangle(690, 290, 850, 340);
    			if (SA.uMsg == WM_LBUTTONDOWN)
    			{
    				SortAcEnglish();
    				//刷新重新载入
    				ShowAllInfor();
    			}
    		}
    		else if (SA.x >= 690 && SA.x <= 850 && SA.y >= 390 && SA.y <= 440)
    		{
    			//按照总分排
    			setlinecolor(RED);
    			rectangle(690, 390, 850, 440);
    			if (SA.uMsg == WM_LBUTTONDOWN)
    			{
    				SortAcSumScore();
    				//刷新重新载入
    				ShowAllInfor();
    			}
    
    		}
    		else if (SA.x >= 690 && SA.x <= 850 && SA.y >= 590 && SA.y <= 640)
    		{
    			//返回
    			setlinecolor(RED);
    			rectangle(690, 590, 850, 640);
    			if (SA.uMsg == WM_LBUTTONDOWN)
    			{
    				cleardevice();
    				//判断从哪个窗口点进来的
    				if (FlagAI == 1)
    				{
    					AdminPage();
    				}
    				else if (FlagAI == -1)
    				{
    					CommonUserPage();
    				}
    
    			}
    		}
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(690, 90, 850, 140);
    			rectangle(690, 190, 850, 240);
    			rectangle(690, 290, 850, 340);
    			rectangle(690, 390, 850, 440);
    			rectangle(690, 590, 850, 640);
    
    		}
    
    	}
    
    }
    
    //返回要查找/修改/删除人所在结构体的下标
    int ReturnPosi()
    {
    	//接收用户输入
    	char ReceInput[64];
    	TCHAR InputWindowFI[] = _T("请输入学号或者姓名进行(查找)(修改)(删除)");
    	InputBox(ReceInput, 10, InputWindowFI);
    
    	//进行循环查找,一旦相同就跳出循环
    	for (int w = 0; w < NowStudentNums; w++)
    	{
    		if (strcmp(StuArry[w].s_Name, ReceInput) == 0 || strcmp(StuArry[w].s_Num, ReceInput) == 0)//返回0表示两个字符串相等
    		{
    			return w;
    		}
    	}
    	//如果没找到这人就返回-1
    	return -1;
    }
    
    
    //打印找到人 的信息
    void PrintFoudInfor(int Position)
    {
    	//鼠标操作
    	MOUSEMSG PFI;
    	initgraph(860, 760);
    
    	
    
    
    
    	cleardevice();
    	IMAGE picture2;
    	loadimage(&picture2, "./secondbc.jpg", 860, 760);
    	putimage(0, 0, &picture2);
    
    	
    	
    
    	setfillcolor(GREEN);
    	fillrectangle(690, 590, 850, 640);
    	setbkmode(TRANSPARENT);
    
    	//表头文字部分
    	settextstyle(30, 0, "黑体");
    	outtextxy(40, 100, "学号");
    	outtextxy(200, 100, "姓名");
    	outtextxy(300, 100, "语文");
    	outtextxy(400, 100, "数学");
    	outtextxy(500, 100, "英语");
    	outtextxy(600, 100, "总分");
    	outtextxy(740, 600, "返回");
    
    	//打印被查找人的信息
    
    
    	//学号
    	outtextxy(40, 140, StuArry[Position].s_Num);
    	//姓名
    	outtextxy(200, 140, StuArry[Position].s_Name);
    	//语文成绩
    	outtextxy(300, 140, StuArry[Position].s_Chinese);
    	//数学成绩
    	outtextxy(400, 140, StuArry[Position].s_Math);
    	//英语成绩
    	outtextxy(500, 140, StuArry[Position].s_English);
    	//输出总分
    	char SuSo[20];
    	sprintf(SuSo, "%.2f", StuArry[Position].s_SumScore);//小数点后保留两位
    	outtextxy(600, 140, SuSo);
    
    	while (1)
    	{
    		PFI = GetMouseMsg();
    		if (PFI.x >= 690 && PFI.x <= 850 && PFI.y >= 590 && PFI.y <= 640)
    		{
    			//返回
    			setlinecolor(RED);
    			rectangle(690, 590, 850, 640);
    			if (PFI.uMsg == WM_LBUTTONDOWN)
    			{
    				cleardevice();
    				if (FlagFPT == 1)
    				{
    					AdDeSeMoPage();
    				}
    				else if (FlagFPT = -1)
    				{
    					CommonUserPage();
    				}
    			}
    		}
    		//鼠标不在选项上
    		else
    		{
    			setlinecolor(WHITE);
    			rectangle(690, 590, 850, 640);
    		}
    
    	}
    }
    
    
    //查询——这个负责最终的调用
    void PrintFoudInfor()
    {
    	//定义一个变量用来接收下标
    	int TempPosi = ReturnPosi();
    	if (TempPosi == -1)//没找到
    	{
    		//获取窗口句柄
    		HWND hndtipsF = GetHWnd();
    		//用一个字符数组来总结句子
    		int isok = MessageBox(hndtipsF, "查无此人!", "提示", MB_OK);
    	}
    	else//找到了——打印输出
    	{
    		cleardevice();
    		PrintFoudInfor(TempPosi);
    	}
    }
    
    //修改学生信息,找到返回下标,重新给他赋值,保存,否则直接弹窗警告
    void ModifyStudInfor()
    {
    	//直接套用上面查找的操作,在此基础上加一行修改前
    	//因为需要得到要修改人在结构体数组中的位置-下标,所以不能将函数直接拿过来用,得粘贴过来
    	//定义一个变量用来接收下标
    	int TempModi = ReturnPosi();
    	if (TempModi == -1)//没找到
    	{
    		//获取窗口句柄
    		HWND hndtipsM = GetHWnd();
    		//用一个字符数组来总结句子
    		int isok = MessageBox(hndtipsM, "查无此人!", "提示", MB_OK);
    	}
    	else//找到了这个学生进行下面的操作
    	{
    		cleardevice();
    		//鼠标操作
    		MOUSEMSG Modi;
    		initgraph(860, 760);
    
    
    
    		IMAGE picture2;
    		loadimage(&picture2, "./secondbc.jpg", 860, 760);
    		putimage(0, 0, &picture2);
    
    
    		setfillcolor(GREEN);
    		fillrectangle(690, 590, 850, 640);
    
    		//表头文字部分
    		setbkmode(TRANSPARENT);
    		settextstyle(50, 0, "黑体");
    		outtextxy(40, 40, "修改前");
    		outtextxy(40, 240, "修改后");
    		settextstyle(30, 0, "黑体");
    		outtextxy(40, 100, "学号");
    		outtextxy(200, 100, "姓名");
    		outtextxy(300, 100, "语文");
    		outtextxy(400, 100, "数学");
    		outtextxy(500, 100, "英语");
    		outtextxy(600, 100, "总分");
    		outtextxy(740, 600, "返回");
    
    		outtextxy(40, 300, "学号");
    		outtextxy(200, 300, "姓名");
    		outtextxy(300, 300, "语文");
    		outtextxy(400, 300, "数学");
    		outtextxy(500, 300, "英语");
    		outtextxy(600, 300, "总分");
    
    		//打印被查找人的信息
    		//学号
    		outtextxy(40, 140, StuArry[TempModi].s_Num);
    		//姓名
    		outtextxy(200, 140, StuArry[TempModi].s_Name);
    		//语文成绩
    		outtextxy(300, 140, StuArry[TempModi].s_Chinese);
    		//数学成绩
    		outtextxy(400, 140, StuArry[TempModi].s_Math);
    		//英语成绩
    		outtextxy(500, 140, StuArry[TempModi].s_English);
    		//输出总分
    		if (strlen(StuArry[TempModi].s_Name) != 0)
    		{
    			char SuSo1[20];
    			sprintf(SuSo1, "%.2f", StuArry[TempModi].s_SumScore);//小数点后保留两位
    			outtextxy(600, 140, SuSo1);
    		}
    
    
    
    
    
    
    
    		//加入输入弹窗——重新书写内容
    
    		//修改学号
    		while (1)
    		{
    			//用于接收输入的学号,先覆盖进去
    			char TempModiNums[64];
    
    			TCHAR InputWindow0[] = _T("请输入该学生的学号");
    			InputBox(TempModiNums, 9, InputWindow0);
    
    			if (strcmp(TempModiNums,StuArry[TempModi].s_Num)==0)//如果输入的学号和本身位置的学号相同
    			{
    				//不作出变化,直接break
    				break;
    			}
    			else//如果输入的学号和本身位置的学号不同,则需要判断与整个结构体中是否有重复的
    			{
    				int FlagInput3 = 0;
    
    				int nums = strlen(TempModiNums);
    
    				//判断输入的是否是纯数字
    				for (int i = 0; i < nums; i++)
    				{
    					if (TempModiNums[i] >= '0' && TempModiNums[i] <= '9')//如果不是数字
    					{
    
    					}
    					else
    					{
    						FlagInput3 = 1;
    						HWND hwndInput3 = GetHWnd();
    						int isok = MessageBox(hwndInput3, "输入格式有误,请重新输入", "提示", MB_OK);
    						break;
    					}
    				}
    
    				if (FlagInput3 == 0)
    				{
    					//为什么这里新输入的学号,会显示在结构体数组中存在,
    					//因为这是修改函数,上面输入的学号已经覆盖到了他应该取得位置,
    					/*
    					思路1.先别把要该的值覆盖进去,先进行判断
    							判断完成符合条件最后再把值赋给它,
    					思路2.将原本的学生结构体数组复制一份
    							 在新的结构体数组中遍历判断
    
    
    							 //这里选择第一种
    					*/
    					//判断是否输入重复
    					int FlagInput4 = 0;
    					for (int i = 0; i < NowStudentNums; i++)
    					{
    						if (strcmp(TempModiNums, StuArry[i].s_Num) == 0)
    						{
    							FlagInput4 = 1;
    							break;
    						}
    					}
    					if (FlagInput4 == 1)
    					{
    						HWND hwndInput4 = GetHWnd();
    						int isok = MessageBox(hwndInput4, "该学生已经存在,请重新输入", "提示", MB_OK);
    					}
    					else if (FlagInput4 == 0)
    					{
    						//覆盖
    						memcpy(TempModiNums, StuArry[TempModi].s_Num, nums);
    						break;
    					}
    				}
    			}
    		}
    
    		//修改姓名
    		TCHAR InputWindow1[] = _T("请输入该学生的姓名");
    		InputBox(StuArry[TempModi].s_Name, 10, InputWindow1);
    
    		//输入语文成绩
    		while (1)
    		{
    			TCHAR InputWindow2[] = _T("请输入该学生的语文成绩");
    			InputBox(StuArry[TempModi].s_Chinese, 4, InputWindow2);
    
    			if (ScoreFormat(StuArry[TempModi].s_Chinese))//为真跳出循环
    			{
    				break;
    			}
    
    		}
    
    
    
    
    
    		//输入数学成绩
    		while (1)
    		{
    			TCHAR InputWindow3[] = _T("请输入该学生的数学成绩");
    			InputBox(StuArry[TempModi].s_Math, 4, InputWindow3);
    
    			if (ScoreFormat(StuArry[TempModi].s_Math))//为真跳出循环
    			{
    				break;
    			}
    
    		}
    
    
    		//输入英语成绩
    		while (1)
    		{
    			TCHAR InputWindow4[] = _T("请输入该学生的英语成绩");
    			InputBox(StuArry[TempModi].s_English, 4, InputWindow4);
    
    			if (ScoreFormat(StuArry[TempModi].s_English))//为真跳出循环
    			{
    				break;
    			}
    
    		}
    
    		//计算总分
    		StuArry[TempModi].s_SumScore =
    			atof(StuArry[TempModi].s_Chinese) +
    			atof(StuArry[TempModi].s_Math) +
    			atof(StuArry[TempModi].s_English);
    
    		//打印被查找人的信息
    		//学号
    		outtextxy(40, 340, StuArry[TempModi].s_Num);
    		//姓名
    		outtextxy(200, 340, StuArry[TempModi].s_Name);
    		//语文成绩
    		outtextxy(300, 340, StuArry[TempModi].s_Chinese);
    		//数学成绩
    		outtextxy(400, 340, StuArry[TempModi].s_Math);
    		//英语成绩
    		outtextxy(500, 340, StuArry[TempModi].s_English);
    		//输出总分-加一个限制条件
    		if (strlen(StuArry[TempModi].s_Name) != 0)
    		{
    			char SuSo2[20];
    			sprintf(SuSo2, "%.2lf", StuArry[TempModi].s_SumScore);//小数点后保留两位
    			outtextxy(600, 340, SuSo2);
    		}
    
    		//保存文件
    		SaveInforModi();
    
    
    
    
    
    		while (1)
    		{
    			Modi = GetMouseMsg();
    			if (Modi.x >= 690 && Modi.x <= 850 && Modi.y >= 590 && Modi.y <= 640)
    			{
    				//返回
    				setlinecolor(RED);
    				setlinecolor(RED);
    
    				rectangle(690, 590, 850, 640);
    				if (Modi.uMsg == WM_LBUTTONDOWN)
    				{
    					cleardevice();
    					//回到增删查改界面
    					AdDeSeMoPage();
    
    					//辅助测试——显示当前人数
    					/*char temptps[5];
    					sprintf(temptps, "%d", NowStudentNums);
    
    
    					HWND hwndTemp = GetHWnd();
    					int tips2 = MessageBox(hwndTemp, temptps, "提示", MB_OK);*/
    				}
    			}
    			//鼠标不悬停
    			else
    			{
    				setlinecolor(WHITE);
    
    				rectangle(690, 590, 850, 640);
    
    			}
    		}
    	}
    }
    
    //删除某个学生的信息
    void DeSomeStu()
    {
    	//先进行查找,找到返回下标,然后依次将该下标后面的数据往前推,最后人数--
    	//没找到就查无此人
    	//查找
    	// 
    	//因为要实现的功能不同,所以不能直接调用查找函数
    	//定义一个变量用来接收下标
    	int TempDelt = ReturnPosi();
    	if (TempDelt == -1)//没找到
    	{
    		//获取窗口句柄
    		HWND hndtipsD = GetHWnd();
    		//用一个字符数组来总结句子
    		int isok = MessageBox(hndtipsD, "查无此人!", "提示", MB_OK);
    	}
    	else//找到了,确认是否删除
    	{
    		//找到了就提示是否确定删除
    		//获取窗口句柄
    		//delete sure?
    		HWND hndtipsDS = GetHWnd();
    		//用一个字符数组来总结句子
    		int isok = MessageBox(hndtipsDS, "确定删除?", "提示", MB_OKCANCEL);
    		if (isok == IDOK)
    		{
    			//确定删除操作
    			//将这个元素的后一个依次迁移
    			for (int d = TempDelt; d < NowStudentNums - 1; d++)
    			{
    				StuArry[d] = StuArry[d + 1];
    			}
    			//现在的人数-1
    			NowStudentNums--;
    			//删除完成只是将当前结构体里面的数据清除了,但是文件中并没有作出更改
    			//更新到文件中
    			SaveInforModi();//用这个全部清空的函数,再对文件进行重写
    		}
    		else if (isok == IDCANCEL)
    		{
    			//取消删除不执行任何操作
    		}
    	}
    
    }
    
    //按照语文成绩进行排序
    void SortAcChinese()
    {
    	//使用冒泡排序针对语文成绩对学生进行排序
    
    
    	//用循环将每个人的成绩都存进成绩的结构体数组
    	for (int i = 0; i < NowStudentNums; i++)
    	{
    		SoArry[i].SuScore = atof(StuArry[i].s_Chinese);
    	}
    	//对结构体进行排序
    
    	//注意:当用两个结构体进行排序时,即一个结构体辅助另一个结构体进行排序时,
    	//注意两个需要同时发生变化,两个结构体都需要发生变化,积累经验
    
    	for (int r = 0; r < NowStudentNums; r++)
    	{
    		Score TempScore;
    		Student TempStudent;
    		for (int j = 1; j < NowStudentNums - r; j++)
    		{
    			if (SoArry[j - 1].SuScore < SoArry[j].SuScore)
    			{
    				TempScore = SoArry[j];
    				TempStudent = StuArry[j];
    
    				SoArry[j] = SoArry[j - 1];
    				StuArry[j] = StuArry[j - 1];
    
    				SoArry[j - 1] = TempScore;
    				StuArry[j - 1] = TempStudent;
    			}
    		}
    	}
    	//不用保存,默认是按照添加的顺序排序
    }
    
    //按照数学成绩进行排序
    void SortAcMath()
    {
    	//每次给成绩结构体数组赋值都会被重新覆盖
    
    	//用循环将每个人的成绩都存进成绩的结构体数组
    	for (int i = 0; i < NowStudentNums; i++)
    	{
    		SoArry[i].SuScore = atof(StuArry[i].s_Math);
    	}
    	//对结构体进行排序
    
    	//注意:当用两个结构体进行排序时,即一个结构体辅助另一个结构体进行排序时,
    	//注意两个需要同时发生变化,两个结构体都需要发生变化,积累经验
    
    	for (int t = 0; t < NowStudentNums; t++)
    	{
    		Score TempScore;
    		Student TempStudent;
    		for (int j = 1; j < NowStudentNums - t; j++)
    		{
    			if (SoArry[j - 1].SuScore < SoArry[j].SuScore)
    			{
    				TempScore = SoArry[j];
    				TempStudent = StuArry[j];
    
    				SoArry[j] = SoArry[j - 1];
    				StuArry[j] = StuArry[j - 1];
    
    				SoArry[j - 1] = TempScore;
    				StuArry[j - 1] = TempStudent;
    			}
    		}
    	}
    	//不用保存,默认是按照添加的顺序排序
    }
    
    //按照英语成绩进行排序
    void SortAcEnglish()
    {
    	//每次给成绩结构体数组赋值都会被重新覆盖
    
    	//用循环将每个人的成绩都存进成绩的结构体数组
    	for (int i = 0; i < NowStudentNums; i++)
    	{
    		SoArry[i].SuScore = atof(StuArry[i].s_English);
    	}
    	//对结构体进行排序
    
    	//注意:当用两个结构体进行排序时,即一个结构体辅助另一个结构体进行排序时,
    	//注意两个需要同时发生变化,两个结构体都需要发生变化,积累经验
    	//因为顺序是一样的,可以把两个想象成一个
    
    	for (int y = 0; y < NowStudentNums; y++)
    	{
    		Score TempScore;
    		Student TempStudent;
    		for (int j = 1; j < NowStudentNums - y; j++)
    		{
    			if (SoArry[j - 1].SuScore < SoArry[j].SuScore)
    			{
    				TempScore = SoArry[j];
    				TempStudent = StuArry[j];
    
    				SoArry[j] = SoArry[j - 1];
    				StuArry[j] = StuArry[j - 1];
    
    				SoArry[j - 1] = TempScore;
    				StuArry[j - 1] = TempStudent;
    			}
    		}
    	}
    	//不用保存,默认是按照添加的顺序排序
    }
    
    //按照总分进行排序
    void SortAcSumScore()
    {
    	for (int i = 0; i < NowStudentNums; i++)
    	{
    		Student TempStudent;
    		for (int j = 1; j < NowStudentNums - i; j++)
    		{
    			if (StuArry[j - 1].s_SumScore < StuArry[j].s_SumScore)
    			{
    
    				TempStudent = StuArry[j];
    
    
    				StuArry[j] = StuArry[j - 1];
    
    
    				StuArry[j - 1] = TempStudent;
    			}
    		}
    	}
    }
    
    
    //管理员登录
    void AdminSignIn()
    {
    	//打开文件将账号和密码读过来
    	FILE* fp = fopen("AdminSignIn.txt", "r");
    	if (fp == NULL)
    	{
    		return;
    	}
    	//读取到对应的管理员结构体数组
    	fscanf(fp, "%s\t%s\t\n", AdminUser.UserName, AdminUser.PassWord);
    
    	//关闭文件
    	fclose(fp);
    
    
    
    
    	char ReceAcctNumber[64];
    	TCHAR InputAcct[] = _T("请输入用户名");
    	InputBox(ReceAcctNumber, 10, InputAcct);
    
    	char ReceAcctPassWord[64];
    	TCHAR InputPass[] = _T("请输入密码");
    	InputBox(ReceAcctPassWord, 10, InputPass);
    
    	//如果用户名和密码都正确才进度到管理员界面
    	//否则弹窗提示错误
    	if (strcmp(AdminUser.UserName, ReceAcctNumber) == 0 && strcmp(AdminUser.PassWord, ReceAcctPassWord) == 0)
    	{
    		cleardevice();
    		AdminPage();
    	}
    	else
    	{
    		HWND SignError = GetHWnd();
    		int isok = MessageBox(SignError, "用户名或密码错误!", "提示", MB_OK);
    	}
    }
    
    
    
    int main(void)
    {
    	FirstPage();
    	return 0;
    }
    
    展开全文
  • 6.0.8版本升级了以下内容: 1、锁定考试项目以后还能录成绩的BUG 2、写留言版对齐问题 3、任课教师录成绩会显示...(2)五大功能模块:1、学籍管理 2、成绩管理 3、作业管理(美术培训学校专用) 4、学生素质评价
  • 选定某一主题,运用oracle数据库,以及相关技术方法设计和开发一个信息管理的数据库系统,实现数据库的开发应用以及日常管理维护等基本功能。 具体要求如下: (1)选定某一主题,创建一个oracle数据库,对其进行...
  • 3.学生成绩管理系统.zip :合并前各个模块的代码,以及编译出来的可执行文件和中间生成文件。 4.参考程序文件夹:存放示例的可执行系统(朋友老师提供的仅能运行,无代码)。 【PS】下载后不会使用的,下面评论,我...
  • 具体要求学生成绩管理系统从功能上划分可分为以下几大模块:1.学生信息管理学生信息管理模块:设置学生基本信息,并可以对学生信息进行添加、修改、删除。2.课程信息管理课程信息管理:设置课程号,课程名,任课教师...
  • java实现学生成绩管理系统。Java完成算法设计和程序设计并上机调试通过。程序添加适当的注释,程序的书写要采用缩进格式。程序具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应,如插入删除时指定的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 11,718
精华内容 4,687
关键字:

学生成绩管理系统用户界面

友情链接: juleifenxi.zip