C语言学生信息管理完整 .docx
精品名师归纳总结同学信息治理系统此题目设计目的是训练同学的基本编程才能,明白治理信息系统的开发流程,熟识C语言的文件和单链表的各种基本操作。本程序中涉及结构体、单链表、文件等方面的知识。通过本程序的训练,使同学能对C 语言的文件操作有一个更深刻的明白,把握利用单链表储备结构实现对同学成果治理的原理,为进一步开发出高质量的治理信息系统打下坚实的基础。1、问题定义创建一个同学成果治理系统。假设系统中每个同学记录只包括同学学号、同学姓名、年龄、性别、产生年月、电话等信息。程序的运行成效如下图所示,选择任意菜单后,实现相应功能。在问题定义阶段要考虑题目的可行性和需求分析,接下来进入开发阶段,完成系统设计和系统实现的任务。2、系统设计2.1 总体设计接受模块化的程序设计方法,即将较大的任务依据确定的原就分为一个个较小的任务,然后分别设计各个小任务。需要留意的是划分出来的模块应当相对独立但又相关,且简洁懂得。可以用模块化层次结构来分析其任务的划分,一般从上到下进行,最上面一层是主模块,下面各层是其上一层模块的逐步细化描述。本成果治理系统要求接受数组实现,它由如下六大功能模块组成: 输入同学记录。查询同学记录。删除同学记录。显示全部同学记录。统计同学人数。刷新当前信息。2.2 详细设计2.2.1 数据结构设计同学个人信息结构体结构体 struct student 将用于储备同学的基本信息,它将作为单链表的数据域。struct record /* 结构体 */char codeLEN+1 。 /* 学号 */ char nameLEN+1 。 /* 姓名 */ int age。 /* 年龄 */char sex3 。 /* 性别 */char dateLEN+1 。 /* 产生年月 */ char telLEN+1 。 /* 电话号码 */stuN 。可编辑资料 - - - 欢迎下载精品名师归纳总结2.2.2 输入记录模块void readfile/*建立信息 */char *p="student.txt" 。FILE *fp 。int i=0 。if fp=fopen"student.txt","r"=NULLprintf"Open file %s error. Strike any key to exit.",p。system"pause"。exit0 。whilefscanffp,"%s %s %d %s %s %s",stui.code,stui.name,&stui.age, stui.sex,stui.date,stui.tel=8i+ 。i=i 。fclosefp 。n=i 。printf" 录入完毕! n" 。2.2.3 查询记录模块void seek /* 查找 */int i,item,flag 。char s121。 /* 以姓名和学号最长长度+1 为准 */ printf"-n"。printf"-1. 按学号查询 -n" 。printf"-2. 退出本菜单 -n" 。printf"-n"。while1printf" 请选择子菜单编号:" 。scanf"%d",&item 。flag=0 。switchitemcase 1:printf" 请输入要查询的同学的学号:n" 。scanf"%s",s1 。fori=0 。i<n 。i+ ifstrcmpstui.code,s1=0可编辑资料 - - - 欢迎下载精品名师归纳总结flag=1 。printf" 同学学号同学姓名 年龄 性别产生年月电话 n"。printf"-n"。printf"%6s%7s%6d%5s %9s %10sn",stui.code,stui.name,stui.age,stui.sex,stui.date,stui.tel。ifflag=0printf" 该学号不存在! n"。 break。case 2:return。default:printf" 请在 1-2 之间选择 n" 。2.2.4 删除记录模块void delint i,j,flag=0 。char s1LEN+1 。printf" 请输入要删除同学的学号:n" 。scanf"%s",s1 。fori=0 。i<n 。i+ ifstrcmpstui.code,s1=0flag=1 。forj=i 。j<n-1 。j+ stuj=stuj+1 。ifflag=0printf" 该学号不存在! n"。ifflag=1printf" 删除成功 ,显示结果请选择菜单6n" 。n- 。2.2.5 显示全部同学记录模块void displayint i 。printf" 全部同学的信息为:n" 。printf" 同学学号 同学姓名 年龄 性别 产生年月电话n" 。可编辑资料 - - - 欢迎下载精品名师归纳总结printf"-n"。fori=0 。i<n 。i+printf"%6s %7s %5d %5s %8s %10sn",stui.code,stui.name,stui.age, stui.sex,stui.date,stui.tel。3、系统实现3.1.1 程序预处理包括加载头文件,定义结构体、常量和变量,并对它们进行初始化工作#include<stdio.h> /*I/O函数 */ #include<stdlib.h> /* 其它说明 */ #include<malloc.h> #include<string.h> /* 字符串函数 */#define BUFLEN 100 /*缓冲区最大字符数*/#define LEN 15 /*学号和姓名最大字符数,实际请更换 */ #define N 100 /*最高校生人数 ,实际请更换 */3.1.2 主函数 mainmain 函数主要实现了对整个程序的运行把握,以及相关功能模块的调用。FILE *fp 。void seek。/* 函数声明 */ void insert 。void del 。void display 。void save。void getnum 。void readfile 。void menu 。int mainwhilek menu。system"pause"。return 0。switchnumcase 1:insert。break。case 2:del。break。case 3:seek。break。case 4:display 。break。case 5:getnum。break。可编辑资料 - - - 欢迎下载精品名师归纳总结case 6:readfile 。break。case 7:k=0。break。default:printf" 请在 1-7 之间选择 n" 。3.1.3 主菜单界面用户进入成果治理系统时,需要显示主菜单,提示用户进行选择,完成相应任务。此代码被 main 函数调用。void menu/*界面 */int num 。printf"*系统功能菜单 *n"。printf"*闫晨曦 0951100206*n"。/printf" 友情提示 :查询前请先刷新系统!n" 。printf"*n"。printf"*1.增加同学信息*n" 。printf"*2.删除同学信息*n" 。printf"*3.查询同学信息*n" 。printf"*4.显示当前信息*n" 。printf"*5.统计同学人数*n" 。printf"*6.刷新当前信息*n" 。printf"*7.退出系统*n" 。printf"*n"。printf" 请选择菜单编号 :" 。scanf"%d",&num 。3.1.4 插入同学记录在插入同学记录操作中,系统会先按学号查找到要插入的节点的位置,然后在该学号之后插入一个新节点。void insert /* 插入函数 */int i=n,j,flag 。printf" 请输入待增加的同学数:n" 。scanf"%d",&m 。doflag=1 。whileflagflag=0 。printf" 请输入第 %d 个同学的学号 :n",i+1 。scanf"%s",stui.code 。forj=0 。j<i 。j+可编辑资料 - - - 欢迎下载精品名师归纳总结ifstrcmpstui.code,stuj.code=0printf" 已有该学号 ,请检查后重新录入.n" 。flag=1 。break。 /* 如有重复马上退出该层循环,提高判定速度 */printf" 请输入第 %d 个同学的姓名 :n",i+1 。scanf"%s",stui.name 。printf" 请输入第 %d 个同学的年龄 :n",i+1 。scanf"%d",&stui.age 。printf" 请输入第 %d 个同学的性别 格式 :男 1 女 0:n",i+1 。scanf"%s",stui.sex 。printf" 请输入第 %d 个同学的产生年月 :格式 :年.月n",i+1 。scanf"%s",stui.date 。printf" 请输入第 %d 个同学的电话 :n",i+1 。scanf"%s",stui.tel 。ifflag=0i=i 。i+ 。whilei<n+m 。n+=m 。printf" 录入完毕! nn" 。sort 。3.1.5 统计同学记录在统计同学记录操作中,系统会统计同学人数总数,并打印输出统计结果。void getnumint num_b=0,num_g=0 。int i 。fp=fopen"student.txt","a+"。fori=0 。i<num 。i+ifstrcmpstui.sex,"1" num_g+。else num_b+。printf" 【统计结果】 n"。fprintffp," 【统计结果】 n" 。printf" 同学总人数为: 10 人n",num 。可编辑资料 - - - 欢迎下载精品名师归纳总结fprintffp," 同学总人数为: 10 人n",num 。printf" 其中男生 5 人,女生 5 人n",num_b,num_g 。fprintffp," 其中男生 %d 人,女生 %d 人n",num_b,num_g 。fclosefp 。3.1.6 排序同学记录在排序同学记录操作中,系统会利用插入排序法实现单链表的按总分字段的降序排序,并打印出排序前和排序后的结果。void sort/* 按学号排序 */int i,j,*p,*q,s 。char temp10 。fori=0 。i<n-1 。i+forj=n-1 。 j>i 。j-ifstrcmpstuj-1.code,stuj.code>0strcpytemp,stuj-1.code 。strcpystuj-1.code,stuj.code。strcpystuj.code,temp 。strcpytemp,stuj-1.name 。strcpystuj-1.name,stuj.name 。strcpystuj.name,temp 。strcpytemp,stuj-1.sex 。strcpystuj-1.sex,stuj.sex 。strcpystuj.sex,temp 。strcpytemp,stuj-1.date 。strcpystuj-1.date,stuj.date 。strcpystuj.date,temp 。strcpytemp,stuj-1.tel 。strcpystuj-1.tel,stuj.tel。strcpystuj.tel,temp 。p=&stuj-1.age 。q=&stuj.age 。s=*q 。*q=*p 。*p=s 。32 测试与调试3.2.1 概述可编辑资料 - - - 欢迎下载精品名师归纳总结一般情形下,为解决一个问题所编写的程序代码较长,可能包括几百条甚至成千上万条语句。在检查并排除全部语法错误后,仍会有不易发觉的规律错误,因此要对程序进行仔细仔细的测试与调试。测试是通过运行程序发觉错误的过程,常见的错误有数据溢出、数组越界、进入死循环、语句次序颠倒、多加“。”或少加“ ”等等。调试就是确定测试中找到的错误性质并改正错误的过程。测试与调试通常交替进行,即测试调试再测试再调试。能检查出尚未发觉的、各种不同类型错误的测试才是成功的测试。测试程序需要测试用例,测试用例可用如下公式表示:测试用例测试数据预期结果。好的测试用例应当是用完可能少的测试数据发觉尽可能多的错误,即发觉错误的概率要大。要选择合适的测试数据,使系统在运行时尽量能执行到每条语句,以测试各指令是否正确。仍应分别测试输入合法数据与非法数据时,程序的运行情形,。对于合法数据, 仍要考虑数据的一般性与特殊性,如求最大值的问题,应测试最大值在最前面、最终面、中间某一位置的情形。测试程序时,用监视窗口可以随时查看变量或表达式的值,有时仍可以将部分程序代码用注释符暂时括起来,缩短程序,以便压缩出错代码的范畴。3.2.2 程序测试在主菜单中选择 1当用户输入 1 并按回车键后,即可进入数据输入界面。如下图所示: 请依据提示输入所需记录的内容。在主菜单中选择 2当用户输入 2 并按回车键后,即可进入记录删除界面。在主菜单中选择 3当用户输入 3 并按回车键后,即可进入记录查找界面。如以下图,可按学号或姓名进行查找。在主菜单中选择 4在主菜单中选择 5在主菜单中选择 74、系统爱护经测试与调试确认软件无错时,开发就告一段落,这时可以交付软件供用户使用,但是在软件的使用过程中仍会面临更加漫长的工作,即软件爱护。一般爱护的工作有:更换使用中发觉的错误。为适应实际环境而对程序进行修改。为中意新的需求而对程序作必要的改进等等。5、归纳总结5.1 开发体会通过对此题目的开发,体会到要把握以下几点内容。可编辑资料 - - - 欢迎下载精品名师归纳总结5.2 实训中遇到的问题及解决方法在这次的实训中,主要遇到的问题是编译环境的不同对程序也不同。原先我们的程序是不支持在VC+ 里面编译的,因此始终都处在编译失败,该函数未定义的错误中。后来经过老师的指导,最终找到了根源,就是把“clrscr ”改为“ system"cls" ”就可以了。5.3 设计中尚存的不足之处关于这次的程序,也有挺多不足的的方。第一,我觉得程序仍不够完善,有些的方甚至有点乱。其次,有些的方好像功能有点重复了。最终,就是该程序界面不够美观大方。5.4 感想和心得体会通过这次实训,我感受甚深,可编辑资料 - - - 欢迎下载