【c语言课程设计】基于单链表与结构体的学生奖学金评定系统(菜单操作)

编写C程序,实现以下功能:
1)每名学生信息包括:学号(8个字符)、姓名(最多20个字符)、5门课程成绩(整型)、总成绩(整型)。
2)声明结构体类型用以保存学生信息。
3)从键盘读入全班同学的信息(不超过50人,总成绩由各门课程成绩相加计算得到)。
4)计算每个人的总成绩。
5)按总成绩由高到低对学生信息进行排序,成绩相同则按学号由小到大排序。(默认输入的学号不会重复)。在屏幕输出排序后所有学生信息。
6)奖学金评奖规则:班级总人数的前5%为一等奖学金;班级总人数的前15%除去获得一等奖学金的同学,其余为二等奖学金;班级总人数的前30%除去获得一等和二等奖学金的同学,其余为三等奖学金。(按百分比计算人数时如出现小数则四舍五入)。
但是有任意一门课程不及格则没有评奖资格,获奖资格顺延给下一位同学。
7)在屏幕输出一等、二等、三等奖学金获奖同学的学号、姓名、总成绩以及获奖等级。
8)输入学号,查找该学号的同学,如查到则在屏幕上输出该生所有信息(学号、姓名、各门课程成绩、总成绩、获奖情况),如未查到则输出提示;直到输入#为止。
9)将排序后的所有学生信息(学号、姓名、各门课程成绩、总成绩、获奖情况)写入文本文件中。

定义链表结构体:

#define N 50
#define M 20
typedef struct info
{
    char name[M];//姓名
    char stu_id[M]; //学号
    int Program;//编程成绩
    int Physics;//物理成绩
    int English;//英语成绩
    int Politics;//政治成绩
    int Math;//数学成绩
    int final_score;//五门课总成绩
    char scholorship[M];//奖学金
} INFO;

typedef struct stu
{
    INFO data;        //数据域
    struct stu *next; //指针域
} STU;

创建链表:

STU *createClass(int n)
{
    STU *p, *q, *h;
    h = (STU *)malloc(sizeof(STU));
    h->next = NULL;
    q = h;
    int i;
    for (i = 0; i < n; i++)
    {
        p = (STU *)malloc(sizeof(STU));
        p->next = NULL;
        q->next = p;
        printf("提示:学生学号请输入8位,姓名最多20各字符,课程成绩请输入0-100之内的正整数\n");
        printf("请输入第%d个学生的信息:学生姓名,学生学号,编程成绩,物理成绩,英语成绩,政治成绩,数学成绩\n", i + 1);
        scanf("%s%s%d%d%d%d%d", &p->data.name, &p->data.stu_id, &p->data.Program, &p->data.Physics, &p->data.English, &p->data.Politics, &p->data.Math);
        p->data.final_score = p->data.English + p->data.Math + p->data.Physics + p->data.Politics + p->data.Program;
        q = p;
    }
    scholorship(h);
    return h;
}

显示已输入的链表信息(按照总成绩高低排序,成绩相同的按照学号大小由小到大排序):

void showStuInfo(STU *h) // h为头指针
{
    STU *p;
    p = h->next;
    printf("|姓名  |学号          |编程成绩       |物理成绩    |英语成绩    |政治成绩  |数学成绩   |总成绩   |   奖学金奖项 |\n");
    while (p != NULL)
    {
        printf("|%-6s|%-15s|%-13d|%-13d|%-13d|%-12d|%-10d|%-7d|%-5s|", p->data.name, p->data.stu_id, p->data.Program, p->data.Physics, p->data.English, p->data.Politics, p->data.Math, p->data.final_score,p->data.scholorship);
        printf("\n");
        p = p->next;
    }
}

对单链表中总成绩进行冒泡排序的函数(总成绩相同情况下按照学号进行排序):

void AdjustList(STU *head) 
{                             
    STU *p, *q, *tail;
    tail = NULL;
    while ((head->next->next) != tail) 
    {
        p = head;
        q = head->next;
        while (q->next != tail) 
        {
            if ((q->data.final_score) < (q->next->data.final_score))
            {
                p->next = q->next;
                q->next = q->next->next;
                p->next->next = q; //整体思路为先判断exp大小,满足后结点小时,让
                q = p->next;       //结点连接完成后,将q返回至新的首结点
            }
            if ((q->data.final_score) == (q->next->data.final_score)&&atol(q->data.stu_id)>atol(q->next->data.stu_id))
            {
                p->next = q->next;
                q->next = q->next->next;
                p->next->next = q; //整体思路为先判断exp大小,满足后结点小时,让
                q = p->next;       //结点连接完成后,将q返回至新的首结点
            }
            q = q->next; // p,q前往下一结点继续判断
            p = p->next;
        }
        tail = q; //将结束指针往前一格,经历一次遍历后,改变一个数的位置, 例如1 5 4 3 2 将2还原到5 需要三次遍历,每次遍历中不仅仅让2的位置变了,也让2后面的数变成递增的形式,也是满足了题目需求
                  //即一次遍历确定一个数的位置
    }
}

奖学金评定函数:

void scholorship(STU *h)
{
    int yideng = round(count * 1.0 * 0.05);
    int erdeng = round(count * 1.0 * 0.15);
    int sandeng = round(count * 1.0 * 0.30);
    AdjustList(h);
    //printf("按总成绩由高到低对学生信息进行排序(成绩相同则按学号由小到大排序)\n");
    int i = 1;
    STU *p;
    p = h->next;
    while (p != NULL)
    {
        if (i<=yideng)
        {
            strcpy(p->data.scholorship ,"一等奖");
        }
        else if(i<=erdeng)
        {
            strcpy(p->data.scholorship, "二等奖");
        }
        else if(i<=sandeng)
        {
            strcpy(p->data.scholorship, "三等奖");
        }
        else
        {
            strcpy(p->data.scholorship, "无奖项");
        }
        p = p->next;
        i++;
    }
}

存入文件的操作:

void saveStuInfo(STU *h) // h为头指针
{
    STU *p;
    FILE *fp;
    p = h->next;
    fp = fopen("data.txt", "w");
    if (fp == NULL)
    {
        printf("无法打开文件!");
        exit(0);
    }
    else
    {
        fprintf(fp, "%d\n", count);
        while (p != NULL)
        {
            fprintf(fp, "%s\n%s\n%d\n%d\n%d\n%d\n%d\n%d\n%s\n", p->data.name, p->data.stu_id, p->data.Program, p->data.Physics, p->data.English, p->data.Politics, p->data.Math, p->data.final_score, p->data.scholorship);
            p = p->next;
        }
    }
    fclose(fp);
    printf("保存成功\n");
}

菜单显示:

void showMenu()
{
    printf("------学生信息管理系统V2.0--------\n");
    printf("*       1. 创建学生系统              *\n");
    printf("*       2. 学生信息录入          *\n");
    printf("*       3. 学生信息显示          *\n");
    printf("*       4.学生信息查询(输入学生的学号查询)     *\n");
    printf("*       5. 学生信息保存         *\n");
    printf("*       6.学生信息载入          *\n");
    printf("*       0. 退出系统              *\n");
    printf("----------------------------------\n");
    printf("*  作者:XXX,学号:XXXXXXXXX   *\n");
    printf("----------------------------------\n");
}

完整代码请点击此处下载

你可能感兴趣的:(c语言编程题目,c语言,课程设计,链表,数据结构,开发语言)