1.    设计题目

2.    设计思想

2.1设计内容及实现

3.    系统结构

4.    数据结构说明和模块算法说明

4.1结构体顺序表的定义

4.2顺序表的构造

4.3顺序表的插入

4.4顺序表的按值查找

4.5顺序表的删除数据

4.6顺序表的按值查找

4.7顺序表的排序算法---冒泡排序

5.    使用说明书

5.1登录系统

5.2新建输入学生信息的输入格式说明

5.3插入学生输入个数说明

5.4学生个人信息查询输入格式说明

5.5删除学生信息输入格式说明

5.6查询所有学生输入格式说明

5.7按总分排序输入格式说明

5.8按学号排序输入格式说明

5.9 更改学生科目成绩输入格式说明

5.10退出系统格式输入说明

6.运行结果

7.测试过程及结果分析

7.1测试数据:

7.2 程序需改进的地方:

8.附录:源程序清单. 

  1. 设计题目

1.1 学生成绩管理系统

  1. 设计思想

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_c语言

2.1 设计结构图

2.1设计内容及实现

首先学生成绩管理要有输入输出和学生信息,学生信息又有姓名、班级、学号;学生成绩查询;插入学生成绩数据;修改学生成绩数据;删除学生成绩数据;按成绩或者学号排序等。

于是根据需求完成学生信息管理系统顺序表的建立、查询、插入、删除,以及修改元素、排序;然后我就把整个系统分成不同的模块,每个模块完成一个特定的子功能,最后把这些模块结合起来组成一个整体,来实现各个功能。

本学生成绩管理系统共8个菜单栏:1.新建输入学生的个人信息; 2.插入学生;3学生个人信息查询;4.删除学生信息;5.查询所有学生成绩信息;6. 按学生总分成绩排序;7. 对学生按学号排序;8.更改学生科目成绩;操作者可以根据不同需求选择不同的操作。

(1) 主函数:通过mian函数user[] = "admin\0"; password[] = "root\0";来存储自定义的账号密码,来进行登录系统,如果登录成功,则进入系统,通过调用调用add_student函数、check_oneStudent函数、stu_out函数、sum_grade函数、insert_stu函数、调用del_stu函数、stu_num函数、update_grade函数从而实现各种功能。

(2) menu函数:只作为一个选项菜单函数,打印输出提示。

(3) add_student函数:通过输入录入学生的个数,从而录入学生的姓名、学号、班级、各科成绩,求出总分,循环几次学生信息的录入。

(4) insert_stu函数:首先要做个判断,因为定义了一个全局变量来控制系统里存放多少个学生,如果录入的学生超过系统的最大容量,就报错;否则就录入学生的名字、学号、班级、各科成绩,在本函数中做了一个学号是否重复的判断,因为每个学生的学号都是唯一的。如果录入的学号在系统中已经存在,就报错。否则插入成功。

(5) stu_check函数:用于实现学生信息的查询,学生只需要输入自己的学号,就可以查到对应的信息,本函数也做了判断,如果输入的学生存在于系统就输出,否则查不到该学生信息。

(6) del_stu函数:用于删除学生本人,通过输入学生的学号,去系统中一一遍历寻找,如果找到,就删除;如果遍历后找不到指定输入的学号,就输出没有该学生。

(7) stu_out函数:用于查询所有学生信息并输出,操作者通过输入,如果起初的系统里就没学生,就输出没学生信息;否则就一一输出所有的学生信息。

(8) stu_num函数:用于对学生学号从小到大排序输出;通过遍历每个学生的学号,按冒泡排序的算法,将所有的学生学号,从小到大输出。

(9) sum_grade函数:用于对学生的所有科目的总成绩一一遍历,也是用冒泡排序的算法实现从高到底的总分排序。

(10) update_grade函数:用于实现对系统中已经存在的各科成绩,进行修改,将需要修改的某科成绩分数与系统中已经存在的数据进行查找并修改保存。如果更改的科目不对,就不报错,否则更改成功。

(11)定义结构体studentInformation,用来存储学生的名字、班级、学号、学生的数据库成绩、高数成绩、C语言成绩、学生总分。

系统结构

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_数据库_02

程序问题加Q:3125841747

4、数据结构说明和模块算法说明

4.1结构体顺序表的定义

#include<stdio.h>

#include<string.h>  //通过strcmp函数比较字符串

#define max 100    //定义顺序表的插入,假设最大值为100

int size = 0;     //构造一个空表



/*显示学生属性的信息*/

typedef struct studentInformation

{

    /*定义结构体成员变量*/

    char student_name[20];

    char student_class[10];

    int student_number;

    float student_mysql;

    float student_math;

    float student_C;

    float sum_grade;

} information;  /*结构体变量名*/

*模块说明: 定义顺序表的存储结构和实现

4.2顺序表的构造

/*新建学生信息*/

void add_student(information im[], int geshu)

{

    int i;

    int count = size + geshu;  //通过输入录入学生的个数,来确认录入循环的次数

    for(i = size; i < count; i++)

    {

        printf("----请录入学生的信息----\n");

        printf("请录入学生的姓名:\n");

        scanf("%s",&im[i].student_name);

        printf("请录入学生的学号:\n");

        scanf("%d",&im[i].student_number);

        printf("请录入学生的班级:\n");

        scanf("%s",&im[i].student_class);

        printf("请录入学生的数据库成绩:\n");

        scanf("%f",&im[i].student_mysql);

        printf("请录入学生的高数成绩:\n");

        scanf("%f",&im[i].student_math);

        printf("请录入学生的C语言成绩:\n");

        scanf("%f",&im[i].student_C);

 im[i].sum_grade=im[i].student_mysql+im[i].student_math+im[i].student_C;

//用来做总成绩的求和

     size++;    //顺序表的长度+1

    }

}

* 模块说明: 顺序表的建立

* 输入参数: 学生的个人信息及学科成绩

* 其它说明: 学生信息包括学号、姓名、数据库成绩、高数成绩、C语言成绩存入结构体数组中

4.3顺序表的插入

/*实现学生信息的查询*/

void insert_stu(information im[])

{

    int i,j;

    i=size;//代表当前的数组下标,size本为全局变量,当插入的时候,只能在末尾插

    if(i>max)

    {

        printf("数据错误!\n");

        return;

    }

    printf("请录入插入的学生名字:\n");

    scanf("%s",im[i].student_name);



    printf("请录入插入的学生学号:\n");

    scanf("%d",&im[i].student_number);

     for(j=0; j<size; j++)   //判断学号是否重复插入

    {

        if(im[j].student_number==im[i].student_number) //判断插入的位置是否合适,也就是说如果用户输入的学号,在结构体数组中能找到,就输出

        {

            printf("学号已经存在,不能重复插入!");

            return ;

        }

    }

    printf("请录入插入的学生班级:\n");

    scanf("%s",im[i].student_class);

    printf("请录入插入的学生数据库成绩:\n");

    scanf("%f",&im[i].student_mysql);

    printf("请录入插入的学生高数成绩:\n");

    scanf("%f",&im[i].student_math);

    printf("请录入插入的学生C语言成绩:\n");

    scanf("%f",&im[i].student_C);

 im[i].sum_grade=im[i].student_mysql+im[i].student_math+im[i].student_C;

   //更新更改后的学生总成绩

    size += 1;    //插入成功后,顺序表的长度+1

    printf("插入成功!\n");

    return ;

}

* 模块说明: 插入元素

* 输入参数: 输入要插入的学生学号

* 其它说明:学生信息包括学号、姓名、数据库成绩、高数成绩、C语言成绩

4.4顺序表的按值查找

/*输入学号查学生*/

void stu_check(information im[], int student_number)

{

    int i;

    for(i = 0; i < size; i++)

    {

        if(im[i].student_number == student_number)  //判断要查找的元素是否存在于顺序表中

          {

            printf("名字 = %s\t学号 = %d\t班级 = %s\t数据库成绩 = %0.2f\t高数成绩 = %0.2f\tC语言成绩 = %0.2f\t总成绩 = %0.2f\n\n",            im[i].student_name,im[i].student_number,im[i].student_class,im[i].student_mysql,im[i].student_math,im[i].student_C,im[i].sum_grade);

            return ;

        }

}

//否则就输出没有找到

   printf("没有该学生的信息!\n");

}

* 模块说明: 查找元素

* 输入参数: 输入要查询的学生学号

* 输出参数: 输出已经存在于顺序表中的元素或找不到该元素

4.5顺序表的删除数据

/*学生删除*/

void del_stu(information im[],int student_number)

{

    int i,j;

    for(i = 0; i < size; i++) //判断要删除的元素是否存在于顺序表中

    {

        if(im[i].student_number == student_number) //通过移动数组元素来删除信息

        {

              for(j = i; j < size - 1; j++)//删除成功后,后面的元素覆盖掉删除的那个位置, 其后面的元素向前移

            {

                im[j] = im[j+1];

            }

            size--;    //删除成功后,表长减1

            printf("删除成功!\n");

            return ;

        }

    }

    printf("没有该学生\n");

}

* 模块说明: 删除元素

* 输入参数: 输入要删除的学生学号

4.6顺序表的按值查找

void stu_out(information im[])

{

    int i;

    if(size == 0) //如果为空表,在顺序表中找到不到该指定元素

    {

        printf("没有学生信息!");

    }

    for(i = 0; i < size; i++)  //从顺序表的一端开始,依次将每个元素同输入定值 student_id进行比较

    {

        printf("名字 = %s\t学号 = %d\t班级 = %s\t\n数据库成绩 = %0.2f\t高数成绩 = %0.2f\tC语言成绩 = %0.2f\n\n",

               im[i].student_name,im[i].student_number,im[i].student_class,im[i].student_mysql,im[i].student_math,im[i].student_C);

    }

}

* 模块说明: 查找元素

* 输入参数: 输入要查找的学生学号

* 输出参数: 输出学生的信息

4.7顺序表的排序算法---冒泡排序

void stu_num(information im[])

{

    int i,j;

    information stu_temp;   //作为交换的标志

    for(i = 0; i < size; i++) //遍历学号

    {

        for(j = 0; j<size-1-i; j++) //冒泡排序

        {

            if(im[j].student_number > im[j+1].student_number) //交换元素

            {

                stu_temp = im[j];

                im[j] = im[j+1];

                im[j+1] = stu_temp;

            }

        }

    }

    printf("按学号排序后的结果为:\n");

    for(i = 0; i < size; i++)

    {

        printf("名字 = %s\t学号 = %d\t班级 = %s\t\n数据库成绩 = %0.2f\t高数成绩 = %0.2f\tC语言成绩 = %0.2f\n\n",

 im[i].student_name,im[i].student_number,im[i].student_class,im[i].student_mysql,im[i].student_math,im[i].student_C);

    }

}

* 模块说明: 按元素(学号)从小到大排序
/*顺序表的排序---冒泡排序(对学生按总分进行排序)*/

void sum_grade(information im[])

{

    int i,j;

    information stu_temp; //作为交换的标志

    for(i = 0; i < size; i++)  //遍历元素

    {

        for(j = 0; j<size-1-i; j++) //冒泡排序

        {

            if(im[j].sum_grade < im[j+1].sum_grade) //作为交换的标志

            {

                stu_temp = im[j];

                im[j] = im[j+1];

                im[j+1] = stu_temp;

            }

        }

    }

    printf("总分从高到低排序后的结果为:\n");

    for(i = 0; i < size; i++)

    {

        printf("名字 = %s\t学号 = %d\t班级 = %s\t\n数据库成绩 = %0.2f\t高数成绩 = %0.2f\tC语言成绩 = %0.2f \t总成绩 = %0.2f\n\n",              im[i].student_name,im[i].student_number,im[i].student_class,im[i].student_mysql,im[i].student_math,im[i].student_C,im[i].sum_grade);

    }

}

* 算法说明: 按元素(总分)从高到底排序

5、使用说明书

5.1登录系统

输入用户名:admin    密码:root,来进行登录系统,因为程序中已存放中该系统的用户名和密码。

 

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_c语言_03

                                                图5.1-1  登录系统的输入格式操作界面

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_数据结构_04

          图5.1-2 进入系统后,未按照菜单选项提示并错误输入的操作界面

5.2新建输入学生信息的输入格式说明

操作者键盘输入1时,会弹出让操作者输入几个学生,操作者值需要输入一个确定的数即可,但是数据不要大于100,因为设计的表长最大值储存值为100,超过会提示报错。

特别说明:本系统中,所有的学生的名字定义的是字符数组类型char student_name[20],故名字长度不能超过20个;学生的班级不能超过10个字,因为班级定义的是字符数组类型,且最大值为10;输入的学号不能超过int的取值范围,因为定义的学号为int类型;学生的各科成绩输入格式不能超过float的取值范围,可以输入整数。输入示例如下图所示:

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_数据结构_05

                                         5.2-1新建学生的输入示例操作界面

5.3插入学生输入个数说明

操作者输入2时,依次输入要插入的学生信息,注意:插入的学生学号不能跟系统中已存在的学号一样,学号每个人都是唯一的,否则插入不成功!输入示例如下图所示:

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_数据结构_06

                                         5.3-1插入学生的输入示例操作界面

5.4学生个人信息查询输入格式说明

当操作者输入3时,会弹出要输入要查询的学号,这是就按操作者的需求进行输入学号,如果要查询的学号在该系统中,就输出该指定的学生,否则查不到该学生信息。输入示例如下图所示:

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_开发语言_07

                               图5.4-1学生个人信息查询输入示例操作界面

5.5删除学生信息输入格式说明

当操作者输入4时,系统会弹出要输入删除的学号,这时,操作者之前输入系统已录入的学号,则会删除成功,否则系统输出没有该学生。输入示例如下图所示:

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_数据库_08

5.5-1删除学生信息的输入格式示例操作界面

5.6查询所有学生输入格式说明

   当操作者要查询学生的信息时,值需要输入5即可;系统就会输出所有的学生信息,比如班级、名字、学号、各科分数。输入示例如下图所示:

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_数据结构_09

5.6-1删除学生信息的输入格式示例操作界面

5.7按总分排序输入格式说明

   当操作者输入6时,系统会输出所有学生从高到低的总分排序,输入示例如下图所示:

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_数据库_10

                                     5.7-1按总分排序输入格式说明操作界面

5.8按学号排序输入格式说明

   当操作者输入7时,系统会输出所有学生学号从小到大的排序,输入示例如下图所示:

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_开发语言_11

                   5.8-1按学号排序输入格式说明操作界面

5.9 更改学生科目成绩输入格式说明

   当操作者输入8时,请按照系统的提示依次输入,首先输入要更改的学号,再输入要修改的科目(科目只能输入数据库、高数、C语言),更改完后,系统会输出“更改成功!”的提示,否则系统提示输入错误。

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_c语言_12

                                 5.9-1 正确更改学生的学科成绩格式说明操作界面

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_c语言_13

5.9-2 错误更改学生的学科成绩操作界面

5.10退出系统格式输入说明

当操作者输入0时,即可成功退出系统。

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_开发语言_14

图5.10-1 成功退出系统界面

6.运行结果

mysql查询01号课程成绩前三的学生号课程号成绩并排序 mysql查询学生科目总成绩_数据结构_15

                                         图6.1  成功登录系统的操作界面

图6.2  成功录入学生信息的操作界面

图6.3  (左)学号不存在的查询或成功查询学生个人信息的操作界

图6.4  成功插入学生信息的操作界面

 图6.5  成功查询所有学生信息的操作界面

图6.6  对所有学生按总成绩从高到低排序的操作界面

 图6.7  对所有学生按学号从小到大排序的操作界面

  图6.8  对学号为1904的学生更改高数成绩的操作成功界面

7.测试过程及结果分析

7.1测试数据:

测试对原有系统中已存在的成绩,进行更改,并查看总分是否也随着更改后的数据而改变:

      图7.1-1 对学号为1904的学生更改高数成绩之后,总分也更改成功的操作界面

在更改学生的科目分数后,总分也会随之更改,测试数据符合预期。

7.2 程序需改进的地方:

(1)当输入学生的学号前几位为0的时候,而存在系统中只有1,前面几位的0未存储到系统中。


图7.2-1

(2)本程序采用的是顺序表存储学生的数据,本质就是 "一次开辟,永久使用",即存储数据之前先开辟好足够的存储空间,空间一旦开辟后期无法改变大小,对于本程序而言,当插入的学生数值大于100的时候,就会报错,导入插入不了。