文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

C语言如何实现学生信息管理系统的文件操作

2023-07-02 10:42

关注

本文小编为大家详细介绍“C语言如何实现学生信息管理系统的文件操作”,内容详细,步骤清晰,细节处理妥当,希望这篇“C语言如何实现学生信息管理系统的文件操作”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

新增函数——文件操作;

//学生数据文件储存 //储存任意时期的学生数据 void Store_List(Link head){    //文件操作     ofstream ofs;    ofs.open("Std_Information.txt",ios::out);        if(head==NULL)    {        printf("学生为空\n");        return;     }    else    {        Link p=head->next;        while(p)        {            ofs<< "姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl;             p=p->next;        }            }}

1.头文件和预处理

#include <stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#include<stdbool.h>#include<iostream>#include<fstream>//文件操作所需头文件 using namespace std;#define NO_LENGTH  20#define NAME_LENGTH 11typedef struct Student{    char studentNo[NO_LENGTH];    char studentName[NAME_LENGTH];    int score;}st;typedef struct node{    struct Student data; //数据域    struct node *next; //指针域}Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名

2.定义学生结构体的数据结构

typedef struct Student{    char studentNo[NO_LENGTH];    char studentName[NAME_LENGTH];    int score;}st;

3.定义每条记录或节点的数据结构

typedef struct node{    struct Student data; //数据域    struct node *next; //指针域}Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名

4.函数接口代码.

1.定义提示菜单

//定义提示菜单void myMenu(){    printf("*****************************菜单*****************************\n");     printf("***********************1 增加学生记录*************************\n");     printf("***********************2 删除学生记录*************************\n");     printf("***********************3 查找学生记录*************************\n");     printf("***********************4 修改学生记录*************************\n");     printf("***********************5 统计学生人数 ************************\n");     printf("***********************6 显示学生记录*************************\n");     printf("***********************7 信息文件打印*************************\n");    printf("***********************8 退出系统 ****************************\n");     }

2.增加学生记录

void inputStudent(Link l){     printf("请输入学生学号:");     scanf("%s",l->data.studentNo);     printf("请输入学生的姓名:");     scanf("%s",l->data.studentName);    printf("请输入学生的成绩:");     scanf("%s",&(l->data.score));     //每个新创建的节点的next域都初始化为NULL     l->next = NULL;     system("cls");}

3.输入学号接口&middot;

void inputStudentNo(char s[],char no[]){    printf("请输入要%s的学生学号:",s);    scanf("%s",no);}

4.遍历表中学生

//遍历表中学生 void displayNode(Link head){    if(head==NULL)    {        printf("学生为空\n");        return;     }    else    {        Link p=head->next;        while(p)        {            cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl;             p=p->next;        }            }   // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息   system("pause");   system("cls");}

5.增加学生记录

bool addNode(Link head){     Link p,q;   //p,q两个节点一前一后     Link node;  //node指针指向新创建的节点     node=(Link)malloc(sizeof(Node));     inputStudent(node);     q = head;     p = head->next;  //q指向head后面的第一个有效节点     if(head->next==NULL)         //链表为空时        head->next = node;     else {         //循环访问链表中的所有节点        while(p != NULL){            if (node->data.studentNo < p->data.studentNo){                //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序                q->next = node;                node->next = p;                return true;            }            else{                //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)                q = p;                p = p->next;            }        }        //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面        q->next = node;    }     return true;     system("pause");   system("cls");}

6.删除学生信息

//删除学生信息bool deleteNode(Link head){    // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false    //输入要处理的学号        char no[NO_LENGTH];    inputStudentNo("删除",no);        Link p=head->next;    Link q=head;    while(p)    {        if(strcmp(p->data.studentNo,no)==0)        {            cout<<"成功删除该学生"<<endl;             q->next=p->next;            free(p);            system("pause");               system("cls");            return true;        }        else        {            q=p;            p=p->next;        }    }    cout<<"未找到该学生"<<endl;         system("pause");           system("cls");    return false;}

7.查找学生信息

//查找学生信息 bool queryNode(Link head){    // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false    //输入要处理的学号    char no[NO_LENGTH];    inputStudentNo("查找",no);        Link p=head->next;    while(p)    {        if(strcmp(p->data.studentNo,no)==0)        {                           system("cls");               cout<<"姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl;             return true;        }        else        {            p=p->next;        }    }    cout<<"未找到该学生"<<endl;    system("cls");    return false;}

8.修改学生信息

//修改学生信息 bool modifyNode(Link head){    // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false        //输入要处理的学号    char no[NO_LENGTH];    inputStudentNo("修改",no);    Link p=head->next;    while(p)    {        if(strcmp(p->data.studentNo,no)==0)        {            cout<<"请输入修改后的姓名"<<endl;             cin>>p->data.studentName;            cout<<"请输入修改后的学号"<<endl;             cin>>p->data.studentNo;            cout<<"请输入修改后的成绩"<<endl;             cin>>p->data.score;            system("cls");            return true;        }        else        {            p=p->next;        }    }    cout<<"未找到该学生,请重新输入学号"<<endl;     system("cls");    return false;}

9.统计学生人数

//统计学生人数int countNode(Link head){    //统计学生人数,扫描链表统计节点个数,返回节点数    Link p;    int count = 0;    p = head->next;    while(p)    {        p=p->next;        count++;    }    //填充代码    system("cls");    return count;}

10.清空链表

//清空链表 void clearLink(Link head){    Link q,p;    p=head->next;    q=head;    while(p)    {        q->next=p->next;        free(p);        p=q->next;    }        //遍历链表,用free语句删除链表中用malloc建立起的所有的节点}

11.文件操作

//学生数据文件储存 //储存任意时期的学生数据 void Store_List(Link head){    //文件操作     ofstream ofs;    ofs.open("Std_Information.txt",ios::out);        if(head==NULL)    {        printf("学生为空\n");        return;     }    else    {        Link p=head->next;        while(p)        {            ofs<< "姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl;             p=p->next;        }            }}

5.main函数

int main() {    int select;        int count;    Link head;  // 定义链表    //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据    head = (Link)malloc(sizeof(Node));    head->next = NULL;    while(1)    {        myMenu();        printf("\n请输入你的选择(0-7):");  //显示提示信息        scanf("%d",&select);        switch(select)        {        case 1:            //增加学生记录            if(addNode(head))                printf("成功插入一个学生记录。\n\n");            break;        case 2:            //删除学生记录            if(deleteNode(head))                printf("成功删除一个学生记录。\n\n");            else                printf("没有找到要删除的学生节点。\n\n");            break;        case 3:            //查询学生记录            if(queryNode(head))                printf("成功找到学生记录。\n\n");            else                printf("没有找到要查询的学生节点。\n\n");            break;        case 4:            //修改学生记录            if(modifyNode(head))                printf("成功修改一个学生记录。\n\n");            else                printf("没有找到要修改的学生节点。\n\n");            break;        case 5:            //统计学生人数            count = countNode(head);            printf("学生人数为:%d\n\n",count);            break;        case 6:            //显示学生记录            displayNode(head);            break;        case 7:            //退出前清除链表中的所有结点            clearLink(head);            return 0;        default:            printf("输入不正确,应该输入0-7之间的数。\n\n");            system("cls");             break;        }    }    return 0;}

6.学生信息管理系统总源码(可直接复制运行)

#include <stdio.h>#include<string.h>#include<malloc.h>#include<stdlib.h>#include<stdbool.h>#include<iostream>#include<fstream>//文件操作所需头文件 using namespace std;#define NO_LENGTH  20#define NAME_LENGTH 11typedef struct Student{    char studentNo[NO_LENGTH];    char studentName[NAME_LENGTH];    int score;}st;typedef struct node{    struct Student data; //数据域    struct node *next; //指针域}Node,*Link;  //Node为node类型的别名,Link为node类型的指针别名//定义提示菜单void myMenu(){    printf("*****************************菜单*****************************\n");     printf("***********************1 增加学生记录*************************\n");     printf("***********************2 删除学生记录*************************\n");     printf("***********************3 查找学生记录*************************\n");     printf("***********************4 修改学生记录*************************\n");     printf("***********************5 统计学生人数 ************************\n");     printf("***********************6 显示学生记录*************************\n");     printf("***********************7 信息文件打印*************************\n");    printf("***********************8 退出系统 ****************************\n");     }void inputStudent(Link l){     printf("请输入学生学号:");     scanf("%s",l->data.studentNo);     printf("请输入学生的姓名:");     scanf("%s",l->data.studentName);    printf("请输入学生的成绩:");     scanf("%d",&(l->data.score));     //每个新创建的节点的next域都初始化为NULL     l->next = NULL;     system("cls");}void inputStudentNo(char s[],char no[]){    printf("请输入要%s的学生学号:",s);    scanf("%s",no);}//遍历表中学生 void displayNode(Link head){    if(head==NULL)    {        printf("学生为空\n");        return;     }    else    {        Link p=head->next;        while(p)        {            cout<<"姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl;             //ofs<< "姓名:"<<p->data.studentName<<"    学号"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl;             p=p->next;        }            }   // 填写代码,根据传入的链表head头指针,扫描链表显示所有节点的信息   system("pause");   system("cls");}bool addNode(Link head){     Link p,q;   //p,q两个节点一前一后     Link node;  //node指针指向新创建的节点     node=(Link)malloc(sizeof(Node));     inputStudent(node);     q = head;     p = head->next;  //q指向head后面的第一个有效节点     if(head->next==NULL)         //链表为空时        head->next = node;     else {         //循环访问链表中的所有节点        while(p != NULL){            if (node->data.studentNo < p->data.studentNo){                //如果node节点的学号比p节点的学号小,则插在p的前面,完成插入后,提前退出子程序                q->next = node;                node->next = p;                return true;            }            else{                //如果node节点的学号比p节点的学号大,继续向后移动指针(依然保持pq一前一后)                q = p;                p = p->next;            }        }        //如果没能提前退出循环,则说明之前没有插入,那么当前node节点的学号是最大值,此时插在链表的最后面        q->next = node;    }     return true;     system("pause");   system("cls");}bool deleteNode(Link head){    // 按照给定的学号删除学生记录,如果删除成功返回true,如果没找到学号返回false    //输入要处理的学号        char no[NO_LENGTH];    inputStudentNo("删除",no);        Link p=head->next;    Link q=head;    while(p)    {        if(strcmp(p->data.studentNo,no)==0)        {            cout<<"成功删除该学生"<<endl;             q->next=p->next;            free(p);            system("pause");               system("cls");            return true;        }        else        {            q=p;            p=p->next;        }    }    cout<<"未找到该学生"<<endl; system("pause");   system("cls");    return false;}//查找学生信息 bool queryNode(Link head){    // 按照给定的学号查询学生记录,如果查找成功返回true,如果没找到学号返回false    //输入要处理的学号    char no[NO_LENGTH];    inputStudentNo("查找",no);        Link p=head->next;    while(p)    {        if(strcmp(p->data.studentNo,no)==0)        {                           system("cls");               cout<<"姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl;             return true;        }        else        {            p=p->next;        }    }    cout<<"未找到该学生"<<endl;    system("cls");    return false;}//修改学生信息 bool modifyNode(Link head){    // 按照给定的学号找到学生记录节点,如果修改成功返回true,如果没找到学号返回false        //输入要处理的学号    char no[NO_LENGTH];    inputStudentNo("修改",no);    Link p=head->next;    while(p)    {        if(strcmp(p->data.studentNo,no)==0)        {            cout<<"请输入修改后的姓名"<<endl;             cin>>p->data.studentName;            cout<<"请输入修改后的学号"<<endl;             cin>>p->data.studentNo;            cout<<"请输入修改后的成绩"<<endl;             cin>>p->data.score;            system("cls");            return true;        }        else        {            p=p->next;        }    }    cout<<"未找到该学生,请重新输入学号"<<endl;     system("cls");    return false;}//统计学生人数int countNode(Link head){    //统计学生人数,扫描链表统计节点个数,返回节点数    Link p;    int count = 0;    p = head->next;    while(p)    {        p=p->next;        count++;    }    //填充代码    system("cls");    return count;}//清空链表 void clearLink(Link head){    Link q,p;    p=head->next;    q=head;    while(p)    {        q->next=p->next;        free(p);        p=q->next;    }        //遍历链表,用free语句删除链表中用malloc建立起的所有的节点}//学生数据文件储存 //储存任意时期的学生数据 void Store_List(Link head){    //文件操作     ofstream ofs;    ofs.open("Std_Information.txt",ios::out);        if(head==NULL)    {        printf("学生为空\n");        return;     }    else    {        Link p=head->next;        while(p)        {            ofs<< "姓名:"<<p->data.studentName<<"    学号:"<<p->data.studentNo<<"  成绩:"<<p->data.score<<endl;             p=p->next;        }            }}int main() {    int select;        int count;    Link head;  // 定义链表            //建立head头结点,在这个程序中head指向头结点,头结点data部分没有内容,其后续节点才有真正的数据    head = (Link)malloc(sizeof(Node));    head->next = NULL;    while(1)    {        myMenu();        printf("\n请输入你的选择(0-8):");  //显示提示信息        scanf("%d",&select);        switch(select)        {        case 1:            //增加学生记录            if(addNode(head))                printf("成功插入一个学生记录。\n\n");            break;        case 2:            //删除学生记录            if(deleteNode(head))                printf("成功删除一个学生记录。\n\n");            else                printf("没有找到要删除的学生节点。\n\n");            break;        case 3:            //查询学生记录            if(queryNode(head))                printf("成功找到学生记录。\n\n");            else                printf("没有找到要查询的学生节点。\n\n");            break;        case 4:            //修改学生记录            if(modifyNode(head))                printf("成功修改一个学生记录。\n\n");            else                printf("没有找到要修改的学生节点。\n\n");            break;        case 5:            //统计学生人数            count = countNode(head);            printf("学生人数为:%d\n\n",count);            break;        case 6:            //显示学生记录            displayNode(head);            break;        case 7:Store_List(head);                cout<<"打印成功"<<endl;                 system("pause");                   system("cls");            break;        case 8:            //退出前清除链表中的所有结点            clearLink(head);            return 0;        default:            printf("输入不正确,应该输入0-8之间的数。\n\n");            system("pause");            system("cls");             break;        }    }    return 0;}

7.测试结果

C语言如何实现学生信息管理系统的文件操作

C语言如何实现学生信息管理系统的文件操作

C语言如何实现学生信息管理系统的文件操作

C语言如何实现学生信息管理系统的文件操作

C语言如何实现学生信息管理系统的文件操作

C语言如何实现学生信息管理系统的文件操作

读到这里,这篇“C语言如何实现学生信息管理系统的文件操作”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯