5.学生管理系统

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
typedef struct Node {
    char num[20];
    char name[10];
    char sex[5];
    int chinese;
    int math;
    int english;
    char birthday[10];
    int age;
    struct Node* next;
} Node;

Node* create_() {
    Node* G;
    G = (Node*)malloc(sizeof(Node));
    G->next = NULL;
    return G;
}

void add(Node* G) {
    Node* p = G;
    Node* q;
    while (p->next) {
        q = p;
        p = p->next;
    }
    int i;
    int count = 0;
    puts("请输入添加的人数:");
    scanf("%d", &count);
    for (i = 0; i < count; i++) {
        q = (Node*)malloc(sizeof(Node));
        puts("请输入学生姓名:");
        scanf("%s", q->name);
        puts("请输入学生学号:");
        scanf("%s", q->num);
        puts("请输入学生性别:");
        scanf("%s", q->sex);
        puts("请输入学生年龄:");
        scanf("%d", &q->age);
        puts("请输入学生语文成绩:");
        scanf("%d", &q->chinese);
        puts("请输入学生数学成绩:");
        scanf("%d", &q->math);
        puts("请输入学生英语成绩:");
        scanf("%d", &q->english);
        puts("请输入学生出生日期:");
        scanf("%s", q->birthday);
        q->next = NULL;
        p->next = q;
        p = p->next;
    }
    puts("已添加!");
}

// 打印
void print(struct Node* G) {
    printf("------------------------------------------------------------\n");
    printf("    学号      姓名  性别  年龄  语文  数学  英语  出生日期\n");
    Node* p = G->next;
    while (p) {
        printf("%s  %s   %s    %d   %d   %d   %d  ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
        int i;
        for (i = 0; i < 4; i++) {
            printf("%c", p->birthday[i]);
        }
        printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
        p = p->next;
    }
    printf("------------------------------------------------------------");
}

// 平均成绩
void average(struct Node* G) {
    Node* p = G->next;
    int count = 0;
    double chinese = 0;
    double math = 0;
    double english = 0;
    while (p) {
        count++;
        chinese += p->chinese;
        math += p->math;
        english += p->english;
        p = p->next;
    }
    printf("语文平均成绩:%.2f\n数学平均成绩:%.2f\n英语平均成绩:%.2f", chinese / count, math / count, english / count);
}

// 删除
void delete(struct Node* G) {
    Node* p = G->next;
    Node* q = G;
    puts("请输入要删除学生的学号:");
    char num[20];
    scanf("%s", num);
    int flag = 0;
    while (p) {
        if (strcmp(p->num, num) == 0) {
            q->next = p->next;
            flag = 1;
        }
        q = p;
        p = p->next;
    }
    if (flag) {
        puts("已删除!");
        print(G);
    } else {
        puts("未查询到该学号!");
    }
}

// 按年级输出
void gradeprint(struct Node* G) {
    Node* p = G->next;
    int count = 0;
    printf("------------------------------------------------------------\n");
    printf("    学号      姓名  性别  年龄  语文  数学  英语  出生日期\n");
    while (p) {
        if (strncmp(p->num, "2021", 4) == 0) {
            printf("%s  %s   %s    %d   %d   %d   %d  ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
            int i;
            for (i = 0; i < 4; i++) {
                printf("%c", p->birthday[i]);
            }
            printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
            count++;
        }
        p = p->next;
    }
    if (count) {
        printf("以上为2021级学生共%d人!\n", count);
        count = 0;
    }
    printf("------------------------------------------------------------\n");
    p = G->next;
    printf("    学号      姓名  性别  年龄  语文  数学  英语  出生日期\n");
    while (p) {
        if (strncmp(p->num, "2020", 4) == 0) {
            printf("%s  %s   %s    %d   %d   %d   %d  ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
            int i;
            for (i = 0; i < 4; i++) {
                printf("%c", p->birthday[i]);
            }
            printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
            count++;
        }
        p = p->next;
    }
    if (count) {
        printf("以上为2020级学生共%d人!\n", count);
        count = 0;
    }
    printf("------------------------------------------------------------\n");
    p = G->next;
    printf("    学号      姓名  性别  年龄  语文  数学  英语  出生日期\n");
    while (p) {
        if (strncmp(p->num, "2019", 4) == 0) {
            printf("%s  %s   %s    %d   %d   %d   %d  ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
            int i;
            for (i = 0; i < 4; i++) {
                printf("%c", p->birthday[i]);
            }
            printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
            count++;
        }
        p = p->next;
    }
    if (count) {
        printf("以上为2019级学生共%d人!\n", count);
    }
}

// 按性别输出
void sexprint(struct Node* G) {
    Node* p = G->next;
    int count = 0;
    printf("------------------------------------------------------------\n");
    printf("    学号      姓名  性别  年龄  语文  数学  英语  出生日期\n");
    while (p) {
        if (strcmp(p->sex, "男") == 0) {
            count++;
            printf("%s  %s   %s    %d   %d   %d   %d  ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
            int i;
            for (i = 0; i < 4; i++) {
                printf("%c", p->birthday[i]);
            }
            printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
        }
        p = p->next;
    }
    if (count) {
        printf("以上为男生共%d人!\n", count);
        count = 0;
    }
    printf("------------------------------------------------------------\n");
    printf("    学号      姓名  性别  年龄  语文  数学  英语  出生日期\n");
    p = G->next;
    while (p) {
        if (strcmp(p->sex, "女") == 0) {
            count++;
            printf("%s  %s   %s    %d   %d   %d   %d  ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
            int i;
            for (i = 0; i < 4; i++) {
                printf("%c", p->birthday[i]);
            }
            printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
        }
        p = p->next;
    }
    if (count) {
        printf("以上为女生共%d人!\n", count);
    }
}

int getLength(struct Node* G) {
    Node* p = G->next;
    int count = 0;
    while (p) {
        count++;
        p = p->next;
    }
    return count;
}

// 按成绩排序
void sort(struct Node* G) {
    Node* p;
    Node* q;
    Node* m;
    int choice, i;
    puts("1.按语文排序  2.按数学排序  3.按英语排序");
    scanf("%d", &choice);
    int n = getLength(G);
    int num;
    switch (choice) {
    case 1:  // 按语文
        for (i = 0; i < n - 1; i++) {
            num = n - i - 1;
            q = G->next;
            p = q->next;
            m = G;
            while (num--) {
                if (q->chinese < p->chinese) {
                    q->next = p->next;
                    p->next = q;
                    m->next = p;
                }
                m = m->next;
                q = m->next;
                p = q->next;
            }
        }
        print(G);
        break;
    case 2:  // 按数学
        for (i = 0; i < n - 1; i++) {
            num = n - i - 1;
            q = G->next;
            p = q->next;
            m = G;
            while (num--) {
                if (q->math < p->math) {
                    q->next = p->next;
                    p->next = q;
                    m->next = p;
                }
                m = m->next;
                q = m->next;
                p = q->next;
            }
        }
        print(G);
        break;
    case 3:  // 按数学
        for (i = 0; i < n - 1; i++) {
            num = n - i - 1;
            q = G->next;
            p = q->next;
            m = G;
            while (num--) {
                if (q->english < p->english) {
                    q->next = p->next;
                    p->next = q;
                    m->next = p;
                }
                m = m->next;
                q = m->next;
                p = q->next;
            }
        }
        print(G);
    }
}

// 按姓名检索
void find(struct Node* G) {
    Node* p = G->next;
    char name[10];
    puts("请输入要检索的学生的姓名:");
    scanf("%s", name);
    int flag = 0;
    printf("------------------------------------------------------------\n");
    while (p) {
        if (strcmp(p->name, name) == 0) {
            puts("该学生的信息为:");
            printf("    学号      姓名  性别  年龄  语文  数学  英语  出生日期\n");
            printf("%s  %s   %s    %d   %d   %d   %d  ", p->num, p->name, p->sex, p->age, p->chinese, p->math, p->english);
            int i;
            for (i = 0; i < 4; i++) {
                printf("%c", p->birthday[i]);
            }
            printf("-%c%c-%c%c\n", p->birthday[4], p->birthday[5], p->birthday[6], p->birthday[7]);
            flag = 1;
        }
        p = p->next;
    }
    printf("------------------------------------------------------------");
    if (!flag) {
        puts("未查询到该姓名!");
    }
}

void menu() {
    puts("");
    printf("\t\t\t\t\t-----------------------------------\n");
    printf("\t\t\t\t\t*                                 *\n");
    printf("\t\t\t\t\t*         学生信息管理系统        *\n");
    printf("\t\t\t\t\t*                                 *\n");
    printf("\t\t\t\t\t-----------------------------------\n");

    puts("\t\t\t\t\t 1.增加学生");
    puts("\t\t\t\t\t 2.显示全部学生");
    puts("\t\t\t\t\t 3.计算平均成绩");
    puts("\t\t\t\t\t 4.删除一个学生");
    puts("\t\t\t\t\t 5.按年级输出学生信息");
    puts("\t\t\t\t\t 6.按性别输出学生信息");
    puts("\t\t\t\t\t 7.按姓名检索学生");
    puts("\t\t\t\t\t 8.按某一学科成绩对所有学生排序");
    puts("\t\t\t\t\t 0.退出程序");
    printf("\t\t\t\t\t-----------------------------------\n");
}
int main() {
    struct Node* G = create_();
    int choice;

    while (1) {
        menu();
        scanf("%d", &choice);
        switch (choice) {
        case 1:
            add(G);
            break;
        case 2:
            print(G);
            break;
        case 3:
            average(G);
            break;
        case 4:
            delete (G);
            break;
        case 5:
            gradeprint(G);
            break;
        case 6:
            sexprint(G);
            break;
        case 7:
            find(G);
            break;
        case 8:
            sort(G);
            break;
        case 0:
            exit(0);
            puts("成功退出!");
        }
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值