C语言文本编辑器.doc_第1页
C语言文本编辑器.doc_第2页
C语言文本编辑器.doc_第3页
C语言文本编辑器.doc_第4页
C语言文本编辑器.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

附件二 4315c642f02aef6688977819bd11942d.pdf 【学生用】 西北农林科技大学信息工程学院数据结构与C语言综合训练实习报告题 目: 文本编辑器 学 号2011013228姓 名马跃专业班级电子商务112指导教师景旭实践日期2010年7月5日-7月16日目 录一、综合训练目的与要求1二、综合训练任务1三、总体设计1四、详细设计说明2五、调试与测试9六、实习日志15七、实习总结16八、附录:核心代码清单16一、综合训练目的与要求正文本综合训练是计算机科学与技术、信息管理与信息系统、软件工程专业重要的实践性环节之一,是在学生学习完程序设计语言(C)、数据结构课程后进行的一次全面的综合练习。本课综合训练的目的和任务:1 巩固和加深学生对C语言、数据结构课程的基本知识的理解和掌握2 掌握C语言编程和程序调试的基本技能3 利用C语言进行基本的软件设计4 掌握书写程序设计说明文档的能力5 提高运用C语言、数据结构解决实际问题的能力二、综合训练任务本综合训练是计算机科学与技术、信息管理与信息系统、软件工程专业重要的实践性环节之一,是在学生学习完程序设计语言(C)、数据结构课程后进行的一次全面的综合练习。本课综合训练的目的和任务:1 巩固和加深学生对C语言、数据结构课程的基本知识的理解和掌握2 掌握C语言编程和程序调试的基本技能3 利用C语言进行基本的软件设计4 掌握书写程序设计说明文档的能力5 提高运用C语言、数据结构解决实际问题的能力三、总体设计1. 设计题目-文本编辑系统2. 已知技术参数和设计要求1分别统计出其中英文字母数和空格数及整篇文章总字数;2统计某一字符串在文章中出现的次数,并输出该次数;(采用模式匹配算法)3删除某一子串,并将后面的字符前移;4实现某一个字符的替换;5实现某一个字符串的替换;四、详细设计说明1. 程序框架* 欢迎使用简单的文本编辑器 * 主菜单 * 1、输入文本内容 * 2、显示当前文本内容 * 3、文本内容统计菜单 * * 4、文本内容处理菜单 * 5、关于 * 6、退出本系统 * 注:第一次使用本系统时请选择1号功能 *判断123456文本内容的输入,CreatWord(),将文本内容输入到已申请的存储空间中显示函数,List,将当前文本中内容显示出来文章内容统计菜单,CountWord(),以菜单形式显示给用户,对文章的内容进行各种方式的统计文章内容处理菜单,Bmenu(),这部分为一子菜单,使用了包括Search、DeleteInsert等多个函数,对文章内容进行处理一个类似与作者信息的代码,AboutWord(),显示作者信息退出系统图1 简单的文本编辑器主框架* 文章内容统计菜单 * 1、文章中大写字母的个数 * 2、文章中小写字母的个数 * 3、文章中数字的个数 * 4、文章中标点符号的个数 * 5、文章中空格的个数 * 6、文章中所有字数 * 7、退出返回主菜单 * 8、直接退出本系统 * *判断统计文本中大写字母个数1统计文本中小写字母个数2统计文本中数字的个数3统计文本中标点符号的个数4统计文本中空格的个数5统计文本所有字数6返回到主菜单7直接退出系统8两个子菜单:如选择上图中功能3,则有:图2 简单的文本编辑器-文本内容统计菜单如选择功能4,则有:* 文章内容处理菜单 * 1、查找文章中的字符或者字符串 * 2、删除文章中的字符或者字符串 * 3、向文章中插入字符或者字符串 * 4、复制字符或者字符串 * 5、修改行内容 * 6、替换字符或者字符串 * 7、返回主菜单 *判断123456使用子函数Search (),对存储在链表中的文本进行字符或者字符串查找使用子函数Delete (),对存储在链表中文本进行字符或者字符串的删除使用子函数Insert (),对存储在链表中的文本进行字符或者字符串的插入使用函数Copy ()复制字符或者字符串使用函数Modify()修改行内容使用函数Replace()替换字符或者字符串图3 简单的文本编辑器-文本内容处理菜单2. 模块功能说明1. 主要函数组成1. Hollow() 标题函数主菜单函数,其结果为图1所显示部分,将1、2、3、4、8、9等函数合。2. Edit() 文本输入函数,实现上图1菜单功能1,对文本的内容进行输入;3. List() 当前文本内容输出函数,实现上图1菜单功能2以及图3中功当4. 前存储在链表中的文本内容输出;5. CountWord() 文章内容统计函数,实现上图1菜单功能3,对存储在链表中进行统计,包括对文本内容中的大写字母、小写字母、数字、标点符号、空格以及所字6. Replace() 文章内容替换函数,实现上图3菜单功能替换部分7. Search() 文章内容查找函数,实现上图3菜单功能1中查找部分8. Copy() 文章内容复制函数,实现上图3菜单复制部分9. Delete() 文章内容删除函数,实现上图3菜单功能2中删除部分10. Save() 文章内容保存函数,实现上图3菜单保存部分11. Insert() 文章内容插入函数,实现上图3菜单功能3中插入部分12. Bmenu() 第二子菜单函数,实现上图1菜单功能4,图3是此函数实现的结果它将5、6、7各子函数集合在此函数中13. About() 显示作者信息的函数,实现上图1菜单功能514. main() 主函数2. 其余函数详解1. Status StrAssign(HString &T,char *chars) 生成一个其值等于串常量chars的串T2. Status StrCopy(HString &T,HString S)初始条件: 串S存在。操作结果: 由串S复制得串T3. Status StrEmpty(HString S) 初始条件: 串S存在。操作结果: 若S为空串,则返回TRUE,否则返回FALSE4. int StrCompare(HString S,HString T) 若ST,则返回值0;若S=T,则返回值=0;若ST,则返回值05. int StrLength(HString S) 返回S的元素个数,称为串的长度6. Status ClearString(HString &S)将S清为空串7. Status Concat(HString &T,HString S1,HString S2)用T返回由S1和S2联接而成的新串8. Status SubString(HString &Sub, HString S,int pos,int len) 用Sub返回串S的第pos个字符起长度为len的子串。其中,1posStrLength(S)且0lenStrLength(S)-pos+19. void InitString(HString &T)10. int Index(HString S,HString T,int pos)算法4.1 T为非空串。若主串S中第pos个字符之后存在与T相等的子串,则返回第一个这样的子串在S中的位置,否则返回011. Status StrInsert(HString &S,int pos,HString T) 1posStrLength(S)+1。在串S的第pos个字符之前插入串T12. Status StrDelete(HString &S,int pos,int len)从串S中删除第pos个字符起长度为len的子串13. Status Replace(HString &S,HString T,HString V)初始条件: 串S,T和V存在,T是非空串(此函数与串的存储结构无关)操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串14. void DestroyString() 堆分配类型的字符串无法销毁15. void StrPrint(HString T) 输出T字符串。3. 程序函数细节1 Creat()文本内容输入函数1.1.1 具体创建过程如下:1.2 定义文件变量*sfp: FILE*sfp;1.3 打开文件:if(sfp=fopen(d:/0.txt,a+)=NULL)1.4 1.4.1 printf(打开文件失败);1.4.2 exit(0);1.5 使用循环操作进行输入操作:while(c!=EOF)1.6 fputc(c,sfp);c=getchar();1.7 fclose(sfp); 2 List()当前文本输出函数2.1.1 本子函数功能为将当前存储在链表中的文本信息输出在屏幕上,具体伪码算法如下:2.2 定义文本行数变量n,每行字符数i:int i,j;2.3 利用循环输出信息:2.3.1 for(i=0;in;i+)2.3.2 2.3.2.1 printf(%d: ,i+1);2.3.2.2 StrPrint(Ti);2.3.3 2.3.4 getchar();文本输出函数到此结束。3 CountWord() 文本内容统计函数3.1.1 本子函数是对文本中内容进行统计。具体伪码算法如下:3.1.2 定义记录文本大写字母数、小写字母数、空格数、数字数、标点数和总字数的变量:3.1.3 int WORD=0,word=0,space=0,num=0,punct=0,sum=0;3.1.4 利用循环对链表中信息进行匹配判断,将大写字母数、小写字母数、空格数、数字数、标点数和总字数统计出来: 3.1.5 for(i=0;in;i+)3.1.6 3.1.7 for(j=0;j=A)&(ch=a)&(ch=0)&(ch=9)3.1.15 num+;3.1.16 else if(ch= )3.1.17 space+;3.1.18 else if(ch=33|ch=34|ch=39|ch=44|ch=46|ch=58|ch=59|ch=63)3.1.19 punct+;3.1.20 3.1.21 3.1.22 sum=WORD+word+num;本程序对统计项目设计了菜单提供给用户选择。3.1.23 菜单的编写使用do while语句进行循环操作,此部分不再多谈。4 Search ( ) 文本内容查找函数4.1.1 本子函数是对文本内容进行查找并且对查找的内容进行统计其出现的次数。4.1.2 具体伪码算法如下:4.2 int i,k,f=1; char b;HString s;/ f为继续查找标志定i4.3 利用循环进行查找操作,核心算法为:4.3.1 for(i=0;i=l+m-1&l0)5.3.1.2 5.3.1.3 for(i=l-1+m;in;i+)5.3.1.4 Ti-m=Ti;5.3.1.5 for(i=n-m;iMAX_LEN)6.1.2 6.1.3 printf(插入行太多n);6.1.4 return;6.1.5 ;对输入的字符进行插入操作,具体核心算法如下:6.1.5.1 for(i=n-1;i=l-1;i-)6.1.5.2 Ti+m=Ti;6.1.5.3 n+=m;6.1.5.4 printf(请顺序输入待插入内容:n);6.1.5.5 for(i=l-1;il-1+m;i+)6.1.5.6 6.1.5.7 gets(str);6.1.5.8 InitString(Ti);6.1.5.9 StrAssign(Ti,str);6.1.5.10 7 Bmenu()文本内容处理菜单本函数为文本内容处理菜单,即使用循环语句对文本内容处理部分的子函数集中在此函数中。8 About() 输出信息函数8.1.1 这两个子函数为本人自己另加的输出程序信息的函数;8.1.2 About()是显示作者信息;9 main()9.1.1 本人将主菜单单独创建为一个子函数,方便观看。仍然是很简单的循环语句实现。9.1.2 主函数为: 9.1.2.1 for(i=0;iMAX_LEN;i+) / 初始化串9.1.2.2 InitString(Ti);9.1.2.3 while(s)9.1.2.4 Hollow();五、调试与测试本程序是在CodeBlock中编写,程序运行环境:WINDOWS根据程序的提示即可完成文本编辑器的各项功能。1.首先打开程序,截图如下:2.按要求输入文本,截图如下:3.打开文件,截图如下:4.显示内容,截图如下:5.进入统计菜单界面:6.进入内容处理菜单界面:总结:除了输入时有些小毛病外,其他一切良好,基本完成任务。但任务要求做出图形界面程序,所以我又用VB和QT做了另外两个文本编辑系统。VB的编辑系统:QT的编辑系统:六、实习日志2012年7月6日 今天是实习的第一天,我的题目是文本编辑系统。我觉得首先应该对于程序的功能有一个大的框架,经过和同学老师的商量讨论,在题目要求的基础上拓展了好多的功能,下一步就是通过代码实现功能了。2012年7月7日 实习的第二天,在老师的提议下开始详细的写设计说明。我用流程图的形式将功能展示出来,这样会使各个功能之间的关系看起来一目了然。看来是万事俱备只欠东风。老师的帮助真的很重要啊。2012年7月8日 今天开始编程序,发现并没有想象中的那么顺利。所以首先将该用到的程序好好复习了一下,感觉心里踏实多了。然后开始着手编小程序,到时候再把他们连接在一起就好。只是真正动手做起来好难啊,只做了一点点就头晕眼花的。2012年7月9日 今天继续编一个个子函数,有了昨天的铺垫,觉得不那么难了。通过不断的试验和请教老师同学,终于完成好多的子函数,仿佛已经看到的一片光明的未来。 2012年7月10日 今天已经是实习的第五天了,我动用了一切可以动用的资源,终于完成了各个子函数的编程。我根据之前的画流程框图的构建嵌套的大框架,只可惜最终才完成了一部分。虽然有点累,但还是很开心,觉得过的无比的充实。2012年7月11日 今天继续完成程序框架的嵌套,功夫不负有心人,总算是弄完了。无比激动的运行之后发现就编译错误就有好多,这无疑给我泼了一大盆的冷水。虽然觉得很麻烦,但是没办法,还是乖乖的改吧2012年7月12日 今天继续修改程序,按照计划今天可是最后一天改程序了,时间紧迫。我集中精力的排查错误,终于基本改好了,剩下的一点点小问题。只能留到明天解决了。2012年7月13日 今天调动所有的脑细胞,终于将程序完全的改完了,开始写课程设计报告了。这个报告只要按自己的真实想法真心体会来写,比编程序轻松多了呢。2012年7月14日 今天完成了实习报告的撰写和整合,并且向老师建议的那样再做了ppt。让我对自己程序的框架更加的明白,还锻炼了其他各个方面的能力,真是一举多得啊。我相信这几天的努力没有白费,我很期待明天的答辩。七、实习总结得到文本编辑器这一课程设计题目时,自己还比较害怕是制作向windows系统中记事本一样的程序。看了任务书之后自己有了些欣慰,任务书上要求是对输入的信息进行操作,这是我们经常练习的内容,虽然是比平时练习的更为难,更有深度,但自己毕竟知道该向什么方向去努力,自己应该如何去编写这个程序。所以自己在整个课程设计过程中还是比较轻松的,编写过程中遇到的困难及问题都通过查阅资料、向老师提问得以解决。这都是基于对课题有一个明确的了解,清楚向什么方向去写。所以本次课程设计自己最大的体会就是不管写什么程序,自己首先得对这个问题要分析透彻,要知道自己要干什么,然后才能让自己干什么。 我相信自己能更加努力,在这条路上会走的更远。八、附录:核心代码清单#include #include #include / malloc()等 #include / INT_MAX等 #include / EOF(=Z或F6),NULL #include / atoi() #include / eof() #include / floor(),ceil(),abs() #include / exit() #include / cout,cin #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 / #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 typedef int Status; / Status是函数的类型,其值是函数结果状态代码,如OK等 typedef int Boolean; / Boolean是布尔类型,其值是TRUE或FALSE / c4-2.h 串的堆分配存储 struct HString char *ch; / 若是非空串,则按串长分配存储区,否则ch为NULL int length; / 串长度 ; / bo4-2.cpp 串采用堆分配存储结构(由c4-2.h定义)的基本操作(15个) / 包括算法4.1、4.4 Status StrAssign(HString &T,char *chars); Status StrCopy(HString &T,HString S); Status StrEmpty(HString S); int StrCompare(HString S,HString T); int StrLength(HString S); Status ClearString(HString &S); Status Concat(HString &T,HString S1,HString S2); Status SubString(HString &Sub, HString S,int pos,int len); void InitString(HString &T); int Index(HString S,HString T,int pos); / 算法4.1 Status StrInsert(HString &S,int pos,HString T); / 算法4.4 Status StrDelete(HString &S,int pos,int len); Status Replace(HString &S,HString T,HString V); void DestroyString(); void StrPrint(HString T); #define MAX_LEN 2500 / 文件最大行数 #define LINE_LEN 75 / 每行字符数最大值+1 #define NAME_LEN 20 / 文件名最大长度(包括盘符、路径)+1 HString TMAX_LEN; char strLINE_LEN,filenameNAME_LEN=; FILE *fp; int n=0; / 文件行数 void Edit(); void Open(); void List(); void CountWord(); void Insert(); void About(); void Delete(); void Copy(); void Modify(); void Search(); void Replace(); void Save(); void Bmeun(); void Hollow(); int main() Status s=TRUE; system(color 75); int i; for(i=0;iMAX_LEN;i+) / 初始化串 InitString(Ti); while(s) Hollow(); Status StrAssign(HString &T,char *chars) / 生成一个其值等于串常量chars的串T int i,j; if(T.ch) free(T.ch); / 释放T原有空间 i=strlen(chars); / 求chars的长度i if(!i) / chars的长度为0 T.ch=NULL; T.length=0; else / chars的长度不为0 T.ch=(char*)malloc(i*sizeof(char); / 分配串空间 if(!T.ch) / 分配串空间失败 exit(OVERFLOW); for(j=0;ji;j+) / 拷贝串 T.chj=charsj; T.length=i; return OK; Status StrCopy(HString &T,HString S) / 初始条件: 串S存在。操作结果: 由串S复制得串T int i; if(T.ch) free(T.ch); / 释放T原有空间 T.ch=(char*)malloc(S.length*sizeof(char); / 分配串空间 if(!T.ch) / 分配串空间失败 exit(OVERFLOW); for(i=0;iT,则返回值0;若S=T,则返回值=0;若ST,则返回值0 int i; for(i=0;iS.length&iT.length;+i) if(S.chi!=T.chi) return S.chi-T.chi; return S.length-T.length; int StrLength(HString S) / 返回S的元素个数,称为串的长度 return S.length; Status ClearString(HString &S) / 将S清为空串 if(S.ch) free(S.ch); S.ch=NULL; S.length=0; return OK; Status Concat(HString &T,HString S1,HString S2) / 用T返回由S1和S2联接而成的新串 int i; if(T.ch) free(T.ch); / 释放旧空间 T.length=S1.length+S2.length; T.ch=(char *)malloc(T.length*sizeof(char); if(!T.ch) exit(OVERFLOW); for(i=0;iS1.length;i+) T.chi=S1.chi; for(i=0;iS2.length;i+) T.chS1.length+i=S2.chi; return OK; Status SubString(HString &Sub, HString S,int pos,int len) / 用Sub返回串S的第pos个字符起长度为len的子串。 / 其中,1posStrLength(S)且0lenStrLength(S)-pos+1 int i; if(posS.length|lenS.length-pos+1) return ERROR; if(Sub.ch) free(Sub.ch); / 释放旧空间 if(!len) / 空子串 Sub.ch=NULL; Sub.length=0; else / 完整子串 Sub.ch=(char*)malloc(len*sizeof(char); if(!Sub.ch) exit(OVERFLOW); for(i=0;i0) n=StrLength(S); m=StrLength(T); i=pos; while(i=n-m+1) SubString(sub,S,i,m); if(StrCompare(sub,T)!=0) +i; else return i; return 0; Status StrInsert(HString &S,int pos,HString T) / 算法4.4 / 1posStrLength(S)+1。在串S的第pos个字符之前插入串T int i; if(posS.length+1) / pos不合法 return ERROR; if(T.length) / T非空,则重新分配空间,插入T S.ch=(char*)realloc(S.ch,(S.length+T.length)*sizeof(char); if(!S.ch) exit(OVERFLOW); for(i=S.length-1;i=pos-1;-i) / 为插入T而腾出位置 S.chi+T.length=S.chi; for(i=0;iT.length;i+) S.chpos-1+i=T.chi; / 插入T S.length+=T.length; return OK; Status StrDelete(HString &S,int pos,int len) / 从串S中删除第pos个字符起长

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论