学生成绩管理系统————课设

# 学生管理系统

概要设计:

  • 数据录入:录入系统所需的数据,用链表组织数据。
  • 数据存储:用文件的形式将录入的数据进行保存。
  • 数据读写:对文件的数据可以进行读写操作。
  • 数据修改:可以对已存在的旧数据进行修改操作。
  • 数据插入:可以将新数据插入到任意位置。
  • 数据删除:可以对已存在的旧数据进行删除操作。
  • 数据查询:按要求对数据进行查询,至少包含两项简单查询以及一项组合查询。

各个模块的详述:

  • 这里我改善融合了功能模块,因为这样可以有效减少代码量,优化运行时间,这里可以将存储操作执行在每次的其他操作之后,这样并不会减少功能,而且比较人性化,开始操作:
    • 数据录入:利用课堂学到的链表操作,可以完成,在这里我们要注意录入的信息的数据类型,还有一个判断是否继续的操作,利用布尔判断可以完成。在录入完成之后我们直接进行存储操作,不需要在主菜单上再设计一个存储操作,存储的时候一定要写好路径。后来有用。
    • 数据读写:这里主要的功能是读操作,写操作其实可以在存储里完成,读操作,首先,要从文件中提取数据,放到我们的链表之中,然后利用输出函数输出链表里面的数据,这里将读写步骤,有两个操作,一个是提取数据,一个是输入数据。
    • 数据修改:这里修改操作,我们是对链表进行操作,操作完成后再利用前面的存储操作,我们可以完成这里的任务,但是,在修改时,有一个问题,我们要修改的学生怎样找到,这里我是按照学号查找来找到要修改的学生,找到之后我们有下一步详细修改的操作,这里我只写了详细修改,因为全部修改和详细修改没有区别,所以我只选取一种修改的操作,其实我建议选择详细修改,这样比较清晰。
    • 数据插入:这步虽然要求可以插在任意的地方,但是有一个不好的地方就是,任意地方分为三种地方,前面 中间和后面。这样要增加好多的判断,和多种操作方法,无疑增加代码量,所以我们完全可以选取最简单的一种,然后利用后来 的排序操作让他移动到相应的位置。这里选择尾结点插入操作,最进行存储操作(最简单)。
    • 数据删除:不管是插入还是删除操作,有一个重点就是结点的连接顺序不能错,一旦错了就会丢失结点,紧随数据丢失,所以在这两项操作中,尽量一边操作一边画图处理,这样可以理解我们操作的意义,在删除时,每次删除,注意的结点都不能错。最后仍然进行存储文件操作。

详细流程图

image

重点设计

  • 增加模块:重点
    增加模块操作,要分几步骤进行。首先找到你要增加的位置,其次插入种类不同代码不同,还有就是输入数据的时候需要进行格式判断,格式对了,录入信息,格式不对,重新录入。这里简单介绍尾插法。

代码如下:

/********************增加模块**********************/ 
pStudent Insert(pStudent phead)
{
    system("cls");           
    pStudent pNew,p=phead;
    /*if(phead->next==NULL)
    {
        printf("无信息!");
        Sleep(1000);
        return phead;
    }*/
    char choice;
    while(p->next!=NULL)            //找尾结点 
    p=p->next;                  //移动 
    do                                    // 循环插入 
    {
        pNew=(pStudent)malloc(sizeof(Student));
        printf("请输入姓名:");
        scanf("%s",pNew->name);
        printf("请输入学号:");
        scanf("%s",pNew->number);
        while(strlen(pNew->number)!=8)         //格式判断 
        {
            printf("请输入正确的8位学号:");
            scanf("%s",pNew->number);
        }
        printf("请输入性别:"); 
        getchar();
        scanf("%c",&pNew->sex);
        while(pNew->sex!='m'&&pNew->sex!='w'&&pNew->sex!='M'&&pNew->sex!='W')
        {
            printf("请输入正确的性别:");
            fflush(stdin);
            scanf("%c",&pNew->sex);
        }
        printf("请输入年龄:");
        scanf("%u",&pNew->age);
        while(pNew->age<=0||pNew->age>=100)
        {
            printf("请输入正确的年龄:");
            scanf("%u",&pNew->age);
        }
        printf("请输入英语成绩:");
        scanf("%lf",&pNew->english);
        while(pNew->english>100||pNew->english<0)
        {
            printf("请输入正确的英语分数:");
            scanf("%lf",&pNew->english);
        }
        printf("请输入C语言成绩:");
        scanf("%lf",&pNew->c);
        while(pNew->c>100||pNew->c<0)
        {
            printf("请输入正确的C语言分数:");
            scanf("%lf",&pNew->c);
        }
        printf("请输入数学成绩:");
        scanf("%lf",&pNew->math);
        while(pNew->math>100||pNew->math<0)
        {
            printf("请输入正确的数学分数:");
            scanf("%lf",&pNew->math);
        }
        pNew->sum=pNew->c+pNew->english+pNew->math;
        pNew->aver=(pNew->c+pNew->english+pNew->math)/3;
        p->next=pNew;
        p=pNew;
        p->next=NULL;
        iCount++;
        printf("是否继续添加信息(Y or N):");
        choice=getchar();
    }while(panduan(choice)==1);
    printf("已增加学生信息.\n");
    Sleep(1000);
    Save_Stu(phead);    
    return phead;
}
  • 排序模块: 排序有好多类别,这里我选择冒泡排序。在排序时候,有一个严重问题,如何交换链表数据。有两种方法,第一:可以直接调用一个交换数据的函数,这样只交换数据,而不改变结点位置。第二:进行结点交换,这种交换虽然思考比较难,但是一旦理解,一劳永逸。这里我选择第二种交换方法,建议在理解同时,使用手动画图理解,方便快捷好理解。
pStudent sort(pStudent phead)    //传送头结点 
{            //pj是当前结点 pj_f是pj前一个结点  pj_b是pj后一个结点 
    pStudent pTemp,pj,pj_f,pj_b;    //这里交换的是pj和pj_b   
    int i,j,flag; 
    for(i=0;i<iCount-1;i++)          //冒泡排序 
     for(j=0,flag=0,pj=phead;j<iCount-1-i;j++)   
     {
        if(flag==0)      //当flag==0时 结点没交换 
        {
            pj_f=pj;      //移动结点位置 
            pj=pj->next;
            pj_b=pj->next;
         }
        if(flag==1)    //当flag==1时 结点交换 
        {
            pj_f=pj_f->next;  //移动结点位置 
            pj_b=pj->next;
        }
        flag=0;
        if(pj->sum<pj_b->sum)    //数据判断 
        {
            pTemp=pj->next;      //六步操作 完成交换 
            pj->next=pj_b->next;
            pj_b->next=pTemp;

            pTemp=pj_f->next;
            pj_f->next=pj_b->next;
            pj_b->next=pTemp;
            flag=1;     //flag==1  进行交换的结点位置移动 
        }
     }
     return phead;
//声明部分
#ifndef  state_h
#define  state_h
typedef struct accout
{
    char pass[20];
    char name[20];
    struct accout *next;
}Accout,*pAccout;


typedef struct student
{
    char number[15];
    char name[30];
    char sex;
    unsigned int age;
    double english;
    double c;
    double math;
    double aver;
    double sum;
    struct student *next;
}Student,*pStudent;

pAccout router_acc(pAccout ahead);    //读取账户信息
void save_acc(pAccout ahead);  //保存账户
void login_acc();          //登录函数 
void login_printf();       //登录界面 
pAccout login_panduan(pAccout ahead);  
pAccout login_zhuce(pAccout ahead);

pStudent Create(pStudent phead);  //声明创建链表
void meun();         //综合 
void print();       //主菜单   
void print1();      //主界面
void print2();      //退出界面 
pStudent searchmenu(pStudent phead);   //查询子系统菜单   
pStudent search1(pStudent phead);   //学号查询   
pStudent search2(pStudent phead);   //姓名查询   

pStudent sortmenu(pStudent phead);     //排序子系统菜单  
pStudent sort1(pStudent phead);        //年龄排序   
pStudent sort2(pStudent phead);        //平均分排序 
pStudent sort3(pStudent phead);       //总分排序  
pStudent sort(pStudent phead);  

pStudent Insert(pStudent phead); //新学生信息录入 
void print_stu1(pStudent phead);//打印学生信息 
void print_stu2();//学生信息表格 

pStudent delete_Stu(pStudent phead);   //删除信息 

void Save_Stu(pStudent phead);//信息保存 
pStudent router_Stu(pStudent phead);  //信息读取 

pStudent revise(pStudent phead);  //修改信息 

int panduan(char choice);         //布尔判断 
int back(char *a);    //返回整数函数 
void shuai1(); 
void shuai2(); 
void saocaozuo();//颜色操作 
#endif

//主函数:
oid main()               //主函数 
{
    print1();
    login_acc();
    meun();
}

//其他函数:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<windows.h>
#include"state.h"
#include<conio.h>
#define change 3
int iCount;
int n;

//*****************登录*****************//
pAccout router_acc(pAccout ahead)
{
    pAccout p1,p2;
    FILE *fp;
    int m=0;
    if((fp=fopen("e:\\课设\\Accout.txt", "r"))==NULL)
    {
        printf("读取失败!");
        return ahead;
     }
    ahead==NULL;
    p1=(pAccout)malloc(sizeof(Accout));
    while(fscanf(fp,"%s %s",p1->name,p1->pass)==2)
    {
        //printf("%s\n",p1->name);                  //读进去了 
        m=m+1;
        if(m==1)
        {
            ahead->next=p1;
            p2=p1;
            p2->next = NULL;
        }
        else
        {
            p2->next=p1;
            p2=p1;
            p2->next=NULL;
        }
        p1=(pAccout)malloc(sizeof(Accout));
    }
    fclose(fp);
    return ahead;
}
void save_acc(pAccout ahead)
{
    FILE *fp;
    if((fp=fopen("e:\\课设\\Accout.txt","w"))==NULL)
    {
        printf("打开失败!");
        Sleep(2000);
        exit(1);
     } 
    pAccout pAcc;
    pAcc=ahead->next;
    while(pAcc!=NULL)
    {
        fprintf(fp,"%s %s\n",pAcc->name,pAcc->pass);
        pAcc=pAcc->next;
    }
    fclose(fp);
    printf("保存成功!"); 
}
void login_printf()
{
    system("cls");
    printf("\n\n\n\n");
    printf("\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆\t\t\t\n");
    printf("\t\t\t☆                            ★\t\t\t\n");
    printf("\t\t\t☆         1.登录             ★\t\t\t\n");
    printf("\t\t\t☆         2.注册             ★\t\t\t\n");
    printf("\t\t\t☆         0.退出             ★\t\t\t\n");
    printf("\t\t\t☆                            ★\t\t\t\n");
    printf("\t\t\t★☆★☆★☆★☆★☆★☆★☆★☆\t\t\t\n");
}
void shuai1()
{
    printf("\n");
    printf("\t\t\t ----------------------------\n");
    printf("\t\t\t     **  **       **         \n");
    Sleep(1000); 
    printf("\t\t\t     **  **       **         \n");
    printf("\t\t\t     **  **  ************    \n");
    Sleep(1000);
    printf("\t\t\t    **   **  ************    \n"); 
    printf("\t\t\t   **   **   **   **   **    \n");
    Sleep(1000);
    printf("\t\t\t  **   **    **   **  ***    \n");
    printf("\t\t\t      **     **   **   **    \n");
    Sleep(1000); 
    printf("\t\t\t     **           **         \n");
    printf("\t\t\t    **            **         \n");
    Sleep(1000);
    printf("\t\t\t                  **         \n"); 
    printf("\t\t\t-----------------------------\n");
    Sleep(1000);
    printf("\t\t\t\t***************\n");
    printf("\t\t\t\t恭喜!注册成功!\n"); 
    printf("\t\t\t\t***************\n");
    Sleep(2000);
}
void shuai2()
{
    printf("\n");
    printf("\t\t\t ----------------------------\n");
    printf("\t\t\t     **  **       **         \n");
    Sleep(1000); 
    printf("\t\t\t     **  **       **         \n");
    printf("\t\t\t     **  **  ************    \n");
    Sleep(1000);
    printf("\t\t\t    **   **  ************    \n"); 
    printf("\t\t\t   **   **   **   **   **    \n");
    Sleep(1000);
    printf("\t\t\t  **   **    **   **  ***    \n");
    printf("\t\t\t      **     **   **   **    \n");
    Sleep(1000); 
    printf("\t\t\t     **           **         \n");
    printf("\t\t\t    **            **         \n");
    Sleep(1000);
    printf("\t\t\t                  **         \n"); 
    printf("\t\t\t-----------------------------\n");
    Sleep(1000);
    printf("\t\t\t\t***************\n");
    printf("\t\t\t\t恭喜!登录成功!\n"); 
    printf("\t\t\t\t***************\n");
    Sleep(2000);
} 
 void login_acc()
 {
    system("cls");
    int bk;
    pAccout ahead,p1;
    ahead=(pAccout)malloc(sizeof(Accout));
    ahead->next=NULL;
    router_acc(ahead);
    while(1)
    {
        char a[200]; 
        login_printf();
        printf("请输入:");
        scanf("%s",a);
        bk=back(a);
        switch(bk)
        {
            case 1:{
                    ahead=login_panduan(ahead);
                    break;
                    }
            case 2:{
                    ahead=login_zhuce(ahead);
                    break;
                    }
            case 0:{
                    print2();
                    exit(0);
                    break;
                    }
            default:printf("输入错误!");
                    Sleep(1000);
                    system("cls");
                    break;
        }
        if(bk==1)
        break;
    }
}
pAccout login_zhuce(pAccout ahead)
{
    char name1[20],pass1[20];
    pAccout p1,p2;
    p1=ahead;
    while(p1->next!=NULL)
    {
        p1=p1->next;
    }
    while(1)
    {
        p2=(pAccout)malloc(sizeof(Accout));
        system("cls");
        printf("\n\n\n\n");
        printf("\t\t\t账号(8位)       :");
        scanf("%s",p2->name);
        printf("\t\t\t密码(不超过10位):");
        scanf("%s",p2->pass);
        if(strlen(p2->name)<=8)
        {
            if(strlen(p2->pass)<=10)
            {
                p1->next=p2;
                p2->next=NULL;
                shuai1(); 
                save_acc(ahead);
                break;
            }
            else
            {
                printf("\n\n\n\n");
                printf("\t\t\t\t***************\n");
                printf("\t\t\t\t格式不对,请重新输入!\n"); 
                printf("\t\t\t\t***************\n");
                Sleep(2000);
            }
         }
         else
         {
                printf("\n\n\n\n");
                printf("\t\t\t\t***************\n");
                printf("\t\t\t\t格式不对,请重新输入!\n"); 
                printf("\t\t\t\t***************\n");
                Sleep(2000);
         }
    }
    return(ahead);
}

pAccout login_panduan(pAccout ahead)
{
    char name1[20],pass1[20];
    pAccout p1;
    int i=0, j = 0;
    char ch;
    while(1)
    {
        i++;
        p1=ahead->next;
        system("cls");
        printf("\n\n\n\n");
        printf("\t\t\t\t账号:");
        scanf("%s",name1);
        printf("\t\t\t\t密码:");
        while(j < 20) 
        {
            ch = getch();
            if(ch == '\b' && j > 0) 
            {
                printf("\b \b");
            }
            else if(ch == 13)
            {
                break;
            } 
            else 
            {
                pass1[j] = ch;
                printf("*");
                j++;
            }

        }
        pass1[j]='\0';
        while(p1!=NULL)
        {
            if(strcmp(name1,p1->name)==0)
            {
                if(strcmp(pass1,p1->pass)==0)
                {
                    shuai2();
                    return ahead;
                 } 
                else
                {
                    p1=p1->next;
                }
            }
            else
            {
                p1=p1->next;
            }
            if(p1==NULL)
            {
                printf("\n\n\t\t\t\t输入有误");
                Sleep(2000);
                break; 
            }
        }
        if(i>=change)
        {
            system("cls");
            printf("\n\n\n\n");
            printf("\t\t\t\t***************\n");
            printf("\t\t\t\t你完蛋了!!!!!\n");
            printf("\t\t\t\t***************\n");
            Sleep(2000);
            print2();
            exit (0);
        }
    }
    return ahead;
}
int panduan(char choice)
{
    while(1)
    {   
        fflush(stdin);
        choice=getchar();
        if(choice == 'y'|| choice =='Y')
        return 1;
        else if(choice == 'n'||choice == 'N')
        return 0;
        while(getchar() != '\n')    
            continue;
        printf("输入错误!请重新输入您的选择:\n");
    }
}
int back(char *a)
{
    if(strlen(a)==1)
    {
        if(a[0]>='0'&&a[0]<='9')
        return ((int)a[0]-48);
    }
    else
        return 10;
}

void print1()
{
    system("cls");
    printf("\n\n\n\n");
    printf("\t\t\t|******************************|\n");
    printf("\t\t\t||****************************||\n");
    printf("\t\t\t|||                          |||\n");
    printf("\t\t\t|||   欢迎来到学生管理系统   |||\n");
    printf("\t\t\t|||                          |||\n");
    printf("\t\t\t||****************************||\n");
    printf("\t\t\t|******************************|\n");
    Sleep(2000);
}
void print()        //主界面 
{
    system("cls");
    printf("\t\t\t|*******************************|\n");
    printf("\t\t\t|  欢迎来到学生管理系统(主菜单) |\n");
    printf("\t\t\t|*******************************|\n");
    printf("\t\t\t|          1.插入信息           |\n");
    printf("\t\t\t|          2.查看信息           |\n");
    printf("\t\t\t|          3.查询信息           |\n");
    printf("\t\t\t|          4.修改信息           |\n");
    printf("\t\t\t|          5.排序信息           |\n");
    printf("\t\t\t|          6.删除信息           |\n");
    printf("\t\t\t|          7.颜色变幻           |\n");
    printf("\t\t\t|-------------------------------|\n");
    printf("\t\t\t|-------------------------------|\n");
    printf("\t\t\t|          0.退出程序           |\n");
    printf("\t\t\t|===============================|\n");
}
void print2()
{
    system("cls");
    printf("\n\n\n\n");
    printf("\t\t\t|******************************|\n");
    printf("\t\t\t||****************************||\n");
    printf("\t\t\t|||                          |||\n");
    printf("\t\t\t|||        谢谢使用          |||\n");
    printf("\t\t\t|||                          |||\n");
    printf("\t\t\t||****************************||\n");
    printf("\t\t\t|******************************|\n");
    Sleep(2000);
}
/*******************查询模块********************/ 
pStudent searchmenu(pStudent phead)     //查询子系统菜单 
{
    fflush(stdin);
    system("cls");
    int bk;
    while(1)
    {
        char P[200];
        system("cls");
        printf("\t\t\t|*******************************|\n");
        printf("\t\t\t|        查询子系统菜单         |\n");
        printf("\t\t\t|*******************************|\n");
        printf("\t\t\t|         1.按学号查询          |\n");
        printf("\t\t\t|         2.按姓名查找          |\n"); 
        printf("\t\t\t|-------------------------------|\n");
        printf("\t\t\t|         0.返回上一层          |\n");
        printf("\t\t\t|*******************************|\n\n");
        printf("请输入指令:");
        scanf("%s",P);
        bk=back(P);
        switch(bk)
        {
            case 1:
                {
                    phead=search1(phead);
                    break;
                }
            case 2:
                {
                    phead=search2(phead);
                    break;
                }
            case 0:break;
            default:printf("输入错误!请重新输入\n");
                    system("pause");
                    break;
        }
        if(bk==0)
        break;
    }
    return phead;
}
pStudent search1(pStudent phead)          //学号查找 
{
    system("cls");
    char number1[15],choice;
    pStudent p;
    while(1)
    {
        system("cls");
        printf("请输入8位学号:"); 
        scanf("%s",number1);
        if(strlen(number1)!=8)
        {
            system("cls");
            printf("**************\n");
            printf("请输入8位学号!\n");
            printf("**************\n");
            Sleep(1000);
        }
        else
        break;
    }
    while(1)
    {
        system("cls");
        if(phead->next==NULL)
        {
            printf("没有信息!\n");
            system("pause");
            break;
        }
        p=phead->next;
        while(strcmp(p->number,number1)!=0&&p->next!=NULL)
        p=p->next;
        if(strcmp(p->number,number1)==0)
        {
            print_stu2();
            printf("%-8s  ",p->number);
            printf("%-8s  ",p->name);
            printf("%-4c   ",p->sex);
            printf("%-4u   ",p->age);
            printf("%-4.1f   ",p->english);
            printf("%-4.1f   ",p->c);
            printf("%-4.1f   ",p->math);
            printf("%-4.1f   ",p->aver);
            printf("%-4.1f",p->sum);
            printf("\n");
            system("pause"); 
        }
        else
        {   
            printf("不存在的!\n");
            system("pause");
        }
        system("cls");
        fflush(stdin);

        printf("是否继续查找?(Y or N)\n");
        if(panduan(choice)==1)
        {
            while(1)
            {
                system("cls");
                printf("请输入8位学号:"); 
                scanf("%s",number1);
                if(strlen(number1)!=8)
                {
                    system("cls");
                    printf("**************\n");
                    printf("请输入8位学号!\n");
                    printf("**************\n");
                    Sleep(1000);
                }
                else
                    break;
            }
        }
        else if(panduan(choice)==0)
        break;
    }
    return phead;   
}
pStudent search2(pStudent phead)         //姓名查找 
{
    system("cls");
    char name1[30],choice;
    pStudent p;
    while(1)
    {
        system("cls");
        printf("请输入学生姓名:"); 
        scanf("%s",name1);
        if(strlen(name1)>=30)
        {
            system("cls");
            printf("**************\n");
            printf("请输入正确的名字!\n");
            printf("**************\n");
            Sleep(1000);
        }
        else
        break;
    }
    while(1)
    {
        system("cls");
        if(phead->next==NULL)
        {
            printf("没有信息!\n");
            system("pause");
            break;
        }
        p=phead->next;
        while(strcmp(p->name,name1)!=0&&p->next!=NULL)
        p=p->next;
        if(strcmp(p->name,name1)==0)
        {
            print_stu2();
            printf("%-8s  ",p->number);
            printf("%-8s  ",p->name);
            printf("%-4c   ",p->sex);
            printf("%-4u   ",p->age);
            printf("%-4.1lf   ",p->english);
            printf("%-4.1lf   ",p->c);
            printf("%-4.1lf   ",p->math);
            printf("%-4.1lf   ",p->aver);
            printf("%-4.1lf",p->sum);
            printf("\n");
            system("pause");
        }
        else
        {
            printf("不存在的!\n");
            system("pause");
        }
        printf("是否继续查找?(Y or N)\n");
        if(panduan(choice)==1)
        {
            while(1)
            {
                system("cls");
                printf("请输入学生姓名:"); 
                scanf("%s",name1);
                if(strlen(name1)>=30)
                {
                    system("cls");
                    printf("**************\n");
                    printf("请输入正确的名字!\n");
                    printf("**************\n");
                    Sleep(1000);
                }
                else
                    break;
            }
        }
        else if(panduan(choice)==0)
            break;  
    }
    return phead;   
} 

/******************排序模块*******************/ 
pStudent sortmenu(pStudent phead)     //排序子系统菜单
{
    fflush(stdin);
    system("cls");
    int bk;
    while(1)
    {
        system("cls");
        char P[200];
        printf("\t\t\t|*******************************|\n");
        printf("\t\t\t|        排序子系统菜单         |\n");
        printf("\t\t\t|*******************************|\n");
        printf("\t\t\t|         1.按年龄排序          |\n");
        printf("\t\t\t|         2.按平均分排序        |\n");
        printf("\t\t\t|         3.按总分排序          |\n");
        printf("\t\t\t|-------------------------------|\n");
        printf("\t\t\t|         0.返回上一层          |\n");
        printf("\t\t\t|*******************************|\n\n");
        printf("请输入指令:");
        scanf("%s",P);
        bk=back(P);
        switch(bk)
        {
            case 1:phead=sort1(phead);
                   break;
            case 2:phead=sort2(phead);
                   break;
            case 3:phead=sort3(phead);
                   break;
            case 0:break;
            default:printf("输入错误,重新输入!");
                    Sleep(1000);
                    system("cls");
                    break; 
        }
        if(bk==0)
        break;
    }
    Save_Stu(phead);
    return phead;
}
pStudent sort1(pStudent phead)        //按年龄 
{
    system("cls");
    if(phead->next==NULL)
        {
            printf("没有信息!\n");
            Sleep(1000);
            return phead;
        }
    sort(phead);
    print_stu1(phead);
    return phead; 
}       
pStudent sort2(pStudent phead)        //按平均 
{
    system("cls");
    if(phead->next==NULL)
        {
            printf("没有信息!\n");
            Sleep(1000);
            return phead;
        }
    sort(phead);
    print_stu1(phead);
    return phead;
}
pStudent sort3(pStudent phead)        //按总分 
{
    system("cls");
    if(phead->next==NULL)
        {
            printf("没有信息!\n");
            Sleep(1000);
            return phead;
        }
    sort(phead);
    print_stu1(phead);
    return phead;
}

pStudent sort(pStudent phead)    //传送头结点 
{            //pj是当前结点 pj_f是pj前一个结点  pj_b是pj后一个结点 
    pStudent pTemp,pj,pj_f,pj_b;    //这里交换的是pj和pj_b   
    int i,j,flag; 
    for(i=0;i<iCount-1;i++)          //冒泡排序 
     for(j=0,flag=0,pj=phead;j<iCount-1-i;j++)   
     {
        if(flag==0)      //当flag==0时 结点没交换 
        {
            pj_f=pj;      //移动结点位置 
            pj=pj->next;
            pj_b=pj->next;
         }
        if(flag==1)    //当flag==1时 结点交换 
        {
            pj_f=pj_f->next;  //移动结点位置 
            pj_b=pj->next;
        }
        flag=0;
        if(pj->sum<pj_b->sum)    //数据判断 
        {
            pTemp=pj->next;      //六步操作 完成交换 
            pj->next=pj_b->next;
            pj_b->next=pTemp;

            pTemp=pj_f->next;
            pj_f->next=pj_b->next;
            pj_b->next=pTemp;
            flag=1;     //flag==1  进行交换的结点位置移动 
        }
     }
     return phead;
}
/********************增加模块**********************/ 
pStudent Insert(pStudent phead)
{
    system("cls");           
    pStudent pNew,p=phead;
    /*if(phead->next==NULL)
    {
        printf("无信息!");
        Sleep(1000);
        return phead;
    }*/
    char choice;
    while(p->next!=NULL)            //找尾结点 
    p=p->next;                  //移动 
    do                                    // 循环插入 
    {
        pNew=(pStudent)malloc(sizeof(Student));
        printf("请输入姓名:");
        scanf("%s",pNew->name);
        printf("请输入学号:");
        scanf("%s",pNew->number);
        while(strlen(pNew->number)!=8)         //格式判断 
        {
            printf("请输入正确的8位学号:");
            scanf("%s",pNew->number);
        }
        printf("请输入性别:"); 
        getchar();
        scanf("%c",&pNew->sex);
        while(pNew->sex!='m'&&pNew->sex!='w'&&pNew->sex!='M'&&pNew->sex!='W')
        {
            printf("请输入正确的性别:");
            fflush(stdin);
            scanf("%c",&pNew->sex);
        }
        printf("请输入年龄:");
        scanf("%u",&pNew->age);
        while(pNew->age<=0||pNew->age>=100)
        {
            printf("请输入正确的年龄:");
            scanf("%u",&pNew->age);
        }
        printf("请输入英语成绩:");
        scanf("%lf",&pNew->english);
        while(pNew->english>100||pNew->english<0)
        {
            printf("请输入正确的英语分数:");
            scanf("%lf",&pNew->english);
        }
        printf("请输入C语言成绩:");
        scanf("%lf",&pNew->c);
        while(pNew->c>100||pNew->c<0)
        {
            printf("请输入正确的C语言分数:");
            scanf("%lf",&pNew->c);
        }
        printf("请输入数学成绩:");
        scanf("%lf",&pNew->math);
        while(pNew->math>100||pNew->math<0)
        {
            printf("请输入正确的数学分数:");
            scanf("%lf",&pNew->math);
        }
        pNew->sum=pNew->c+pNew->english+pNew->math;
        pNew->aver=(pNew->c+pNew->english+pNew->math)/3;
        p->next=pNew;
        p=pNew;
        p->next=NULL;
        iCount++;
        printf("是否继续添加信息(Y or N):");
        choice=getchar();
    }while(panduan(choice)==1);
    printf("已增加学生信息.\n");
    Sleep(1000);
    Save_Stu(phead);    
    return phead;
}
/*****************输出模块******************/ 
void print_stu1(pStudent phead)
{
    system("cls");
    if(phead->next==NULL)
        {
            printf("没有信息!\n");
            Sleep(1000);
            return ;
        }
    print_stu2();
    pStudent pTemp;
    pTemp=phead->next;
    while(pTemp != NULL)
    {
        pTemp->sum=pTemp->c+pTemp->english+pTemp->math;
        pTemp->aver=(pTemp->c+pTemp->english+pTemp->math)/3;
        printf("%-8s  ",pTemp->number);
        printf("%-8s  ",pTemp->name);
        printf("%-4c   ",pTemp->sex);
        printf("%-4u   ",pTemp->age);
        printf("%-6.1f  ",pTemp->english);
        printf("%-6.1f  ",pTemp->c);
        printf("%-6.1f  ",pTemp->math);
        printf("%-6.1f  ",pTemp->aver);
        printf("%-6.1f",pTemp->sum);
        printf("\n");
        pTemp=pTemp->next;
    }
    system("pause");
}
void print_stu2()
{
    printf("成绩如下:\n");
    printf("-----------------------------------------------------------------------\n");
    printf("学号******姓名******性别***年龄***英语****C语言****数学****平均****总分\n");
    printf("-----------------------------------------------------------------------\n");
} 

/*****************保存模块***************/ 
void Save_Stu(pStudent phead)                    //定义保存函数
{
    system("cls");
    FILE *fp;                            
    if((fp=fopen("e:\\课设\\Student", "wt"))==NULL)
    {
       printf("不能打开文件\n");
       exit(1);
    }
    pStudent p;
    p=phead->next;
    while(p!=NULL)
    {
        fprintf(fp,"%s %s %c %u %lf %lf %lf %lf %lf\n", p->number, p->name ,p->sex,p->age,p->english,p->c,p->math,p->sum,p->aver);    //把内存中的文件输入到硬盘中
        p=p->next;
    }
    fclose(fp);                   //关闭文件
    //printf("文件已保存\n");     //成功保存,显示提示
    Sleep(1000);
}
/******************读取模块**********************/ 
pStudent router_Stu(pStudent phead)
{
    system("cls");
    FILE *fp;
    int m=0;
    if((fp=fopen("e:\\课设\\Student", "rw"))==NULL)
    {
        printf("读取失败!");
        return;
     }
    pStudent p1,p2;

    p1=(pStudent)malloc(sizeof(Student));
    while(fscanf(fp,"%s %s %c %u %lf %lf %lf %lf %lf",
        p1->number, p1->name, &p1->sex, &p1->age,&p1->english,&p1->c,&p1->math,&p1->sum,&p1->aver)==9)
    {
        m=m+1;
        if(m==1)
        {
            phead->next=p1;
            p2=p1;
            p2->next = NULL;
        }
        else
        {
            p2->next=p1;
            p2=p1;
            p2->next=NULL;
        }
        p1=(pStudent)malloc(sizeof(Student));
    }
    fclose(fp);
    //printf("读取成功!");
    iCount=m;
    //Sleep(1000);
    return phead;
} 
/******************删除模块**********************/ 
pStudent delete_Stu(pStudent phead)
{
    system("cls");
    if(phead->next==NULL)
    {
        printf("没有可删除的信息!\n");
        system("pause");
        return phead;
    }
    char number1[8];
    pStudent pTemp,p;
    printf("请输入您要查找的学生学号:");
    scanf("%s",number1);
    while(strlen(number1)!=8)
    {
        printf("请输入8位学号");
        scanf("%s",number1); 
    }
    pTemp=phead;
    while(strcmp(pTemp->number,number1)!=0&&pTemp->next!=NULL)
    {
        p=pTemp;
        pTemp=pTemp->next;
    }
    if(strcmp(pTemp->number,number1)==0)
    {
        if(p!=phead)
        {
            p->next=pTemp->next;
        }
        else
        {
            phead=pTemp->next;
        }
        printf("已删除");
        Sleep(1000);
    }
    else
    {
        printf("没找到");
        Sleep(1000);
    }
    getchar();
    Save_Stu(phead);
    return phead;
}
/********************修改*******************/
pStudent revise(pStudent phead)
{
    system("cls");
    char P[200];
    int bk; 
    char number1[8];
    pStudent pTemp;
    if(phead->next==NULL)
    {
        printf("没有可修改的信息!\n");
        system("pause");
        return phead;
    }
    pTemp=phead->next;
    printf("请输入你要修改的学生学号:");
    scanf("%s",number1);
    while(strlen(number1)!=8)
    {
        printf("请输入正确的8位学号:");
        scanf("%s",number1);
    }
    while(strcmp(pTemp->number,number1)!=0&&pTemp->next!=NULL)
    {
        pTemp=pTemp->next;
    }
    if(strcmp(pTemp->number,number1)==0)
    {
        while(1)
        {
            system("cls");
            printf("\t\t\t请输入你要修改的信息:\n");
            printf("\t\t\t********************************\t\t\t\n");
            printf("\t\t\t   1.修改学号      2.修改姓名   \t\t\t\n");
            printf("\t\t\t   3.修改年龄      4.修改性别   \t\t\t\n");
            printf("\t\t\t   5.修改C语言     6.修改数学   \t\t\t\n");
            printf("\t\t\t   7.修改英语      8.显示信息   \t\t\t\n");
            printf("\t\t\t   0.返回上一层                 \t\t\t\n");
            printf("\t\t\t********************************\t\t\t\n");
            printf("请输入您的选择:");
            scanf("%s",P);
            bk=back(P);
            switch(bk)
            {
                case 1:{
                        system("cls");
                        printf("请输入新学号:");
                        scanf("%s",pTemp->number);
                        while(strlen(pTemp->number)!=8)
                        {
                            printf("请输入正确的8位学号:");
                            scanf("%s",pTemp->number);
                        }
                        system("cls");
                        printf("修改成功!");
                        Sleep(1000);
                        break;
                        }
                case 2:{
                        system("cls");
                        printf("请输入新的姓名:");
                        scanf("%s",pTemp->name);
                        system("cls");
                        printf("修改成功!");
                        Sleep(1000);
                        break;
                        }
                case 3:{
                        system("cls");
                        printf("请输入新的年龄:");
                        scanf("%u",&pTemp->age);
                        while(pTemp->age<=0||pTemp->age>=100)
                        {
                            printf("请输入正确的年龄:");
                            scanf("%u",&pTemp->age);
                        }
                        system("cls");
                        printf("修改成功!");
                        Sleep(1000);
                        break;
                        }
                case 4:{
                        system("cls");
                        printf("请输入新的性别:");
                        getchar();
                        scanf("%c",&pTemp->sex);
                        while(pTemp->sex!='m'&&pTemp->sex!='w'&&pTemp->sex!='M'&&pTemp->sex!='W')
                        {
                            printf("请输入正确的性别:");
                            fflush(stdin);
                            scanf("%c",&pTemp->sex);
                        }
                        system("cls");
                        printf("修改成功!");
                        Sleep(1000);
                        break;
                        }
                case 5:{
                        system("cls");
                        printf("请输入新的C语言成绩(0-100):");
                        scanf("%lf",&pTemp->c);
                        while(pTemp->c>100||pTemp->c<0)
                        {
                            printf("请输入正确的C语言分数:");
                            scanf("%lf",&pTemp->c);
                        }
                        system("cls");
                        printf("修改成功!");
                        Sleep(1000);
                        break;
                        }
                case 6:{
                        system("cls");
                        printf("请输入新的数学成绩(0-100):");
                        scanf("%lf",&pTemp->math);
                        while(pTemp->math>100||pTemp->math<0)
                        {
                            printf("请输入正确的数学分数:");
                            scanf("%lf",&pTemp->math);
                        }
                        system("cls");
                        printf("修改成功!");
                        Sleep(1000);
                        break;
                        }
                case 7:{
                        system("cls");
                        printf("请输入新的英语成绩(0-100):");
                        scanf("%lf",&pTemp->english);
                        while(pTemp->english>100||pTemp->english<0)
                        {
                            printf("请输入正确的英语分数:");
                            scanf("%lf",&pTemp->english);
                        }
                        system("cls");
                        printf("修改成功!");
                        Sleep(1000);
                        break;
                        }
                case 8:{
                        system("cls");
                        print_stu2();
                        print_stu1(phead);
                        Sleep(1000);
                        break;
                        }
                case 0:break;
                default:printf("输入错误,请重新输入");
                        system("pause");
            }
            if(bk==0)
            break;
       }
       Save_Stu(phead);
       return phead;
    }
    else 
    {
        printf("无该学生信息!");  
        Sleep(1000);
        return phead;
    }
}

void saocaozuo()
{
    printf("本操作为颜色变幻,按M或者N键可变换,回车键退出。");
    int i=0,j=15;
    char Color[8];
    char suiji[16][2]={"1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
    char ch;
    while(1)
    {
        ch=getch();
        if(ch=='m'||ch=='M')
        {
            i++;
            if(i==16)
            i=0;
            strcpy(Color,"color ");
            strcat(Color,suiji[i]);
            strcat(Color,suiji[j]);
            system(Color);
        }
        else if(ch=='n'||ch=='N')
        {
            j--;
            if(j==-1)
            j=15;
            strcpy(Color,"color ");
            strcat(Color,suiji[i]);
            strcat(Color,suiji[j]);
            system(Color);
        }
        else if(ch==13)
        {
            system("cls");
            break;
        }

     } 
} 


void meun()
{
    pStudent phead;
    phead = (pStudent)malloc(sizeof(Student));
    phead->next = NULL;
    router_Stu(phead); 
    char P,a[200];
    char choice; 
    int bk;
    while(1)
    {
        system("cls");
        print();
        fflush(stdin);
        printf("请输入指令:");
        scanf("%s",a);
        bk=back(a);
        switch(bk)
        {
            case 1:{phead=Insert(phead);     //完成 
                   system("cls");
                     break;}
            case 2:{print_stu1(phead);  //完成 
                   system("cls");
                   break;}
            case 3:{phead=searchmenu(phead);   //完成 
                   system("cls");
                    break;}
            case 4:{phead=revise(phead);      //完成 
                   system("cls");
                   break;}
            case 5:{phead=sortmenu(phead);    //完成 
                   system("cls");
                    break;}
            case 6:{phead=delete_Stu(phead); //完成 
                   system("cls");
                   break;}
            case 7:{saocaozuo();
                    break;
                    }
            case 0:{
                    print2();
                    exit(1);
                    }
            default:{printf("输入错误!请重新输入\n");
                    system("pause");}
         }
    }
    free(phead);
}


  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值