1、C语言学生信息管理系统设计1前言在计算机技术和互联网飞速发展的今天,计算机成为了现代生活中一个重要的工具。学生信息管理系统利用计算机对学生信息进行统一管理,为学校老师的工作提供便利。本程序是利用结构数组实现此学生信息管理系统。2设计目的利用本课程设计的目的是要培养学生初步具有系统分析思想,并能利用开发工具开发一个简单实用的综合程序。为学生提供了一个既动手又动脑,独立实践的机会,将课本上的理论知识和实际有机的结合起来,锻炼学生的分析解决实际问题的能力,提高学生适应实际,实践编程的能力。3功能描述如图1所示,学生信息管理系统主要利用数组来实现,其数组元素是结构体类型,整个系统由如下几大功能模块组成
2、。图1 学生信息管理系统功能模块(1)输入记录模块。输入记录模块主要完成将数据存入数组中的工作。在此学生信息管理系统中,记录可以从以文本形式存储的数据文件中读入,也可从键盘逐个输入记录。当从数据文件中读入记录时,它就是在以记录为单位存储的数据文件中,将记录逐条复制到结构体类型的数组元素中。(2)查询记录模块。查询记录模块主要完成在数组中查找满足相关条件的记录。在此学生信息簿管理系统中,用户可以按照学生姓名或学生学号在数组中进行查找。若找到该记录,则显示出此记录的信息;否则,显示出未找到该记录的提示信息。(3)更新记录模块。更新记录模块主要完成对记录的维护。在此电话簿管理系统中,它实现对记录的修
3、改、删除操作。一般而言,系统进行了这些操作之后,需要将修改的数据存入源数据文件。(4)输出记录模块。输出记录模块主要完成两个任务。第一,它实现对记录的存盘操作,即将数组中各元素中存储的记录信息写入数据文件中。第二,它实现将数组中存储的录信息在屏幕上显示出来。4总体设计1、功能模块设计(1)主控main()函数执行流程学生信息管理系统执行主流程如图2所示。它先以可读写的方式打开文本类型的数据文件。选择打开的文件名“a”,从文件中读出数据添加到新建的数组中,然后执行显示主菜单和进入主循环操作,进行按键判断。值得一提的是,文本类型文件与二进制类型文件不同,它可以使用Windows自带的记事本打开并查
4、看到存储的文件内容。图2 主控函数执行流程图在判断键值时,有效的输入为1-6之间的任意数值,其他输入都被视为错误按键。若输入为6(即变量select=6),则会进行存盘操作。最后,系统执行退出学生信息管理系统的操作。若选择1,则调用input()函数,执行录入信息操作;若选择2,则调用scan()函数,执行查询记录操作;若选择3,则调用list()函数,执行将所有信息打印输出至屏幕的操作;若选择4,则调用change()函数,执行修改记录操作:若选择5,则调用drop()函数,执行删除记录操作;若输入为1-6之外的值,则显示输入错误,请重新输入。(2)输入记录模块输入记录模块主要实现将数据存入
5、数组中。调用int input()函数,学生信息存入某个数组元素中的操作,并且这个操作在main()中调用执行,即在学生信息管理系统进入显示菜单界面时,该操作己经执行了。此时,用户应选择1,调用input()函数,进行记录的输入,即完成在数组中添加元素的操作。(3)查询记录模块查询记录模块主要实现在数组中按学生姓名或学号查找满足条件的记录。在查询函数void scan()中,通过FILE * fp,调用fopen(a.txt)函数,将数据读入到结构体struct test 中的scan(),list()函数,可将其数组在屏幕中打印输出,即完成查询学生信息的操作。(4)更新记录模块更新记录模块主
6、要实现了对记录的修改和删除操作。因为记录是以数组的结构形式存储的,所以这些操作都在数组中完成。下面分别介绍这2个功能模块。1)修改记录修改记录操作需要对数组中目标元素的数据域中的值进行修改,它分两步完成。第一步,输入要修改的学生学号,输入后找到该学生相关的记录;第二步,若找到该记录,修改需要修改的信息,并将存盘标记变saveflag置1,表示已经对记录进行了修改,但还未执行存盘操作。2)删除记录删除记录操作完成删除指定学生的记录,它也分两步完成。第一步,输入要修改的学生学号,输入后找到该学生的记录,返回指向该记录的数组元素下标;第二步,若找到该记录,则从该记录所在元素的后续元素起,依次向前移一
7、个元素位置,有值的数组元素个数减1,其具体过程如图3所示,在删除了数组元素A2后,数组元素A3和A4向前移动了一个位置图3 数组中删除记录示意图(5)输出记录模块当把记录输出至文件时,将数组元素tempi 中各字段的值,写入文件指针fp所指的文件:当把记录输出至屏幕时,调用void list()函数,将数组中存储的记录信息在屏幕上打印出来。2、数据结构设计本程序定义了结构体Student,用于存放学生的基本信息。这里仅有8个与学生有关的字段,读者可以按照需要扩展相关字段。struct Student char num15; char name9; char age3; char sex3; c
8、har birth11; char address50; char phonenum15; char email22;t100;其各字段的值的含义如下: num15:学生学号。 name10:学生姓名。 age3:学生年龄。 birth11:学生出生年月。 address50:学生地址。 phonenum15:学生电话号码。 email22:学生邮箱地址。3、函数功能描述1)menu()函数原型:void menu()menu()函数用于在屏幕开头,输出菜单,让用户自行选择。2)input () 函数原型:int input(int cnt)input ()函数用于用户输入学生姓名、学号、年龄
9、、出生年月、地址、号码、E-mail。3)scan()函数原型:void scan(int cnt)scan()函数用于查询学生有关信息。4)list()函数原型:void list(int cnt)list()函数用于显示学生有关信息。5)change()函数原型:void change(int cnt)change()用于修改学生有关信息。6)drop()函数原型:int drop(int cnt)drop()用于删除学生有关信息。5程序实现1、源程序#include#include#includestruct Teacher char num7; char name9; char zc7
10、; int jbgz; int jt; int ksf; int yksk; int sfgz;t100;void menu() printf(*教师工资管理系统*n); printf(*1 输入记录 2 插入记录*n); printf(*3 修改记录 4 删除记录*n); printf(*5 查询记录 6 显示记录*n); printf(*7 记录排序 8 工资统计*n); printf(* 9 退出系统 *n); printf(*n);int input(int cnt) int choice=0,i,j,count; char temp7; printf(开始输入记录.n); count
11、=cnt; for(i=cnt;i100;i+) printf(Continue?(1 Yes 0 No):); scanf(%d,&choice); getchar(); if(choice=0) break; else if(choice=1) printf(请输入教师号:); gets(temp); for(j=0;jcnt;j+) if(strcmp(temp,tj.num)=0) printf(教师号重复,请重新输入:); gets(temp); j=-1; strcpy(ti.num,temp); printf(请输入教师姓名:); gets(ti.name); printf(请输
12、入教师职称:); gets(ti.zc); if(strcmp(ti.zc,教授)=0) ti.jbgz=2500; ti.jt=3000; else if(strcmp(ti.zc,副教授)=0) ti.jbgz=2000; ti.jt=2500; else if(strcmp(ti.zc,讲师)=0) ti.jbgz=2000; ti.jt=2500; else ti.jbgz=1500; ti.jt=2000; printf(请输入教师课时费:); scanf(%d,&ti.ksf); printf(请输入教师扣款:); scanf(%d,&ti.yksk); ti.sfgz=ti.jb
13、gz+ti.jt+ti.ksf-ti.yksk; cnt+; if(count!=cnt) printf(n记录输入成功,); else printf(n未输入记录,); system(pause); return cnt;void insert() printf(开始插入记录); system(pause);void change(int cnt) int choice=0,i,j,p=-1; char temp7,tnum7; printf(开始修改记录.nn); getchar(); printf(请输入要修改的教师号:); gets(temp); for(i=0;icnt;i+) if
14、(strcmp(ti.num,temp)=0) p=i; break; if(p=-1) printf(n输入的教师号不存在,修改失败,按任意键返回主菜单.); getchar(); else printf(要修改的教师信息如下所示:n); printf(教师号 姓名 职称 基本工资 津贴 课时费 扣款 应发工资n); printf(%-10s%-10s%-8s%-10d%-8d%-8d%-8d%-8dnn,tp.num,tp.name,tp.zc,tp.jbgz,tp.jt,tp.ksf,tp.yksk,tp.sfgz); printf(n1教师号 2姓名 3职称 4 课时费 5扣款); p
15、rintf(n请输入要修改的选项:); scanf(%d,&choice); getchar(); switch(choice) case 1: printf(请重新输入教师号:); gets(tnum); for(j=0;jcnt;j+) if(strcmp(tnum,tj.num)=0) printf(教师号重复,请重新输入:); gets(tnum); j=-1; strcpy(tp.num,tnum); break; case 2: printf(请重新输入教师姓名:); gets(tp.name); break; case 3: printf(请重新输入教师职称:); gets(tp
16、.zc); if(strcmp(tp.zc,教授)=0) tp.jbgz=2500; tp.jt=3000; else if(strcmp(tp.zc,副教授)=0) tp.jbgz=2000; tp.jt=2500; else if(strcmp(tp.zc,讲师)=0) tp.jbgz=2000; tp.jt=2500; else tp.jbgz=1500; tp.jt=2000; tp.sfgz=tp.jbgz+tp.jt+tp.ksf-tp.yksk; break; case 4: printf(请重新输入教师课时费:); scanf(%d,&tp.ksf); tp.sfgz=tp.j
17、bgz+tp.jt+tp.ksf-tp.yksk; break; case 5: printf(请重新输入教师扣款:); scanf(%d,&tp.ksf); tp.sfgz=tp.jbgz+tp.jt+tp.ksf-tp.yksk; break; default:printf(输入错误,修改失败.); printf(修改记录完成,); system(pause); return;int drop(int cnt) int i,p=-1; char temp7; printf(开始删除记录.nn); getchar(); printf(请输入要删除的教师号:); gets(temp); for
18、(i=0;icnt;i+) if(strcmp(ti.num,temp)=0) p=i; break; if(p=-1) printf(n输入的教师号不存在,删除失败,按任意键返回主菜单.); getchar(); else printf(n要删除的教师信息如下所示:n); printf(教师号 姓名 职称 基本工资 津贴 课时费 扣款 应发工资n); printf(%-10s%-10s%-8s%-10d%-8d%-8d%-8d%-8dnn,tp.num,tp.name,tp.zc,tp.jbgz,tp.jt,tp.ksf,tp.yksk,tp.sfgz); for(i=p;icnt-1;i+
19、) ti=ti+1; cnt-; printf(n记录删除成功,按任意键返回主菜单.); getchar(); return cnt;void scan(int cnt) int choice=0,i,p=-1,count=0; char temp9; printf(开始查询记录.nn); printf(请选择查询方式(1按教师号 2 按教师姓名 3按教师职称):); scanf(%d,&choice); getchar(); switch(choice) case 1: printf(请输入要查询的教师号:); gets(temp); for(i=0;icnt;i+) if(strcmp(t
20、i.num,temp)=0) p=i; break; if(p=-1) printf(n输入的教师号不存在,查询失败,按任意键返回主菜单.); getchar(); else printf(n要查询的教师信息如下所示:n); printf(教师号 姓名 职称 基本工资 津贴 课时费 扣款 应发工资n); printf(%-10s%-10s%-8s%-10d%-8d%-8d%-8d%-8dnn,tp.num,tp.name,tp.zc,tp.jbgz,tp.jt,tp.ksf,tp.yksk,tp.sfgz); printf(n查询成功,按任意键返回主菜单.); getchar(); break
21、; case 2: printf(请输入要查询的教师姓名:); gets(temp); for(i=0;icnt;i+) if(strcmp(ti.name,temp)=0) if(count=0) p=i; printf(n要查询的教师信息如下所示:n); printf(教师号 姓名 职称 基本工资 津贴 课时费 扣款 应发工资n); printf(%-10s%-10s%-8s%-10d%-8d%-8d%-8d%-8dn,tp.num,tp.name,tp.zc,tp.jbgz,tp.jt,tp.ksf,tp.yksk,tp.sfgz); count+; else p=i; printf(%
22、-10s%-10s%-8s%-10d%-8d%-8d%-8d%-8dn,tp.num,tp.name,tp.zc,tp.jbgz,tp.jt,tp.ksf,tp.yksk,tp.sfgz); count+; if(p=-1) printf(n输入的教师姓名不存在,查询失败,按任意键返回主菜单.); getchar(); else printf(n查询成功,按任意键返回主菜单.); getchar(); break; case 3: printf(请输入要查询的教师职称:); gets(temp); for(i=0;icnt;i+) if(strcmp(ti.zc,temp)=0) if(cou
23、nt=0) p=i; printf(n要查询的教师信息如下所示:n); printf(教师号 姓名 职称 基本工资 津贴 课时费 扣款 应发工资n); printf(%-10s%-10s%-8s%-10d%-8d%-8d%-8d%-8dn,tp.num,tp.name,tp.zc,tp.jbgz,tp.jt,tp.ksf,tp.yksk,tp.sfgz); count+; else p=i; printf(%-10s%-10s%-8s%-10d%-8d%-8d%-8d%-8dn,tp.num,tp.name,tp.zc,tp.jbgz,tp.jt,tp.ksf,tp.yksk,tp.sfgz)
24、; count+; if(p=-1) printf(n输入的教师职称不存在,查询失败,按任意键返回主菜单.); getchar(); else printf(n查询成功,按任意键返回主菜单.); getchar(); break; default: printf(选择错误,按任意键返回主菜单.); getchar(); return;void list(int cnt) int i; printf(开始显示记录.n); printf(n当前文件中所有记录显示如下nn); printf(教师号 姓名 职称 基本工资 津贴 课时费 扣款 应发工资n); for(i=0;icnt;i+) print
25、f(%-10s%-10s%-8s%-10d%-8d%-8d%-8d%-8dn,ti.num,ti.name,ti.zc,ti.jbgz,ti.jt,ti.ksf,ti.yksk,ti.sfgz); printf(n记录显示完成,); system(pause);void sort(int cnt) int choice=0,i,j; struct Teacher temp; printf(开始记录排序.n); printf(n请选择排序方式(1按教师号 2 按教师姓名 3按教师职称):); scanf(%d,&choice); switch(choice) case 1: for(i=0;icnt-1;i+) for(j=0;jcnt-i-1;j+)