c语言程序设计文版本编辑器LJA.docx

上传人:b****8 文档编号:11472553 上传时间:2023-03-01 格式:DOCX 页数:64 大小:388.83KB
下载 相关 举报
c语言程序设计文版本编辑器LJA.docx_第1页
第1页 / 共64页
c语言程序设计文版本编辑器LJA.docx_第2页
第2页 / 共64页
c语言程序设计文版本编辑器LJA.docx_第3页
第3页 / 共64页
c语言程序设计文版本编辑器LJA.docx_第4页
第4页 / 共64页
c语言程序设计文版本编辑器LJA.docx_第5页
第5页 / 共64页
点击查看更多>>
下载资源
资源描述

c语言程序设计文版本编辑器LJA.docx

《c语言程序设计文版本编辑器LJA.docx》由会员分享,可在线阅读,更多相关《c语言程序设计文版本编辑器LJA.docx(64页珍藏版)》请在冰豆网上搜索。

c语言程序设计文版本编辑器LJA.docx

c语言程序设计文版本编辑器LJA

 

 

计算机课程设计(论文)

题目:

文本编辑器

学院:

测试与光电工程学院

专业名称:

测控技术与仪器

班级学号:

学生姓名:

LJA

指导教师:

 

二O一O年十一月

测试与光电工程学院

课程设计课题申报表

系2008级学生

相关课程

C语言

指导教师

学生人数

1

课题名称

文本编辑器

设计地点

检测楼204

课题工作内容

 

1.巩固和加深对C语言课程的基本知识的理解和掌握。

2.掌握C语言编程和调试的基本技能。

3.掌握结构体和链表的概念和应用。

4.掌握全局变量和数组的概念和应用。

5.掌握图形函数库的基本功能和使用。

6.撰写课程设计报告。

 

系负责人签字:

申报人:

2010年11月10日

测试与光电工程学院

课程设计任务书

测控技术与仪器系班学号姓名

课题名称:

文本编辑器

课题要求:

1.利用C语言的单链表数据结构及相关函数,编程实现一个与DOS环境下Edit相似的文本编辑器。

2.在此文本编辑器中,用户可以通过快捷键和选择菜单项,完成基本的文本编辑和文件处理工作。

3.要求界面简单美观,操作简单方便。

课题进程:

1.功能描述11周—12周

2.总体设计12周—13周

3.数据结构设计13周—14周

4.程序实现14周—16周

5.撰写实验报告15周—16周

 

指导教师:

摘要

文本编辑器是最常用的文本创建和编辑工具,随着计算机科学与技术的发展,用来处理文本的编辑器随处可见,并且形式多样。

比如windows下的记事本、写字板、EditPlus、UltraEdit等都是十分优秀的文本编辑和处理工具。

本文即是利用C语言来开发一个简易的文本编辑器。

通过本文可以了解到文本编辑器的开发过程,掌握菜单的开发技巧,加深对文件操作的理解。

关键词:

文本编辑、文件、菜单、剪切板、帮助

 

引言1

第一章功能描述1

2.1.1程序执行主流程3

2.1.2文件操作模块3

2.1.3文本编辑模块3

2.1.4剪切板操作模块3

2.1.5菜单控制模块3

2.1.6帮助及其他模块3

2.2.1与剪切板相关的record结构体3

2.2.2与单链表相关的node结构体3

2.2.3与行单链表相关的Hnode结构体3

2.2.4全局变量及其数组3

致谢1

引言

C语言是一种面向过程的计算机程序设计语言,它是目前众多计算机语言中举世公认的优秀的结构程序设计语言之一。

C语言功能齐全。

具有各种各样的数据类型,并引入了指针概念,可使程序效率更高。

另外C语言也具有强大的图形功能,支持多种显示器和驱动器。

而且计算功能、逻辑判断功能也比较强大,可以实现决策目的的游从C语言产生到现在,它已经成为最重要和最流行的编程语言之一。

在各种流行编程语言中,都能看到C语言的影子,如Java的语法与C语言基本相同戏。

C程序设计是应用性很强的一门课程它既有理论又有实践,既讲方法又讲动手能力,是计算机及相关专业中一门重要的计算机基础课程,通过课程设计巩固和加深学生对C语言课程的基本知识的理解和掌握;掌握C语言编程和程序调试的基本技能。

本文即是通过对文本编辑器这一常见的文本处理工具的设计和编写,实践C语言的理论知识和掌握C语言的基本技能,本文将涉及到程序设计的主要环节,也是对文本编辑相关知识学习的加深与扩展。

第一章功能描述

如图1.1所示,文本编辑器主要由五大功能模块构成,它们分别是文件操作模块,文本编辑模块,剪切操作模块,菜单控制模块和帮助及其他模块。

下面分别简要介绍功能模块的功能。

(1)文件操作模块。

在文件操作模块中,主要完成文件的创建,打开,保存和另存操作。

用户可以选择File菜单上的New子菜单来完成新建文本文件操作;选择File菜单上的Save子菜单来完成保存文件操作选择File菜单上的Open子菜单来完成打开文件操作;选择Flie菜单上的Saveas子菜单来完成文件的另存为操作。

在文件的打开,保存和另存为操作中,系统会提示用户输入文件路径及文件名。

值得一提的是,当用户打开一个文件时,指定的文件必须存在,否则系统会报错。

(2)文本编辑器模块。

在文本编辑器模块中,主要完成在编辑窗口中以添加或插入的方式输入字符,删除光标所在当前位置的单个字符或前一个位置的单个字符,朝上下左右4个方向的光标移动操作。

当光标所在位置及后面的位置没有字符时,系统会以添加的方式输入字符;当光标所在位置及后面的位置有字符时,系统会已插入的方式输入字符。

用户可以使用BackSpace键删除光标前一个字符,也可以使用Del键删除当前位置的字符或删除Ctrl+左移(右移)键i选定了的多个字符。

用户可以使用左移键(←),右移键(→),上移键(↑)和下移键(↓)来移动光标位置。

(3)剪贴板操作模块。

在剪贴板操作模块中,主要完成对已选定文本的剪切,复制,粘贴工作。

如果用户要剪切文本以便可以将它移动到其他位置,可通过Ctrl+X左移键(右移键)先选定文本,然后选择Edit菜单上的Cut子菜单或按Ctrl+X快捷键来完成剪切任务。

如果用户要复制文本以便可以将它黏贴到其他位置,必须先选定文本,然后选择Edit菜单上的Copy紫菜单或按Ctrl+C快捷键来完成复制任务。

如果用户要粘贴剪切或复制的文本,必须将光标置于要粘贴文本的位置,然后选择Edit菜单上的Paste子菜单或按Ctrl+V快捷键来完成粘贴任务。

(4)菜单控制模块。

在菜单控制模块中,主要完成菜单的显示。

光带条在子菜单之间的上下移动或菜单之间的左右移动和子菜单项的选取。

本文本编辑器共有Flie,Edit和Help3个子菜单项,用户可以分别按F1,F2和F3功能键来完成这3个菜单项的调用,即显示某项菜单。

用户可按光标上移或下移键在某菜单项的子菜单之间循环移动,也可使用光标的左移或右移键在3个菜单项之间循环移动。

当光带移动到某个字菜单项上时,用户此时可使用Enter键来选取相关菜单选项。

(5)帮助及其他模块。

在帮助及其他模块中,主要完成系统功能及按键的简要介绍。

其他模块包括文本的快速预览和窗口的显示。

用户可按F10功能键来打开快速预览窗口,在快速预览窗口中没有功能菜单条。

主窗口要有菜单栏,文本编辑区和状态栏三大部分构成,菜单栏用来显示菜单项,文本编辑区主要用来文本字符的输入,删除等操作,状态栏主要用来显示当前光标在文本窗口中的坐标值。

图1.1文本编辑器功能模块图

 

第二章系统总体设计

2.1功能模块设计

2.1.1程序执行主流程

文本编辑器程序执行主流程如图2.1所示,它是在main()函数中实现的。

他首先初始化一些全局变量及结构数组,接着调用drawmain()函数来显示主窗口,然后调用while

(1)进入主循环,等待用户按键,最后程序根据用户的按键值,进行相应的处理,完成文本编辑的相关工作。

下面对图2.1中的按键判断和相关处理作补充说明。

①若按键为常规字符,即其ASCII码大于32小于127,则继续判断在文本编辑区的当前光标位置有没有字符,若有字符,则调用insert()函数,将此字符插入在当前位置,否则在判断没有满行后,将此字符添加在单链表的数据域中,若此行已满,则执行添加新行操作。

②若按键为Enter键,则将光标移至下一行的行首,等待用户输入新的字符。

③若按键为光标移动键(左,右,上,下)且移动后的位置满足相关条件,则执行gotoxy()操作,将光标移动至目标位置。

④若按键为BackSpace键,则将调用Del()函数将光标的前一个字符从单链表中删除;若按键为Del键,也将调用del()函数将光标的当前位置的字符从单链表中删除。

⑤若按键为Ctrl开头的按键,则执行与其相关的操作。

具体来说,若为Ctrl+左移键(←),则将选定当前光标的位置开始向右的一个字符,若按住Ctrl键不放,连续按右移键,可以选定多个字符。

若为Ctrl+左移键(←),则将执行与以上相同的操作。

若为Ctrl+X键,则将选定相关内容保存起来,且从单链表中删除选定的字符后重新显示单链表的内容。

若为Ctrl+C键,则将选定的相关内容保存起来,重新显示单链表中的内容(目的:

为了去除字符的底色)。

若为Ctrl+V键,则调用insert()函数将保存起来的字符插入在单链表中,并重新显示单链表中的内容。

⑥若按键为F10键,则调用qview()函数,实现文本的快速预览。

若按键为F1,F2,F3功能键,则调用menuctrl()菜单控制函数,在此函数中完成案件的具体判断和执行相应功能操作。

若为F1键,则调用File菜单;若为F2键,则调用Edit菜单;若为F3键,则调用Help菜单。

2.1.2文件操作模块

在此模块中,主要实现文件的新建、打开、保存和另存为操作。

在此系统中,文件的新建操作实现比较简单,文件另存为操作与保存操作类似,下面重点介绍在此文本编辑器程序中,文件的打开和保存操作的具体设计和实现。

在介绍之前,我们先简单描述一下程序中用到的保存数据的数据结构。

在此程序中,共有两种类型的单链表,我们称其为行单链表和列单链表,一个列单链表用来保存一行的字符,有多少行即有多少个这样的单链表。

行单链表只有一个,它的每个节点的数据域用来保存不同列单链表的首节点的地址。

例如,第4行第4列的字符保存在行单链表的第4个节点的数据域所指的列单链表的第4个节点的数据域中。

①打开文件

它首先提示用户输入要打开文件的文件名,若该文件不存在或由于其他原因打开失败,则会结束文件打开操作。

若文件成功打开并且文件指针没有到文件尾,则从文件中一次读取一个字符,并将该字符添加到一列单链表节点中,直至遇到换行符(ASCII码10)或连续读取字符个数大于76(在此文件编辑器中,每行最多为76个字符)。

当列单链表形成后,它的首地址将被保存至行单链表的相应节点的数据域中,如此动作,直至文件指针指向文件尾部而结束。

②保存文件

保存文件操作主要完成将单链表中的数据写入文件中的任务,它的具体实现流程如下。

ⅰ户输入一个保存此单链表数据的文件名。

ⅱ以只写方式打开此文件,若成功打开此文件,则执行步骤(3);否则退出。

ⅲ读取行单链表中的节点数据域的值,若值不为空,则执行步骤(4);否则执行步骤(6)。

ⅳ依次读取行单链表节点中保存的首地址的相应列单链表节点的数据域的值,若其值为回车符,则用换行符替代后将其写入文件中;否则直接将其值写入文件中,直至该列单链表中指针域为NULL的最后一个元素结束。

ⅴ读取行单链表中的下一个节点,并跳至步骤(3)。

ⅵ关闭文件,退出。

2.1.3文本编辑模块

在文件编辑模块中,主要完成以添加或插入的方式输入字符、删除光标所在的当前位置或前一个位置的单个字符、朝上下左右4个方向的光标的移动操作。

下面介绍这4个功能的具体设计与实现。

①添加字符

当光标处在文本编辑的最后一行的位置且光标后面没有字符时,若此时输入字符,程序会判断一行中字符的个数,若字符个数不等于76,则在当前的列单链表的最后一个节点中保存输入的字符,然后添加一个新的节点来保存下一个输入的字符:

若等于76,则在当前的列单链表的最后一个节点中保存输入的字符,然后在行单链表中添加一个新节点用来保存下一行的列单链表的首地址,添加一个新的列单链表节点来保存下一个用户输入的字符。

②插入字符

若光标所在处已经存在字符,当用户在当前位置输入字符时,程序会调用insert()函数将输入的字符在光标所在的位置处在列单链表中插入,插入完成后,会调用test()函数来检查各行是否满足只有76个字符的条件,若不满足此条件,则在此函数中会对多出的字符进行处理。

下面分别对列单链表中字符的插入过程和单链表的检查过程进行介绍。

若在第m行,第n列的位置插入一个字符,其insert()过程描述如下:

ⅰ定位至行单链表中的第m个节点,得到这个节点的数据域的值,其值为对应列单链表中第一个节点的地址。

ⅱ定位至列单链表中的第n-1个节点。

ⅲ创建一个新的列单链表节点,用其数据域保存输入的字符。

ⅳ若字符插入在第m行第1列,则直接将行单链表中第m个节点的数据域的值改变为新的列单链表节点的地址,新的列单链表节点的指针域指向列单链表中原来的第1个节点。

若字符不是插入在第m行第1列,则执行简单的单链表中插入节点的操作。

ⅴ插入此字符后,调用test()函数,从第m行开始检查各行是否满足每行只允许有76个字符的条件,若不满足此条件,则必须进行处理。

其test()检查处理过程描述如下:

ⅰ用指针tail指向已经插入了新节点的列单链表中的最后一个节点。

ⅱ若此单链表中节点数超过76个,则指针p1会指向此列单链表中的第76个节点,指针p2指向第77个节点,并将p1所指节点的指针域设置为NULL。

ⅲ若tail所指节点的数据域为Enter键(ASCII为13)且在行单链表中只有m个节点,则在此行单链表中添加一个新的节点,新节点的数据域为p2的值,指针域为空,并将m节点的指针域指向它;若tail所指节点反而数据域为Enter键(ASCII为13)且在行单链表中有多于m个节点,与上面不同的是,它执行的是在行单链表插入一个新的节点的操作。

ⅳ若tail所指节点的数据域不是回车符,p1的数据域为回车符并且行单链表中只有m个节点,则在行单链表中添加一个新的节点,新节点的数据域为p2的值,指针域为空,并将第m节点的指针域指向它;若tail所指节点的数据域不为回车符并且行单链表中有多于m节点,则将tail的指针域指向行单链表中第m+1个节点所指的列单链表的首节点,并将行单链表中第m+1个节点的数据域修改成指针p2的值,并对行单链表中第m+1个节点所指的列单链表进行test()检查,相似的处理过程至行单链表中的最后一个节点结束。

③删除字符

当用户按下Del键时,系统会调用del()函数在单链表中删除当前光标所在处的字符;当用户按下BackSpace键时,系统也会调用这个函数在单链表中删除当前光标所在处前一个位置的字符。

若在第m行、第n列的位置删除一个字符,其在列单链表中删除一个节点的操作域插入工作十分相似,所以这里重点介绍删除该字符后,单链表中数据的前移工作过程。

ⅰ在相应的列单链表中删除第n个节点。

ⅱ判断第m行是否存在并且判断在此行中是否有字符,若第m行不存在,或此行中没有字符,则结束字符删除过程,否则执行步骤(3)。

ⅲ用tail保存第m行相应列单链表中最后一个节点的地址,并将最后一个节点的指针域保存为第m+1行中相应列单链表的第一个元素的地址。

ⅳ计算出第m行中没有字符的位置的个数num,然后在第m+1行的相应列单链表中截取num个节点,并将行单链表中的第m+1节点的数据域改为相应列单链表中的第num个节点后的节点的地址。

ⅴ调用m++语句,是变量m增1,跳至步骤(3),开始对下一行进行处理。

2.1.4剪切板操作模块

在剪切板操作模块中,主要完成对已选定文本的剪切、复制和粘贴工作,因此剪贴板操作与文本选定工作密切相关。

下面分别介绍文本的选定和对选定文本的剪切、复制和粘贴操作的具体实现。

①选定文本

用户可按Ctrl+<-或Ctrl+->来选定文本,就具体实现而言,两者基本相同。

在介绍选定文本的实现过程之前,先简要介绍一个全局的结构数组r[],它的元素的类型为record结构体类型,每一个元素可保存一个字符的x坐标、y坐标和字符值。

其文本选定的实现过程如下:

ⅰ当用户按下Ctrl+<-或Ctrl+->键时,程序将当前光标位置向左或向右移动一个位置。

ⅱ当前光标所在位置的字符的x坐标、y坐标和字符值保存在数组元素r[value]中value从0开始,若按减为Ctrl+<-,value值在原来基础上每次加1;若按键为Ctrl+->,value值在原来基础上每次减1.

ⅲ调用Colorview()函数,用不同的颜色来显示已经选定的当前文本,以达到突出选定文本的效果。

②剪切

用户可按Ctrl+X键或通过Edit菜单选项来剪切选定的文本,若之前没有选定的文本,此按键无效。

它的实现过程如下:

ⅰ若全局变量value的值大于0(大于0表示已经有文本选定),则执行下面操作。

ⅱ保存当前位置的坐标,利用循环语句,依次利用x[0]至x[value-1]数组元素保存已选定字符的坐标,调用del()函数在单链表中一次删除一个选定的字符。

ⅲ利用全局变量backup保存value的值后,将value赋值为0。

ⅳ重新在文本编辑器中显示单链表中保存的所有字符,并将光标置位到原来的位置。

③复制

用户可按Ctrl+C键或通过Edit菜单选项来复制选定的文本,复制操作的实现比剪切操作简单,它的实现过程如下:

ⅰ保存当前位置的坐标。

ⅱ利用全局变量backup保存value的值后,将value赋值为0。

ⅲ重新在文本编辑器中显示单链表中保存的所有字符,并将光标置位到原来的位置。

④粘贴

用户可按Ctrl+V键或通过Edit菜单选项,完成粘贴操作。

这一操作必须在剪切或复制操作之后出现。

它的具体实现过程如下:

ⅰ若全局变量backup的值大于0(大于0表示已经有字符放入了剪贴板数组)中,则执行下面的操作。

ⅱ保存当前位置的坐标,利用循环语句,依次利用x[0]至x[backup-1]数组元素保存已选定字符的坐标和字符值,调用insert()函数在单链表中一次插入一个字符。

ⅲ重新在文本编辑器中显示单链表中保存的所有字符,并将光标置位到原来的位置。

2.1.5菜单控制模块

在菜单控制模块中,主要完成菜单的显示、光带条在子菜单之间的上下移动或菜单之间的左右移动以及子菜单项的选项工作。

下面分别介绍这3项功能的具体实现。

①显示菜单

用户可按F1、F2和F3功能键来分别调用File、Edit和Help菜单,即完成菜单的显示。

当按下这3个功能键中的某个功能键时,程序会调用menuctrl()函数来完成菜单的调用操作。

在menuctrl()函数中,会根据功能键的键值调用drawmenu(value,flag)函数,参数value、flag都为局部变量,分别用来保存调用某个菜单、某个菜单下的第几个菜单选项。

例如,按F1键后,它的默认值为drawmenu(0,0),表示绘制File菜单及其5个菜单选项,并将菜单选择光带条置于第一个菜单选项上。

下面简要描述一下draw(value,flag)函数的过程。

ⅰ先取value除以3的余数m(因为有3个菜单项,所以除数选择3),根据m的值来绘制不同的菜单。

m的取值为0、1、2、。

当m等于0时,表示绘制File菜单;其余类推。

ⅱ然后绘制菜单的边框及菜单选项值。

ⅲ取File除以x的余数t,x的取值视m的取值而定,如当m=5时,x=5,因为File菜单下有5个选项。

ⅳ根据t的值,用不同的前景色和背景色在原来的位置重新显示菜单选项,以达到光带条的效果。

②移动菜单光带条

当用户按F1、F2和F3中的某个功能键调用了某个菜单后,可继续按光标左移、右移、上移和下移键来实现菜单之间的切换和菜单选项之间的切换。

ⅰ若为左移键,则调用drawmenu(--value,flag)函数,将切换至某个菜单的左边邻居菜单。

若当前菜单为最左边的File菜单,则切换至最右边的Help菜单。

若为右移键,则调用drawmenu(++value,flag)函数。

ⅱ若为上移键,则调用drawmenu(value,--flag)函数;若为下移键,则调用drawmenu(value,++flag)函数。

③选取菜单

当用户将光带选择条置于某个菜单选项上时,可按Enter键来选取该菜单选项。

选取菜单操作的实现比较简单,它主要利用a=(value%3)*10+flag%b来计算出选择的菜单选项的编号。

选取不同菜单选项后,a的值不同。

这样,程序可根据a的值,返回给main()函数不同的标记,在main()函数中,可根据标记的不同来执行相关功能。

2.1.6帮助及其他模块

帮助模块主要用于提示用户如何使用本软件,它的实现非常简单。

同样,文本的快速预览模块是在原来主窗口显示模块的基础上,去除了菜单的显示。

主窗口主要由菜单栏、文本编辑区和状态栏3大部分构成。

菜单栏用来显示菜单项,文本编辑区主要用来完成文本字符的输入、删除等操作,状态栏主要用来显示当前光标在文本窗口中的坐标值。

它主要利用文本窗口的gotoxy()函数和cprintf()函数来实现,这里需要对文本窗口的坐标进行仔细设计。

2.2数据结构设计

本程序定义了3个结构体,分别与剪贴板、列单链表和行单链表相关。

下面分别介绍这3个结构体及几个全局变量。

2.2.1与剪切板相关的record结构体

typedefstructrecord

{

charch;

intcol,line;

}record;

record结构体表示一个字符所具有的属性,当用户使用相关按键选定文本后,选定的文本保存在record结构体类型的数组中。

结构体中各字段表示的意义如下。

charch:

保存一个选定的文本字符。

intcol,line:

分别保存选定字符所在位置的x轴坐标和y轴坐标。

2.2.2与单链表相关的node结构体

typedefstructnode

{

charch;

structnode*next;

}node;

node结构体定义了在一个单链表中保存行中的单个字符的结构,我们称由node类型的节点构成的单链表为列单链表。

结构体中各字段表示的意义如下。

charch:

数据域,保存一个字符。

structnode*next:

指针域,指向列单链表中的下一个节点。

2.2.3与行单链表相关的Hnode结构体

typedefstructHnode

{

node*next;

structHnode*next1;

}record;

Hnode结构体定义了在一个单链表中保存列单链表首节点地址的结构,我们称由Hnode类型的节点构成的单链表为行单链表。

结构体中各字段表示的意义如下。

node*next:

数据域,。

指向列单链表的首节点的地址

structHnode*next1:

指针域,指向列单链表中的下一个节点。

2.2.4全局变量及其数组

intvalue,backup,NUM:

value保存有值数组元素的最大下标值,backup保存value的副本,NUM保存当前行中用户输入的字符个数。

recordr[500]:

定义一个有500个元素的结构体数组,每个数组元素可保存一个选定的文本字符及其坐标值。

2.3函数功能描述

⑴drawmain()

函数原型:

voiddrawmain()

drawmain()函数用于在程序中会只包括菜单栏,编辑区和状态栏在内的主窗口。

⑵qview()

函数原型:

voidqview(Hnode*q)

qview()函数用于快速预览文本。

q为指向行单链表中第一个节点的指针。

⑶view()

函数原型:

viodview(Hnode*q)

view()函数用于按行显示保存在单链表中的文本字符,q为指向行单链表中第一个节点的指针。

⑷check()

函数原型:

intcheck(Hnode*Hhead,intm,intn)

函数用于在单链表中检查第m行,第n列位置的字符,若为常规字符,则返回该字符;否则返回0或-1.

⑸judge()

函数原型:

intjudje(Hnode*Hhead,intm)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1