C语言学生成绩信息管理系统(超详细版)

这篇具有很好参考价值的文章主要介绍了C语言学生成绩信息管理系统(超详细版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

主题:一个简易成绩管理系统

功能介绍:

1.以文本形式存储学生信息

2.对以存信息进行   1. 插入 2. 修改3. 删除  4.查询  5.成绩数字特征

目录

一:分析

二:查询 

三:菜单

四:初始化函数

五:插入函数

六:修改函数

七:删除函数

八:数字特征

九:显示函数


一:分析

要进行 插入 查询 删除 修改 就还需要进行查询

这些函数内部都需要调用同一种功能的函数因此

                                                                查询函数模块需要精心设计

接下来先看查询函数

在这之前确定数据结构  链式结构(链表), 顺序结构(数组

分析:

0)要进行初始化可以链表头插法(建议带头结点优点接下来可以看到增删查改省去很多判断)

student_information *head;
head = (student_information *)malloc(sizeof(student_information));
head->next = NULL;
while (1)
{
        printf("是否继续输入成绩: 1(是)/0(否) ");
        scanf("%d", &judge);
        if (judge == 1)
        {
            student_information *p;
            p = (student_information *)malloc(sizeof(student_information));
            if (!head->next)
            {
                head->next = p;
                p->next = NULL;
            }
            else
            {
                p->next = head->next;
                head->next = p;
            }
        else
        {
            return head;
        }
}

      也可以结构体数组

1)要进行插入用链表较方便方法如下:

//p为目标结点
    p->next = pf->next;
    pf->next = p;

数组需要进行整体向后挪移 时间复杂度大,写起来不方便

 2)要进行删除链表也较方便:

    pf->next = pf->next->next;

 同样数组需要进行整体向后挪移 时间复杂度大,写起来不方便

 3)要进行修改,查询两者相差不大

综上所述:链表较优

于是

typedef struct student_information
{
    char name[15];   //姓名
    char number[15]; //学号
    int score[3];    //三科成绩
    //还可以加入其他信息类型
    struct student_information *next;
} student_information;

OK

二:查询 

这是姓名进行查询

/// @brief 姓名查询函数
/// @param head
/// @param name
/// @return 返回目标前指针
student_information *inquery_name(student_information *head, char name[])
{
    student_information *p = head;
    while (p->next)
    {
        if (strcmp((p->next)->name, name) != 0)//strcmp()返回值为-+0相等为零
            p = p->next;
        else
            return p;
    }
    return p;
}

下面是学号查询

/// @brief 学号查询函数
/// @param head
/// @param number
/// @return 返回目标前指针
student_information *inquery_number(student_information *head, char number[])
{
    student_information *p = head;
    while (p->next)
    {
        if (strcmp((p->next)->number, number) != 0)
            p = p->next;
        else
            return p;
    }
    return p;
}

/*这两个函数可以改成QQ号,手机号等信息查询,也可以进行双重查询(将姓名QQ一起查询)只需将函数进行双重判断就行。                                                                                                            这两个也可以合并为一个函数因为参数都是string,但是要进行提示使用者要进行何种查询。          */

接下来分析函数

1.参数:是用链表进行的线性结构存储方式,自然参数要有头指针。                                                  2.返回值:为目标结点前一结点利于插入删除,都需要前一结点较方便,上面的函数可以看出来)                                                                                                                                                3.主体较简单,逐个比较即可。

将两函数进行合并为一个函数块

/// @brief 分为 姓名查询与学号查询
/// @param head
/// @return 返回头指针  目标信息的前指针
student_information **inquery_info(student_information *head)
{
    student_information *q, *qf;
    int b;
    char name_inquery[15];
    char number_inquery[15];
    printf("请选择查询方式:1.姓名查询  2.学号查询\n");
    scanf("%d", &b);
    switch (b)
    {
    case 1:
        scanf("%s", name_inquery);
        qf = q = inquery_name(head, name_inquery); //接收前指针
        q = q->next;
        if (q)
        {
            printf("************************************************\n");
            printf("姓名\t学号\t\t成绩1\t成绩2\t成绩3\n");
            printf("%s\t%s\t%d\t%d\t%d\n", q->name, q->number, q->score[0], q->number[1], q->score[2]);
            printf("************************************************\n");
        }
        else
            printf("查询的信息不存在!!!\n");
        break;
    case 2:
        printf("请输入学号:");
        scanf("%s", number_inquery);
        qf = q = inquery_number(head, number_inquery); //接收前指针
        q = q->next;
        if (q)
        {
            printf("************************************************\n");
            printf("姓名\t学号\t\t成绩1\t成绩2\t成绩3\n ");
            printf("%s\t%s\t%d\t%d\t%d\n", q->name, q->number, q->score[0], q->number[1], q->score[2]);
            printf("************************************************\n");
        }
        else
            printf("查询的信息不存在!!!\n");
        break;
    default:
        printf("输入错误!!!\n");
        break;
    }
    point[0] = head;//此处将head,和qf一并传回
    point[1] = qf;
    return point;
}

三:菜单

int main(void)
{
    student_information *head;
    student_information **temp; //临时存储头指针与目标前指针
    int flag = 1;
    do
    {
        printf("初始化信息: 1\n");
        printf("插入信息:   2\n");
        printf("查询信息:   3\n");
        printf("修改信息:   4\n");
        printf("删除信息:   5\n");
        printf("成绩特征:   6\n");
        printf("打印信息单: 7\n");
        printf("退出程序:   0\n");
        int o;
        printf("请选择功能:");
        scanf("%d", &o);
        switch (o)
        {
        case 1:
            head = init_info();
            break;
        case 2:
            head = insert_info(head);
            break;
        case 3:
            temp = inquery_info(head);
            head = temp[0];
            break;
        case 4:
            head = modify_info(head);
            break;
        case 5:
            head = dele_info(head);
            break;
        case 6:
            digitalFeature(head);
            break;
        case 7:
            show_info(head);
            break;
        case 0:
            flag = 0;
            printf("************************************************\n");
            printf("感谢使用!!!\n");
            printf("************************************************\n");
            break;
        default:
            printf("\n输入错误,请重新输入!!!!\n\n");
            break;
        }
    } while (flag);
}

四:初始化函数

要求需要将信息存储进文件如下

//文件写入
    FILE *fp = fopen("information.txt", "w+");
    if (!fp)
    {
        printf("文件打开失败!!");
    }
    char str_1[] = "s";

    fputs(p->name, fp);
    fputs("\t", fp);

    fputs(p->number, fp);
    fputs("\t", fp);

    itoa(p->score[0], str_1, 10);//integer to array 整形转化为字符串
    fputs(str_1, fp);
    fputs("\t", fp);

    itoa(p->score[1], str_1, 10);
    fputs(str_1, fp);
    puts("\t", fp);

    itoa(p->score[2], str_1, 10);
    fputs(str_1, fp);
    fputs("\n", fp);

    fclose(fp);

 初始化:

student_information *init_info()
{
    int judge;

    //文件写入
    FILE *fp = fopen("information.txt", "w+");
    if (!fp)
    {
        printf("文件打开失败!!");
    }

    //带头结点链表
    student_information *head;
    head = (student_information *)malloc(sizeof(student_information));
    head->next = NULL;
    while (1)
    {
        printf("是否继续输入成绩: 1(是)/0(否) ");
        scanf("%d", &judge);
        if (judge == 1)
        {
            student_information *p;
            p = (student_information *)malloc(sizeof(student_information));
            printf("请输入信息:\n姓名\t学号\t成绩1\t成绩2\t成绩3\n");
            scanf("%s%s%d%d%d", p->name, p->number, &(p->score[0]), &(p->score[1]), &(p->score[2]));
            if (!head->next)
            {
                head->next = p;
                p->next = NULL;
            }
            else
            {
                p->next = head->next;
                head->next = p;
            }
            //文件写入部分
            //
        }
        else
        {
            fclose(fp);
            return head;
        }
    }
}

五:插入函数

/// @brief 显示系统所有信息 将新信息插入到指定位序上
/// @param head
/// @return 返回新链表的头指针
student_information *insert_info(student_information *head)
{
    //文件写入

    int j, i;
    show_info(head);
    printf("请输入要插入的位序 \n");
    scanf("%d", &j);
    student_information *p;
    p = (student_information *)malloc(sizeof(student_information));
    printf("请输入信息:姓名\t学号\t成绩1\t成绩2\t成绩3\n");
    scanf("%s%s%d%d%d", p->name, p->number, &(p->score[0]), &(p->score[1]), &(p->score[2]));
    student_information *pf = head;
    for (i = 1; i < j; i++)
    {
        pf = pf->next;
    }
    p->next = pf->next;
    pf->next = p;
    printf("插入成功!!!\n");
    p = head->next;
    //写入文件
    char str_2[] = "s";
    while (p)
    {
        //即使存入文件
        //文件写入部分
        //
        p = p->next;
    }
    //fclose(fp_1);
    return head;
}

六:修改函数

/// @brief 修改信息 并重新存储到文档中
/// @param head
/// @return 返回新链表的头指针
student_information *modify_info(student_information *head)
{
    //文件写入
    //

    student_information **p;
    student_information *q;
    p = inquery_info(head); //接受返回的头指针与目标前指针
    q = p[1];               //接收目标指针
    q = q->next;            //移动到目标指针
    if (q == NULL)
    {
        printf("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        printf("输入信息错误,信息不存在!!\n");
    }
    else
    {
        int flag = 1;
        while (flag)
        {
            int s;
            printf("请选择要修改的信息:\n1.姓名, 2.学号, 3.成绩1, 4.成绩2, 5.成绩3, 0.不修改退出\n");
            scanf("%d", &s);
            switch (s)
            {
            case 1:
                printf("请输入新姓名\n");
                scanf("%s", q->name);
                printf("修改成功!!!!\n");
                break;
            case 2:
                printf("请输入新学号\n");
                scanf("%s", q->number);
                printf("修改成功!!!!\n");
                break;
            case 3:
                printf("请输入新成绩1\n");
                scanf("%d", &(q->score[0]));
                printf("修改成功!!!!\n");
                break;
            case 4:
                printf("请输入新成绩2\n");
                scanf("%d", &(q->score[0]));
                printf("修改成功!!!!\n");
                break;
            case 5:
                printf("请输入新成绩3\n");
                scanf("%d", &(q->score[0]));
                printf("修改成功!!!!\n");
                break;
            case 0:
                flag = 0;
                break;
            default:
                printf("请重新输入!!\n");
                break;
            }
        }
    }
    student_information *p_2;
    p_2 = head->next;
    char str_3[] = "j";
    //写入文件
    while (p_2)
    {
        //
        p_2 = p_2->next;
    }
    //fclose(fp_2);
    return p[0]; //返回头指针
}

七:删除函数

/// @brief 删除信息 并重新存储到文档中
/// @param head
/// @return 返回新链表的头指针
student_information *dele_info(student_information *head)
{
    //文件写入

    student_information **p;
    student_information *q;
    p = inquery_info(head); //接受返回的头指针与目标前指针
    q = p[1];               //接收目标指针的前指针 不移动到目标指针利于删除
    if ((q->next) != NULL)
    {
        q->next = q->next->next;
        printf("删除成功!!!!\n");
    }
    else
    {
        printf("输入信息错误,信息不存在!!\n");
    }
    head = p[0]; //接收头指针

    student_information *p_3;
    p_3 = head->next;
    char str_4[] = "j";
    //写入文件
    while (p_3)
    {
        //

        p_3 = p_3->next;
    }
    //fclose(fp_3);
    return head; //返回新链表的头指针
}

八:数字特征

自由发挥部分

/// @brief 显示平均分 最高分 不及格人数 优秀率
/// @param head
void digitalFeature(student_information *head)
{
    int h;
    student_information *sco = head->next;
    int total[subjectTotal] = {0};       //临时变量 存分数之和
    double average[subjectTotal];        //平均分
    int max_score[subjectTotal] = {0};   //最高分
    double people = 0.0;                 //总人数
    int people_fail[subjectTotal] = {0}; //三科不及格人数
    int people_good[subjectTotal] = {0}; //优秀人数
    double goodRate[subjectTotal] = {0}; //三科优秀率
    while (sco != NULL)
    {
        people += 1;
        for (h = 0; h < subjectTotal; h++)
        {
            total[h] += sco->score[h];
            if (sco->score[h] < 60)
                people_fail[h]++;
            if (sco->score[h] >= 85)
                people_good[h]++;
            if (sco->score[h] > max_score[h])
                max_score[h] = sco->score[h];
        }
        sco = sco->next;
    }
    for (h = 0; h < subjectTotal; h++)
    {
        average[h] = total[h] / people;
        goodRate[h] = people_good[h] / people;
    }
    printf("**********************************************************************\n");
    printf("                         成绩数字特征                              \n");
    for (h = 0; h < subjectTotal; h++)
    {
        printf("科目%d\t平均分%6.2f\t最高分%d\t不及格人数%d\t优秀率%6.2f\n", h + 1, average[h], max_score[h], people_fail[h], goodRate[h]);
    }
    printf("**********************************************************************\n");
}

九:显示函数

/// @brief 显示全部信息
/// @param head
void show_info(student_information *head)
{
    student_information *p = head->next;
    int i = 1;
    printf("************************************************\n");
    printf("序号\t姓名\t学号\t\t成绩\t成绩\t成绩\n ");
    while (p)
    {
        printf("%d\t%s\t%s\t%d\t%d\t%d\n", i, p->name, p->number, p->score[0], p->number[1], p->score[2]);
        p = p->next;
        i++;
    }
    printf("************************************************\n");
}

十:运行结果 

菜单

c语言学生成绩信息管理系统,c语言,大作业,函数,c语言,数据结构,链表

初始化 

c语言学生成绩信息管理系统,c语言,大作业,函数,c语言,数据结构,链表

插入 

c语言学生成绩信息管理系统,c语言,大作业,函数,c语言,数据结构,链表

查询 

c语言学生成绩信息管理系统,c语言,大作业,函数,c语言,数据结构,链表

修改 

c语言学生成绩信息管理系统,c语言,大作业,函数,c语言,数据结构,链表

删除 

c语言学生成绩信息管理系统,c语言,大作业,函数,c语言,数据结构,链表

 就到这了!!!!!!

内容仅供自己学习记录,欢迎指正!!!!感谢!!!!文章来源地址https://www.toymoban.com/news/detail-525242.html

到了这里,关于C语言学生成绩信息管理系统(超详细版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 学生成绩管理系统(合并文件,查找,总分排序,保存补考学生信息)

    目录 题目及要求: 录入学生成绩信息到链表中 合并文件 直接插入排序(总分降序) 冒泡排序(总分降序) 顺序查找(名字查找) 二分查找(名字查找)  这里是先按字母首字母排序再查找 保存不及格学生到文件中 现有学生成绩信息文件 1(1.txt),内容如下(同学自己补

    2024年02月10日
    浏览(49)
  • Java基础——学生成绩信息管理系统(简单实现)

    1、 定义一个学生类 Student,包含姓名、成绩信息; 2、使用 ArrayList集合存储学生对象; 3、 对集合中的元素进行增删查改的操作。 学生类可以包含姓名、成绩、学号、年龄等等,这里只包含了前两项学生类属性。 在该类中定义了简单的增、删、查、改的方法。 其中,遍历集

    2024年02月11日
    浏览(35)
  • 【学生成绩管理系统----C语言】

    还在为期末程序设计而烦恼吗,不要担心,大师帮你安利一波完整的的管理系统代码,对你有帮助记得加关注噢! 文章目录 一、学生成绩管理系统是什么? 二、信息管理的七个模块 1.Step one 2.Step Two  3.Step Three 4.Step four 5.Step five 6.Step Six 7.Next 总结        学生信息管理系统

    2024年02月03日
    浏览(56)
  • 课设——C语言学生成绩管理系统

            相信许多同学在大学期间,学习计算机相关课程的时候,都有一个令人头疼的问题——课程设计。那么本片文章就详细的分享一个用C语言实现一个简单学生成绩管理系统,供同学们学习和参考(文章最后会附上源程序)。 1.建立一张学生成绩表,每个学生包含 学

    2024年02月11日
    浏览(82)
  • 学生成绩管理系统(C语言实现)

    设计并实现一个简单的学生成绩管理系统 学生成绩表信息包括学号、姓名、各科课程成绩(语文、数学、英语、政治)和总分。用带头结点的单链表管理学生成绩表,每个学生的信息依次从键盘输入,并根据需要进行插入、删除、排序、输出等操作。 一、 实训环境 信息工程

    2024年02月11日
    浏览(39)
  • 学生信息及成绩管理系统(Python+Sqlite)数据库版

    目录 功能模块: 运行功能演示:  具体代码实现过程: 创建sqlite 数据库  Python代码 引入os和sqlite3包: 初始化数据库: 连接数据库: 关闭并提交数据到数据库: 查询数据并显示: 添加并插入数据到数据库: 更新数据到数据库: 删除数据并更新数据库:  导入和导出数据

    2024年02月04日
    浏览(47)
  • C语言课程设计-学生成绩管理系统

    需求分析: 1.设计题目:学生成绩管理系统 2.系统功能需求分析:实现对学生各科成绩总分及平均分的排序,和成绩的查找 概要设计 1. 功能模块图 详细设计 1. 流程图 测试结果 :列出所有功能的运行界面,并作文字说明。 1.录入成绩:录入3个人的学号和各科成绩 2.每门课程

    2024年02月11日
    浏览(51)
  • C语言编程学生成绩管理系统

    目录 一、介绍 二、功能 1.录入学生 2.删除学生信息 3.修改学生信息 4.查询学生信息 5.所有学生信息 6.成绩排序  7.退出程序 三、代码 1.主函数 2.头文件 3.函数封装库         利用C语言,运用链表、指针、封装函数等基本知识实现一个学生管理系统。通过在终端对学生信息进

    2024年02月10日
    浏览(54)
  • C语言学生成绩管理系统(综合项目)

    1. 这个代码主要实现以下功能: 2. 用到的主要参数有:     1.整型变量int n;用于储存学生人数和之后的循环判断。     2.字符串char name[][];用于储存姓名。     3.浮点型变量float score[];用于储存成绩。     4.长整型变量long ID[Max];用于储存学号。 3.用到的子函数有: int  Menu(

    2024年02月11日
    浏览(43)
  • 基于mysql+jdbc+java swing的学生成绩信息管理系统

    来csdn也有两年了,在这期间学了很多的知识,也跟着许多的大神做了几个小项目。但自己也在想什么时候能够有个自己的项目,之前在学校做过一个基于集合存储数据的学生信息管理系统,现在想着改进一下,于是趁着暑假做了一个小项目吧(基于mysql+jdbc+java swing的学生成绩

    2024年02月04日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包