专栏首页小L的魔法馆学生信息管理系统

学生信息管理系统

/*编译环境为vc++6.0----VS2015*/
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<Windows.h>
#include<ctype.h>
struct list {
    char ID[20];
    char name[20];
    char gender[5];
    float score;
    struct list *next;
};
                                        /*文件指针*/
char *filename ="'C:\\Users\\ASUS\\Desktop\\myfile.txt";/*文件存储路径*/
int re_ID = 0;                                          /*为了检验是否经过了创建学生信息的检查*/
struct list *List = NULL;                               /*表头*/
struct list *create();                                  /*创建学生链表*/
struct list *Find_Previous(struct list *p);             /*为了删除而使用的查找函数*/
struct list *Find_Previously(struct list *p);           /*为了添加而使用的查找函数*/
struct list *Selectsort(struct list *L);                /*插入排序--按照成绩进行排序*/
void Print();                                           /*打印菜单*/
void Print_Query();                                     /*打印查询菜单*/
void Exit();                                            /*退出*/
void Querying();                                        /*查询*/
void Help();                                            /*帮助手册*/
void Display(struct list *p);                           /*打印表*/
void Save(struct list *pp);                             /*将链表写入文件中*/
void Query_ID(struct list *p);                          /*按学号查询*/
void Query_Name(struct list *p);                        /*按姓名查询*/
void Query_Gender(struct list *p);                      /*按性别查询*/
void Query_Score(struct list *p);                       /*按成绩查询*/
void Addition(struct list *p);                          /*添加学生信息*/
void Delete(struct list *p);                            /*删除学生的信息*/
void Rebuild(struct list *p);                           /*删除所有信息*/
int  check_ID(char ID[]);                               /*检查学号的输入正确性*/
int main(void)  
{
    char choice = '\0';
    while (1) {
        system("cls");
        fflush(stdin);
        Print();
        scanf("%c", &choice);
        switch (choice) {
        case'1':
            List = create();
            break;
        case'2':
            Querying();
            break;
        case'3':
            Selectsort(List);
            break;
        case'4':
            Display(List);
            break;
        case'5':
            Exit();
            break;
        case'6':
            Help();
            break;
        case'7':
            Save(List);
            break;
        case'8':
            Addition(Find_Previous(List));
            break;
        case'9':
            Delete(Find_Previous(List));
            break;
        case'0':
            Rebuild(List);
            break;
        default:
            printf("没有此选择项,请重新输入!\n");
            break;
        }
    }
    return 0;
}

struct list *create() {
    char ch = '\0';
    struct list *head = NULL;
    struct list *current = NULL;
    struct list *previous = NULL;
    while (1) {
        printf("请问是否输入学生信息?(Y or N)\n");
        scanf(" %c", &ch);
        if (tolower(ch) == 'n') {
            puts("你选择了取消输入!\n");
            system("pause");
            break;
        }
        current = (struct list *)malloc(sizeof(struct list));

        if (head == NULL)
            head = current;
        if (previous != NULL)
            previous->next = current;

        puts("请输入学生姓名:");
        scanf("%s", current->name);
        while (1) {
            puts("请输入学生学号:");
            fflush(stdin);
            scanf("%s", current->ID);
            if (check_ID(current->ID) == 0)
                break;
            else
                puts("你输入的格式错误,请重新输入!\n");
        }
        while (1) {
            puts("请输入学生的性别:(注意:boy or girl)");
            fflush(stdin);
            scanf(" %s", current->gender);
            if (strcmp(current->gender, "boy") == 0 || strcmp(current->gender, "girl") == 0)
                break;
            else
                puts("你输入的格式错误,请重新输入!\n");
        }
        while (1) {
            printf("请输入学生的成绩:\n");
            fflush(stdin);
            if (scanf("%f", &current->score)!=EOF&&current->score>=0.0)
                break;
            else
                printf("你输入的格式错误,请重新输入!\n");
                fflush(stdin);
        }
        current->next = NULL;
        previous = current;
    }
    re_ID++;
    return (head);
}

void Exit() {   /*这个是用来退出*/
    int i = 0;
    printf("退出中");
    for (i = 4; i > 0; --i) {
        Sleep(200);
        printf(".");
    }
    exit(0);
}
void Save(struct list *pp)
{
    if (re_ID == 0) {
        printf("请先创建学生信息!\n");
        system("pause");
        return;
    }
    struct list *head = NULL;
    head = pp;
    FILE *fp = NULL;
    if (!(fp = fopen(filename, "wb"))) {
        fprintf(stderr,"\n打开失败\n");
        system("pause");
        return;
    }
    while (head->next != NULL) {
        fwrite(head,sizeof(struct list),1,fp);
        head = head->next;
    }
    fclose(fp);
    printf("数据读入文件完毕\n");
    system("pause");
}


void Display(struct list *p) {
    if (re_ID == 0) {
        printf("请先创建学生信息!\n");
        system("pause");
        return;
    }
    struct list *temp = NULL;
    temp = p;
    while (temp != NULL) {
        printf("-----/*姓名*/--------/*学号*/-----/*性别*/-----/*成绩*/-----\n");
        printf("       %s              %s           %s            %.2f\n", temp->name, temp->ID,temp->gender,temp->score);
        temp = temp->next;
    }
    system("pause");
}
void Print() {
    printf("-----主菜单功能如下:\n");
    printf("-----1.输入学生信息\n");
    printf("-----2.查询\n");
    printf("-----3.排序\n");
    printf("-----4.打印学生信息\n");
    printf("-----5.退出\n");
    printf("-----6.帮助\n");
    printf("-----7.数据写入文件\n");
    printf("-----8.插入学生信息\n");
    printf("-----9.删除学生信息\n");
    printf("-----0.重建学生信息\n");
    printf("请输入你的选择!\n");
}
void Help() {
    puts("Ver3.0-学生信息管理系统\n");
    puts("由于本人是新手,所以一定会有很多的问题\n");
    puts("如果能告诉我,在下不胜感激\n");
    system("pause");
}
void Print_Query() {
    printf("-----查询菜单功能如下:\n");
    printf("-----1.按学号查询\n");
    printf("-----2.按姓名查询\n");
    printf("-----3.按性别查询\n");
    printf("-----4.按成绩查询\n");
    printf("-----5.退出查询\n");
    printf("请输入你的选择:\n");
}
void Querying() {
    char cho = '\0';
    while (1) {
        system("cls");
        fflush(stdin);
        Print_Query();
        scanf("%c", &cho);
        switch (cho) {
        case'1':
            Query_ID(List);
            break;
        case'2':
            Query_Name(List);
            break;
        case'3':
            Query_Gender(List);
            break;
        case'4':
            Query_Score(List);
            break;
        case'5':
            return;
            break;
        default:
            printf("无此选择项!\n");
            system("pause");
            break;
        }
    }
}
void Query_Name(struct list *p) {
    if (re_ID == 0) {
        printf("请先创建学生信息!\n");
        system("pause");
        return;
    }
    struct list *temp = NULL;
    char na[20];
    temp = p;
    printf("请输入你想要查询的姓名:\n");
    scanf("%s", na);
    while (temp != NULL) {
        if (strcmp(temp->name, na) == 0) {
            printf("你的查找如下:\n");
            printf("-----/*姓名*/--------/*学号*/-----/*性别*/-----/*成绩*/-----\n");
            printf("        %s              %s          %s            %.2f\n", temp->name, temp->ID, temp->gender, temp->score);
            temp = temp->next;
        }
        else
            temp = temp->next;
    }
    system("pause");
}
void Query_ID(struct list *p) {
    if (re_ID == 0) {
        printf("请先创建学生信息!\n");
        system("pause");
        return;
    }
    struct list *temp = NULL;
    char id[20];
    temp = p;
    while (1) {
        printf("请输入你想要查询的学号:\n");
        fflush(stdin);
        scanf("%s", id);
        if (check_ID(id) == 0)
            break;
        else
            puts("你输入的格式错误,请重新输入!");
    }
    while (temp != NULL) {
        if (strcmp(temp->ID, id) == 0) {
            printf("你的查找如下:\n");
            printf("-----/*姓名*/--------/*学号*/-----/*性别*/-----/*成绩*/-----\n");
            printf("       %s              %s          %s            %.2f\n", temp->name, temp->ID, temp->gender, temp->score);
            temp = temp->next;
        }
        else
            temp = temp->next;
    }
    system("pause");
}
void Query_Gender(struct list *p) {
    if (re_ID == 0) {
        printf("请先创建学生信息!\n");
        system("pause");
        return;
    }
    struct list *temp = NULL;
    char ge[5];
    temp = p;
    while (1) {
        puts("请输入学生的性别:(注意:boy or girl)");
        fflush(stdin);
        scanf(" %s", ge);
        if (strcmp(ge, "boy") == 0 || strcmp(ge, "girl") == 0)
            break;
        else
            puts("你输入的格式错误,请重新输入!\n");
    }
    while (temp != NULL) {
        if (strcmp(temp->gender,ge) == 0) {
            printf("你的查找如下:\n");
            printf("-----/*姓名*/--------/*学号*/-----/*性别*/-----/*成绩*/-----\n");
            printf("       %s              %s          %s            %.2f\n", temp->name, temp->ID, temp->gender, temp->score);
            temp = temp->next;
        }
        else
            temp = temp->next;
    }
    system("pause");
}
void Query_Score(struct list *p) {
    if (re_ID == 0) {
        printf("请先创建学生信息!\n");
        system("pause");
        return;
    }
    struct list *temp = NULL;
    float sc = 0;
    temp = p;
    while (1) {
        puts("请输入学生的成绩:");
        fflush(stdin);
        if (scanf("%f", &sc) != EOF&&sc >= 0.0)
            break;
        else
            puts("你输入的格式错误,请重新输入!\n");
    }
    while (temp != NULL) {
        if (temp->score == sc) {
            printf("你的查找如下:\n");
            printf("-----/*姓名*/--------/*学号*/-----/*性别*/-----/*成绩*/-----\n");
            printf("       %s             %s          %s            %.2f\n", temp->name, temp->ID, temp->gender, temp->score);
            temp = temp->next;
        }
        else
            temp = temp->next;
    }
    system("pause");
}

struct list *Find_Previously(struct list *p){
    if (re_ID == 0) {
        printf("请先创建学生信息!\n");
        system("pause");
        return NULL;
    }
    struct list *temp = NULL;
    temp = p;
    char iidd[20];
    while (1) {
        printf("请输入你想要查询的学号:(注意:第一条信息之前不能插入信息)\n");
        fflush(stdin);
        scanf("%s", iidd);
        if (check_ID(iidd) == 0)
            break;
        else
            puts("你输入的格式错误,请重新输入!\n");
    }
    while (temp != NULL) {
        if (strcmp(temp->ID, iidd) == 0) {
            break;
        }
        else
            temp = temp->next;
    }
    return temp;
}
struct list *Find_Previous(struct list *p) {
    if (re_ID == 0) {
        printf("请先创建学生信息!\n");
        system("pause");
        return NULL;
    }
    struct list *temp = NULL;
    temp = p;
    char iidd[20];
    while (1) {
        Display(List);
        printf("请输入你想要插入之前的学号:\n");
        fflush(stdin);
        scanf("%s", iidd);
        if (check_ID(iidd) == 0)
            break;
        else
            puts("你输入的格式错误,请重新输入!\n");
    }
    while (temp != NULL) {
        if (strcmp(temp->next->ID, iidd) == 0) {
            break;
        }
        else
            temp = temp->next;
    }
    return temp;
}

void Delete(struct list *p) {
    if (re_ID == 0) {
        printf("请先创建学生信息!\n");
        system("pause");
        return;
    }
    struct list *temp = NULL;
    temp = p->next;
    p->next = temp->next;
    free(temp);
}
void Rebuild(struct list *p) {
    if (re_ID == 0) {
        printf("请先创建学生信息!\n");
        return;
    }
    struct list *temp = NULL;
    struct list *tt = NULL;
    temp = p;
    p->next = NULL;
    while (temp != NULL) {
        tt = temp->next;
        free(temp);
        temp = tt;
    }
    puts("重建学生信信息完成!\n");
    re_ID = 0;
    system("pause");
}
void Addition(struct list *p) {
    if (re_ID == 0) {
        printf("请先创建学生信息!\n");
        system("pause");
        return;
    }
    struct list *temp = NULL;
    temp = (struct list *)malloc(sizeof(struct list));
    if (temp == NULL) {
        fprintf(stderr, "空间不足!\n");
        exit(0);
    }
    puts("请输入学生姓名:");
    scanf("%s", temp->name);
    while (1) {
        puts("请输入学生学号:");
        fflush(stdin);
        scanf("%s", temp->ID);
        if (check_ID(temp->ID) == 0)
            break;
        else
            puts("你输入的格式错误,请重新输入!\n");
    }
    while (1) {
        puts("请输入学生的性别:(注意:boy or girl)");
        fflush(stdin);
        scanf("%s", temp->gender);
        if (strcmp(temp->gender, "boy") == 0 || strcmp(temp->gender, "girl") == 0)
            break;
        else
            puts("你输入的格式错误,请重新输入!\n");
    }
    while (1) {
        printf("请输入学生的成绩:");
        fflush(stdin);
        if (scanf("%f", &temp->score) != EOF&&temp->score >= 0.0)
            break;
        else
            printf("你输入的格式错误,请重新输入!\n");
        continue;
    }
    temp->next = p->next;
    p->next = temp;
}
int check_ID(char ID[]) {
    int i = 0, flag = 0;
    while (ID[i] != '\0') {
        if (ID[i]<'0' || ID[i]>'9') {
            flag = 1;
            break;
        }
        else
            i++;
    }
    return flag;
}

struct list *Selectsort(struct list *L)
{
    float temp;
    struct list *p, *q, *m;
    if (!L->next || !L->next->next)return L;
    p = L->next;
    while (p->next)
    {
        m = p;
        q = p->next;
        while (q)
        {
            if (q->score<m->score)m = q;
            q = q->next;

        }
        if (p != m)
        {
            temp = m->score;
            m->score = p->score;
            p->score = temp;
        }
        p = p->next;
    }

    return L;
}

最后,附上几张测试图:

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 栈模型的实现--链表实现

    栈是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶(top)。push进栈相当于插入,pop相当于删除最后插入的元素,一般不对空栈进行pop...

    Enterprise_
  • string类中字符的大小写转换

    今天做一道题,要用string类,涉及大小写转换,查看了C++文档,string类没有提供这样的方法,只好自己写。 之后是想到一个比较笨的方法,我把...

    Enterprise_
  • 第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--G-旋转矩阵

    链接:https://www.nowcoder.com/acm/contest/90/G 来源:牛客网

    Enterprise_
  • [linux][c/c++]代码片段01

    landv
  • 化曲为直の神奇

    要学好人工智能、机器学习、统计、 计量、量化、优化等等和统计相关的内容, 少不了三大块数学: 微积分、线性代数和概率统计。 前面我们在“概率分布の三奥义”里面探...

    史博
  • 浅谈Kotlin(三):类

    听着music睡
  • 机器学习理解上最新案例:“以貌取物”与“以貌取书”(附下载)

    【新智元导读】 本文介绍 MIT Technology Review 最近报道了关于机器学习的两项研究成果:让机器学会对人产生“第一印象”、能凭借书的封面判断内...

    新智元
  • Discuz! X3.4提示Table './.../k_spider' is marked的解决办法

    (145) Table './.../k_spider' is marked as crashed and should be repaired

    德顺
  • Devexpress XtraGrid 控件编辑的内容,如何实时生效

    跟着阿笨一起玩NET
  • 经典软件架构模式(二)

    今天继续推送“经典软件架构模式(二)之管道和过滤器模式、MVC模式。 管道和过滤器模式 第三个案例是一个WEB的例子,但并不是简单的CGI加数据库,而是一个在...

    韩伟

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动