文件管理系统_基于C语言的学生管理系统(含文件)(一)

       "点击上方“蓝色字”,关注我们哦(*^▽^*)!"


fcae943bee7860d92fb9b79c50f42805.gif

NO.1

篇幅较长,请空闲时观看

前言

这个项目是大一暑假完成,纯C语言编写,界面比较美观,由于当时还是一个初学者,有什么问题希望大家可以批评指正。(源码会在第二篇文章末尾给出)

这个项目有些瑕疵,但基本功能都已实现,在此分享一下我的思路。

全部内容我会分为两部分: 第一部分主要写每个功能界面以及它们之间的逻辑关系。 第二部分主要写 单链表和文件读写 的实现。 正文

先看看作品效果

流程图如下

8687ffddf79468b1e2abd0fe61266eea.png

首先是一个菜单选择界面,其中包括登录,找回密码和退出系统。

b5518a2fbbde413a93efcf529a423165.png

源码如下

//主界面
void menu(){
    printf("\t\t\t----------------------------------------\n");
    printf("\t\t\t|\t欢迎来到三千学生管理系统\t|\n");
    printf("\t\t\t----------------------------------------\n");
    printf("\t\t\t|\t1.登陆\t\t\t\t|\n");
    printf("\t\t\t|\t2.找回密码\t\t\t|\n");
    printf("\t\t\t|\t3.退出系统\t\t\t|\n");
    printf("\t\t\t----------------------------------------\n");
    printf("\t\t\t请选择功能(1-3)(按回车键确认):");

  //获取选择
  int choice = 0;
  scanf("%d",&choice);

  //清除缓冲区
 char ch;
  while((ch = getchar()) != '\n' && ch != EOF);

  switch(choice)//判断选择
 {
  case 1:
   {
    system("cls");//刷新界面
    login();//调用login()函数进行登录
    break;
   }
 case 2:
   {
    system("cls");
    rebackPassword();//调用rebackPassword()函数找回密码
    break;
   }
  case 3:
   {
    printf("\n\t\t\t");
    exit(0);//退出系统
   }
  default:
   {
    //当输入不是指定选项时
    printf("\n\t\t\t输入错误!请重新输入!\n\t\t\t");
    system("pause");//暂停程序
    system("cls");//刷新界面

    menu();//重新调用本函数
    break;
   }
  }
}

选择其中一项都会跳转到其他界面。本文只写登录和登录成功后。登录失败以及找回密码都有对应措施,在文中不再介绍。

进入登录界面后,输入密码:123,即可登录成功。

96d597ff20c3d03d961975436d98510d.png

源码如下

//登录界面
void login(){
    int i = 0;
    char Password[]="123";//登录密码
    char tempPass[10]="0";//从输入端获取的密码

    printf("\t\t\t---------------登陆系统---------------\n\n");
    printf("\t\t\t\t管理员账号:三千\n");
    for(i=1;i<=3;i++)
    {
       printf("\t\t\t\t管理员密码:");
       //获取你所输入的密码
       scanf("%s",tempPass);

       //清除缓冲区
       char ch;
       while((ch = getchar()) != '\n' && ch != EOF);

        //判断登录密码和获取的密码是否相同
        //strcmp()用于字符串比较,两字符串相同时返回0
       if(!strcmp(Password,tempPass))
       {
          printf("\n\t\t\t\t登陆成功!");
          printf("\n\t\t\t\t");
          system("pause");//程序暂停
          system("cls");//刷新界面
          function();//调用fuction()函数进入功能界面
       }else
        {
          //密码错误达到三次
          if(3 == i)
          {
              printf("\n\t\t\t\t密码输入错误3次!请重新选择!\n\n");
             printf("\t\t\t\t");
             system("pause");
          }else
          {
             printf("\n\t\t\t\t密码输入错误%d次!请重新输入!\n",i);
          }
       }
    }
    if(4 == i)
    {
       system("cls");
       //登录密码失败后进入登录分界面
       login_Second();/
    }
}

//登录分界面,解决密码输入错误超过三次后
void login_Second(){
    printf("\t\t\t-------------------------------------\n");
    printf("\t\t\t|\t    1.找回密码\t\t    |\n");
    printf("\t\t\t|\t    2.重新登录\t\t    |\n");
    printf("\t\t\t|\t    3.退出系统\t\t    |\n");
    printf("\t\t\t-------------------------------------\n");
    printf("\t\t\t\t   请选择(1-3):");

    //获取选择
    int choice = 0;
    scanf("%d",&choice);

    //清除缓冲区
    char ch;
    while((ch = getchar()) != '\n' && ch != EOF);
    switch(choice)
    {
    case 1:
       {
          system("cls");//刷新界面
          rebackPassword();//调用rebackPassword()函数找回密码
          break;
       }
    case 2:
       {
          system("cls");
          login();//调用login()函数进行登录
          break;
       }
    case 3:
       {
          printf("\n\t\t\t\t");
          exit(0);//退出系统
       }
    default:
       {
          printf("\n\t\t\t\t输入错误!请重新输入!\n\t\t\t\t");
          system("pause");//暂停程序
          system("cls");//刷新界面

          login_Second();//重新调用本函数
          break;
       }
    }
}

53488f0b1d0323d18db2857be19ea8af.gif

登录成功后进入功能选择界面。

其中包括八个功能:增,删,改,查,统计,排序,返回,退出。

842de34e326b8da4bc3f7a564872989d.png

源码如下

//功能界面
void function(){
    printf("\t\t\t-----------------------------------------\n");
    printf("\t\t\t|\t欢迎使用三千学生管理系统\t|\n");
    printf("\t\t\t-----------------------------------------\n");
    printf("\t\t\t|\t1.添加学生信息\t\t\t|\n");
    printf("\t\t\t|\t2.统计学生信息\t\t\t|\n");
    printf("\t\t\t|\t3.查找学生信息\t\t\t|\n");
    printf("\t\t\t|\t4.修改学生信息\t\t\t|\n");
    printf("\t\t\t|\t5.删除学生信息\t\t\t|\n");
    printf("\t\t\t|\t6.排序学生信息\t\t\t|\n");
    printf("\t\t\t|\t7.返回上一级\t\t\t|\n");
    printf("\t\t\t|\t8.退出程序\t\t\t|\n");
    printf("\t\t\t-----------------------------------------\n");
    printf("\t\t\t请选择功能(1-8):");
 
    //存储临时数据
    struct student tempData={"0","0","0",0,0.0,0.0,0.0};

    //获取选择
    int choice = 0;
    scanf("%d",&choice);
    //清除缓冲区
    char ch;
    while((ch = getchar()) != '\n' && ch != EOF);

    switch(choice)
    {
    case 1:
        {
            //调用addStudent()函数添加学生信息
            addStudent(tempData);
            printf("\n\t\t\t\t");
            system("pause");//暂停程序
            system("cls");//刷新界面
            break;
        }
    case 2:
        {
            printf("\n\t\t\t--------------统计学生信息--------------\n");
            //调用printList()函数打印所有学生信息
            printList(List);
            printf("\n\t\t\t\t");
            system("pause");
            system("cls");
            break;
        }
    case 3:
        {
            //调用searchStudent()函数查找学生信息
            searchStudent(tempData);
            printf("\n\t\t\t\t");
            system("pause");
            system("cls");
            break;
        }
    case 4:
        {
            //调用modifyStudent()函数修改学生信息
            modifyStudent(tempData);
            printf("\n\t\t\t\t");
            system("pause");
            system("cls");
            break;
        }
    case 5:
        {
            //调用deleteStudent()函数删除学生信息
            deleteStudent(tempData);
            printf("\n\t\t\t\t");
            system("pause");
            system("cls");
            break;
        }
    case 6:
        {
            //调用sortStudent()函数排序学生信息
            sortStudent();
            printf("\n\t\t\t\t");
            system("pause");
            system("cls");
            break;
        }
    case 7:
        {
            system("cls");
            menu();//返回主界面
            break;
        }
    case 8:
        {
            printf("\n\t\t\t\t");
            exit(0);//退出系统
        }
    default:
        {
            printf("\n\t\t\t\t输入错误!请重新输入!\n");
            printf("\n\t\t\t\t");
            system("pause");//暂停程序
            system("cls");//刷新界面
            break;
        }
    }
    function();//重新调用本函数
}

每一个功能的实现背后都有链表和文件在运行工作。(我将链表和文件读写的实现专门写在另一个.h文件中,在第二篇文章中将会写到。)

接下来开始一一讲解程序的功能(功能效果图不再展示)

功能一:添加学生信息

调用addStudent()函数将学生信息添加到链表中,并最终存储在文件中。

//添加学生信息
void addStudent(struct student tempData){
    printf("\n\t\t\t--------------添加学生信息--------------\n");
    printf("\t\t\t\t学号:");
    scanf("%s",tempData.id);//获取学生学号
    char ch;
    while((ch = getchar()) != '\n' && ch != EOF);//清除缓冲区

    printf("\t\t\t\t姓名:");
    scanf("%s",tempData.name);//获取学生姓名
    while((ch = getchar()) != '\n' && ch != EOF);
    
    printf("\t\t\t\t性别:");
    scanf("%s",tempData.gender);//获取学生性别
    while((ch = getchar()) != '\n' && ch != EOF);

    printf("\t\t\t\t年龄:");
    scanf("%d",&tempData.age);//获取学生年龄
    while((ch = getchar()) != '\n' && ch != EOF);

    printf("\t\t\t\t数学:");
    scanf("%f",&tempData.math);//获取学生数学成绩
    while((ch = getchar()) != '\n' && ch != EOF);

    printf("\t\t\t\t英语成绩:");
    scanf("%f",&tempData.english);//获取学生英语成绩
    while((ch = getchar()) != '\n' && ch != EOF);

    tempData.sumscore=tempData.math+tempData.english;//计算学生总成绩
    printf("\t\t\t\t总成绩为:%.1f\n",tempData.sumscore);//打印学生总成绩

    insertnode(List,tempData);//向链表中插入学生信息
    saveToFile("student.txt",List);//将链表中的学生信息保存到文件student.txt
    printf("\n\t\t\t\t添加成功!\n");
}

功能二:统计学生信息

调用printList()函数将链表中的全部学生信息打印到界面上。

...
case 2:
{
    printf("\n\t\t\t--------------统计学生信息--------------\n");
    //调用printList()函数打印所有学生信息
    printList(List);
    printf("\n\t\t\t\t");
    system("pause");
    system("cls");
    break;
}
...
//打印学生信息,打印函数,位于另一个.h文件中
void printList(struct Node *StudentListhead){
    struct Node *pmove=StudentListhead->next;

    //按格式打印
    printf("\t学号\t\t姓名\t性别\t年龄\t高数成绩\t英语成绩\t成绩总和\n");

    while(pmove)//pmove为NULL时,退出循环
    {
        //格式化输出打印
        printf("\t%-10s\t%-4s\t%-6s\t%-3d\t%.1f\t\t%.1f\t\t%.1f\n",pmove->data.id,pmove->data.name,pmove->data.gender,pmove->data.age,pmove->data.math,pmove->data.english,pmove->data.sumscore);
        
        //pmove指向下一个结点,以此遍历链表
        pmove=pmove->next;
    }
    printf("\n");
}

功能三:查找学生信息

方式:1.按学号查找

          2.按姓名查找(缺陷:若有重名者,只能查找其中一个)

输入要查找学生的学号或姓名,与链表中的学生信息进行对比。若存在,则打印该学生信息;反之则打印“查无此人!”

//查找学生信息
void searchStudent(struct student tempData){
    printf("\n\t\t\t---------------查找学生信息--------------\n\n");
    printf("\t\t\t\t1.按学号查找\t\t\t\t\n");
    printf("\t\t\t\t2.按姓名查找\t\t\t\t\n");
    printf("\t\t\t\t请选择功能:");

    //获取选择
    int choice = 0;
    scanf("%d",&choice);
    //清除缓冲区
    char ch;
    while((ch = getchar()) != '\n' && ch != EOF);

    switch(choice)
    {
    case 1:
        {
            printf("\n\t\t\t请输入要查找的学生的学号:");
            scanf("%s",tempData.id);//获取学生学号
            while((ch= getchar()) != '\n' && ch != EOF);//清除缓冲区

            //searchnode_byid()返回值为结点指针或NULL
            //返回NULL,说明未查到
            if(searchnode_byid(List,tempData.id) == NULL)
            {
                //若链表中不存在该学号
                printf("\n\t\t\t\t查无此人!\n"); 
            } else
            {
                //打印查找的学生信息
                printsearch(searchnode_byid(List,tempData.id));
            }
            break;
        }
    case 2:
        {
            printf("\n\t\t\t请输入要查找的学生的姓名:");
            scanf("%s",tempData.name);//获取学生姓名
            while((ch = getchar()) != '\n' && ch != EOF);//清除缓冲区

            //searchnode_byname()返回值为结点指针或NULL
            //返回NULL,说明未查到
            if(searchnode_byname(List,tempData.name) == NULL)
            {
                //若链表中不存在该姓名
                printf("\n\t\t\t\t查无此人!\n");
            }else
            {
                //打印查找的学生信息
                printsearch(searchnode_byname(List,tempData.name));
            }
            break;
        }
    default:
        {
            printf("\n\t\t\t\t输入错误!请重新输入!\n");
            break;
        }
    }
}

功能四:修改学生信息

方式:1.按学号查找修改

          2.按姓名查找修改(缺陷:若有重名者,只能查找其中一个)

调用modifyStudent()函数将在链表中查找到学生信息进行修改,再重新保存到文件中。

//修改学生信息
void modifyStudent(struct student tempData){
    printf("\n\t\t\t--------修改学生信息--------\t\t\t\t\n");
    //先调用printList()函数打印全部学生信息
    printList(List);
    printf("\t\t\t\t1.按学号修改\t\t\t\t\n");
    printf("\t\t\t\t2.按姓名修改\t\t\t\t\n");
    printf("\t\t\t\t请选择功能:");

    //获取选择
    int choice = 0;
    scanf("%d",&choice);
    //清除缓冲区
    char ch;
    while((ch = getchar()) != '\n' && ch != EOF);

    switch(choice)
    {
    case 1:
        {
            printf("\n\t\t\t请输入要修改的学生的学号:");

            scanf("%s",tempData.id);//获取学生的学号
            while((ch = getchar()) != '\n' && ch != EOF);

            if(searchnode_byid(List,tempData.id) == NULL)
            {
                //若链表中不存在该学号
                printf("\n\t\t\t\t查无此人!\n");
            }else
            {
                //修改学生信息的分函数
                modifyStudent_Second(tempData);
            }
            break;
        }
    case 2:
        {
            printf("\n\t\t\t\t请输入要修改的学生的姓名:");
            scanf("%s",tempData.name);//获取学生姓名
            while((ch = getchar()) != '\n' && ch != EOF);

            if(searchnode_byname(List,tempData.name)==NULL)
            {
                //若链表中不存在该姓名
                printf("\n\t\t\t\t查无此人!\n");
           }else
            {
                modifyStudent_Second(tempData);
            }
            break;
        }
    default:
        {
            printf("\t\t\t\t输入错误!请重新输入!\n");
            function();//进入功能界面
            break;
        }
    }
}
void modifyStudent_Second(struct student tempData){
    //重新定义一个指针并指向要修改的学生的信息的结点
    struct Node *curnode=searchnode_byid(List,tempData.id);
    //调用printsearch()函数打印要修改学生的信息
    printsearch(searchnode_byid(List,tempData.id));

    printf("\n");
    printf("\t\t\t\t1.学号\t\t\t\t\n");
    printf("\t\t\t\t2.姓名\t\t\t\t\n");
    printf("\t\t\t\t3.性别\t\t\t\t\n");
    printf("\t\t\t\t4.年龄\t\t\t\t\n");
    printf("\t\t\t\t5.高数成绩\t\t\t\t\n");
    printf("\t\t\t\t6.英语成绩\t\t\t\t\n");
    printf("\t\t\t\t请选择要修改的内容:");

    //获取选择
    int choice = 0;
    scanf("%d",&choice);
    //清除缓冲区
    char ch;
    while((ch = getchar()) != '\n' && ch != EOF);

    switch(choice)
    {
    case 1:
        {
            printf("\n\t\t\t\t修改前的学号:%s\n",curnode->data.id);
            printf("\t\t\t\t请输入修改后的学号:");

            scanf("%s",curnode->data.id);
            while((ch = getchar()) != '\n' && ch != EOF);

            //将修改后的信息保存到文件
            saveToFile("student.txt",List);
            printf("\n\t\t\t\t修改成功!\n");
            break;
        }
    case 2:
        {
            printf("\n\t\t\t\t修改前的姓名:%s\n",curnode->data.name);
            printf("\t\t\t\t请输入修改后的姓名:");

            scanf("%s",curnode->data.name);
            while((ch = getchar()) != '\n' && ch != EOF);

            saveToFile("student.txt",List);
            printf("\n\t\t\t\t修改成功!\n");
            break;
        }
    case 3:
        {
            printf("\n\t\t\t\t修改前的性别:%s\n",curnode->data.gender);
            printf("\t\t\t\t请输入修改后的性别:");

            scanf("%s",curnode->data.gender);
            while((ch= getchar()) != '\n' && ch != EOF);

            saveToFile("student.txt",List);
            printf("\n\t\t\t\t修改成功!\n");
            break;
        }
    case 4:
        {
            printf("\n\t\t\t\t修改前的年龄:%d\n",curnode->data.age);
            printf("\t\t\t\t请输入修改后的年龄:");

            scanf("%d",&curnode->data.age);
            while((ch = getchar()) != '\n' && ch != EOF);

            saveToFile("student.txt",List);
            printf("\n\t\t\t\t修改成功!\n");
            break;
        }
    case 5:
        {
            printf("\n\t\t\t\t修改前的高数成绩:%.1f\n",curnode->data.math);
            printf("\t\t\t\t请输入修改后的高数成绩:");

            scanf("%f",&curnode->data.math);
            while((ch = getchar()) != '\n' && ch != EOF);
            //计算总成绩
            curnode->data.sumscore=curnode->data.math+curnode->data.english;

            saveToFile("student.txt",List);
            printf("\n\t\t\t\t修改成功!\n");
            break;
        }
    case 6:
        {
            printf("\n\t\t\t\t修改前的英语成绩:%.1f\n",curnode->data.english);
            printf("\t\t\t\t请输入修改后的英语成绩:");

            scanf("%f",&curnode->data.english);
            while((ch = getchar()) != '\n' && ch != EOF);

            curnode->data.sumscore=curnode->data.math+curnode->data.english;

            saveToFile("student.txt",List);
            printf("\n\t\t\t\t修改成功!\n");
            break;
        }
    default:
        {
            printf("\n\t\t\t\t输入错误!请重新输入!\n");
            break;
        }
    }
}

功能五:删除学生信息

方式:1.按学号查找删除

   2.按姓名查找删除(缺陷:若有重名者,只能查找其中一个)

调用deleteStudent()函数将在链表中查找到的学生信息进行删除,再重新保存到文件。

//删除学生信息
void deleteStudent(struct student tempData){
    printf("\n\t\t\t--------------删除学生信息---------------\n");
    //调用printList()函数打印全部学生信息
    printList(List);
    printf("\t\t\t\t1.按学号删除\t\t\t\t\n");
    printf("\t\t\t\t2.按姓名删除\t\t\t\t\n");
    printf("\t\t\t\t请选择功能:");

    //获取选择
    int choice = 0;
    scanf("%d",&choice);
    //清除缓冲区
    char ch;
    while((ch = getchar()) != '\n' && ch != EOF);

    switch(choice)
    {
    case 1:
        {
            printf("\n\t\t\t请输入要删除的学生的学号:");

            scanf("%s",tempData.id);
            while((ch = getchar()) != '\n' && ch != EOF);

            //从链表中删除学生信息
            Deletenode_byid(List,tempData.id);
            //将剩余信息保存到文件
            saveToFile("student.txt",List);
            break;
        }
    case 2:
        {
            printf("\n\t\t\t请输入要删除的学生的姓名:");

            scanf("%s",tempData.name);
            while((ch = getchar()) != '\n' && ch != EOF);

            Deletenode_byname(List,tempData.name);
            saveToFile("student.txt",List);
            break;
        }
    default:
        {
            printf("\n\t\t\t\t输入错误!请重新输入!\n");
            break;
        }
    }
}

功能六:排序学生信息

方式:1.根据学号排序(从低到高)

          2.根据数学成绩排序(从高到低)

          3.根据英语成绩排序(从高到低)

          4.根据总成绩排序(从高到低)

调用sortStudent()函数按照所选项将链表中的学生信息排序,并打印到界面上。

//排序
void sortStudent(){
    printf("\n\t\t\t---------------排序学生信息--------------\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\t请选择功能(1-4):");

    //获取选择
    int choice = 0;
    scanf("%d",&choice);
    //清除缓冲区
    char ch;
    while((ch = getchar()) != '\n' && ch != EOF);

    switch(choice)
    {
    case 1:
        {
            //按学号从低到高排序链表
            sortList_byid(List);
            //将排序后的信息保存到文件
            saveToFile("student.txt",List);
            //打印链表中的信息
            printList(List);
            break;
        }
    case 2:
        {
            //按数学成绩从高到低排序链表
            sortList_bymath(List);
            printList(List);
            break;
        }
    case 3:
        {
            //按英语成绩从高到低排序链表
            sortList_byenglish(List);
            printList(List);
            break;
        }
    case 4:
        {
            //按总成绩从高到低排序链表
            sortList_bysumscore(List);
            printList(List);
            break;
        }
    default:
        {
            printf("\n\t\t\t\t输入错误!请重新输入!\n");
            break;
        }
    }
}

功能七:返回上一级

调用menu()函数返回主界面

void function(){
    ...
    case 7:
        {
            system("cls");
            menu();//返回主界面
            break;
        }
    ...
}

功能八:退出程序

void function(){
    ...
    case 8:
        {
            printf("\n\t\t\t\t");
            exit(0);//退出系统
        }
    ...
}

最后main()函数

//主函数
int main(){
    //设置控制台标题,颜色,尺寸
    system("title 学生信息管理系统");
    system("color F0");
    system("mode con cols=90 lines=30");

    //创造一个链表,存储学生信息
    List=creatList();

    //读取student.txt文件信息到链表中
    //student.txt用于存放链表中的学生信息
    readFromFile("student.txt",List);
    //进入主界面
    menu();

    return 0;
}

以上便是程序的界面部分,相对不难,但仍有些不足,希望对你有所帮助。

1198312ab95f02e4f7ad0fa9c5526069.png 

作者:瑾年辰良一位热爱生活的快乐青年 5a64dabbf7b62b74f3a39640961e106d.png 70acb541c03a37de0028daebfeea1c99.png

"即见君子,云胡不喜?"

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基于文件保存的学生管理系统的示例代码,它可以在命令行界面下运行,并支持添加、查询、修改和删除学生信息。 ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_NAME_LEN 20 #define FILE_NAME "students.txt" struct student { char name[MAX_NAME_LEN]; int id; float score; }; void print_menu() { printf("\n学生管理系统\n"); printf("1. 添加学生\n"); printf("2. 查询学生\n"); printf("3. 修改学生\n"); printf("4. 删除学生\n"); printf("5. 退出\n"); printf("请输入您的选择:"); } void add_student() { FILE *fp; struct student s; printf("请输入学生姓名:"); scanf("%s", s.name); printf("请输入学生学号:"); scanf("%d", &s.id); printf("请输入学生成绩:"); scanf("%f", &s.score); fp = fopen(FILE_NAME, "a"); if (fp == NULL) { printf("无法打开文件!\n"); return; } fprintf(fp, "%s %d %g\n", s.name, s.id, s.score); fclose(fp); printf("添加学生成功!\n"); } void query_student() { FILE *fp; struct student s; char name[MAX_NAME_LEN]; int id, found = 0; printf("请选择查询方式:\n"); printf("1. 按姓名查询\n"); printf("2. 按学号查询\n"); printf("请输入您的选择:"); scanf("%d", &id); fp = fopen(FILE_NAME, "r"); if (fp == NULL) { printf("无法打开文件!\n"); return; } if (id == 1) { printf("请输入要查询的学生姓名:"); scanf("%s", name); while (fscanf(fp, "%s %d %f", s.name, &s.id, &s.score) != EOF) { if (strcmp(s.name, name) == 0) { printf("姓名:%s\t学号:%d\t成绩:%g\n", s.name, s.id, s.score); found = 1; } } } else if (id == 2) { printf("请输入要查询的学生学号:"); scanf("%d", &id); while (fscanf(fp, "%s %d %f", s.name, &s.id, &s.score) != EOF) { if (s.id == id) { printf("姓名:%s\t学号:%d\t成绩:%g\n", s.name, s.id, s.score); found = 1; } } } else { printf("输入有误,请重新输入!\n"); } if (!found) { printf("没有找到该学生!\n"); } fclose(fp); } void modify_student() { FILE *fp, *fp_tmp; struct student s; char name[MAX_NAME_LEN]; int id, found = 0; printf("请输入要修改的学生学号:"); scanf("%d", &id); fp = fopen(FILE_NAME, "r"); if (fp == NULL) { printf("无法打开文件!\n"); return; } fp_tmp = fopen("tmp.txt", "w"); if (fp_tmp == NULL) { printf("无法打开文件!\n"); fclose(fp); return; } while (fscanf(fp, "%s %d %f", s.name, &s.id, &s.score) != EOF) { if (s.id == id) { printf("请输入该学生的新姓名:"); scanf("%s", s.name); printf("请输入该学生的新成绩:"); scanf("%f", &s.score); found = 1; } fprintf(fp_tmp, "%s %d %g\n", s.name, s.id, s.score); } fclose(fp); fclose(fp_tmp); if (!found) { printf("没有找到该学生!\n"); } else { remove(FILE_NAME); rename("tmp.txt", FILE_NAME); printf("修改学生信息成功!\n"); } } void delete_student() { FILE *fp, *fp_tmp; struct student s; int id, found = 0; printf("请输入要删除的学生学号:"); scanf("%d", &id); fp = fopen(FILE_NAME, "r"); if (fp == NULL) { printf("无法打开文件!\n"); return; } fp_tmp = fopen("tmp.txt", "w"); if (fp_tmp == NULL) { printf("无法打开文件!\n"); fclose(fp); return; } while (fscanf(fp, "%s %d %f", s.name, &s.id, &s.score) != EOF) { if (s.id == id) { found = 1; } else { fprintf(fp_tmp, "%s %d %g\n", s.name, s.id, s.score); } } fclose(fp); fclose(fp_tmp); if (!found) { printf("没有找到该学生!\n"); } else { remove(FILE_NAME); rename("tmp.txt", FILE_NAME); printf("删除学生信息成功!\n"); } } int main() { int choice; while (1) { print_menu(); scanf("%d", &choice); switch (choice) { case 1: add_student(); break; case 2: query_student(); break; case 3: modify_student(); break; case 4: delete_student(); break; case 5: printf("谢谢使用!\n"); return 0; default: printf("输入有误,请重新输入!\n"); } } } ``` 在该程序中,学生信息被保存在一个文本文件中,每行表示一个学生,包括姓名、学号和成绩。添加、查询、修改和删除学生信息时,程序都会读取该文件并进行相应的操作。在修改和删除学生信息时,程序需要使用一个临时文件来存储修改后的信息,然后再将其覆盖原文件

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值