单链表创建简易学生信息管理系统

该程序实现了一个学生管理系统,包括初始化班级信息、打印班级信息、增加学生信息、按学号删除学生、搜索学生、按学号和成绩排序、找出最高分和最低分以及判断成绩是否为素数的功能。通过链表结构存储学生数据,支持多种操作和查询。
摘要由CSDN通过智能技术生成
//1.班级初始化
class *init(int original_num) {
    printf("初始化人数是%d人\n", original_num);
    class *head = (class *) malloc(sizeof(class));//初始化头节点
    class *temp = head;
    temp->next = NULL;
    int i = 0;
    printf("输入学生信息(依次输入姓名,学号,考勤分,实验分,课程设计分,课堂测试分,期末考试分数):\n");//创建多个新学生节点赋值并连接
    for (i = 0; i < original_num; i++) {
        class *new_stu = (class *) malloc(sizeof(class));
        node++;
        scanf("%s %s %lld", new_stu->first_name, new_stu->last_name, &new_stu->id);
        for (int j = 0; j < 5; j++) {
            scanf("%f", &new_stu->usual_score[j]);
        }
        new_stu->total_score = new_stu->usual_score[0] * 0.05 + new_stu->usual_score[1] * 0.3 +
                               new_stu->usual_score[2] * 0.05 + new_stu->usual_score[3] * 0.2 +
                               new_stu->usual_score[4] * 0.4;
        if (new_stu->total_score >= 93) {
            new_stu->GPA = "A+";
            A++;
        } else if (new_stu->total_score >= 85 && new_stu->total_score < 93) {
            new_stu->GPA = "A";
            a++;
        } else if (new_stu->total_score >= 80 && new_stu->total_score < 85) {
            new_stu->GPA = "B+";
            B++;
        } else if (new_stu->total_score >= 75 && new_stu->total_score < 80) {
            new_stu->GPA = "B";
            b++;
        } else if (new_stu->total_score >= 70 && new_stu->total_score < 75) {
            new_stu->GPA = "C+";
            C++;
        } else if (new_stu->total_score >= 65 && new_stu->total_score < 70) {
            new_stu->GPA = "C";
            c++;
        } else if (new_stu->total_score >= 60 && new_stu->total_score < 65) {
            new_stu->GPA = "D";
            D++;
        } else if (new_stu->total_score < 60) {
            new_stu->GPA = "F";
            F++;
        }

        temp->next = new_stu;
        temp = new_stu;
    }
    temp->next = NULL;
    return (class *) head;
}
//2.打印班级信息
void prints(class *input_class) {
    class *temp = input_class;
    printf("当前班级学生信息是(姓名,学号,总分):\n");
    while (temp->next) {
        temp = temp->next;
        printf("%s %s  %lld  %f %s\n", temp->first_name, temp->last_name, temp->id, temp->total_score, temp->GPA);
    }
}
//3.增加学生信息(放链尾)
class *add(class *input_class) {
    //建立节点连接
    class *temp = input_class;
    class *add_stu = (class *) malloc(sizeof(class));
    node++;
    while (temp->next) {
        temp = temp->next;
    }
    temp->next = add_stu;
    add_stu->next = NULL;
    //输入数据域
    printf("输入新增学生信息(依次输入姓名,学号,考勤分,实验分,课程设计分,课堂测试分,期末考试分数):\n");
    scanf("%s", add_stu->first_name);
    scanf("%s", add_stu->last_name);
    scanf("%lld", &add_stu->id);
    for (int i = 0; i < 5; i++) {
        scanf("%f", &add_stu->usual_score[i]);
    }
    add_stu->total_score =
            add_stu->usual_score[0] * 0.05 + add_stu->usual_score[1] * 0.3 + add_stu->usual_score[2] * 0.05
            + add_stu->usual_score[3] * 0.2 + add_stu->usual_score[4] * 0.4;
    if (add_stu->total_score >= 93) {
        add_stu->GPA = "A+";
        A++;
    } else if (add_stu->total_score >= 85 && add_stu->total_score < 93) {
        add_stu->GPA = "A";
        a++;
    } else if (add_stu->total_score >= 80 && add_stu->total_score < 85) {
        add_stu->GPA = "B+";
        B++;
    } else if (add_stu->total_score >= 75 && add_stu->total_score < 80) {
        add_stu->GPA = "B";
        b++;
    } else if (add_stu->total_score >= 70 && add_stu->total_score < 75) {
        add_stu->GPA = "C+";
        C++;
    } else if (add_stu->total_score >= 65 && add_stu->total_score < 70) {
        add_stu->GPA = "C";
        c++;
    } else if (add_stu->total_score >= 60 && add_stu->total_score < 65) {
        add_stu->GPA = "D";
        D++;
    } else if (add_stu->total_score < 60) {
        add_stu->GPA = "F";
        F++;
    }

    return (class *) input_class;
}
//4.根据学号删除学生信息
class *delete(class *input_class) {
    printf("输入要删除的学生学号:");
    long long int id;
    scanf("%lld", &id);
    class *temp = input_class;
    class *temp1 = NULL;
    while (temp->next) {
        temp1 = temp;
        temp = temp->next;
        if (temp->id == id) {
            if (temp->next != NULL) {
                for (int i = 0; i < 20; i++) {
                    temp->first_name[i] = temp->next->first_name[i];
                    temp->last_name[i] = temp->next->last_name[i];
                }
                temp->id = temp->next->id;
                for (int i = 0; i < 5; i++) {
                    temp->usual_score[i] = temp->next->usual_score[i];
                }
                temp->total_score = temp->next->total_score;

                temp->next = temp->next->next;
            }else{
                free(temp);
                temp = NULL;
                temp1->next = NULL;
            }
        }
    }

    node--;
    return (class *) input_class;
}
//5.搜索学生信息
void search(class *input_class) {
    class *temp = input_class;
    printf("输入要搜索的学生学号:");
    long long int id;
    scanf("%lld", &id);
    while (temp->next) {
        temp = temp->next;
        if (temp->id == id) {
            printf("%s %s  %lld  %f %s\n", temp->first_name, temp->last_name, temp->id, temp->total_score, temp->GPA);
        }
    }
}
//1.根据学号排序`在这里插入代码片`
void sort_by_id(class *input_class) {
    class *temp = input_class;
    long long int t;
    int i, j;
    long long int store[node];
    for (i = 0; i < node; i++) {
        temp = temp->next;
        store[i] = temp->id;
    }
    for (i = 0; i < node; i++)
    {
        for (j = i + 1; j < node; j++)
        {
            if (store[j] > store[i])
            {
                t = store[i];
                store[i] = store[j];
                store[j] = t;
            }
        }
    }
    printf("学号排序如下:\n");
    for (i = 0; i < node; i++) {
        printf("%lld\n", store[i]);
    }
}
//2.根据分数排序
void sort_by_score(class *input_class) {
    class *temp = input_class;
    float t;
    int i, j;
    float store[node];
    for (i = 0; i < node; i++) {
        temp = temp->next;
        store[i] = temp->total_score;
    }
    for (i = 0; i < node; i++)//设置外层循环
    {
        for (j = i + 1; j < node; j++)//设置内层循环
        {
            if (store[j] > store[i])//如果前一个数比后一个数大
            {
                t = store[i];
                store[i] = store[j];
                store[j] = t;
            }
        }
    }
    printf("成绩排序如下:\n");
    for (i = 0; i < node; i++) {
        printf("%f\n", store[i]);
    }
}
//3.输出最高分学生
void max(class *input_class) {
    class *temp = input_class;
    float store[node];
    int i;
    for (i = 0; i < node; i++) {
        temp = temp->next;
        store[i] = temp->total_score;
    }
    float max = store[0];
    for (i = 1; i < node; i++) {
        if (store[i] >= max) {
            max = store[i];
        }
    }
    printf("最高分是%f\n", max);
}

//4.输出最低分学生
void min(class *input_class) {
    class *temp = input_class;
    float store[node];
    int i;
    for (i = 0; i < node; i++) {
        temp = temp->next;
        store[i] = temp->total_score;
    }
    float min = store[0];
    for (i = 1; i < node; i++) {
        if (store[i] <= min) {
            min = store[i];
        }
    }
    printf("最低分是%f\n", min);
}
//5.输入学号,判断成绩是否素数
void prime(class *input_class) {
    class *temp = input_class;
    printf("输入学生学号进行素数判断:");
    long long int id;
    scanf("%lld", &id);
    while (temp->next) {
        temp = temp->next;
        if (temp->id == id) {
            int score = (int) temp->total_score;
            int i;
            int judge = 0;
            for (i = 2; i < score; i++) {
                if (score % i == 0) {
                    judge++;
                }
            }
            if (judge == 0) {
                printf("这个学生的成绩是素数\n");
            } else {
                printf("这个学生的成绩不是素数\n");
            }
        }
    }
}
int main() {
    int origin_num;
    printf("输入初始化人数:");
    scanf("%d", &origin_num);
    class *test = init(origin_num);
    prints(test);
    printf("Okay, data upload finished. What do you what to do next? You can enter a number \n"
           "to tell me.\n");
    int choose;
    printf("1 add\n"
           "2 delete\n"
           "3 search\n"
           "4 sort by id\n"
           "5 sort by score\n"
           "6 best score\n"
           "7 worst score\n"
           "8 prime judge\n"
           "9 encrypt\n"
           "10 analyze\n"
           "0 exit\n");
    scanf("%d", &choose);
    switch (choose) {
        case 1:
            add(test);
            prints(test);
            break;
        case 2:
            delete(test);
            prints(test);
            break;
        case 3:
            search(test);
            break;
        case 4:
            sort_by_id(test);
            break;
        case 5:
            sort_by_score(test);
            break;
        case 6:
            max(test);
            break;
        case 7:
            min(test);
            break;
        case 8:
            prime(test);
            break;
        case 10:
            analyze();
            break;
        case 0:
            break;
    }
    printf("Do you still need my service? You can enter a number to tell me.\n");
    int choose1;
    while (1) {
        printf("1 add\n"
               "2 delete\n"
               "3 search\n"
               "4 sort by id\n"
               "5 sort by score\n"
               "6 best score\n"
               "7 worst score\n"
               "8 prime judge\n"
               "9 encrypt\n"
               "10 analyze\n"
               "0 exit\n");
        scanf("%d", &choose1);
        switch (choose1) {
            case 1:
                add(test);
                prints(test);
                break;
            case 2:
                delete(test);
                prints(test);
                break;
            case 3:
                search(test);
                break;
            case 4:
                sort_by_id(test);
                break;
            case 5:
                sort_by_score(test);
                break;
            case 6:
                max(test);
                break;
            case 7:
                min(test);
                break;
            case 8:
                prime(test);
                break;
            case 10:
                analyze();
                break;
            case 0:
                return 0;
        }
    }
    return 0;
}
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值