学生学籍管理系统(c语言)

  • 一、项目背景
  • 二、需求分析
  • 三、系统总体设计
  • 四、详细设计
    • 1、系统包含的函数
    • 2、各个功能模块的软件功能
    • 3、各个功能模块的程序流程图
      • 1、主函数流程图
      • 2、add_data()函数流程图
      • 3、update()**函数流程图**
      • 4、search_data()函数流程图
      • 5、delete()函数流程图
      • 6、list_data()函数流程图
      • 7、pack()函数流程图
  • 五、代码

一、项目背景

​ 学生成绩管理系统是一个学校不可缺少的重要部分,它的内容对于学校的决策者和管理者来说都至关重要,所以学生成绩管理系统应该为用户提供充足的信息和快捷的查询手段。同时,学生成绩管理是各大学的主要日常管理工作之一,涉及到校、系、师、生的诸多方面,随着教学体制的不断改革,尤其是学分制、选课制的展开和深入,学生成绩日常管理工作及保存管理日趋繁重、复杂。高校都迫切需要研制开发一款属于自己的功能强大,操作简单,具有人性化的学生成绩管理系统。

二、需求分析

设计一个利用文件处理方式,实现对学生学籍信息(包括:学号,姓名,性别,年龄,籍贯,系别,专业,班级)进行添加、修改、删除、查找、统计输出等操作。学生学籍管理系统的功能要求如下:

①增加数据

②更新数据

③查询数据

④删除数据

⑤显示数据

⑥重组文件

⑦要求本系统采用结构体等数据结构。

三、系统总体设计

学生学籍管理系统包含6个模块。

(1)增加数据模块 (2)更新数据模块。

(3)查询数据模块 (4)删除数据模块。

(5)显示数据模块 (6)重组文件模块

四、详细设计

1、系统包含的函数

(1)主函数:main()函数。

(2)子函数:

①增加数据函数:add_data()函数

②更新数据函数:updata_data()函数

③查询数据函数:search_data()函数

④删除数据函数:delete_data()函数

⑤显示数据函数:list_data()函数

⑥重组文件函数:pack()函数

2、各个功能模块的软件功能

(1)add_data()函数

函数原型:void add_data();

函数功能:输入一个或多个学生的信息,并将所输入的学生信息存入到数据文件中。

(2)updata_data()函数

函数原型:void updata_data();

函数功能:更新已存在的学生的信息。

(3)search_data()函数

函数原型:void search_data();

函数功能:按学号查询未作删除标记的学生的信息。

(4)delete_data()函数

函数原型:void delete_data();

函数功能:对某学生信息作删除标记,只作逻辑删除。

(5)list_data()函数

函数原型:void list_data();

函数功能:按指定条件显示未作删除标记的学生的信息。

(6)pack()函数

函数原型:void pack();

函数功能:对作删除标记的学生信息作物理删除。

3、各个功能模块的程序流程图

1、主函数流程图

2、add_data()函数流程图

3、update()函数流程图

4、search_data()函数流程图

5、delete()函数流程图

6、list_data()函数流程图

7、pack()函数流程图

五、代码

/*全部数据定义及各子函数声明*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX 100
struct student
{short status;      /*数据状态,0:正常 1:删除*/int num;         /*学生的学号*/char name[9];      /*姓名*/char sex[3];      /*性别*/int age;          /*年龄*/char origin[21];  /*籍贯*/char depart[21];  /*系别*/char major[21];   /*专业*/int clas;         /*班级*/
};/*子函数部分*/
void add_data();        /*增加数据*/
void update_data(); /*更新数据*/
void search_data(); /*查询数据*/
void delete_data(); /*删除数据,只做删除标志*/
void list_data();       /*显示数据*/
void pack();            /*在物理上删除作有删除标记的记录*//*主函数*/
FILE *fp;
void main()
{int select;        /*选择变量*/if((fp=fopen("stu.dat","rb+"))==NULL)       /*stu.dat文件不存在*/{if((fp=fopen("stu.dat","wb+"))==NULL)  /*打开stu.dat文件失败*/{printf("打开文件stu.dat失败!");system("PAUSE");      /*暂时停一下,等待下一个操作*/exit(1);                /*退出程序*/}}
do
{printf("\n学生学籍管理系统\n");printf("1.增加数据 \n2.更新数据 \n3.查询数据\n4.删除数据\n5.显示数据 \n6.重组文件\n7.退出\n");printf("\n请选择:\n");scanf("%d",&select);while(select<1||select>7){printf("请输入1至7的数:");scanf("%d",&select);}switch(select){case 1:add_data();     /*增加数据*/
break; case 2:update_data();        /*更新数据*/
break; case 3:search_data();        /*查询数据*/
break; case 4:delete_data();        /*删除数据,只作删除标志*/
break; case 5:list_data();      /*显示数据*/
break; case 6:pack();               /*在物理上删除作有删除标记的记录*/
break;  }
}while(select!=7);         /*选择7退出循环*/
fclose(fp);             /*关闭文件*/
system("PAUSE");          /*暂时停一下,等待下一个操作*/
}/*增加数据函数*/
void add_data()
{struct student stu;        /*定义学生变量stu*/char tag;                  /*设置标志是否继续添加数据*/stu.status=0;              /*数据状态,0:正常 1:删除*/do{printf("学号:");scanf("%d",&stu.num);printf("姓名:");scanf("%s",stu.name);printf("性别:");scanf("%s",stu.sex);printf("年龄:");scanf("%d",&stu.age);printf("籍贯:");scanf("%s",stu.origin);printf("系别:");scanf("%s",stu.depart);printf("专业:");scanf("%s",stu.major);printf("班级:");scanf("%d",&stu.clas);fseek(fp,0,SEEK_END);          /*将指针移动到文件尾部*/
/*将学生信息存入文件中*/fwrite(&stu,sizeof(struct student),1,fp); printf("继续添加吗(y/n):");while (getchar()!='\n');     /*跳过当前行*/tag=getchar();tag=tolower(tag);              /*将大写字母转化为小写字母*/while(tag!='y'&&tag!='n'){printf("输入非法,从新输入(y/n):");while(getchar()!='\n');   /*跳过当前行*/tag=getchar();tag=tolower(tag);          /*将大写字母转化为小写字母*/}}while(tag=='y');              /*当回答要求循环时*/
}/*更新数据函数*/
void update_data()
{struct student stu;        /*学生*/int num;                  /*要修改的学生的学号*/printf("输入要修改的学生的学号:");scanf("%d",&num);rewind(fp);                /*使位置指针返回到文件的开头*/fread(&stu,sizeof(struct student),1,fp);   /*读入学生信息*/while(!feof(fp)){/*文件未结束*/
/*查找学号相同且数据状态正常未作删除标记*/if(stu.num==num&&stu.status==0) break;fread (&stu,sizeof(struct student),1,fp);/*继续读取学生信息*/}if(!feof(fp)){/*查询成功*/printf("更新前学生的信息:\n");printf("%-10s%-10s%-7s%-7s%-10s%-10s%-10s%7s\n","学号","姓名","性别","年龄","籍贯","系别","专业","班级");printf("%-10d%-10s%-7s%-7d%-10s%-10s%-10s%-7d\n",stu.num,stu.name,stu.sex,stu.age,stu.origin,stu.depart,stu.major,stu.clas);printf("输入更新后的数据:\n");
printf("学号:");scanf("%d",&stu.num);printf("姓名:");scanf("%s",stu.name);printf("性别:");scanf("%s",stu.sex);printf("年龄:");scanf("%d",&stu.age);printf("籍贯:");scanf("%s",stu.origin);printf("系别:");scanf("%s",stu.depart);printf("专业:");scanf("%s",stu.major);printf("班级:");scanf("%d",&stu.clas);
/*将指针从当前位置移动到一个学生信息之前*/fseek(fp,-sizeof(struct student),SEEK_CUR); fwrite(&stu,sizeof(struct student),1,fp);    /*写入数据*/}else{/*查询失败*/printf("无此学号的学生!\n");clearerr(fp);     /*清除文件结束标志*/}
}/*查询数据函数*/
void search_data()
{struct student stu;        /*学生*/int num;                  /*学生的学号*/printf("输入要查询的学生的学号:");scanf("%d",&num);rewind(fp);fread(&stu,sizeof(struct student),1,fp);    /*读入学生信息*/while(!feof(fp)){/*文件未结束*/
/*学生的学号相同且数据正常,未作删除标记*/if(stu.num==num&&stu.status==0)           /*查询成功*/break; fread(&stu,sizeof(struct student),1,fp);/*读入学生信息*/}if(!feof(fp)){/*查询成功*/printf("%-10s%-10s%-7s%-7s%-10s%-10s%-10s%7s\n","学号","姓名","性别","年龄","籍贯","系别","专业","班级");printf("%-10d%-10s%-7s%-7d%-10s%-10s%-10s%-7d\n",stu.num,stu.name,stu.sex,stu.age,stu.origin,stu.depart,stu.major,stu.clas);}else{/*查询失败*/printf("无此学号的学生:");clearerr(fp);}
}/*删除数据函数*/
void delete_data()
{struct student stu;int num;printf("输入要删除数据的学生的学号:");scanf("%d",&num);rewind(fp);fread(&stu,sizeof(struct student),1,fp);while(!feof(fp)){/*文件未结束*//*学生的学号相同并且数据状态正常,未作删除标记*/
if(stu.num==num&&stu.status==0) break;fread(&stu,sizeof(struct student),1,fp);}if(!feof(fp)){/*查询成功*/printf("被删除记录为:\n");printf("%-10s%-10s%-7s%-7s%-10s%-10s%-10s%7s\n","学号","姓名","性别","年龄","籍贯","系别","专业","班级");printf("%-10d%-10s%-7s%-7d%-10s%-10s%-10s%-7d\n",stu.num,stu.name,stu.sex,stu.age,stu.origin,stu.depart,stu.major,stu.clas);stu.status=1;       /*使数据状态为删除状态*//*将指针从当前位置移动到一个学生信息之前*/
fseek(fp,-sizeof(struct student),SEEK_CUR); fwrite(&stu,sizeof(struct student),1,fp);   /*写入数据*/}else{/*查询失败*/printf("无此学生学号的信息!\n");clearerr(fp);}
}/*显示数据函数*/
void list_data()
{struct student stu[MAX],tstudent;int select;       /*选择变量*/int stcout=0,n;    /*stcout表示学生的个数*/int i,j;printf("请选择:\n");printf("1.按学号显示  2.按专业显示\n");scanf("%d",&select);while(select<1||select>3){printf("请输入1或2的数:");scanf("%d",&select);}rewind(fp);       /*使位置指针返回到文件的开头*/fread(&stu[0],sizeof(struct student),1,fp);        /*读入学生信息*/while(!feof(fp)){/*计算文件中学生信息的学生数*/stcout++;
/*继续读入学生信息*/fread(&stu[stcout],sizeof(struct student),1,fp);}if(select==1){/*用冒泡排序法把学生信息按学号大小排序*/for(i=1;i<=stcout;i++)for(j=0;j<stcout-i;j++){if(stu[j].num>stu[j+1].num){tstudent=stu[j];stu[j]=stu[j+1];stu[j+1]=tstudent;}}printf("按学生的学号排序:\n");printf("%-10s%-10s%-7s%-7s%-10s%-10s%-10s%7s\n","学号","姓名","性别","年龄","籍贯","系别","专业","班级");for(i=0;i<stcout;i++)        /*按学号顺序输出学生信息*/{if(stu[i].status==0)  /*数据状态正常,未作删除标志*/{printf("%-10d%-10s%-7s%-7d%-10s%-10s%-10s%-7d\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].origin,stu[i].depart,stu[i].major,stu[i].clas);}}}else{/*用冒泡排序法把学生信息按专业排序*/for(i=0;i<stcout;i++)for(j=0;j<stcout-i;j++){if(strcmp(stu[j].major,stu[j+1].major)>0){tstudent=stu[j];stu[j]=stu[j+1];stu[j+1]=tstudent;}}printf("按专业排序:\n");printf("%-10s%-10s%-7s%-7s%-10s%-10s%-10s%7s\n","学号","姓名","性别","年龄","籍贯","系别","专业","班级");for(i=0;i<stcout;i++)     /*按专业顺序输出学生信息*/{if(stu[i].status==0){printf("%-10d%-10s%-7s%-7d%-10s%-10s%-10s%-7d\n",stu[i].num,stu[i].name,stu[i].sex,stu[i].age,stu[i].origin,stu[i].depart,stu[i].major,stu[i].clas);}}}clearerr(fp);       /*清除文件结束标记*/
}/*重组文件函数*/
void pack()
{struct student stu;FILE *fpTmp;if((fpTmp=fopen("stu_tmp.dat","wb"))==NULL){/*文件stu_tmp.dat打开失败*/printf("打开文件stu_tmp.dat失败!");system("PAUSE");   /*暂时停一下,等待下一个操作*/exit(2);            /*退出程序*/}rewind(fp);            /*使文件指针返回到文件开头*/fread(&stu,sizeof(struct student),1,fp);    /*读入图书信息*/while(!feof(fp)){
/*文件未结束*/if(stu.status==0)        /*数据状态正常,未作删除标记*/fwrite(&stu,sizeof(struct student),1,fpTmp);    /*写入图书信息*/fread(&stu,sizeof(struct student),1,fp);  /*继续读入图书信息*/}fclose(fp);fclose(fpTmp);              /*关闭文件*/remove("stu.dat");                        /*删除文件*/rename("stu_tmp.dat","stu.dat");        /*更改文件名*/if((fp=fopen("stu.dat","rb+"))==NULL){
/*打开文件stu.dat失败*/printf("打开文件stu.dat失败!");system("PAUSE");       /*暂时停一下,等待下一个操作*/exit(3);                /*退出程序*/}
}

学生学籍管理系统(c语言)相关推荐

  1. C语言编程学生学籍登录窗口,C语言实现学生学籍管理系统

    本文实例为大家分享了C语言实现学生学籍管理系统的具体代码,供大家参考,具体内容如下 #include #include #include #include #include //*********** ...

  2. c语言学籍管理实验报告,c语言实验报告(学生学籍管理系统)

    c语言实验报告(学生学籍管理系统) (20页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 14.90 积分 实实 验验 报报 告告学学 生生 学学 籍籍 ...

  3. c语言学生学籍管理修改,C语言课设之学生学籍管理系统.doc

    C语言课设之学生学籍管理系统.doc 题目学生学籍管理系统 目录一.个人简介.二.报告摘要.三.报告目录.四.报告正文. 1.系统需求分析 2.系统总体设计 3.系统详细设计六.总结. 二.报告摘要 ...

  4. 川轻化c语言实验答案,c语言实验报告(学生学籍管理系统)

    <c语言实验报告(学生学籍管理系统)>由会员分享,可在线阅读,更多相关<c语言实验报告(学生学籍管理系统)(20页珍藏版)>请在人人文库网上搜索. 1.氮闭谜蹋典灸逐簇距坏硕蹄 ...

  5. c语言代码学生学籍系统,C语言实现学生学籍管理系统.pdf

    C语言实现学生学籍管理系统 这篇文章主要为大家详细介绍了C语言实现学生学籍管理系统,具有一定的 考价值,感兴趣的小伙伴们可以 考 一下 本文实例为大家分享了C语言实现学生学籍管理系统的具体代码,供大家 ...

  6. 【C】C语言大作业——学生学籍管理系统

    文章目录 学生管理系统 界面 主界面 登陆界面 注册界面 管理界面 学生界面 退出界面 链接 注意 学生管理系统 学C语言时写的一个大作业,弄了一个带图形界面的,使用的是VS配合EasyX图形库进行实 ...

  7. 课设 c语言编译学籍管理系统,C语言课设之学生学籍管理系统

    <C语言课设之学生学籍管理系统>由会员分享,可在线阅读,更多相关<C语言课设之学生学籍管理系统(10页珍藏版)>请在人人文库网上搜索. 1.题目:学生学籍管理系统 目录:一.个 ...

  8. C语言学生学籍管理系统源程序|用数据文件存放学生的学籍,可对学生学籍进行注册,登录,修改,删除,查找,统计,学籍变化等操作。(用文件保存) 功能要求: (1) 系统以菜单方式工作。 (2) 登记学生的

    学生学籍管理系统 用数据文件存放学生的学籍,可对学生学籍进行注册,登录,修改,删除,查找,统计,学籍变化等操作.(用文件保存) 功能要求: (1) 系统以菜单方式工作. (2) 登记学生的学号,姓名, ...

  9. 班级学籍管理系统c语言论文,c语言课程设计学生学籍管理系统论文.doc

    c语言课程设计学生学籍管理系统论文 PAGE PAGE 2 1. 课题的主要功能 1.1 需求分析. 程序的功能: 对一个有N个学生的班级,通过该系统实现对该班级学生的基本信息进行录入.显示.修改.删 ...

  10. 学籍管理系统 c语言流程图,程序设计基础 ——C语言第10章 综合应用案例——学生学籍管理系统...

    程序设计基础 第 10章 综合应用 案例 -学生学籍 管理系统 1 详细设计 需求分析 总体设计 第 10章 综合应用 案例 -学生学籍管理系统 编码实现 运行结果 2 设计一个利用 文件 处理方式, ...

最新文章

  1. 最牛逼的阿里巴巴内部Java调优方案,没有之一!
  2. oracle中取最新的前几条记录(rownum)
  3. SAP Spartacus Focusdirective继承自Lockdirective,静态代码分析
  4. 变态公式之如何算出圆的内部被切割成几块?
  5. Asp.net页面和Html页面之间的关系
  6. 网站html标签如何优化,网站HTML标签优化教程
  7. Kafka版本介绍Version2.4.0
  8. 读书随笔:The Book of Why——CHAPTER 3:From Evidence to Causes: Reverend Bayes Meets Mr. Holmes
  9. Java基础学习总结(174)——Java 开发者应该会的流程图绘制技巧
  10. smart原则_绩效指标如何设定?SMART原则轻松搞定
  11. 显卡虚拟化--最强实践
  12. (转)NET Reflector简介
  13. TFS2012 权限设置
  14. 小学计算机应用到英语课教案,信息技术与小学英语教学有效融合(转载)
  15. java8 .map是什么意思_JDK8 stream().map() 作用
  16. 关于QTableWidget中单元格的合并
  17. 7 款殿堂级的开源 CMS(内容管理系统)
  18. ubuntu16.04 无法挂载固态移动硬盘(三星)
  19. asp.net用ajax交互实现文档导出及下载
  20. Python实现的深度学习技术在水文水质领域应用

热门文章

  1. 【Tools系列】Windows下一款好用的文件搜索工具:XSearch
  2. 2、CPP 基础语法学习
  3. java 二进制转换成图片_java二进制转换为图片
  4. EditPlus 使用 json 格式化
  5. MES系统生产派工提高注塑行业生产效率
  6. 获取照片经纬度(wgs84)转高德经纬度(gcj02)
  7. Android自定义控件--圆形进度条(中间有图diao)
  8. 【技术类】2019校招技术类岗位面经汇总
  9. 沟通的艺术I:什么是沟通
  10. x86架构应用如何向Arm架构低成本迁移