学生成绩系统

学生成绩系统(已完成)

在这里插入图片描述

//!!注意:输入性别的地方代码严谨性有待完善!!
/*
4.22日志:head节点内存有问题,优先修复这个问题再向下进行
*/
/*
4.23日志:head节点内存问题已修复,现在只需要修复
性别乱码问题即可,性别乱码问题
在节点二就不会再出现乱码这是目前已知信息望尝试修复。
目前4.23bug不需要先去修复,这里先将查询程序写完。
*/
//4.25日志以上bug均已修复
/*
4.28龙场悟道:
1.可以尝试在查找的时候返回节点地址
2.横线行可以单独写函数
3.输入有效性检验重构输入函数
4.列表最后一个节点可以给NULL
*/
/*
4.30日志
查询功能完成完毕
数据严谨性输入完善完毕
*/
/*
5.1日志
文件打开功能模块更加完善。
新建文件部分需要跟文件打开部分同步完善,目前还没完善。
未完成功能:排序,统计
2023年5月1日22点47分:目前已知bug已全修复,后续bug待发现。
*/
/*
5.5日志:功能基本完成结束
*/
#include "stdlib.h"
#include "stdio.h"
#include "windows.h"
#include "conio.h"
#include "string.h"
//统一宏定义
#define MYlist struct list
// #define stuDATA struct student//宏定义结构体
#define list_len sizeof(struct list)
#define stu_len sizeof(struct student)//结构体大小(长度)
#define DATA_DIS access->data.stuID,access->data.stuNAME,access->data.stuSEX,access->data.stuMAT,access->data.stuENG,access->data.stuC//宏定义用于printf
#define DATAAM 41//数据库容量
MYlist *last,*head;
//head地址永远不用改变,link用于链表链接,access用于链表访问。
int Record=0;//注意本次代码使用部分全局变量
FILE *target;
char Filename[20]="";
char Filenamecur[20]="";
int cFlag=0;//有链表产生这里cFlag就为1
int FileopenFlag=0;
int FileModifyFlag=0;
typedef struct student{
    int stuID;
    char stuNAME[16];
    char stuSEX[4];
    int stuMAT;
    int stuC;
    int stuENG;
}stuDATA;
struct list{
    stuDATA data;
    MYlist *next;
};
//主菜单
void ShowMainMenue(){
    system("cls");
    printf("\t\t\t   学生成绩管理系统\n");
    printf("******************************************************************************\n");
    if(strcmp(Filenamecur,"")!=0)printf("当前打开的文件为:%s\n",Filenamecur);
    else printf("当前没有打开文件\n");
    printf("1.新建记录\t\t\t5.修改记录\t\t\t9. 从文件读取\n");
    printf("2.添加记录\t\t\t6.删除记录\t\t\ta.保存到文件\n");
    printf("---------\t\t\t----------\t\t\t-----------\n");
    printf("3.查看记录\t\t\t7.排序\t\t\t\t0.退出\n");
    printf("4.查询记录\t\t\t8.统计分析\t\t\t\t\n");
    printf("******************************************************************************\n");
    printf("请输入指令(0-10):");
}
//修改信息菜单
void ShowModifyMenue(){
    system("cls");
    printf("\t\t\t   学生成绩管理系统:修改记录\n");
    printf("******************************************************************************\n");
    printf("\t\t\t\t1.修改学号\n");
    printf("\t\t\t\t2.修改姓名\n");
    printf("\t\t\t\t3.修改性别\n");
    printf("\t\t\t\t4.修改数学成绩\n");
    printf("\t\t\t\t5.修改英语成绩\n");
    printf("\t\t\t\t6.修改C语言成绩\n");
    printf("\t\t\t\t0.返回上级菜单\n");
    printf("******************************************************************************\n");
}
//排序菜单
void ShowRankMenue(){
    system("cls");
    printf("\t\t\t   学生成绩管理系统:排序系统\n");
    printf("******************************************************************************\n");
    printf("\t\t\t\t1.学号排序\n");
    printf("\t\t\t\t2.数学成绩排序\n");
    printf("\t\t\t\t3.英语成绩排序\n");
    printf("\t\t\t\t4.C语言成绩排序\n");
    printf("\t\t\t\t0.返回上级菜单\n");
    printf("******************************************************************************\n");
}
//释放链表
void Freelist(MYlist *access){
    MYlist *curFree;
    while(1){
        if(access->next!=NULL){
            curFree=access;
            access=access->next;
            free(curFree);
        }
        else{
            break;
        }
        if(access==head){
            free(access);
            break;
        }

    }
}
//存储到文件
void SaveToFile(){
    system("cls");
    FILE *WRIT;
    MYlist *access;
    int i=0;
    char cFlag;
    access=head;
    start:
    printf("是否保存当前文件(y/n):");
    scanf("%c",&cFlag);
    fflush(stdin);
    if(cFlag!='y'&&cFlag!='n'){
        printf("输入指令错误,请重新输入!\n");
        goto start;
    }
    if(cFlag=='n'){
        return;
    }
    if(cFlag=='y'){
        WRIT=fopen(Filenamecur,"w");
        while(i<Record){
            fwrite(&access->data,stu_len,1,WRIT);
            if(access->next!=NULL)access=access->next;
            else {
                printf("保存成功!\n");
                break;
            }
        }
    }
    FileModifyFlag=0;
    fclose(WRIT);
}
//限制输入学号
void IDGets(MYlist *access){
    MYlist *search;
    start:
    search=head;
    printf("请输入学号:");
    scanf("%d",&access->data.stuID);
    fflush(stdin);
    while(1){
        if(search!=access&&access->data.stuID==search->data.stuID){
            printf("学好重复,请重新输入!\n");
            goto start;
        }
        if(access->data.stuID<0){
            printf("学好输入错误,请重新输入!\n");
            goto start;
        }
        if(search->next==NULL)break;
        search=search->next;
    }
}
//限制性别输入
void SEXGets(MYlist *access){
    MYlist *search;
    start:
    printf("请输入性别(F/M):");
    gets(access->data.stuSEX);
    if(strcmp(access->data.stuSEX,"F")!=0&&strcmp(access->data.stuSEX,"M")!=0){
        printf("输入错误,请输入(F/M)!\n");
        goto start;
    }
}
//限制数学分数
void MScore(MYlist *access){
    start:
    printf("请输入数学成绩:");
    scanf("%d",&access->data.stuMAT);
    getchar();
    if(access->data.stuMAT>100||access->data.stuMAT<0){
        printf("请输入合法的成绩(0~100)!\n");
        goto start;
    }
}
//限制数学分数
void EScore(MYlist *access){
    start:
    printf("请输入英语成绩:");
    scanf("%d",&access->data.stuENG);
    getchar();
    if(access->data.stuENG>100||access->data.stuENG<0){
        printf("请输入合法的成绩(0~100)!\n");
        goto start;
    }
}
//限制数学分数
void CScore(MYlist *access){
    start:
    printf("请输入C语言成绩:");
    scanf("%d",&access->data.stuC);
    getchar();
    if(access->data.stuC>100||access->data.stuC<0){
        printf("请输入合法的成绩(0~100)!\n");
        goto start;
    }
}
//文件读取
void ReadtestFile(char *readMode){
    FileopenFlag=1;
    cFlag=1;
    MYlist *access,*creat,*accessbef;
    int i=0;
    target=fopen(Filenamecur,readMode);
    if(target==NULL){
        Record=-1;
    }
    while(!feof(target)){
        if(Record==0){
            creat=(MYlist*)malloc(list_len);
            accessbef=access=head=creat;
        }
        if(Record!=0){//双节点滑动前进,前节点探测后节点落实。
            creat=(MYlist*)malloc(list_len);
            accessbef=access;
            access->next=creat;
            access=creat;
        }
        if(fread(&access->data,stu_len,1,target)){
            Record++;
        }
        else{
            if(Record!=0)free(access);
        }
    }
    last=accessbef;
    last->next=NULL;
    fclose(target);
}
// 选中打开目标打开方式
void Openfile(){//注意新建文件部分应该与该部分思想一致
    if(cFlag==1&&Record!=0&&FileModifyFlag!=0){
        printf("将为您打开新的文件,");
        SaveToFile();
    }
    system("cls");
    printf("请输入要打开的文件名称:");
    gets(Filename);//↓突然想到一种新的文件打开方式,以下注释掉
    target=fopen(Filename,"r");
    if(target!=NULL&&cFlag==0){
        printf("文件打开成功!\n");
        FileModifyFlag=0;
        FileopenFlag=1;
        strcpy(Filenamecur,Filename);
        ReadtestFile("r");
    }
    else if(target!=NULL&&cFlag==1&&Record!=0){
        printf("文件打开成功!\n");
        FileModifyFlag=0;
        Freelist(head);
        cFlag=0;
        Record=0;
        FileopenFlag=1;
        strcpy(Filenamecur,Filename);
        ReadtestFile("r");
    }
    else if(target!=NULL&&cFlag==1&&Record==0){
        printf("文件打开成功!\n");
        FileModifyFlag=0;
        Freelist(head);
        cFlag=0;
        Record=0;
        FileopenFlag=1;
        strcpy(Filenamecur,Filename);
        ReadtestFile("r");
    }
    else{
        printf("文件打开失败(可能没有这个文件)!\n");
        return;
    }
    fclose(target);
}
MYlist *SearchAddress(){
    MYlist *search;
    search=head;
    int stuID;
    printf("请输入学号:");
    scanf("%d",&stuID);
    fflush(stdin);
    while(1){
        if(stuID==search->data.stuID){
            return search;
        }
        if(search->next!=NULL)search=search->next;
        else break;
    }
    printf("没有找到该学生!\n");
    return NULL;
}
//定位当前节点前一个节点
MYlist *SearchAddressbef(MYlist *access){
    MYlist *cur,*bef;
    cur=access;
    access=head;
    while(1){
        if(cur==head){
            return cur;
        }
        else if(access->next==cur){
            bef=access;
            break;
        }
        else if(access->next==NULL){
            bef=NULL;
            break;
        }
        access=access->next;
    }
    return bef;
}
//显示单个学生信息
void DisplaySigalStu(MYlist *access){
    printf("\t|%-15s%-10s%-10s%-10s%-10s%-11s|\n","学号","姓名","性别","数学","英语","C语言");
    printf("        |------------------------------------------------------------------|\n");
    printf("\t|%-15d%-10s%-11s%-10d%-10d%-10d|\n",DATA_DIS);
    printf("        |------------------------------------------------------------------|\n");
}
//链表排序
void RankDataMathdw(){
    MYlist *access,*cur,*befMAX,*befcur,*MAX;
    MAX=cur=access=head;
    int i=0,j=0;
    for(i=0;i<Record;i++){
        MAX=cur;
        if(cur->next!=NULL){
            access=cur->next;
        }
        else{
            break;
        }
        for(;;){
            if(MAX->data.stuMAT<access->data.stuMAT){
                MAX=access;
            }
            if(access->next!=NULL){
                access=access->next;
            }
            else{
                break;
            }
        }
        if(MAX!=cur&&cur!=head){
            befcur=SearchAddressbef(cur);//该处可以改进
            befMAX=SearchAddressbef(MAX);
            befMAX->next=MAX->next;
            MAX->next=cur;
            befcur->next=MAX;
        }
        if(MAX==cur)cur=cur->next;
        if(MAX!=cur&&cur==head){
            befMAX=SearchAddressbef(MAX);
            befMAX->next=MAX->next;
            MAX->next=cur;
            head=MAX;
        }
        last=MAX->next;
    }
}
void RankDataEngup(){
    MYlist *access,*cur,*befMIN,*befcur,*MIN;
    MIN=cur=access=head;
    int i=0,j=0;
    for(i=0;i<Record;i++){
        MIN=cur;
        if(cur->next!=NULL){
            access=cur->next;
        }
        else{
            break;
        }
        for(;;){
            if(MIN->data.stuENG>access->data.stuENG){
                MIN=access;
            }
            if(access->next!=NULL){
                access=access->next;
            }
            else{
                break;
            }
        }
        if(MIN!=cur&&cur!=head){
            befcur=SearchAddressbef(cur);//该处可以改进
            befMIN=SearchAddressbef(MIN);
            befMIN->next=MIN->next;
            MIN->next=cur;
            befcur->next=MIN;
        }
        if(MIN==cur)cur=cur->next;
        if(MIN!=cur&&cur==head){
            befMIN=SearchAddressbef(MIN);
            befMIN->next=MIN->next;
            MIN->next=cur;
            head=MIN;
        }
        last=MIN->next;
    }
}
void RankDataEngdw(){
    MYlist *access,*cur,*befMAX,*befcur,*MAX;
    MAX=cur=access=head;
    int i=0,j=0;
    for(i=0;i<Record;i++){
        MAX=cur;
        if(cur->next!=NULL){
            access=cur->next;
        }
        else{
            break;
        }
        for(;;){
            if(MAX->data.stuENG<access->data.stuENG){
                MAX=access;
            }
            if(access->next!=NULL){
                access=access->next;
            }
            else{
                break;
            }
        }
        if(MAX!=cur&&cur!=head){
            befcur=SearchAddressbef(cur);//该处可以改进
            befMAX=SearchAddressbef(MAX);
            befMAX->next=MAX->next;
            MAX->next=cur;
            befcur->next=MAX;
        }
        if(MAX==cur)cur=cur->next;
        if(MAX!=cur&&cur==head){
            befMAX=SearchAddressbef(MAX);
            befMAX->next=MAX->next;
            MAX->next=cur;
            head=MAX;
        }
        last=MAX->next;
    }
}
void RankDataCup(){
    MYlist *access,*cur,*befMIN,*befcur,*MIN;
    MIN=cur=access=head;
    int i=0,j=0;
    for(i=0;i<Record;i++){
        MIN=cur;
        if(cur->next!=NULL){
            access=cur->next;
        }
        else{
            break;
        }
        for(;;){
            if(MIN->data.stuC>access->data.stuC){
                MIN=access;
            }
            if(access->next!=NULL){
                access=access->next;
            }
            else{
                break;
            }
        }
        if(MIN!=cur&&cur!=head){
            befcur=SearchAddressbef(cur);//该处可以改进
            befMIN=SearchAddressbef(MIN);
            befMIN->next=MIN->next;
            MIN->next=cur;
            befcur->next=MIN;
        }
        if(MIN==cur)cur=cur->next;
        if(MIN!=cur&&cur==head){
            befMIN=SearchAddressbef(MIN);
            befMIN->next=MIN->next;
            MIN->next=cur;
            head=MIN;
        }
        last=MIN->next;
    }
}
void RankDataCdw(){
    MYlist *access,*cur,*befMAX,*befcur,*MAX;
    MAX=cur=access=head;
    int i=0,j=0;
    for(i=0;i<Record;i++){
        MAX=cur;
        if(cur->next!=NULL){
            access=cur->next;
        }
        else{
            break;
        }
        for(;;){
            if(MAX->data.stuC<access->data.stuC){
                MAX=access;
            }
            if(access->next!=NULL){
                access=access->next;
            }
            else{
                break;
            }
        }
        if(MAX!=cur&&cur!=head){
            befcur=SearchAddressbef(cur);//该处可以改进
            befMAX=SearchAddressbef(MAX);
            befMAX->next=MAX->next;
            MAX->next=cur;
            befcur->next=MAX;
        }
        if(MAX==cur)cur=cur->next;
        if(MAX!=cur&&cur==head){
            befMAX=SearchAddressbef(MAX);
            befMAX->next=MAX->next;
            MAX->next=cur;
            head=MAX;
        }
        last=MAX->next;
    }
}
void RankDataMathup(){
    MYlist *access,*cur,*befMIN,*befcur,*MIN;
    MIN=cur=access=head;
    int i=0,j=0;
    for(i=0;i<Record;i++){
        MIN=cur;
        if(cur->next!=NULL){
            access=cur->next;
        }
        else{
            break;
        }
        for(;;){
            if(MIN->data.stuMAT>access->data.stuMAT){
                MIN=access;
            }
            if(access->next!=NULL){
                access=access->next;
            }
            else{
                break;
            }
        }
        if(MIN!=cur&&cur!=head){
            befcur=SearchAddressbef(cur);//该处可以改进
            befMIN=SearchAddressbef(MIN);
            befMIN->next=MIN->next;
            MIN->next=cur;
            befcur->next=MIN;
        }
        if(MIN==cur)cur=cur->next;
        if(MIN!=cur&&cur==head){
            befMIN=SearchAddressbef(MIN);
            befMIN->next=MIN->next;
            MIN->next=cur;
            head=MIN;
        }
        last=MIN->next;
    }
}
void RankDataIDdw(){
    MYlist *access,*cur,*befMAX,*befcur,*MAX;
    MAX=cur=access=head;
    int i=0,j=0;
    for(i=0;i<Record;i++){
        MAX=cur;
        if(cur->next!=NULL){
            access=cur->next;
        }
        else{
            break;
        }
        for(;;){
            if(MAX->data.stuID<access->data.stuID){
                MAX=access;
            }
            if(access->next!=NULL){
                access=access->next;
            }
            else{
                break;
            }
        }
        if(MAX!=cur&&cur!=head){
            befcur=SearchAddressbef(cur);//该处可以改进
            befMAX=SearchAddressbef(MAX);
            befMAX->next=MAX->next;
            MAX->next=cur;
            befcur->next=MAX;
        }
        if(MAX==cur)cur=cur->next;
        if(MAX!=cur&&cur==head){
            befMAX=SearchAddressbef(MAX);
            befMAX->next=MAX->next;
            MAX->next=cur;
            head=MAX;
        }
        last=MAX->next;
    }
}
void RankDataIDup(){
    MYlist *access,*cur,*befMIN,*befcur,*MIN;
    MIN=cur=access=head;
    int i=0,j=0;
    for(i=0;i<Record;i++){
        MIN=cur;
        if(cur->next!=NULL){
            access=cur->next;
        }
        else{
            break;
        }
        for(;;){
            if(MIN->data.stuID>access->data.stuID){
                MIN=access;
            }
            if(access->next!=NULL){
                access=access->next;
            }
            else{
                break;
            }
        }
        if(MIN!=cur&&cur!=head){
            befcur=SearchAddressbef(cur);//该处可以改进
            befMIN=SearchAddressbef(MIN);
            befMIN->next=MIN->next;
            MIN->next=cur;
            befcur->next=MIN;
        }
        if(MIN==cur)cur=cur->next;
        if(MIN!=cur&&cur==head){
            befMIN=SearchAddressbef(MIN);
            befMIN->next=MIN->next;
            MIN->next=cur;
            head=MIN;
        }
        last=MIN->next;
    }
}
//排序系统汇总
void RankDataSystem(){
    char iItem,iItem2;
    ShowRankMenue();
    printf("请输入指令(0-10):");
    scanf("%c",&iItem);
    fflush(stdin);
    while(1){
        switch(iItem){
            case '0':
                break;
            case '1':
                system("cls");
                printf("\t\t\t\t1.学号升序排序\n");
                printf("\t\t\t\t2.学号降序排序\n");
                printf("\t\t\t\t0.返回上级菜单\n");
                printf("请输入指令(0-2):");
                scanf("%c",&iItem2);
                fflush(stdin);
                while(1){
                    switch(iItem2){
                        case '0':
                            break;
                        case '1':
                            RankDataIDup();
                            printf("升序排序!\n");
                            FileModifyFlag=1;
                            break;
                        case '2':
                            RankDataIDdw();
                            printf("降序排序!\n");
                            FileModifyFlag=1;
                            break;
                        default:
                            printf("请输入正确的指令!\n");
                    }
                    if(iItem2=='0')break;
                    printf("|按任意键继续|\n");
                    getch();
                    system("cls");
                    printf("\t\t\t\t1.学号升序排序\n");
                    printf("\t\t\t\t2.学号降序排序\n");
                    printf("\t\t\t\t0.返回上级菜单\n");
                    printf("请输入指令(0-2):");
                    scanf("%c",&iItem2);
                    fflush(stdin);
                }
                break;
            case '2':
                system("cls");
                printf("\t\t\t\t1.数学升序排序\n");
                printf("\t\t\t\t2.数学降序排序\n");
                printf("\t\t\t\t0.返回上级菜单\n");
                printf("请输入指令(0-2):");
                scanf("%c",&iItem2);
                fflush(stdin);
                while(1){
                    switch(iItem2){
                        case '0':
                            break;
                        case '1':
                            RankDataMathup();
                            printf("升序排序!\n");
                            FileModifyFlag=1;
                            break;
                        case '2':
                            RankDataMathdw();
                            printf("降序排序!\n");
                            FileModifyFlag=1;
                            break;
                        default:
                            printf("请输入正确的指令!\n");
                    }
                    if(iItem2=='0')break;
                    printf("|按任意键继续|\n");
                    getch();
                    system("cls");
                    printf("\t\t\t\t1.数学升序排序\n");
                    printf("\t\t\t\t2.数学降序排序\n");
                    printf("\t\t\t\t0.返回上级菜单\n");
                    printf("请输入指令(0-2):");
                    scanf("%c",&iItem2);
                    fflush(stdin);
                }
                break;
            case '3':
                system("cls");
                printf("\t\t\t\t1.英语升序排序\n");
                printf("\t\t\t\t2.英语降序排序\n");
                printf("\t\t\t\t0.返回上级菜单\n");
                printf("请输入指令(0-2):");
                scanf("%c",&iItem2);
                fflush(stdin);
                while(1){
                    switch(iItem2){
                        case '0':
                            break;
                        case '1':
                            RankDataEngup();
                            printf("升序排序!\n");
                            FileModifyFlag=1;
                            break;
                        case '2':
                            RankDataEngdw();
                            printf("降序排序!\n");
                            FileModifyFlag=1;
                            break;
                        default:
                            printf("请输入正确的指令!\n");
                    }
                    if(iItem2=='0')break;
                    printf("|按任意键继续|\n");
                    getch();
                    system("cls");
                    printf("\t\t\t\t1.英语升序排序\n");
                    printf("\t\t\t\t2.英语降序排序\n");
                    printf("\t\t\t\t0.返回上级菜单\n");
                    printf("请输入指令(0-2):");
                    scanf("%c",&iItem2);
                    fflush(stdin);
                }
                break;
            case '4':
                system("cls");
                printf("\t\t\t\t1.C语言升序排序\n");
                printf("\t\t\t\t2.C语言降序排序\n");
                printf("\t\t\t\t0.返回上级菜单\n");
                printf("请输入指令(0-2):");
                scanf("%c",&iItem2);
                fflush(stdin);
                while(1){
                    switch(iItem2){
                        case '0':
                            break;
                        case '1':
                            RankDataCup();
                            printf("升序排序!\n");
                            FileModifyFlag=1;
                            break;
                        case '2':
                            RankDataCdw();
                            printf("降序排序!\n");
                            FileModifyFlag=1;
                            break;
                        default:
                            printf("请输入正确的指令!\n");
                    }
                    if(iItem2=='0')break;
                    printf("|按任意键继续|\n");
                    getch();
                    system("cls");
                    printf("\t\t\t\t1.C语言升序排序\n");
                    printf("\t\t\t\t2.C语言降序排序\n");
                    printf("\t\t\t\t0.返回上级菜单\n");
                    printf("请输入指令(0-2):");
                    scanf("%c",&iItem2);
                    fflush(stdin);
                }
                break;
            default:
                printf("请输入正确的指令!\n");
        }
        if(iItem=='0')break;
        printf("|按任意键继续|\n");
        getch();
        ShowRankMenue();
        printf("请输入指令(0-6):");
        scanf("%c",&iItem);
        fflush(stdin);
    }
}
//查询记录模块
void DisplaySearch(){
    MYlist *access;
    access=SearchAddress();
    if(access!=NULL)DisplaySigalStu(access);
}
//修改记录模块
void ModifyData(){//可以加一个修改其他学生信息的选项
    MYlist *access;
    char iItem;
    access=SearchAddress();
    if(access==NULL){
        return;
    }
    ShowModifyMenue();
    DisplaySigalStu(access);
    printf("请输入指令(0-6):");
    scanf("%c",&iItem);
    fflush(stdin);
    while (iItem){
        switch(iItem){
            case '0':
                break;
            case '1':
                IDGets(access);
                FileModifyFlag=1;
                break;
            case '2':
                printf("请输入学生名称:");
                gets(access->data.stuNAME);
                FileModifyFlag=1;
                break;
            case '3':
                SEXGets(access);
                FileModifyFlag=1;
                break;
            case '4':
                MScore(access);
                FileModifyFlag=1;
                break;
            case '5':
                EScore(access);
                FileModifyFlag=1;
                break;
            case '6':
                CScore(access);
                FileModifyFlag=1;
                break;
            default:
                printf("指令输入错误!请重新输入!\n");
        }
        if(iItem=='0')break;
        printf("|按任意键继续|\n");
        getch();
        ShowModifyMenue();
        DisplaySigalStu(access);
        printf("请输入指令(0-6):");
        scanf("%c",&iItem);
        fflush(stdin);
    }
}
//删除记录模块
void DeletData(){
    MYlist *access,*cur,*bef;
    char iItem;
    access=SearchAddress();
    cur=access;
    if(cur==NULL){
        return;
    }
    DisplaySigalStu(cur);
    bef=SearchAddressbef(cur);
    printf("是否删除该数据(y/n):");
    scanf("%c",&iItem);
    fflush(stdin);
    while(1){//删除的时候注意考虑删除头节点和删除尾节点两种特殊情况
        if(iItem=='y'){
            if(iItem=='y'&&bef->next==cur&&cur->next!=NULL){
                FileModifyFlag=1;
                Record--;
                bef->next=cur->next;
                free(cur);
                break;
            }
            else if(cur==head){
                FileModifyFlag=1;
                Record--;
                head=cur->next;
                free(cur);
                break;
            }
            else if(cur->next==NULL){
                FileModifyFlag=1;
                Record--;
                bef->next=NULL;
                free(cur);
                break;
            }
        }
        else if(iItem=='n'){
            break;
        }
        else{
            printf("指令错误,请重新输入!\n");
            printf("是否删除该数据(y/n):");
            scanf("%c",&iItem);
            fflush(stdin);
        }
    }
}
// 添加记录
void dataADD(){
    system("cls");
    MYlist *access,*creat;
    int i=0;
    char iItem;
    access=head;
    if(Record==-1){
        printf("文件打开失败!\n");
        return;
    }
    do{
        if(Record==0){
            printf("数据库中没有数据,是否添加数据(y/n):");
            scanf("%c",&iItem);
            fflush(stdin);
            if(iItem!='y'&&iItem!='n')printf("输入指令错误!请重新输入!\n");
            if(iItem=='y'){
                FileModifyFlag=1;
                Record++;//数据库数据数量+1
                IDGets(access);
                printf("请输入学生名称:");
                gets(access->data.stuNAME);//gets在获取结构体指针时要以这种形式
                SEXGets(access);
                MScore(access);
                EScore(access);
                CScore(access);
                DisplaySigalStu(access);//输出测试
                if(Record>DATAAM){
                    printf("数据库已满!\n");
                    return;
                }
            }
        }
        if(Record!=-1&&Record!=0){
            printf("是否添加数据(y/n):");
            scanf("%c",&iItem);
            fflush(stdin);
            if(iItem!='y'&&iItem!='n')printf("输入指令错误!请重新输入!\n");
            if(iItem=='y'){
                FileModifyFlag=1;
                access=last;
                creat=(MYlist*)malloc(list_len);
                access->next=creat;
                access=last=creat;
                last->next=NULL;
                Record++;
                IDGets(access);
                printf("请输入学生名称:");
                gets(access->data.stuNAME);//gets在获取结构体指针时要以这种形式
                SEXGets(access);
                MScore(access);
                EScore(access);
                CScore(access);
                DisplaySigalStu(access);//输出测试
                if(Record>DATAAM){
                    printf("数据库已满!\n");
                    return;
                }
            }
        }
    }while(iItem!='n');
}
//新建记录
void NewDataAdd(){
    if(cFlag==1&&Record!=0&&FileModifyFlag!=0){
        printf("将为您新建文件,");
        SaveToFile();
    }
    printf("新建记录,请输入要新建记录的文件名称(.txt):");
    gets(Filename);
    if(strstr(Filename,".txt")!=NULL){
        if(fopen(Filename,"r")!=NULL){
            printf("该文件夹已存在!\n");
            return;
        }
        printf("新建文件成功!\n");
        if(cFlag==1){
            Freelist(head);
            cFlag=0;
            Record=0;
            FileModifyFlag=1;
            FileopenFlag=1;
        }
        Record=0;
        target=fopen(Filename,"w");
        strcpy(Filenamecur,Filename);
        fclose(target);
        ReadtestFile("r");
    }
    else{
        printf("新建文件失败,请新建(.txt)文件\n");
    }
}
//查看记录
void DisplayData(){
    MYlist *access;
    int i=0;
    char iItem;
    access=head;
    if(Record==-1){
        printf("文件打开失败!\n");
        return;
    }
    if(Record==0){
        printf("该文件中没有任何记录,请先添加记录!\n");
        return;
    }
    printf("\t|%-15s%-10s%-10s%-10s%-10s%-11s|\n","学号","姓名","性别","数学","英语","C语言");
    for(;;){
        printf("        |------------------------------------------------------------------|\n");
        printf("\t|%-15d%-10s%-11s%-10d%-10d%-10d|\n",DATA_DIS);
        printf("        |------------------------------------------------------------------|\n");
        if(access->next==NULL)break;
        access=access->next;
    }
}
//最后一个功能统计分析!
void Analysis(){
    MYlist *access,*cur;
    access=cur=head;
    int i=0,MAXC,MINC,MAXE,MINE,MAXM,MINM;
    float SumAll=0,sumM=0,sumE=0,sumC=0,aveC=0,aveE=0,aveM=0;
    if(Record==0){
        printf("数据库中目前没有数据!请添加数据库后使用该功能\n");
        return;
    }
    for(i=0;i<Record;i++){
        sumM+=access->data.stuMAT;
        sumC+=access->data.stuC;
        sumE+=access->data.stuENG;
        if(access->next!=NULL)access=access->next;
        else break;
    }
    access=head;
    MAXC=MINC=head->data.stuC;
    MAXE=MINE=head->data.stuENG;
    MAXM=MINM=head->data.stuMAT;
    for(i=0;i<Record;i++){
        if(MAXC<access->data.stuC)MAXC=access->data.stuC;
        if(MAXE<access->data.stuENG)MAXE=access->data.stuENG;
        if(MAXM<access->data.stuMAT)MAXM=access->data.stuMAT;
        if(MINC>access->data.stuC)MINC>access->data.stuC;
        if(MINE>access->data.stuENG)MINE=access->data.stuENG;
        if(MINM>access->data.stuMAT)MINM=access->data.stuMAT;
        if(access->next!=NULL)access=access->next;
        else break;
    }
    aveC=sumC/Record;
    aveE=sumE/Record;
    aveM=sumM/Record;
    printf("通过数据分析得出:\n数学:平均分为%.1f\t最高分为%d\n",aveM,MAXM);
    printf("英语:平均分为%.1f\t最高分为%d\n",aveE,MAXE);
    printf("C语言:平均分为%.1f\t最高分为%d\n",aveC,MAXC);
}
void ManageMain(){
    char iItem;
    ShowMainMenue();
    scanf("%c",&iItem);
    fflush(stdin);
    while(iItem!=0){
        switch(iItem){
            case '0':
                break;
            case '1':
                NewDataAdd();
                break;
            case '2':
                if(FileopenFlag==1){
                    dataADD();
                }
                else{
                    printf("请先打开一个文件!\n");
                }
                break;
            case '3':
                if(FileopenFlag==1){
                    DisplayData();
                }
                else{
                    printf("请先打开一个文件!\n");
                }
                break;
            case '4':
                if(FileopenFlag==1){
                    DisplaySearch();
                }
                else{
                    printf("请先打开一个文件!\n");
                }
                break;
            case '5':
                if(FileopenFlag==1){
                    ModifyData();
                }
                else{
                    printf("请先打开一个文件!\n");
                }
                break;
            case '6':
                if(FileopenFlag==1){
                    DeletData();
                }
                else{
                    printf("请先打开一个文件!\n");
                }
                break;
            case '7':
                if(FileopenFlag==1){
                    RankDataSystem();
                }
                else{
                    printf("请先打开一个文件!\n");
                }
                break;
            case '8':
                if(FileopenFlag==1){
                    Analysis();
                }
                else{
                    printf("请先打开一个文件!\n");
                }
                break;
            case '9':
                Openfile();
                break;
            case 'a':
                if(FileopenFlag==1){
                    SaveToFile();
                }
                else{
                    printf("请先打开一个文件!\n");
                }
                break;
            default:
                printf("请输入正确的指令!\n");
        }
        if(iItem=='0')break;
        printf("|按任意键继续|\n");
        getch();
        ShowMainMenue();
        scanf("%c",&iItem);
        fflush(stdin);
    }
    if(iItem=='0'&&FileModifyFlag!=0){
        printf("检测到您打开了文件在您退出之前,");
        SaveToFile();
    }
}
int main(){//只有一个函数调用的主函数
    ManageMain();
    system("pause");
}

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值