亲宝软件园·资讯

展开

C语言学籍管理系统

指关节 人气:0

学校的课程设计,自己完成后整理了一下。
自己用链表实现的一个较简单的学籍管理系统,都是通过一些链表以及文件的基本操作完成。

功能实现

1-录入学生信息。
2-查询学生信息。
3-修改学生信息 。
4-删除学生信息。
5-显示学生信息。
6-统计信息报表。
7-读盘,存盘。

注:一些getchar()以及换行符是我为了让界面美观自己加的。

#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<ctype.h>
#include<string.h>
#include<windows.h>
#define LEN sizeof(struct _stu)

typedef struct _stu
{
    long int id;        //学号
    char name[20];      //姓名
    char sex[10];       //性别
    char teacher[20];   //老师
    int years;          //年龄
    char date[20];      //入学时间
    float score;        //入学成绩
    struct _stu *next;  //指向下个结点的指针
}Stu;

int count = 0;//链表长度,学生总数
char choice_s;//选择

void Show();//登陆界面
void Menu();//显示主菜单
Stu *Insert(Stu *pHead);//录入
Stu *Find(Stu *pHead, int id);
void Find_sum(Stu *pHead);//查询
void print(Stu *p);//显示
void Change(Stu *pHead, int id);//修改
Stu *Delete(Stu *pHead, int id);//删除
void printAll(Stu *pHead);//显示全部学生信息(总)
void printAll_1(Stu *pHead);//显示全部学生信息(姓名升序)
void printAll_2(Stu *pHead);//显示全部学生信息(成绩降序)
void data_statistics(Stu *pHead);//数据统计,打印报表
Stu *read_file(Stu *pHead);//读盘
void DeleteLink(Stu *pHead);//销毁链表
void save_file(Stu *pHead);//存盘

int main()
{
    SetConsoleTitle("西安邮电大学学籍管理系统");        //头文件<windows.h>

    int i = 0;
    long int id;
    Stu *pHead = NULL;

    system("color 5A");                    //头文件<windows.h>,改变程序背景及字体颜色
    Show();
    pHead = read_file(pHead);
    while(1)
    {
        Menu();
        switch(choice)
        {
        case '1':
            pHead = Insert(pHead);
            break;
        case '2':
            Find_sum(pHead);
            break;
        case '3':
            printf("\n\n");
            printf("\t输入要修改学生学号: ");
            scanf("%ld",&id);
            Change(pHead,id);
            break;
        case '4':
            printf("\n\n");
            printf("\t输入要删除学生学号: ");
            scanf("%ld",&id);
            pHead = Delete(pHead,id);
            break;
        case '5':
            printAll(pHead);
            break;
        case '6':
            data_statistics(pHead);
            break;
        case '7':
            printf("\n\n");
            printf("\t学生总数为:%d\n",count);
            printf("\n");
                printf("\t请按任意键继续...");
            break;
        case '0':
            save_file(pHead);
            DeleteLink(pHead);    //销毁链表
            printf("\n\n\n");
            printf("\t谢谢使用!\n");
            exit(0);
        }
    }
    return 0;
}

void Show()    //自己添加的登陆功能,比较简单,可以自己修改添加
{
    int i;
    char passwd[18];
    char *ch = "WELCOME";
    printf("\n\n\n");
    printf("\t\t\t----------------------------------------------------------\n");
    printf("\t\t\t|                 Welcome To The System                  |\n");
    printf("\t\t\t----------------------------------------------------------\n");
    printf("\t\t\t                  用户名登陆:");

   do
    {
        scanf("%s",passwd);
        if((strcmp(passwd,"1234567")) != 0)
        {
            printf("\a");//错误警示
            printf("\n");
            printf("\t\t\t                  用户名错误,请重新输入:");
            fflush(stdin);
        }
    }while((strcmp(passwd,"1234567")) != 0);

    for(i = 1; i <= 100; i++)
    {
        printf("\n\n\n\n\n\n\n\n\n");
        printf("\t\t\t\t\t加载:%d%%",i);
        Sleep(9);                //头文件<windows.h>,停顿9毫秒
        system("cls");            //头文件<windows.h>,清屏
    }

    printf("\n\n\n\n\n\n\n\n\n");
    printf("\t\t\t\t\t加载完毕");
    Sleep(666);
    system("cls");

    printf("\n\n\n\n\n\n\n\n\n");
    printf("\t\t\t\t\t");
    for(i = 0; i < 7; i++)
    {
        printf("%c",ch[i]);
        Sleep(333);
    }
    printf("\n\n\n");
    printf("\t\t\t\t\t\t\t请按任意键继续...");
}

void Menu()        //主菜单
{
    getch();
    system("cls");//清屏
    system("color 0D");
    printf("\n\n");
    printf("\t----------------------------------------------------------\n");
    printf("\t|                 欢迎使用学籍管理系统                   |\n");
    printf("\t----------------------------------------------------------\n");
    printf("\t|                   1-录入学生信息                       |\n");
    printf("\t----------------------------------------------------------\n");
    printf("\t|                   2-查询学生信息                       |\n");
    printf("\t----------------------------------------------------------\n");
    printf("\t|                   3-修改学生信息                       |\n");
    printf("\t----------------------------------------------------------\n");
    printf("\t|                   4-删除学生信息                       |\n");
    printf("\t----------------------------------------------------------\n");
    printf("\t|                   5-显示学生信息                       |\n");
    printf("\t----------------------------------------------------------\n");
    printf("\t|                   6-统计信息报表                       |\n");
    printf("\t----------------------------------------------------------\n");
    printf("\t|                   7-学生总数(.读盘)                    |\n");
    printf("\t----------------------------------------------------------\n");
    printf("\t|                   0-退出程序(.存盘)                    |\n");
    printf("\t----------------------------------------------------------\n");
    printf("\t请选择功能(0-7): ");
    fflush(stdin);
    scanf("%c",&choice_s);
    if(choice_s < '0' || choice_s > '7')
    {
        printf("\t请重新选择功能(0-7): ");
        scanf("%c",&choice_s);
    }
    system("cls");//清屏
}

Stu *Insert(Stu *pHead)        //创建链表
{
    Stu *pEnd;
    Stu *pNew,*q;
    pNew = (Stu *)malloc(LEN);
    q = pHead;
    pEnd = pHead;

    printf("\n\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                  ***录入学生信息***                   |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t该学生的学号为: ");
    scanf("%ld",&pNew->id);

    while(pNew->id < 0)
    {
        printf("\t学号不能为负,请重新输入");
        scanf("%ld",&pNew->id);
    }
    while(q)
    {
        if(q->id == pNew->id)
        {
            printf("\t学号已存在,请重新输入: ");
            scanf("%ld",&pNew->id);
            q = pHead;
            continue;
        }
        q = q->next;
    }
    printf("\t学生姓名: ");
    scanf("%s",pNew->name);
    printf("\t学生性别: ");
    scanf("%s",pNew->sex);
    printf("\t学生老师: ");
    scanf("%s",pNew->teacher);
    printf("\t学生年龄: ");
    scanf("%d",&pNew->years);
    while(pNew->years < 0)
    {
        printf("\t年龄不能为负,请重新输入:");
        scanf("%d",&pNew->years);
    }
    printf("\t学生入学时间: ");
    scanf("%s",pNew->date);
    while(strlen(pNew->date) < 8)
    {
        printf("\t入学日期(年/月/日),请重新输入; ");
        scanf("%s",pNew->date);
    }
    printf("\t学生入学成绩: ");
    scanf("%f",&pNew->score);
    while(pNew->score < 0 || pNew->score > 750)
    {
        printf("\t入学成绩(0-750),请重新输入: ");
        scanf("%f",&pNew->score);
    }
    
    pNew->next = NULL;
    if(pHead == NULL)
        pHead = pNew;
    else
    {
        while(pEnd && pEnd->next != NULL)
            pEnd = pEnd->next;
        pEnd->next = pNew;
    }
    count++;
    printf("\n");
    printf("\t请按任意键继续...");
    return pHead;
}

void Find_sum(Stu *pHead)    //4种查询方式    
{
    char choice;
    long int id;
    float score;
    char teacher[20];
    Stu *p = pHead;

    printf("\n\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                  ***查询学生信息***                   |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                     1.按学号查询                      |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                     2.按成绩查询                      |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                     3.按老师和学号查询                |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                     4.按老师和成绩查询                |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                     0.返回主菜单                      |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t请选择查询方式: ");
    fflush(stdin);
    scanf("%c",&choice);
    while(choice < '0' || choice > '4')
    {
        printf("\t请重新选择功能(0-4): ");
        fflush(stdin);
        scanf("%c",&choice);
    }

    switch(choice)
    {
    case '1':
        printf("\t输入要查询学生学号: ");
        scanf("%ld",&id);
        print(Find(pHead,id));        //调用print(),Find()函数
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return;
    case '2':
        printf("\t输入要查询学生成绩: ");
        scanf("%f",&score);
        while(p && p->score != score) p = p->next;
        if(!p)
        {
            printf("\t对不起,没有查询到该学生信息.\n");
        }
        else
        {
            printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
            printf("\t---------------------------------------------------------\n");
            while(p)
            {
                if(p->score == score)
                {
                    printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",p->id,p->name,p->sex,p->teacher,p->years,p->date,p->score);
                    p = p->next;
                }
                else
                    p = p->next;
            }
        }
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return;
    case '3':
        printf("\t输入要查询老师和其学生学号: ");
        scanf("%s %ld",teacher,&id);
        while(p && strcmp(p->teacher,teacher) != 0 && p->id != id) p = p->next;
        if(!p)
        {
            printf("\t对不起,没有查询到该信息.\n");
        }
        else
        {
            printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
            printf("\t---------------------------------------------------------\n");
            while(p)
            {
                if(strcmp(p->teacher,teacher) == 0 && p->id == id)
                {
                    printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",p->id,p->name,p->sex,p->teacher,p->years,p->date,p->score);
                    p = p->next;
                }
                else
                    p = p->next;
            }
        }
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return;
    case '4':
        printf("\t输入要查询老师和其学生成绩: ");
        scanf("%s %f",teacher,&score);
        while(p && strcmp(p->teacher,teacher) != 0 && p->score != score) p = p->next;
        if(!p)
        {
            printf("\t对不起,没有查询到该信息.\n");
        }
        else
        {
            printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
            printf("\t---------------------------------------------------------\n");
            while(p)
            {
                if(strcmp(p->teacher,teacher) == 0 && p->score == score)
                {
                    printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",p->id,p->name,p->sex,p->teacher,p->years,p->date,p->score);
                    p = p->next;
                }
                else
                    p = p->next;
            }
        }
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return;
    case '0':
        return;
    }
}

Stu *Find(Stu *pHead, int id)
{
    Stu *p = pHead;
    while(p && p->id != id) p = p->next;
    return p;
}

void print(Stu *p)
{
    if(!p)
    {
        printf("\t对不起,没有查询到该学生信息.\n");
    }
    else
    {
        printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
        printf("\t---------------------------------------------------------\n");
        getchar();
        printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",p->id,p->name,p->sex,p->teacher,p->years,p->date,p->score);
    }
}

void Change(Stu *pHead, int id)
{
    Stu *pNew = Find(pHead,id);        调用Find()函数
    Stu *q = pHead;
    char choice;
    int num;
    int flag = 0;

    if(pNew)
    {
        printf("\n\n");
        printf("\t---------------------------------------------------------\n");
        printf("\t|                  ***修改学生信息***                   |\n");
        printf("\t---------------------------------------------------------\n");
        printf("\t该学生信息如下: \n");
        printf("\t---------------------------------------------------------\n");
        print(pNew);            //调用print()函数
        printf("\t---------------------------------------------------------\n");
        printf("\t1.学号\t2.姓名3.性别\t4.老师\t5.年龄\n");
        printf("\t6.入学时间\t7.入学成绩\t8.全部修改\t0.返回主菜单\n");
        printf("\t请选择修改类型: ");
        fflush(stdin);
        scanf("%c",&choice);
        while(choice < '0' || choice > '8')
        {
            printf("\t请重新选择功能(0-8): ");
            fflush(stdin);
            scanf("%c",&choice);
        }

        switch(choice)
        {
        case '1':
            printf("\t请输入新的学号: ");
            scanf("%ld",&pNew->id);
            while(pNew->id < 0)
            {
                printf("\t学号不能为负,请重新输入: ");
                scanf("%ld",&pNew->id);
            }
            num = pNew->id;
            while(q)
            {
                if(q->id == num)
                    flag++;
                q = q->next;
            }
            if(flag > 1)
            {
                printf("\t学号已存在,请重新选择!\n");    //学号已存在,直接返回主菜单
                printf("\n");
                printf("\t请按任意键继续...");
                return;
            }
            printf("\n");
            printf("\t请按任意键继续...");
            getchar();
            return;
        case '2':
            printf("\t请输入新的学生姓名: ");
            scanf("%s",pNew->name);
            printf("\n");
            printf("\t请按任意键继续...");
            getchar();
            return;
        case '3':
            printf("\t请输入新的学生性别: ");
            scanf("%s",pNew->sex);
            printf("\n");
            printf("\t请按任意键继续...");
            getchar();
            return;
        case '4':
            printf("\t请输入新的学生老师: ");
            scanf("%s",pNew->teacher);
            printf("\n");
            printf("\t请按任意键继续...");
            getchar();
            return;
        case '5':
            printf("\t请输入新的学生年龄: ");
            scanf("%d",&pNew->years);
            while(pNew->years < 0)
            {
                printf("\t年龄不能为负,请重新输入:");
                scanf("%d",&pNew->years);
            }
            printf("\n");
            printf("\t请按任意键继续...");
            getchar();
            return;
        case '6':
            printf("\t请输入新的入学时间: ");
            scanf("%s",pNew->date);
            while(strlen(pNew->date) < 8)
            {
                printf("\t入学日期(年/月/日),请重新输入; ");
                scanf("%s",pNew->date);
            }
            printf("\n");
            printf("\t请按任意键继续...");
            getchar();
            return;
        case '7':
            printf("\t请输入新的入学成绩: ");
            scanf("%f",&pNew->score);
            while(pNew->score < 0 || pNew->score > 750)
            {
                printf("\t入学成绩(0-750),请重新输入: ");
                scanf("%f",&pNew->score);
            }
            printf("\n");
            printf("\t请按任意键继续...");
            getchar();
            return;
        case '8':
            printf("\t学号: ");
            scanf("%ld",&pNew->id);
            while(pNew->id < 0)
            {
                printf("\t学号不能为负,请重新输入: ");
                scanf("%ld",&pNew->id);
            }
            num = pNew->id;
            while(q)
            {
                if(q->id == num)
                    flag++;
                q = q->next;
            }
            if(flag > 1)
            {
                printf("\t学号已存在,请重新选择!");
                printf("\n");
                printf("\t请按任意键继续...");
                return;
            }
            printf("\t学生名称: ");
            scanf("%s",pNew->name);
            printf("\t学生性别: ");
            scanf("%s",pNew->sex);
            printf("\t老师: ");
            scanf("%s",pNew->teacher);
            printf("\t年龄: ");
            scanf("%d",&pNew->years);
            while(pNew->years < 0)
            {
                printf("\t年龄不能为负,请重新输入:");
                scanf("%d",&pNew->years);
            }
            printf("\t入学时间: ");
            scanf("%s",pNew->date);
            while(strlen(pNew->date) < 8)
            {
                printf("\t入学日期(年/月/日),请重新输入; ");
                scanf("%s",pNew->date);
            }
            printf("\t入学成绩: ");
            scanf("%f",&pNew->score);
            while(pNew->score < 0 || pNew->score > 750)
            {
                printf("\t入学成绩(0-750),请重新输入: ");
                scanf("%f",&pNew->score);
            }
            printf("\n");
            printf("\t请按任意键继续...");
            getchar();
            return;
        case '0':
            printf("\n");
            printf("\t请按任意键继续...");
            return;
        }
    }
    else
    {
        printf("\t对不起,没有查询到该学生信息.\n");
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
    }
}

Stu *Delete(Stu *pHead, int id)
{
    Stu *pNew = Find(pHead,id);        //调用Find()函数
    Stu *pTemp,*q;
    char ch;
    pTemp = pHead;
    q = pTemp;

    if(pTemp == NULL)
    {
        printf("\t暂无学生信息,请先添加!");
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return pHead;
    }
    if(pNew)
    {
        print(pNew);
        printf("\t是否删除(y/n): ");
        scanf("%c",&ch);
        count--;
        switch(ch)
        {
        case 'y':
            while(pTemp)
            {
                if(pTemp->id == id)
                {
                    if(pHead == pTemp)    //特殊情况,删除头节点
                    {
                        pHead = pTemp->next;
                        printf("\n");
                        printf("\t请按任意键继续...");
                        return pHead;
                    }
                    q->next = pTemp->next;
                    free(pTemp);
                    printf("\n");
                    printf("\t请按任意键继续...");
                    return pHead;
                }
                q = pTemp;
                pTemp = pTemp->next;
            }
        case 'n':
            return pHead;
        }
    }
    else
    {
        printf("\t对不起,没有查询到该学生信息.\n");
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return pHead;
    }
}

void printAll(Stu *pHead)        //3种显示方式,通过冒泡排序
{
    char choice;
    Stu *pNew = pHead;
    printf("\n\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                  ***显示学生信息***                   |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                   1.按学号升序显示                    |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                   2.按姓名升序显示                    |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                   3.按成绩降序显示                    |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                   0.返回主菜单                        |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t请选择显示方式: ");
    fflush(stdin);
    scanf("%c",&choice);
    while(choice < '0' || choice > '3')
    {
        printf("\t请重新选择功能(0-3): ");
        fflush(stdin);
        scanf("%c",&choice);
    }

    switch(choice)
    {
    case '1':
        if(pNew == NULL)
        {
            printf("\t对不起,无学生信息!\n");
        }
        else
        {    
            //冒泡排序
            Stu *p = NULL;
            Stu *q = NULL;
            Stu *r = NULL;
            Stu n;
            for(p = pHead; p; p = p->next)
            {
                for(q = p->next; q; q = q->next)
                {
                    if(p->id > q->id)
                    {
                        n = *p;
                        *p = *q;
                        *q = n;
                        r = p->next;
                        p->next = q->next;
                        q->next = r;
                    }
                }
            }
            printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
            printf("\t-------------------------------------------------------------\n");
            while(pNew)
            {
                printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",pNew->id,pNew->name,pNew->sex,pNew->teacher,pNew->years,pNew->date,pNew->score);
                pNew = pNew->next;
            }
        }
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return;
    case '2':
        printAll_1(pHead);
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return;
    case '3':
        printAll_2(pHead);
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return;
    case '0':
        return;
    }
}

void printAll_1(Stu *pHead)
{
    Stu *pNew = pHead;
    if(pNew == NULL)
    {
        printf("\t对不起,无学生信息!\n");
    }
    else
    {
        Stu *p = NULL;
        Stu *q = NULL;
        Stu *r = NULL;
        Stu n;
        for(p = pHead; p; p = p->next)
        {
            for(q = p->next; q; q = q->next)
            {
                if(strcmp(p->name,q->name) > 0)
                {
                    n = *p;
                    *p = *q;
                    *q = n;
                    r = p->next;
                    p->next = q->next;
                    q->next = r;
                }
            }
        }
        printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
        printf("\t-------------------------------------------------------------\n");
        while(pNew)
        {
            printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",pNew->id,pNew->name,pNew->sex,pNew->teacher,pNew->years,pNew->date,pNew->score);
            pNew = pNew->next;
        }
    }
}

void printAll_2(Stu *pHead)
{
    Stu *pNew = pHead;
    if(pNew == NULL)
    {
        printf("\t对不起,无学生信息!\n");
    }
    else
    {
        Stu *p = NULL;
        Stu *q = NULL;
        Stu *r = NULL;
        Stu n;
        for(p = pHead; p; p = p->next)
        {
            for(q = p->next; q; q = q->next)
            {
                if(p->score < q->score)
                {
                    n = *p;
                    *p = *q;
                    *q = n;
                    r = p->next;
                    p->next = q->next;
                    q->next = r;
                }
            }
        }
        printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
        printf("\t-------------------------------------------------------------\n");
        while(pNew)
        {
            printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",pNew->id,pNew->name,pNew->sex,pNew->teacher,pNew->years,pNew->date,pNew->score);
            pNew = pNew->next;
        }
    }
}

void data_statistics(Stu *pHead)        //3种打印方式,通过多遍遍历链表
{
    char choice;
    float score;
    Stu *p,*q,*a,*b;
    p = q = a = b = pHead;

    printf("\n\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                  ***统计信息报表***                   |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                   1.分性别打印报表                    |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                   2.分成绩打印报表                    |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                   3.分性别和成绩打印报表              |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t|                   0.返回主菜单                        |\n");
    printf("\t---------------------------------------------------------\n");
    printf("\t请选择显示方式: ");
    fflush(stdin);
    scanf("%c",&choice);
    while(choice < '0' || choice > '3')
    {
        printf("\t请重新选择功能(0-3): ");
        fflush(stdin);
        scanf("%c",&choice);
    }

    switch(choice)
    {
    case '1':
        printf("\t男: \n");
        printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
        printf("\t-------------------------------------------------------------\n");
        while(p)
        {
            if(strcmp(p->sex,"男") == 0)
            {
                printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",p->id,p->name,p->sex,p->teacher,p->years,p->date,p->score);
                p = p->next;
            }
            else
                p = p->next;
        }
        printf("\n");
        printf("\t女: \n");
        printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
        printf("\t-------------------------------------------------------------\n");
        while(q)
        {
            if(strcmp(q->sex,"女") == 0)
            {
                printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",q->id,q->name,q->sex,q->teacher,q->years,q->date,q->score);
                q = q->next;
            }
            else
                q = q->next;
        }
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return;
    case '2':
        printf("\t你想要以多少分为分界线: ");
        scanf("%f",&score);
        printf("\t%.1f分以下: \n",score);
        printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
        printf("\t-------------------------------------------------------------\n");
        while(p)
        {
            if(p->score < score)
            {
                printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",p->id,p->name,p->sex,p->teacher,p->years,p->date,p->score);
                p = p->next;
            }
            else
                p = p->next;
        }
        printf("\n");
        printf("\t%.1f分及以上: \n",score);
        printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
        printf("\t-------------------------------------------------------------\n");
        while(q)
        {
            if(q->score >= score)
            {
                printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",q->id,q->name,q->sex,q->teacher,q->years,q->date,q->score);
                q = q->next;
            }
            else
                q = q->next;
        }
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return;
    case '3':
        printf("\t你想要以多少分为分界线: ");
        scanf("%f",&score);
        printf("\t%.1f分及以上男生: \n",score);
        printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
        printf("\t-------------------------------------------------------------\n");
        while(a)
        {
            if(strcmp(a->sex,"男") == 0 && a->score >= score)
            {
                printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",a->id,a->name,a->sex,a->teacher,a->years,a->date,a->score);
                a = a->next;
            }
            else
                a = a->next;
        }
        printf("\n");
        printf("\t%.1f分及以上女生: \n",score);
        printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
        printf("\t-------------------------------------------------------------\n");
        while(b)
        {
            if(strcmp(b->sex,"女") == 0 && b->score >= score)
            {
                printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",b->id,b->name,b->sex,b->teacher,b->years,b->date,b->score);
                b = b->next;
            }
            else
                b = b->next;
        }
        printf("\n");
        printf("\t%.1f分以下男生: \n",score);
        printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
        printf("\t-------------------------------------------------------------\n");
        while(p)
        {
            if(strcmp(p->sex,"男") == 0 && p->score < score)
            {
                printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",p->id,p->name,p->sex,p->teacher,p->years,p->date,p->score);
                p = p->next;
            }
            else
                p = p->next;
        }

        printf("\n");
        printf("\t%.1f分以下女生: \n",score);
        printf("\t学号\t姓名\t性别\t老师\t年龄\t入学时间\t入学成绩\n");
        printf("\t-------------------------------------------------------------\n");
        while(q)
        {
            if(strcmp(q->sex,"女") == 0 && q->score < score)
            {
                printf("\t%ld\t%s\t%s\t%s\t%d\t%s\t%.1f\n",q->id,q->name,q->sex,q->teacher,q->years,q->date,q->score);
                q = q->next;
            }
            else
                q = q->next;
        }
        printf("\n");
        printf("\t请按任意键继续...");
        getchar();
        return;
    case '0':
        return;
    }
}

void DeleteLink(Stu *pHead)        //销毁链表
{
    Stu *q = pHead;
    if(pHead == NULL)
        return;
    while(pHead)
    {
        q = pHead->next;
        free(pHead);
        pHead = q;
    }
    pHead = NULL;
}

Stu *read_file(Stu *pHead)        //读盘,直接连接到链表
{
    FILE *fp;
    Stu *pEnd,*pNew;

    fp = fopen("d:\\code\\student.txt","r");        //文件名自己设置
    if(fp == NULL)
    {
        printf("\t打开失败,按任意键退出!");
        getchar();
    }

    pNew = (Stu *)malloc(LEN);    //分配内存
    while(fscanf(fp,"%ld %s %s %s %d %s %f",&pNew->id,pNew->name,pNew->sex,pNew->teacher,&pNew->years,pNew->date,&pNew->score) != EOF)
    {
        count++;    //记录
        pNew->next = NULL;
        if(pHead == NULL)
            pHead = pNew;
        else
        {
            pEnd = pHead;
            while(pEnd && pEnd->next != NULL)
                pEnd = pEnd->next;
            pEnd->next = pNew;
        }
        pNew = (Stu *)malloc(LEN);    //再次分配内存
    }
    free(pNew);    //最后一次分配内存是没有用到的,要释放掉
    fclose(fp);
    getchar();
    return pHead;
}

void save_file(Stu *pHead)        //存盘
{
    FILE *fp;
    Stu *p = pHead;

    fp = fopen("d:\\code\\student.txt","w");        //文件名自己设置
    if(fp == NULL)
    {
        printf("\t打开失败,按任意键退出!");
        getchar();
    }

    if(p == NULL)
        getch();
    else
    {
        while(p)
        {
            fprintf(fp,"%ld %s %s %s %d %s %.1f",p->id,p->name,p->sex,p->teacher,p->years,p->date,p->score);
            fprintf(fp,"\n");
            p = p->next;
        }
        printf("\n\n");
        printf("\t存盘成功!");
    }
    fclose(fp);
}

加载全部内容

相关教程
猜你喜欢
用户评论