欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【C语言大作业】学生管理系统

程序员文章站 2022-03-08 23:00:46
...

简介

大一时帮别人代做的大作业,用的C语言编写,这个项目还是很经典的,可以锻炼到自己C语言的文件操作,并且了解C语言的结构化编程方式。

整体结构

主函数

主函数本着极简风格,只用一个循环,根据用户输入进入相应模块。

int main(){
    int choose;
    init();        //初始化
     
    while(1){
        system("cls");        //清屏 
        borP("欢迎使用学生信息管理系统&&1.学生相关操作&2.课程相关操作&3.选课相关操作&4.设置        &0.退出系统    &&请输入您想要进行的操作序号");
        scanf("%d",&choose);
        switch(choose){
            case 0:{ex();break;}
            case 1:{stuOS();break;}
            case 2:{couOS();break;}
            case 3:{chooseOS();break;}
            case 4:{set();break;}
        }
    }
    
    return 0;
}

效果图
【C语言大作业】学生管理系统

其它函数

程序中一共有如下其它函数

void mar();                    //输出左右外边距
void pLine(char str[]);        //输出星线 
void print(char str[]);        //输出一行 
void borP(char str[]);        //按自动套边框的格式输出,如果框内要输出多行,就用&符连接 
void ex();                    //退出程序 
void stuOS();                //学生操作模块 
void couOS();                //课程操作模块 
void chooseOS();            //选课操作模块 
void set();                    //设置边框属性 
void init();                //程序初始化

操作模块

结构

和主函数类似,所有操作模块都是先用一个循环判断是否退出这个模块,如果退出为假,就进入循环,根据用户输入进入相应操作,不过这次就没再继续进入某个函数模块了,不然最后一堆函数就会显得很乱了。
格式:
while(!exit){
system(“cls”);
borP(“xx相关操作&&1.xxxx&2.xxxx2&3.xxxx&4.xxxx&5.返回上一级 &0.退出系统 &&请输入您想要进行的操作序号”);
scanf("%d",&choose);
switch(choose){
case 1:{操作1步骤;break;}
case 2:{操作2步骤;break;}
case 3:{操作3步骤;break;}
case 4:{操作4步骤;break;}
case 5:exit = 1;break; //这里直接用return也行,不过用exit更便于理解
case 0;ex();
}
}

学生操作模块

界面
【C语言大作业】学生管理系统
操作实现
添加学生操作的步骤是先用FILE指针fp以a+(不存在就创建,存在就在末尾追加内容)方式打开存储学生信息的文件,然后用循环读取用户输入的学生信息并写入文件中,直到用户输入CTRL+Z就结束录入并跳转首页。
代码如下:

fp = fopen("stuInfo.txt","a+");        //这里注意用a+,在末尾追加内容 
printf("请按照学号 姓名 性别顺序输入学生信息,每名学生占一行,以EOF结束录入。\n");
while(scanf("%s%s%s",stuId,stuName,stuSex)!=EOF)
    fprintf(fp,"%-20s%-20s%-5s\n",stuId,stuName,stuSex);
printf("录入学生信息完毕,为您跳转到首页……\n");
fclose(fp);Sleep(sleepTime);return;

添加后stuInfo.txt文件内容存储结构如下:
【C语言大作业】学生管理系统
而删除学生就要复杂些了,当用户输入删除学生学号并确认后,需要先创建一个tmp.txt,然后从stuInfo.txt中依次取出每个学生信息并比较要删除的学号,如果匹配失败就把这个学生信息写入tmp.txt,匹配成功令find=1并跳过不录入该学生信息,直到feof(fp)为空,即所有学生都已比对,就把stuInfo.txt删除,再把tmp.txt改名为stuInfo.txt,最后输出相应提示并返回。
代码如下:

fp = fopen("stuInfo.txt","r");
printf("若档案中有此学生,其信息将被删除,否则您的操作不产生任何影响。\n");
printf("请输入您要删除信息的学生的学号:\n");
scanf("%s",tstuId);
printf("您确定要将学号为 %s 的学生的全部信息删除吗?1.确定 0.取消\n", tstuId);
printf("请输入选项序号1/0:\n");
if(scanf("%d",&tmp)==1&&tmp==1){
    tfp = fopen("tmp.txt","w");
    //查找该学生 
    int find = 0; 
    while(!feof(fp)){
        fscanf(fp,"%s%s%s\n",stuId,stuName,stuSex);
        //如果不是要删除的学生,就填入tmp.txt 
        if(strcmp(stuId,tstuId))fprintf(tfp,"%-20s%-20s%-5s\n",stuId,stuName,stuSex);    
        else find = 1;     
    }
    fclose(fp);
    fclose(tfp);
    remove("stuInfo.txt");
    rename("tmp.txt","stuInfo.txt");
    if(find)printf("删除学生信息成功,为您跳转到首页……\n");
    else    printf("没有找到该学生信息,为您跳转到首页……\n");
}
else {
    fclose(fp);printf("取消了删除,为您跳转到首页……\n");
}
Sleep(sleepTime);return;

课程操作模块

界面
【C语言大作业】学生管理系统
操作实现
添加课程的步骤:先让用户输入课程信息,然后用r+(如果存在就返回null,不存在就创建)方式尝试创建该课程文件,如果创建失败就说明存在该课程,就提示存在并返回,如果创建成功,就在该文件中填入该课程信息提示成功并返回。
代码如下:

printf("请按照  课程编号 课程名称 课程人数  顺序输入课程信息\n");
scanf("%s%s%d",couId,couName,&couMax);
strcpy(fileName,couName);
strcat(fileName,".txt");
if((fp = fopen(fileName,"r+"))!=NULL){        //r+如果打开失败不会创建文件,所以用它做判断 
    printf("该课程已存在,录入失败,为您跳转到首页……\n");fclose(fp);
} 
else{
    fclose(fp);
    fp = fopen(fileName,"w");
    fprintf(fp,"%-10s%-10s%-5d%-5d%-5.2lf\n",couId,couName,couMax,0,0.0);
    fclose(fp);
    printf("课程信息添加成功,为您跳转到首页……\n");
}
Sleep(sleepTime);return;

其它操作类似,这里就不多阐述了。

选课操作模块

界面
【C语言大作业】学生管理系统
操作实现
实现选课操作,需要先让用户输入选课学生学号,然后在stuInfo.txt中查找该学生,找不到就提示查无此人并返回,找到就让用户输入选课课程,并尝试用r方式打开该课程文件,如果返回null就提示没有该课并返回,如果打开成功就判断该课选课人数是否已满,满了就提示课满并返回,没满就用a+方式重新打开该文件,并把该学号及默认0分(不然算平均分会报错)填入并返回。
代码如下:

printf("请输入选课学生的学号:\n");
scanf("%s",tstuId); 
//查找该学生信息 
fp = fopen("stuInfo.txt","r");
int find = 0;
while(!feof(fp)){
    fscanf(fp,"%s%s%s\n",stuId,stuName,stuSex);
    if(!strcmp(stuId,tstuId)){find = 1;break;}        //找到该学生信息 
}
fclose(fp);
if(find){        //有该学生 
    printf("请输入目标课程名称(大小写无关):\n");
    scanf("%s",couName);
    strcpy(fileName,couName);
    strcat(fileName,".txt");
    if((fp = fopen(fileName,"r"))!=NULL){        //找到该课程 
        fscanf(fp,"%s%s%d%d%lf\n",couId,couName,&couMax,&couIn,&avgScore);
        if(couIn<couMax){            //课程没满 
            fp = fopen(fileName,"a+");
            fprintf(fp,"%-20s%-5d\n",tstuId,0);
            fclose(fp);
            printf("选课成功,为您跳转到首页……\n");
        }
        else{printf("该课程人数已满,选课失败,为您跳转到首页……\n");}
    }
    else{printf("档案中查无此课程,选课失败,为您跳转到首页……\n"); fclose(fp);}
}
else{printf("档案中查无此学生,选课失败,为您跳转到首页……\n");}
Sleep(sleepTime);return;

如果想查看其它操作流程可以查看下面源码,这里就不多介绍了。

完整源码

#include<stdio.h>
#include<string.h>
#include<windows.h>

int length = 0;
int Len = 50;        //边框宽
int padding = 2;    //上下内边距
int margin = 2;        //外边距
int win = 1;        //如果是win10,就改为1,如果是win7,就改为2 
int sleepTime = 1000;

void mar();                    //输出左右外边距
void pLine(char str[]);        //输出星线 
void print(char str[]);        //输出一行 
void borP(char str[]);        //按自动套边框的格式输出,如果框内要输出多行,就用&符连接 
void ex();                    //退出程序 
void stuOS();                //学生操作模块 
void couOS();                //课程操作模块 
void chooseOS();            //选课操作模块 
void set();                    //设置边框属性 
void init();                //程序初始化  

int score,couMax,couIn;                                                               //成绩,课程最大人数,课程当前总人数 
char couId[20],couName[20],stuId[20],stuName[20],stuSex[5];                       //课程编号,课程名,学生学号,学生姓名,学生性别 
double avgScore;                                                                 //平均成绩
char tcouName[20],fileName[25],tstuId[20],ttstuId[20],tstuName[20],tstuSex[5];     //替代参数 
int tmp,tscore;

int main(){
    int choose;
    init();        //初始化
     
    while(1){
        system("cls");        //清屏 
        borP("欢迎使用学生信息管理系统&&1.学生相关操作&2.课程相关操作&3.选课相关操作&4.设置        &0.退出系统    &&请输入您想要进行的操作序号");
        scanf("%d",&choose);
        switch(choose){
            case 0:{ex();break;}
            case 1:{stuOS();break;}
            case 2:{couOS();break;}
            case 3:{chooseOS();break;}
            case 4:{set();break;}
        }
    }
    
    return 0;
}
//如果不存在stuInfo.txt就创建一个,以防因为不存在stuInfo.txt文件而终止程序的情况 
void init(){
    FILE *fp;
    fp = fopen("stuInfo.txt","a+");
    fclose(fp); 
} 
//学生相关操作 
void stuOS(){
    FILE *fp,*tfp;
    int choose;
    int exit = 0;
    while(!exit){
        system("cls");
        borP("学生相关操作&&1.添加学生信息&2.删除学生信息&3.修改学生信息&4.查看学生信息&5.返回上一级  &0.退出系统    &&请输入您想要进行的操作序号");
        scanf("%d",&choose);
        switch(choose){
            case 1:{
                fp = fopen("stuInfo.txt","a+");        //这里注意用a+,在末尾追加内容 
                printf("请按照学号 姓名 性别顺序输入学生信息,每名学生占一行,以EOF结束录入。\n");
                while(scanf("%s%s%s",stuId,stuName,stuSex)!=EOF){
                    fprintf(fp,"%-20s%-20s%-5s\n",stuId,stuName,stuSex);
                }
                printf("录入学生信息完毕,为您跳转到首页……\n");fclose(fp);Sleep(sleepTime);return;
                break;
            }
            case 2:{
                fp = fopen("stuInfo.txt","r");
                printf("若档案中有此学生,其信息将被删除,否则您的操作不产生任何影响。\n");
                printf("请输入您要删除信息的学生的学号:\n");
                scanf("%s",tstuId);
                printf("您确定要将学号为 %s 的学生的全部信息删除吗?1.确定 0.取消\n", tstuId);
                printf("请输入选项序号1/0:\n");
                if(scanf("%d",&tmp)==1&&tmp==1){
                    tfp = fopen("tmp.txt","w");
                    //查找该学生 
                    int find = 0; 
                    while(!feof(fp)){
                        fscanf(fp,"%s%s%s\n",stuId,stuName,stuSex);
                        //如果不是要删除的学生,就填入tmp.txt 
                        if(strcmp(stuId,tstuId))fprintf(tfp,"%-20s%-20s%-5s\n",stuId,stuName,stuSex);    
                        else find = 1;     
                    }
                    fclose(fp);
                    fclose(tfp);
                    remove("stuInfo.txt");
                    rename("tmp.txt","stuInfo.txt");
                    if(find)printf("删除学生信息成功,为您跳转到首页……\n");
                    else    printf("没有找到该学生信息,为您跳转到首页……\n");
                }
                else {
                    fclose(fp);printf("取消了删除,为您跳转到首页……\n");
                }
                Sleep(sleepTime);return;
            }
            case 3:{
                fp = fopen("stuInfo.txt","r");
                printf("若档案中有此学生,将重新录入其信息,否则将您录入的信息新增到档案中。\n");
                printf("请输入您要修改信息的学生档案中的学号:\n");
                scanf("%s", ttstuId);        //原学号,用于指定某个学生,因为后面学号可能也需要改 
                printf("请按照学号 姓名 性别顺序输入该学生更新后的完整信息。\n");
                printf("学号 姓名 性别\n");
                scanf("%s%s%s",tstuId,tstuName,tstuSex);
                printf("您确定要将学号为 %s 的学生的信息修改为'%s  %s  %s'吗?1.确定 0.取消\n", ttstuId,tstuId,tstuName,tstuSex);
                printf("请输入选项序号1/0:\n");
                if(scanf("%d",&tmp)==1&&tmp==1){
                    tfp = fopen("tmp.txt","w");
                    //查找该学生 
                    int find = 0; 
                    while(!feof(fp)){
                        fscanf(fp,"%s%s%s\n",stuId,stuName,stuSex);
                        //如果不是要修改的学生,就直接填入tmp.txt 
                        if(strcmp(stuId,ttstuId))fprintf(tfp,"%-20s%-20s%-5s\n",stuId,stuName,stuSex);    
                        else fprintf(tfp,"%-20s%-20s%-5s\n",tstuId,tstuName,tstuSex); 
                    }
                    fclose(fp);
                    fclose(tfp);
                    remove("stuInfo.txt");
                    rename("tmp.txt","stuInfo.txt");
                    printf("修改学生信息成功,为您跳转到首页……\n");
                }
                else {
                    fclose(fp);printf("取消了更改,为您跳转到首页……\n");
                }    
                Sleep(sleepTime);return;
            }
            case 4:{
                printf("若档案中有重复学号或姓名的,将显示档案中位置靠前的学生信息。\n");
                printf("请选择您要使用的学生查询模式:1.按学号查询 2.按姓名查询:\n");
                scanf("%d",&tmp);
                fp = fopen("stuInfo.txt","r");
                if(tmp==1){
                    printf("请输入您要查询的学生的学号:\n");
                    scanf("%s",tstuId);
                    pLine("");                //输出横线做间隔,更美观 
                    printf("%-20s%-20s%-5s\n","学号","姓名","性别");
                    while(!feof(fp)){
                        fscanf(fp,"%s%s%s\n",stuId,stuName,stuSex);
                        if(!strcmp(stuId,tstuId))        //如果是要查找的学生信息 
                            printf("%-20s%-20s%-5s\n",stuId,stuName,stuSex);
                    }
                    pLine("");                //输出横线做间隔,更美观 
                    
                }
                else if(tmp==2){
                    printf("请输入您要查询的学生的姓名:\n");
                    scanf("%s",tstuName);
                    pLine("");
                    printf("%-20s%-20s%-5s\n","学号","姓名","性别");
                    while(!feof(fp)){
                        fscanf(fp,"%s%s%s\n",stuId,stuName,stuSex);
                        if(!strcmp(stuName,tstuName))        //如果是要查找的学生信息 
                            printf("%-20s%-20s%-5s\n",stuId,stuName,stuSex);
                    }
                    pLine("");
                }
                else{fclose(fp);printf("输入错误!为您跳转至首页……\n");Sleep(sleepTime);return;}
                fclose(fp);
                system("pause");return;
            } 
            case 5:exit = 1;break;
            case 0:ex();
        }
    }
}
//课程相关操作 
void couOS(){
    FILE *fp,*tfp;
    int choose;
    int exit = 0;
    while(!exit){
        system("cls");
        borP("课程相关操作&&1.添加课程信息&2.删除课程信息&3.更改课程信息&4.查看课程信息&5.返回上一级  &0.退出系统    &&请输入您想要进行的操作序号");
        scanf("%d",&choose);
        switch(choose){
            case 1:{
                printf("请按照  课程编号 课程名称 课程人数  顺序输入课程信息\n");
                scanf("%s%s%d",couId,couName,&couMax);
                strcpy(fileName,couName);
                strcat(fileName,".txt");
                if((fp = fopen(fileName,"r+"))!=NULL){        //r+如果打开失败不会创建文件,所以用它做判断 
                    printf("该课程已存在,录入失败,为您跳转到首页……\n");fclose(fp);
                } 
                else{
                    fclose(fp);
                    fp = fopen(fileName,"w");
                    fprintf(fp,"%-10s%-10s%-5d%-5d%-5.2lf\n",couId,couName,couMax,0,0.0);
                    fclose(fp);
                    printf("课程信息添加成功,为您跳转到首页……\n");
                }
                Sleep(sleepTime);return;
            } 
            case 2:{
                printf("若档案中有此课程,其信息将被删除,否则您的操作不产生任何影响。\n");
                printf("请输入您要删除的课程名(大小写不敏感):\n");
                scanf("%s",couName);
                strcpy(fileName,couName);
                strcat(fileName,".txt");
                if((fp = fopen(fileName,"r+"))!=NULL){        //存在该课程 
                    printf("您确定要将%s课程信息删除吗?1.确定 0.取消\n",  couName);
                    printf("请输入选项序号1/0:\n");
                    scanf("%d",&tmp);
                    if(tmp==1){fclose(fp);remove(fileName);printf("删除课程信息成功,为您跳转到首页……\n");Sleep(sleepTime);return;}
                    else {fclose(fp);printf("取消了删除,为您跳转到首页……\n");Sleep(sleepTime);return;    }
                }
                else{
                    printf("没有该课程,删除失败!为您跳转到首页……\n");fclose(fp);Sleep(sleepTime);return;
                } 
                break;
            }
            case 3:{
                printf("若档案中有此课程,将重新录入其信息,否则您的操作不产生任何影响。\n");
                printf("请输入您要修改信息的课程档案中的名称(大小写不敏感):\n");
                scanf("%s",couName);
                strcpy(fileName,couName);
                strcat(fileName,".txt");
                if((fp = fopen(fileName,"r"))!=NULL){        //存在该课程 
                    tfp = fopen("tmp.txt","w");
                    fscanf(fp,"%s%s%d%d%lf\n",couId,couName,&couMax,&couIn,&avgScore);
                    printf("请按照课程编号 课程名称 课程人数顺序输入新的课程信息。\n");
                    printf("课程编号    课程名称    课程人数\n");
                    scanf("%s%s%d",couId,couName,&couMax);
                    
                    fprintf(tfp,"%-10s%-10s%-5d%-5d%-5.2lf\n",couId,couName,couMax,couIn,avgScore);            //写入tmp.txt 
                    while(!feof(fp)){
                        fscanf(fp,"%s%d\n",stuId,&score);
                        fprintf(tfp,"%-20s%-5d\n",stuId,score);
                    }
                    fclose(fp);
                    fclose(tfp);
                    remove(fileName);
                    strcpy(fileName,couName);
                    strcat(fileName,".txt");
                    rename("tmp.txt",fileName);        //将tmp.txt替换为fileName文件 
                    printf("课程信息更改成功,为您跳转到首页……\n\n");Sleep(sleepTime);return;
                }
                else{printf("没有该课程,打开失败!为您跳转到首页……\n");fclose(fp);Sleep(sleepTime);return;}
                break;
            }
            case 4:{
                printf("请输入您要查看信息的课程档案中的名称(大小写不敏感):\n");
                scanf("%s",couName);
                strcpy(fileName,couName);
                strcat(fileName,".txt");
                if((fp = fopen(fileName,"r+"))!=NULL){
                    fscanf(fp,"%s%s%d%d%lf",couId,couName,&couMax,&couIn,&avgScore);
                    fclose(fp);
                    printf("课程信息如下:\n课程编号:%s 课程名称:%s\n课程容量:%d 已选人数:%d 平均分:%d\n", couId, couName, couMax, couIn, avgScore);
                    system("pause");fclose(fp);return;
                }
                else{
                    printf("该课程不存在,为您跳转到首页……\n");fclose(fp);Sleep(sleepTime);return;
                }
                break;
            } 
            case 5:exit = 1;break;
            case 0:{
                ex();
                break;
            }
        }
    } 
} 
//选课相关操作 
void chooseOS(){
    FILE *fp,*tfp;
    int choose;
    int exit = 0;
    
    while(!exit){
        system("cls");
        borP("选课相关操作&&1.选课        &2.退选        &3.成绩录入    &4.查看选课信息&5.返回上一级  &0.退出系统    &&请输入您想要进行的操作序号");
        scanf("%d",&choose);
        switch(choose){
            case 1:{
                printf("请输入选课学生的学号:\n");
                scanf("%s",tstuId); 
                //查找该学生信息 
                fp = fopen("stuInfo.txt","r");
                int find = 0;
                while(!feof(fp)){
                    fscanf(fp,"%s%s%s\n",stuId,stuName,stuSex);
                    if(!strcmp(stuId,tstuId)){find = 1;break;}        //找到该学生信息 
                }
                fclose(fp);
                if(find){        //有该学生 
                    printf("请输入目标课程名称(大小写无关):\n");
                    scanf("%s",couName);
                    strcpy(fileName,couName);
                    strcat(fileName,".txt");
                    if((fp = fopen(fileName,"r"))!=NULL){        //找到该课程 
                        fscanf(fp,"%s%s%d%d%lf\n",couId,couName,&couMax,&couIn,&avgScore);
                        if(couIn<couMax){            //课程没满 
                            fp = fopen(fileName,"a+");
                            fprintf(fp,"%-20s%-5d\n",tstuId,0);
                            fclose(fp);
                            printf("选课成功,为您跳转到首页……\n");
                        }
                        else{printf("该课程人数已满,选课失败,为您跳转到首页……\n");}
                    }
                    else{printf("档案中查无此课程,选课失败,为您跳转到首页……\n"); fclose(fp);}
                }
                else{printf("档案中查无此学生,选课失败,为您跳转到首页……\n");}
                Sleep(sleepTime);return;
            }
            case 2:{
                printf("请输入退课学生的学号:\n");
                scanf("%s",tstuId); 
                //查找该学生信息 
                fp = fopen("stuInfo.txt","r");
                int find = 0;
                while(!feof(fp)){
                    fscanf(fp,"%s%s%s\n",stuId,stuName,stuSex);
                    if(!strcmp(stuId,tstuId)){find = 1;break;}        //找到该学生信息 
                }
                fclose(fp);
                if(find){        //有该学生 
                    printf("请输入目标课程名称(大小写无关):\n");
                    scanf("%s",couName);
                    strcpy(fileName,couName);
                    strcat(fileName,".txt");
                    if((fp = fopen(fileName,"r"))!=NULL){        //找到该课程 
                        fscanf(fp,"%s%s%d%d%lf\n",couId,couName,&couMax,&couIn,&avgScore);
                        if(couIn>0){            //课程有人 
                            //获取该学生成绩 
                            int findStu = 0;
                            while(!feof(fp)){
                                fscanf(fp,"%s%d",stuId,&score);
                                if(!strcmp(stuId,tstuId)){findStu = 1;break;}    //找到该学生 
                            }
                            fclose(fp);
                            if(findStu){            //该课程存在该学生 
                                fp = fopen(fileName,"r");
                                fscanf(fp,"%s%s%d%d%lf\n",couId,couName,&couMax,&couIn,&avgScore);
                                tfp = fopen("tmp.txt","w");
                                //
                                fprintf(tfp,"%-10s%-10s%-5d%-5d%-5.2lf\n",couId,couName,couMax,couIn-1,couIn-1==0?0.0:(avgScore*couIn-score)/(couIn-1));
                                while(!feof(fp)){
                                    fscanf(fp,"%s%d\n",stuId,&score);
                                    if(!strcmp(stuId,tstuId))continue;        //如果是要退课的这位学生,就跳过 
                                    fprintf(tfp,"%-20s%-5d\n",stuId,score);
                                }
                                fclose(fp);
                                fclose(tfp);
                                remove(fileName);
                                rename("tmp.txt",fileName);        //将tmp.txt替换为fileName文件 
                                printf("退课成功,为您跳转到首页……\n");Sleep(sleepTime);return;
                            }
                            else{printf("该学生没有选该课程,退课失败,为您跳转到首页……\n");Sleep(sleepTime);return;}
                            
                        }
                        else{printf("当前没有人选该课程,退课失败,为您跳转到首页……\n");Sleep(sleepTime);return;}
                    }
                    else{printf("档案中查无此课程,选课失败,为您跳转到首页……\n"); fclose(fp);Sleep(sleepTime);return;}
                }
                else{printf("档案中查无此学生,选课失败,为您跳转到首页……\n");Sleep(sleepTime);return;}
                break;
            }
            case 3:{
                printf("请输入目标课程的名称(大小写不敏感):\n");
                scanf("%s",couName);
                strcpy(fileName,couName);
                strcat(fileName,".txt");
                if((fp = fopen(fileName,"r"))!=NULL){        //存在该课程 
                    printf("请输入目标学生的学号:\n");
                    scanf("%s",tstuId);
                    fscanf(fp,"%s%s%d%d%lf\n",couId,couName,&couMax,&couIn,&avgScore);
                    //在课程里查找该学生
                    int findStu = 0; 
                    while(!feof(fp)){
                        fscanf(fp,"%s%d\n",stuId,&score);
                        if(!strcmp(stuId,tstuId)){findStu = 1;break;}
                    }
                    fclose(fp);
                    if(findStu){        //该课程存在该学生 
                        printf("请输入该学生的%s成绩:\n",couName);
                        scanf("%d",&tscore);
                        //往tmp里录入成绩 
                        fp = fopen(fileName,"r");
                        tfp = fopen("tmp.txt","w");
                        fscanf(fp,"%s%s%d%d%lf\n",couId,couName,&couMax,&couIn,&avgScore);
                        //(总分-修改原分 +修改分数)/总人数 
                        fprintf(tfp,"%-10s%-10s%-5d%-5d%-5.2lf\n",couId,couName,couMax,couIn,(avgScore*couIn-score+tscore)/couIn);    
                        while(!feof(fp)){
                            fscanf(fp,"%s%d\n",stuId,&score);
                            if(!strcmp(stuId,tstuId)){
                                fprintf(tfp,"%-20s%-5d\n",stuId,tscore);
                            }
                            else fprintf(tfp,"%-20s%-5d\n",stuId,score);
                        }
                        fclose(fp);
                        fclose(tfp);
                        remove(fileName);
                        rename("tmp.txt",fileName);        //将tmp.txt替换为fileName文件 
                        printf("课程信息更改成功,为您跳转到首页……\n\n");Sleep(sleepTime);return;
                    }
                    else{printf("该学生没有选该课程,退课失败,为您跳转到首页……\n");Sleep(sleepTime);return;}
                }
                else{printf("档案中查无此课程,选课失败,为您跳转到首页……\n"); fclose(fp);Sleep(sleepTime);return;}
                break;
            }
            case 4:{
                printf("请输入目标课程的名称(大小写不敏感):\n");
                scanf("%s",couName);
                strcpy(fileName,couName);
                strcat(fileName,".txt");
                if((fp = fopen(fileName,"r"))!=NULL){        //存在该课程 
                    printf("该课程总体信息如下\n");
                    fscanf(fp,"%s%s%d%d%lf\n",couId,couName,&couMax,&couIn,&avgScore);
                    printf("已选这门课程的学生学号及成绩信息如下:\n%-20s%-5s\n","学号","成绩");
                    while(!feof(fp)){
                        fscanf(fp,"%s%d\n",stuId,&score);
                        printf("%-20s%-5d\n",stuId,score);
                    }
                    system("pause");fclose(fp);return;
                }
                else{printf("档案中查无此课程,选课失败,为您跳转到首页……\n"); fclose(fp);Sleep(sleepTime);return;}
                break;
                
            }
            case 5:exit = 1;break;
            case 0: ex();
        }
    }
}
//设置 
void set(){
    int choose;
    int num,tnum;
    do{
        system("cls");
        borP("设置&&1、内部边距&2、外部边距&3、边框宽度&4、指定系统&0、返回菜单");
        printf("请选择:");
        scanf("%d",&choose);
        switch(choose){
            case 1:
                padding = getnum(0,6);break;
            case 2:
                margin = getnum(0,8);break;
            case 3:
                Len = getnum(30,60);break;
            case 4:{
                printf("win10请改为1,win7请改为2\n");
                win = getnum(1,2);break;
                break;
            }
            case 0:
                return;
        }
        system("cls");borP("修改成功!");Sleep(sleepTime);system("cls"); 
    }while(1);
}
int getnum(int min,int max){
    int num;
    printf("请输入%d-%d之间的整数:\n",min,max);
    scanf("%d",&num); 
    while(num<min||num>max){
        printf("输入不合法,请重新输入:\n");
        scanf("%d",&num);
    }
    return num;
}
//退出 
void ex(){
    system("cls");
    borP("感谢您的使用&祝您生活愉快&再见!");
    exit(0);        //终止程序 
}
//输出左右外边距 
void mar(){
    int i = 0;
    for(;i < margin;i++)printf("  ");
}

//输出星线 
void pLine(char str[]){
    int i;
    int s_len = 0;
    //mar();printf(" ");
    for(i = 0;str[i];i++)s_len++;
    for(i = 0;i < (Len-s_len)/2;i++)printf("*");
    printf("%s",str);
    for(i = 0;i < (Len-s_len)/2;i++)printf("*");
    printf("\n");
}

//输出一行 
void print(char str[]){
    int i,s_len = 0;
    for(i = 0;str[i];i++)s_len++;
    mar();        //每行先输出外边距 
    printf("│");
    for(i = 0;i < (Len-s_len)/2;i++)printf(" ");
    printf("%s",str);
    s_len = s_len%2?s_len-1:s_len;
    for(i = 0;i < (Len-s_len)/2;i++)printf(" ");
    printf("│\n");
}

//按自动套边框的格式输出,如果框内要输出多行,就用&符连接 
void borP(char str[]){
    int i,s_len = 0;
    int begin = 0;        //子串从str的哪个元素下标开始复制 
    char substr[100];
    substr[0] = '\0';        //初始化
    for(i = 0;i < margin;i++)printf("\n");
    mar();printf("┌");for(i = 0;i < Len/win;i++)printf("─");printf("┐\n");
    for(i = 0;i < padding;i++)print("");
    for(i = 0;1;i++){
        if(str[i]=='&'){substr[i-begin] = '\0';begin = i+1;print(substr);substr[0] = '\0';}
        substr[i-begin] = str[i]; 
        if(str[i] == '\0'){substr[i-begin] = '\0';print(substr);break;}
    }
    for(i = 0;i < padding;i++)print("");
    mar();printf("└");for(i = 0;i < Len/win;i++)printf("─");printf("┘\n");
    for(i = 0;i < margin;i++)printf("\n");
}