简介

大一时做的大作业,用的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;
}

效果图
main.png

其它函数

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

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();
    }
}

学生操作模块

界面

学生操作界面.png

操作实现

添加学生操作的步骤是先用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文件内容存储结构如下:
stuInfo.png
而删除学生就要复杂些了,当用户输入删除学生学号并确认后,需要先创建一个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;

课程操作模块

界面

课程操作界面.png

操作实现

添加课程的步骤:先让用户输入课程信息,然后用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;

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

选课操作模块

界面

选课操作界面.png

操作实现

实现选课操作,需要先让用户输入选课学生学号,然后在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;

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

完整源码

学生管理系统.c

#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();
        }
    }
}
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 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);
}
//退出 
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");
}

最后修改:2020 年 07 月 01 日
如果觉得我的文章对你有用,请随意赞赏