《2022年C语言程序设计实习分析方案行编辑器学生管理系统.docx》由会员分享,可在线阅读,更多相关《2022年C语言程序设计实习分析方案行编辑器学生管理系统.docx(62页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品学习资源C 程序设计实习报告题目:简洁的行编辑器(修改版)学 院:专 业:姓 名: 班级学号: 指导老师:2021 年 7月 3日前言由于我们班选题是题号和学号一一对应,所以我抽到了 16 题,简洁的行编辑器;刚开头时不知道什么叫行编辑器,以为这个题目有多么的奇妙,其次次实习时老师说选这个题目最好换个题,与老师沟通,老师建议在原有的题目上加些功能;只是仍是不知道什么叫行编辑器,上网,问同学,没有一点思路;再一次问老师,老师说不用管它什么是行编辑器,编辑的目的是为了后面对文件进行处理,于是这一次最终有了新的思路;等到这个题快要做完时,也明白了为什么老师说它太简洁了,做完后自己感觉都有串改题目
2、之嫌疑,原题的要求实在太简洁了,自己加的功能占了程序的大部分; 8 天下来感觉自己对 C 语言欢迎下载精品学习资源以及程序编辑的熟识加深了许多;以前觉得很难的结构体,数组,文件全部用到了,虽然并不能完全把握,那也有一些成就感;在这里要感谢老师以及我的同学,在整个编程中给了我很大的帮忙;目录前言 I1 题目要求 - 1 -2 需求分析 - 1 -3 概要设计 - 1 -3.1 设计思想 - 1 -3.2 软件运行与开发平台 - 2 -3.3 数据结构 - 2 -3.4 系统结构图 - 2 - 4 详细设计 - 2 -4.1 主函数 - 2 -4.3 公共函数 - 19 -(1) 加载函数 - 1
3、9 -(2) 学号输入函数 - 20 -(3) 输入三个科目分数函数- 20(4) 求平均值函数 - 21 -(5) 输入整个记录函数 - 21 -(6) 修改整条记录函数 - 21 -(7) 显示数据结构工程 - 22 -(8) 显示一个记录的函数- 22 - 5 测试、结果进行分析 - 23 -5.1 进入页面 - 23 -5.2 数据录入 - 24 -5.3 数据录入成功,直接返回菜单- 24 -5.4 不进行数据录入,直接进入菜单;目录 II4.2 各功能模块设计- 4 -(1)输入模块- 4 -(2)浏览模块- 5 -(3)添加模块- 6 -(4)查找模块- 7 -(5)修改模块-
4、13 -(6)排序模块- 16 -(7)储存模块- 19 - 25 -欢迎下载精品学习资源5.5 浏览数据 - 25 -5.6 添加数据 - 26 -5.7 浏览添加后的数据- 26 -5.8 查找按姓名查找- 27 -5.9 查找按学号查找- 27 -5.10 修改对分数 2 进行修改 - 28 -5.11 排序按平均分进行排序6 总结- 30 -7 参考文献 - 30 -8 附录- 31 - 28 -主要程序模块清单-31-欢迎下载精品学习资源1 题目要求原题:简洁的行编辑器【要求】(1) 设置一个简洁的行编辑器,每行以回车终止;(2) 数据以文件形式储存;(3) 编辑器具有查找、替换、修
5、改数据的功能;修改后:修改思路是将由行编辑器生成的文件换成有关结构体的内容,建立一个结构体输入关信息,生成文件,再实现查找、替换、修改数据等的功能;这里详细是参考书上同学成果治理系统,实现成果的录入,显示,查找,添加,储存等功能模块;2 需求分析依据题目要求,由于同学信息是存放在文件中,所以应供应文件的输入、输出等操作;在程序中需要浏览同学的信息,应供应显示、查找、排序等操作;另外仍应供应键盘式选择菜单实现功能选择;3 概要设计3.1 设计思想由于原题的特点,对题目进行了确定的拓展;本着提高自己编程才能,加深对C 语言重点、难点内容的懂得, 添加了关于结构体、数组以及文件的运用;将程序模块化,
6、使程序条理清楚,制作简洁,简洁读懂,并能体会到程序开发的思想与方法,加深对C 语言编程的熟识;欢迎下载精品学习资源3.2 软件运行与开发平台C语言, Windows 平台, VC6.0,3.3 数据结构此处选用了结构体的形式来存放每一个同学的信息,对与如干个同学接受了结构体数组;同学成绩治理系统按姓名查找按学号查找按分数1 排序按分数2 排序按分数3 排序按平均分排序3.4 系统结构图数据输数据显数据添数据查数据修排序数据保入示加找改存4 详细设计4.1 主函数主函数比较简洁,只供应了输入和菜单函数的调用;各个功能的模块用菜单方式选择;欢迎下载精品学习资源开头显示一系列功能选项输入 n,判定是
7、 12m 是否NY依据 n 的值调用各功能模块函数终止图 4.1 1【程序】void mainint q,w1 ;printftt*行编辑器 修改拓展版 *nn;printfttttt072092t周磊 t20211002238nn ;doprintftt重新录入数据请按1tt 进入菜单请按 2: bb ;scanf%d,&q ;ifq.=1&q.=2/*对选择数字作出判定 */w1=1 ;getchar;else w1=0;whilew1=1 ;ifq=1/*if语句选择要进行的操作*/ enter;elsemenu ;欢迎下载精品学习资源开头输入用户要输入同学记录的个数 n从 0n-1 调
8、用输入函数input ( i)YNi.=0 吗.调用储存函数save返回主菜单终止图 4.2 14.2 各功能模块设计(1) )输入模块考虑到自己在C 学习时遇到的问题,以及在考运算机二级时薄弱的地方,以及联系这个题目的要求,此处选用了结构体的形式来存放每一个同学的信息,对与如干个同学接受了结 构体数组;详细到各个数据的信息,学号和姓名接受了字符型数组,分数为整型,而平均 分接受了实型;/*定义结构体变量 */ struct studentchar num20 ;/* 学号 */ char name100 ;/* 姓名 */ int score3 ;/*分数 */ float ave;/* 平
9、均分 */stuN ;/*stuN 中每个元素对应一个同学*/ N 接受了宏定义的方式,可以随时在源程序中修改;【程序】/*输入模块 */ void enterint i,n ;printf 请输入同学数量 0-%d.:,N-1 ;欢迎下载精品学习资源scanf%d,&n ;printfn请输入数据 nn ;fori=0 ; in ;i+欢迎下载精品学习资源ifi.=0printfn输入第 %d 个同学记录 n,i+1 ;inputi ; /* 调用输入函数 */欢迎下载精品学习资源save; /* 调用储存函数 */(2) )浏览模块显示同学记录( 10 人一屏)按任意键显示下一屏按任意键返
10、回主菜单图 4.2 2该模块的功能是显示全部同学的记录信息,流程如图;【程序】/*浏览函数 */void browse/* 浏览模块,前面多次用到*/int i,n ;n=load ;printf_face ;fori=0 ; in ;i+ifi.=0&i%10=0/*目的是分屏显示 */printf 任意键连续 n ;getch;putsnn ;printf_onei ;printfnt 共有 %d 条记录 .n,n ;printfn 任意键返回 nn ;getch;欢迎下载精品学习资源开头调用加载函数,并运算可以记录的个数输入用户要追加同学记录个数K=m+ni 从 n 到 k 调用输入函数
11、 input (i)储存追加的记录终止图 4.2 3menu ;(3) )添加模块该模块的功能是用户需要增加新的同学记录,留意新添加的内容不能掩盖原先的记录;追加模块流程图:【程序】/*添加模块 */ void addint i,n,m,k ;FILE *fp ;n=load ;printf 请输入添加的同学个数0-%d.:,N-1-n ;scanf%d,&m ;/*m 为添加同学的个数*/ k=m+n-1 ;fori=n ; i=k ;i+printfn输入第 %d 个同学记录 n,i-n+1 ;inputi ;/* 调用输入函数 */iffp=fopenzhoulei.txt,ab=NUL
12、Lprintfn文件无法打开 n ;欢迎下载精品学习资源fori=n ; i=k ;i+iffwrite&stui,sizeofstruct student,1,fp=0 printf 文件写入错误 n ;fclosefp ;save;(4) )查找模块该模块在参考程序上做的确定规律上的修改,可以按姓名和按学号进行查找,找到以后, 可进行修改和删除信息的操作;由于改动便利,这里的按姓名和按学号查找分了两个函数,使函数比较烦缀,故函数仍可以进行优化;开头显示查找方式1其他让用户选择2调用按姓名查找函数 search_name调用按学号查找函数 search_no终止图 4.24【程序】a) 查找
13、模块/*查找函数 */ void searchint z,w1 ;doprintf 请输入查找方式:1.按姓名查找2. 按学号查找 bb ;欢迎下载精品学习资源scanf%d,&z ;ifz.=1&z.=2/*对选择数字作出判定 */w1=1 ;getchar;else w1=0;欢迎下载精品学习资源whilew1=1 ;ifz=1 elsesearch_name;/* 调用按姓名查找程序 */ search_no;/* 调用按学号查找程序 */欢迎下载精品学习资源b) 按姓名查找模块这个是依据姓名查找到对应的同学记录,但在此处程序有确定的缺陷,就是假如有相同的姓名,只能查到最上面的一个,而其
14、他的就不能找到;后来尝试修改时发觉,仍需要改动其他相应的函数,故没有进行下去;欢迎下载精品学习资源开头输入同学姓名Y是否找到此学生记录N显示找到的记录提示没有找到Y询问用户是否连续查找N让用户做出选择终止图 4.2 5【程序】/*按姓名查找 */ void search_nameint i,n,k,w1=1,w2,w3,w4;struct student s;n=load ;dodok=-1 ;printfnn请输入要查找的姓名!姓名 : ;scanf%s,s.name; /* 输入要修改的数据的姓名*/ printf_face ;/* 调用显示数据结构工程的函数*/ fori=0 ; in
15、;i+ifstrcmps.name,stui.name=0/*匹配姓名 */k=i ;/* 找到要修改的记录 */欢迎下载精品学习资源ifk=-1printf_onek ;break;/* 调用显示一个记录的函数*/欢迎下载精品学习资源 printfnn记录不存在 . ;printfnn是否连续? nt1. 是2.否 返回 bb ;scanf%d,&w1 ;ifw1=1search;else menu;欢迎下载精品学习资源 bb ;whilek=-1&w1=1;w4=0 ;w3=0 ;ifk.=-1printfnn请选择下一步: nt1. 查找其他2. 修改 3. 删除 4. 返回菜单scan
16、f%d,&w2 ;switchw2 case 2:w3=modify_datak,n ; break;case 3: printfn确定删除? nt1. 确定2.返回 bb ;scanf%d,&w4 ;ifw4=1stuk.ave=0 ;欢迎下载精品学习资源break;ifw3=1|w4=1save;printfnn操作成功 _ ;printfnn请选择下一步 :nt1. 查找其他2.返回 bb ;scanf%d,&w2 ;whilew2=1;menu ;c) 按学号查找模块这个函数是在按姓名查找模块的基础上做了相应的改动,由于学号具有唯独性,故不存在查不到相同学号的情形;欢迎下载精品学习资源
17、开头输入同学学号Y是否找到此学生记录N显示找到的记录提示没有找到Y询问用户是否连续查找N让用户做出选择终止图 4.2 6【程序】/*按学号查找程序 */ void search_noint i,n,k,w1=1,w2,w3,w4;struct student s;n=load ;dodok=-1 ;printf/n/n请输入要查找的学号!学号 : ;scanf%s,s.num ;printf_face ;fori=0 ; in ;i+ifstrcmps.num,stui.num=0k=i ;欢迎下载精品学习资源printf_onek ;break;ifk=-1 printfnn记录不存在 .
18、;printfnn是否连续? nt1. 是2.否 返回 bb ;scanf%d,&w1 ;ifw1=1search;else menu;欢迎下载精品学习资源单 bb ;whilek=-1&w1=1;w4=0 ;w3=0 ;ifk.=-1printfnn请选择下一步: nt1. 查找下一个2. 修改 3. 删除 4. 返回菜scanf%d,&w2 ;switchw2 case 2:w3=modify_datak,n ; break;case 3: printfn确定删除? nt1. 确定2.返回 bb ;scanf%d,&w4 ;ifw4=1stuk.ave=0 ;欢迎下载精品学习资源break
19、;ifw3=1|w4=1save;printfnn操作成功 _ ;printfnn请选择下一步 :nt1. 查找其他2.返回 bb ;scanf%d,&w2 ;whilew2=1;menu ;/*浏览函数 */void browse/* 浏览模块,前面多次用到*/int i,n ;n=load ;printf_face ;fori=0 ; in ;i+欢迎下载精品学习资源ifi.=0&i%10=0/*目的是分屏显示 */printf 任意键连续 n ;getch;putsnn ;printf_onei ;printfnt 共有 %d 条记录 .n,n ;printfn 任意键返回 nn ;ge
20、tch;menu ;(5) )修改模块该模块第一要显示全部同学的信息,并接受分屏显示;显示完全部记录后,用户输入要修改的同学的学号,依据学号查找同学记录,并提示用户修改该记录的哪部分信息;欢迎下载精品学习资源开头显示全部记录,让用户看哪条信息需要修改输入要修改的学号Ni.=0 吗.Y提示没有找到显示找到的记录,调用修改函数Y询问用户是否连续修改N返回主菜单终止图 4.2 7【程序】/*修改函数 */ void modifystruct student s;int i,n,k,w0=1,w1,w2=0 ;n=load ;dok=-1 ;printf_face ;/* 调用显示数据结构工程函数*/
21、 fori=0 ; in ;i+欢迎下载精品学习资源ifi.=0&i%10=0/*目的是分屏显示 */ printfnn记住你要修改的学号 .任意键连续 . ;getch;putsnn ;printf_onei ;/* 调用显示一个记录的函数*/doprintfnn请输入你想要修改的学号: ;scanf%s,s.num ;/* 输入要修改的数据的学号*/ fori=0 ;in ;i+ifstrcmps.num,stui.num=0欢迎下载精品学习资源stui*/k=i ;/* 找到要修改的记录*/s=stui ;/* 备份当次要修改的同学记录欢迎下载精品学习资源ifk=-1 printfnn记
22、录不存在 . ;/* 当 k=-1 表示没有找到 */whilek=-1 ;printf_face ;printf_onek ;w1=modify_datak,n ;/* 修改同学记录并返回储存把握值*/ ifw1=1欢迎下载精品学习资源t bb ;elseprintfn操作成功 _.nn 是否连续修改 .nnt1. 是 2.返回并储存scanf%d,&w0 ;w2=1 ;/* 用来把握储存,使w2=1 是标记已有过的修改 */w0=0 ;ifw2=1stuk=s ;欢迎下载精品学习资源ifw0.=1&w2=1save;/*w2不等于 1 表示在此次之前没有修改过,这是就储存用户已确认的修改并
23、返回*/whilew0=1 ;printfnn你所修改的内容不存在;menu ;欢迎下载精品学习资源(6) )排序模块该模块在原有的排序模块上做了确定的修改,可以依据分数1,、分数 2、分数 3 以及平均数进行由大到小的排序;这里选择了冒泡法排序;由于改动便利,这里的4 种排序方法在程序上其实是大同小异,因此程序仍需进行确定的优化;仍有一个问题就是排序终止后不能直接浏览,需要手动调用浏览模块;其缘由是在排序后调用了储存函数,而储存函数储存完毕要直接返回主菜单;假如先进行浏览的话,所显示内容不是排序后的;开头显示要进行的排序方式用户做出选择非 1414调用相应的函数终止图 4.2 8【程序】a)
24、 排序模块/*排序模块 */ void orderint m ;printf 请选择排序方式 :1.按分数 1 排序 2. 按分数 2 排序 3. 按分数 3 排序 4. 按平均分排序 nn ;scanf%d,&m ;switchmcase 1:order_score1 ;break;/* 分数 1*/ case 2:order_score2;break;/* 分数 2*/case 3:order_score3;break;/* 分数 3*/ case 4:order_ave;break; /* 平均分 */欢迎下载精品学习资源b按四种方式排序开头用冒泡法排序储存返回主菜单终止图 4.2 9/
25、*按平均分排序 */ void order_ave int i,j,n ;struct student s;n=load ;fori=0 ; in-1 ;i+/* 冒泡法排序 */forj=i+1 ;jn ;j+ if stui.avestuj.ave s=stui ;stui =stuj ;stuj =s ;save;putsnn ;menu ;/*按分数 1 排序 */ void order_score1 int i,j,n ;struct student s;n=load ;fori=0 ; in-1 ;i+/* 冒泡法排序 */forj=i+1 ;jn ;j+if stui.score
26、0stuj.score0 s=stui ;欢迎下载精品学习资源stui =stuj ;stuj =s ;save;putsnn ;menu ;/*按分数 2 排序 */ void order_score2 int i,j,n ;struct student s;n=load ;fori=0 ; in-1 ;i+/* 冒泡法排序 */forj=i+1 ;jn ;j+if stui.score1stuj.score1 s=stui ;stui =stuj ;stuj =s ;save;putsnn ;menu ;/*按分数 3 排序 */ void order_score3 int i,j,n ;
27、struct student s;n=load ;fori=0 ; in-1 ;i+/* 冒泡法排序 */forj=i+1 ;jn ;j+if stui.score2stuj.score2 s=stui ;stui =stuj ;stuj =s ;save;putsnn ;menu ;欢迎下载精品学习资源(7) )储存模块这个模块单独放在菜单里其实有点缀余,由于每个对文件进行写入或修改的操作都单独进行了储存;这里文件的读写全用的是二进制,所以储存的文件直接以文本打开后会显现乱码;【程序】/*储存函数 */ void save/* 储备函数 */int i ;FILE *fp ;iffp=fop
28、enzhoulei.txt,w=NULL /*按只写方式打开文件 */printf 文件无法打开 n ;/* 防止文件为空,并报错*/fori=0 ; iN ; i+ifstui.ave.=0/*stui.ave.=0表示此记录已删除 */ iffwrite&stui,sizeofstruct student,1,fp.=1/*这里用二进制进行文件的读写,是文件不能通过电脑直接打开*/printf 文件写入错误 n ;fclosefp ;printfnn储存成功 .nn 按任意键连续 nn ;getch;menu;/* 一般的储存模块,用于各种变动之后,文件的储存*/4.3 公共函数这里都是些
29、在每个模块都可能用到的公共函数(1) )加载函数/*加载函数 */ int loadFILE *fp ;int i ;iffp=fopenzhoulei.txt,rb=NULL/*以只读方式打开一个二进制文件*/printfn无法打开文件 n ;欢迎下载精品学习资源return NULL ;fori=0 ;.feoffp ;i+fread&stui,sizeofstruct student,1,fp;fclosefp ;returni-1 ;/* 返回记录个数 */(2) ) 学号输入函数/*学号输入函数 */void no_inputint i,int n/*i表示第 i 个同学的信息, n
30、 表示比较到第 n 个同学 */int j,k,w1 ;dow1=0 ;printf 学号 :;scanf%s,stui.num ;forj=0 ; stui.numj.=0;j+ /* 学号输入函数,作了严格的规定*/ifstui.numj9/*判定学号是否为数字 */欢迎下载精品学习资源ifw1.=1puts 输入错误!仅可输入 0-9 ,请重新输入! n ;w1=1 ;break;欢迎下载精品学习资源fork=0 ;kn;k+/* 比较到第 n 个同学 */* 排除第 i 个同学记录 */ifk.=i&strcmpstuk.num,stui.num=0/*判定学号是否有雷同 */puts
31、 此记录已存在,请重新输入.n ;w1=1 ;break;whilew1=1 ;(3) )输入三个科目分数函数/*i表示第 i 个同学记录 */ void score_inputint iint j ;forj=0 ; j3 ;j+欢迎下载精品学习资源printf 分数 %d:,j+1 ;scanf%d,&stui.scorej;/* 循环语句依次输入三个分数*/(4) )求平均值函数/*求平均值函数 */ void averageint iint j,sum ;forsum=0,j=0 ;j8|c1putsn 选择错误,请重新输入. ;getchar;/* 当输入是字符时可以防止是死循环*/
32、欢迎下载精品学习资源while.c=1;doswitchc/* 选择要修改的工程 */case 1:no_inputi,n ;break;case 2:printf 姓名 : ;scanf%s,stui.name ; break;case 3:printf 分数 1: ;scanf%d,&stui.score0;break;case 4:printf 分数 2: ;scanf%d,&stui.score1;break;case 5:printf 分数 3: ;scanf%d,&stui.score2;break;case 6:score_inputi ;break;case 7:inputi
33、;break;ifc2&c7averagei;putsn 新数据 :n ;printf_face ;/* 显示数据结构工程*/printf_onei ;/* 修改后的数据让用户确认*/printfn是否确定? nnt1. 是 2.否,重新修改 3. 直接返回 bb ;scanf%d,&w1 ;whilew1=2;returnw1 ;/* 返回把握值 */(7) )显示数据结构工程/*显示数据结构工程函数 */void printf_face/*显示数据结构工程函数*/printfnt学号 t 姓名分数 1分数 2分数 3平均 n ;(8) )显示一个记录的函数/*显示一个记录的函数 */ void printf_oneint iint j ;printf%11st%-17s,stui.num,stui.name ;forj=0 ; j3 ;j+printf%9d,stui.scorej;printft%9.2fn,stui.ave;/* 保留