• 学生成绩管理系统C(链表)语言


    #include"stdio.h"
    #include"stdlib.h"
    #include"string.h"  //用于调用一些函数
    struct person {
        char name[20];
        int ID;
        int chinese;
        int english;
        int math;
        struct person *next;   //连接处的指针
    };                                 //由于create里面就有initialize所以先把initialize放在前面
    
    void initialize(struct person *p, int num) {  //初始化链表里面的值
        printf("innitialize person %d
     name is:", num);  //num用于计入输入的第几个同学
        scanf_s("%s", &p->name, sizeof(p->name));
        getchar();
        printf("ID:");
        scanf_s("%d", &p->ID);
        getchar();
        printf("chinese:");
        scanf_s("%d", &p->chinese);
        getchar();
        printf("math:");
        scanf_s("%d", &p->math);
        getchar();
        printf("english:");
        scanf_s("%d", &p->english);
        getchar();
    }
    
    struct person *create(int len) {
        int num = 0;
        struct person *h = 0, *c, *pre = 0;
        while (num < len) {
            c = (struct person*)malloc(sizeof(struct person)); //malloc取内存 sizeof为这个内存的大小  然后转化成指针
            if (num == 0) { h = c; pre = c; }  // 如果num=0  h存下了首地址  为以后拿做准备
            c->next = NULL;
            if (num) {
                pre->next = c;  //pre为前一块内存的地址  把后一块的首地址赋给前一块的尾
                pre = c;      //收尾连接后  pre指前一块的功能就完成了  然后再指向现在的内存 为下一次拿内存、赋地址做准备
            }
            initialize(c, num);   //每取一块地址就去输入一次
            ++num;
        }return h;
    }
    void traverse(struct person *head) {
        int index = 1;    // 用于计数第几个学生
        while (head != NULL) {  //同样一直到后面没有地址结束
            printf("name is: %s	 ID is:%d	  chinese is:%d	  englishi is:%d	  math is:%d
    ", head->name, head->ID, head->chinese, head->english, head->math);
            head = head->next;  //前一个输完后就要指向下一块地址
            ++index;
        }
    }
    
    int getlength(struct person *head) {
        int num = 0;
        while (head != NULL) {    //当head指向后面没有了 它就是NULL  结束
            ++num;
            head = head->next;  //如果head 不是NULL ++num后要把head指针指向最后
        }return num;
    }
    
    //增加学生信息
    void append_node(struct person *h) {
        struct person *t = h, *p;
        while (t->next != NULL) {      
            t = t->next;
        }p = (struct person *)malloc(sizeof(struct person));
        initialize(p, 0);
        p->next = NULL;    
        t->next = p;
        traverse(h);
    }
    
    
    //删除
    struct person * delete_ID(struct person *head, int ID, int len) {
        struct person *t = head;
        struct person *temp;
        for (int i = 0; i < (len - 1); ++i) {
            if (i == 0) {
                if (head->ID == ID) {  head = head->next;  free(t); traverse(head); return head; }
                if ((t->next)->ID == ID) {
                    temp = t->next;
                    t->next = (t->next)->next;
                    free(temp); traverse(head); return head;
                }
            }
            if (i != 0) {
                if ((t->next)->ID == ID) {
                    temp = t->next;
                    t->next = (t->next)->next;
                    free(temp); traverse(head); return head;
                }t = t->next;
            }
        }return head;
    }
    
    //学号查询
    void search_ID(struct person *head, int ID) {
        while (head != NULL) {
            if (head->ID == ID) {
                printf("name is: %s	 ID is:%d	  chinese is:%d	  englishi is:%d  math is:%d
    ", head->name, head->ID, head->chinese, head->english, head->math);
            }head = head->next;
        }
    }
    
    //姓名查询
    void search_name(struct person *head, char name[20]) {
        while (head != NULL) {
            if ((strcmp(head->name, name)) == 0) { printf("name is: %s	 ID is:%d	  chinese is:%d	  englishi is:%d  math is:%d
    ", head->name, head->ID, head->chinese, head->english, head->math); }
            head = head->next;
        }
    }
    
    //指定学生修改
    void change(struct person *head, char name[20]) {
        while (head != NULL) {
            if (strcmp(head->name, name) == 0) {
                printf(" name is:");
                scanf_s("%s", &head->name, sizeof(head->name));
                getchar();
                printf("ID:");
                scanf_s("%d", &head->ID);
                getchar();
                printf("chinese:");
                scanf_s("%d", &head->chinese);
                getchar();
                printf("english:");
                scanf_s("%d", &head->english);
                getchar();
                printf("math:");
                scanf_s("%d", &head->math);
                getchar();
            }
            head = head->next;
        }
        traverse(head);
    }
    //数学分数平均数
    int average_math(struct person *head, int len) {
        int i = 0, sum = 0, average;
        struct person *t = head;
        while (t != NULL) {
            sum += t->math;
            t = t->next;
        }
        average = (sum / len);
        return average;
    }
    //英语分数平均数
    int average_english(struct person *head, int len) {
        int i = 0, sum = 0, average;
        struct person *t = head;
        while (t != NULL) {
            sum += t->english;
            t = t->next;
        }
        average = (sum / len);
        return average;
    }
    
    //语文分数平均数
    int average_chinese(struct person *head, int len) {
        int  sum = 0, average;
        struct person *t = head;
        while (t != NULL) {
            sum += t->chinese;
            t = t->next;
        }
        average = (sum / len);
        return average;
    }
    
    //成绩区间统计
    int statistics_math(struct person*head, int min, int max) {
        int conter = 0;
        while (head!= NULL) {
            if (head->math >= min&&head->math <= max) {
                ++conter;
                printf("name:%s math score:%d
    ", head->name, head->math);
            }head = head->next;
        }return conter;
    }
    
    int statistics_chinese(struct person*head, int min, int max) {
        int conter = 0;
        while (head != NULL) {
            if (head->chinese >= min&&head->chinese <= max) {
                ++conter;
                printf("name:%s chinese score:%d
    ", head->name, head->chinese);
            }head = head->next;
        }return conter;
    }
    int statistics_english(struct person*head, int min, int max) {
        int conter = 0;
        while (head != NULL) {
            if (head->english >= min&&head->english <= max) {
                ++conter;
                printf("name:%s english score:%d
    ", head->name, head->english);
            }head = head->next;
        }return conter;
    }
    
    //某名学生的平均成绩
    int average_name(struct person*head, char name[20]) {
        int av = 0;
        while (head != NULL) {
            if (strcmp(head->name, name) == 0) { av += head->math; av += head->chinese; av += head->english; }
            head = head->next;
        }
        av = av / 3;
        return av;
    }
    
    //排序数学
    void rank_math(struct person *h, int len) {
        struct person  *t = h, *pre = h;
        int i, math, chinese, english,ID;
        char name[20];
        t = t->next;
        for (i = 0; i < (len - 1); ++i) {
            while (t != NULL) {
                if ((t->math) >(pre->math)) {
                    ID = t->ID; t->ID = pre->ID; pre->ID = ID;
                    math = t->math; t->math = pre->math; pre->math = math;
                    strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);
                    chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;
                    english = t->english; t->english = pre->english; pre->english = english;
                }
                t = t->next;
            }pre = pre->next; t = pre->next;
        }
        traverse(h);
    }
    //排序语文
    void rank_chinese(struct person *h, int len) {
        struct person  *t = h, *pre = h;
        int i, math, chinese, english,ID;
        char name[20];
        t = t->next;
        for (i = 0; i < (len - 1); ++i) {
            while (t != NULL) {
                if ((t->chinese) >(pre->chinese)) {
                    ID = t->ID; t->ID = pre->ID; pre->ID = ID;
                    math = t->math; t->math = pre->math; pre->math = math;
                    strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);
                    chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;
                    english = t->english; t->english = pre->english; pre->english = english;
                }
                t = t->next;
            }pre = pre->next; t = pre->next;
        }
        traverse(h);
    }
    
    //排序英语
    void rank_english(struct person *h, int len) {
        struct person  *t = h, *pre = h;
        int i, math, chinese, english,ID;
        char name[20];
        t = t->next;
        for (i = 0; i < (len - 1); ++i) {
            while (t != NULL) {
                if ((t->english) >(pre->english)) {
                    ID = t->ID; t->ID = pre->ID; pre->ID = ID;
                    math = t->math; t->math = pre->math; pre->math = math;
                    strcpy_s(name, t->name); strcpy_s(t->name, pre->name); strcpy_s(pre->name, name);
                    chinese = t->chinese; t->chinese = pre->chinese; pre->chinese = chinese;
                    english = t->english; t->english = pre->english; pre->english = english;
                }
                t = t->next;
            }pre = pre->next; t = pre->next;
        }
        traverse(h);
    }
    
    void release(struct person *head) {
        struct person *n;   //需要一个指针存着下一个地址
        while (head != NULL) {
            n = head->next;  //把n指向下一块要释放的地址
            free(head);
            head = n;   //然后再把head从前一个地址移到下一个地址
        }
    }
    //取长度
    int getlen(struct person *head) {
        int conter = 0;
        struct person*t = head;
        while (t != NULL) {
            ++conter;
            t = t->next;
        }
        return conter;
    }
    //存入文件
    void openfile(struct person *head, int len) {
        FILE *fp;
        struct person*t = head;
        errno_t err;
        int temp;
        char str[100];
        char s[10];
        if ((err = fopen_s(&fp, "D:\学生信息", "w")) != 0)
        {
            printf("文件打开错误
    ");
        }
        else
        {
            printf("文件打开成功
    ");
        }
        for (int i = 0; i < len; ++i) {
            strcpy_s(str, t->name);
            fputs("name:", fp);
            fputs(str, fp);
            fputs(": ", fp);
    
            fputs("ID:", fp);
            sprintf_s(s, "%d", t->ID);
            fputs(s, fp);
            fputs("  ", fp);
    
            sprintf_s(s, "%d", t->chinese);
            fputs("chinese:", fp);
            fputs(s, fp);
            fputs("  ", fp);
    
            sprintf_s(s, "%d", t->math);
            fputs("math:", fp);
            fputs(s, fp);
            fputs("  ", fp);
    
            sprintf_s(s, "%d", t->english);
            fputs("english:", fp);
            fputs(s, fp);
            fputs("
    ", fp);
            t = t->next;
        }
        return;
    }
    
    
    void menu(struct person *head, int len) {
        int m = 0;
        int min, max;
        int ID = 0;
        int conter = 0;
        char name[20];
        while (1) {
                printf("                      请选择您需要的操作:
    ");
                printf("                                       0.  遍历学生信息
    ");
                printf("                                       1.  增加学生信息
    ");
                printf("                                       2.  删除学生信息
    ");
                printf("                                       3.  修改学生信息
    ");
                printf("                                       4.  按姓名查询
    ");
                printf("                                       5.  按学号查询
    ");
                printf("                                       6.  语文成绩在某个区间段的人数以及学生
    ");
                printf("                                       7.  数学成绩在某个区间段的人数以及学生
    ");
                printf("                                       8.  英语成绩在某个区间段的人数以及学生
    ");
                printf("                                       9.  语文平均分
    ");
                printf("                                       10. 数学平均分
    ");
                printf("                                       11. 英语平均分
    ");
                printf("                                       12. 某个学生的三科平均成绩
    ");
                printf("                                       13. 按语文成绩从高到低排序
    ");
                printf("                                       14. 按数学成绩从高到低排序
    ");
                printf("                                       15. 按英语成绩从高到底排序
    ");
                printf("                                       16. 结束功能并把信息写入文件中
    ");
                scanf_s("%d", &m);
                switch (m) {
                case 0: traverse(head); break;
                case 1: append_node(head); break;
                case 2: {printf("要删除学生信息的学号:");
                    scanf_s("%d", &ID);
                    head=delete_ID(head, ID, getlen(head)); }break;
                case 3: {printf("需要修改学生信息的同学姓名:");
                    scanf_s("%s", &name, sizeof(name));
                    change(head, name); }break;
                case 4: {printf("search by name:");
                    scanf_s("%s", &name, sizeof(name));
                    search_name(head, name); }break;
                case 5: {printf("学号查询:");
                    scanf_s("%d", &ID);
                    search_ID(head, ID); }break;
                case 6: {printf("请输入语文成绩的区间:");
                    printf("min=");
                    scanf_s("%d", &min);
                    printf("max=");
                    scanf_s("%d", &max);
                    printf("语文成绩在区间%d到%d之间的学生:%d人
    ", min, max, statistics_chinese(head, min, max)); }break;
                case 7: {printf("请输入数学成绩的区间:");
                    printf("min=");
                    scanf_s("%d", &min);
                    printf("max=");
                    scanf_s("%d", &max);
                    printf("数学成绩在区间%d到%d之间的学生:%d人
    ", min, max, statistics_math(head, min, max)); }break;
                case 8: {printf("请输入英语成绩的区间:");
                    printf("min=");
                    scanf_s("%d", &min);
                    printf("max=");
                    scanf_s("%d", &max);
                    printf("英语成绩在区间%d到%d之间的学生:共有%d人
    ", min, max, statistics_english(head, min, max)); }break;
                case 9: { printf("average of chinese is%d", average_chinese(head, getlen(head))); }break;
                case 10: { printf("average of math is%d", average_math(head, getlen(head))); }break;
                case 11: { printf("average of english is%d", average_english(head, getlen(head))); }break;
                case 12: {printf("请输入学生的姓名:");
                    scanf_s("%s", &name, sizeof(name));
                    printf("%s 的平均成绩为:%d", name, average_name(head, name)); }break;
                case 13: {printf("按照语文成绩从高到底排序:");
                    rank_chinese(head, getlen(head)); }break;
                case 14: {printf("按照数学成绩从高到底排序:");
                    rank_math(head, getlen(head)); }break;
                case 15: {printf("按照英语成绩从高到底排序:");
                    rank_english(head, getlen(head)); }break;
                case 16: openfile(head, getlen(head)); return;
                }
        }
    }
    
    int main() {
        struct person *head;
        int len;
        int min, max;
        int ID = 0;
        char name[20];
        printf("请输入学生信息");
        printf("学生人数:");
        scanf_s("%d", &len);  //输入要取的地址多少
        head = create(len);   // 创建地址   在create里面就有初始复制函数嵌套
        traverse(head);    //遍历
        menu(head, getlen(head));
        release(head);       //释放内存
        system("pause");
        return 0;
    }
  • 相关阅读:
    eclipse下c/cpp " undefined reference to " or "launch failed binary not found"问题
    blockdev 设置文件预读大小
    宝宝语录
    CentOS修改主机名(hostname)
    subprocess报No such file or directory
    用ldap方式访问AD域的的错误解释
    英特尔的VTd技术是什么?
    This virtual machine requires the VMware keyboard support driver which is not installed
    Linux内核的文件预读详细详解
    UNP总结 Chapter 26~29 线程、IP选项、原始套接字、数据链路访问
  • 原文地址:https://www.cnblogs.com/Stephen-Jixing/p/9866688.html
Copyright © 2020-2023  润新知