(c语言课程设计)C语言文本编辑器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
文本编辑器
文本编辑器是最常用的文档创建和编辑工具。随着计算机科学与技术的发展,用来处 理文本 的编辑器 随处可见 ,并且形 式多样。 比如, Windows 下的记 事本,写 字板, EditPlus,UltraEdit 等都是十分优秀的文本编辑器和处理工具。在本章中,我们将向读者讲解 如何利用 C 语言来发展开发一个简易的文本编辑器。
注意:Turbo C2.默认定义的文本窗口为整个屏幕,共有 80 列(或 40 列) ,25 行的文本单元, 每
个单元包括一个字符和一个属性,字符即 ASCII 码字符,属性规定该字符的颜色和强度。同时,他还规定 整个屏幕的左上角坐标为(1 ,1 ) ,右下角坐标为(80 ,25 ) 。并规定沿水平方向为 X 轴,方向朝右;眼循环移动。当光带移动到某个字菜单项上时,用户此时可使用 Enter 键来选取相关菜单选项。 (5)帮助及其他模块。在帮助及其他模块中,主要完成系统功能及按键的简要介绍。 其他模块包括文本的快速预览和窗口的显示。用户可按 F10 功能键来打开快速预览窗口, 在快速预览窗口中没有功能菜单条。 主窗口要有菜单栏, 文本编辑区和状态栏三大部分构成, 菜单栏用来显示菜单项,文本编辑区主要用来文本字符的输入,删除等操作,状态栏主要用 来显示当前光标在文本窗口中的坐标值。
若在第 m 行,第 n 列的位置插入一个字符,其 insert() 过程描述如下: (1) 定位至行单链表中的第 m 个节点,得到这个节点的数据域的值,其值为对应列单链 表中第一个节点的地址。 (2) 定位至列单链表中的第 n-1 个节点。 (3) 创建一个新的列单链表节点,用其数据域保存输入的字符。 (4) 若字符插入在第 m 行第 1 列, 则直接将行单链表中第 m 个节点的数据域的值改变为 新的列单链表节点的地址,新的列单链表节点的指针域指向列单链表中原来的第 1 个节点。 若字符不是插入在第 m 行第 1 列, 则执行简单的单链表中插入节点的操作。 (5) 插入此字符后,调用 test() 函数,从第 m 行开始检查各行是否满足每行只允许有 76 个字符的条件,若不满足此条件,则必须进行处理。 其 test()检查处理过程描述如下: (1) 用指针 tail 指向已经插入了新节点的列单链表中的最后一个节点。 (2) 若此单链表中节点数超过 76 个,则指针 p1 会指向此列单链表中的第 76 个节点, 指 针 p2 指向第 77 个节点,并将 p1 所指节点的指针域设置为 NULL。 (3) 若 tail 所指节点的数据域为 Enter 键(ASCII 为 13)且在行单链表中只有 m 个节点, 则在此行单链表中添加一个新的节点,新节点的数据域为 p2 的值,指针域为空, 并 将 m 节点的指针域指向它 ; 若 tail 所指节点反而数据域为 Enter 键(ASCII 为 13) 且在 行单链表中有多于 m 个节点,与上面不同的是,它执行的是在行单链表插入一个新 的节点的操作。 (4) 若 tail 所指节点的数据域不是回车符, p1 的数据域为回车符并且行单链表中只有 m 个节点,则在行单链表中添加一个新的节点,新节点的数据域为 p2 的值,指针域为 空,并将第 m 节点的指针域指向它;若 tail 所指节点的数据域不为回车符并且行单 链表中有多于 m 节点, 则将 tail 的指针域指向行单链表中第 m+1 个节点所指的列单 链表的首节点,并将行单链表中第 m+1 个节点的数据域修改成指针 p2 的值,并对 行单链表中第 m+1 个节点所指的列单链表进行 test() 检查,相似的处理过程至行单 链表中的最后一个节点结束。 3) 删除字符 当用户按下 Del 键时,系统会调用 del() 函数在单链表中删除当前光标所在处的字符;当用 户按下 BackSpace 键时, 系统也会调用这个函数在单链表中删除当前光标所在处前一个位置 的字符。 若在第 m 行、第 n 列的位置删除一个字符,其在列单链表中删除一个节点的操作域插入工 作十分相似,所以这里重点介绍删除该字符后,单链表中数据的前移工作过程。 (1) 在相应的列单链表中删除第 n 个节点。 (2) 判断第 m 行是否存在并且判断在此行中是否有字符, 若第 m 行不存在,或此行中没 有字符,则结束字符删除过程,否则执行步骤(3) 。 (3) 用 tail 保存第 m 行相应列单链表中最后一个节点的地址,并将最后一个节点的指针 域保存为第 m+1 行中相应列单链表的第一个元素的地址。 (4) 计算出第 m 行中没有字符的位置的个数 num ,然后在第 m+1 行的相应列单链表中 截取 num 个节点, 并将行单链表中的第 m+1 节点的数据域改为相应列单链表中的第 num 个节点后的节点的地址。 (5) 调用 m++语句,是变量 m 增 1,跳至步骤(3) ,开始对下一行进行处理。 4) 移动光标 移动光标的操作主要利用 gotoxy() 函数来实现,过程非常简单,只需对当前的光标位置和移 动方向进行判断后,即可执行 gotoxy() 过程。例如,如果当前光标在第 m 行第 1 列,且按下
1
设计目的
利用 C 语言的单链表数据结构及相关函数,本章编程实现了一个与 DOS 操作系统下的 Edit 相似的文本编辑器。再次文本编辑器中,用户可以通过快捷和选择菜单项,完成基本的 文本编辑器和文件处理工作。 通过文章的介绍,读者可以了解文本编辑器的开发过程,掌握菜单的开发技巧,加深对 文件操作的理解。更重要的是,希望此程序能抛砖引玉,引领读者掌握编程的方法和技巧, 开发出更优秀的程序。
3.文件编辑模块
在文件编辑模块中, 主要完成以添加或插入的方式输入字符、 删除光标所在的当前位置或前 一个位置的单个字符、 朝上下左右 4 个方向的光标的移动操作。 下面介绍这 4 个功能的具体 设计与实现。 1) 添加字符 当光标处在文本编辑的最后一行的位置且光标后面没有字符时, 若此时输入字符, 程序会判 断一行中字符的个数,若字符个数不等于 76,则在当前的列单链表的最后一个节点中保存 输入的字符,然后添加一个新的节点来保存下一个输入的字符:若等于 76 ,则在当前的列 单链表的最后一个节点中保存输入的字符, 然后在行单链表中添加一个新节点用来保存下一 行的列单链表的首地址,添加一个新的列单链表节点来保存下一个用户输入的字符。 2) 插入字符 若光标所在处已经存在字符,当用户在当前位置输入字符时,程序会调用 insert() 函数将输 入的字符在光标所在的位置处在列单链表中插入,插入完成后,会调用 test()函数来检查各 行是否满足只有 76 个字符的条件,若不满足此条件,则在此函数中会对多出的字符进行处 理。下面分别对列单链表中字符的插入过程和单链表的检查过程进行介绍。
2
功能描述
如图.1 所示,文本编辑器主要由五大功能模块构成,它们分别是文件操作模块,文本编 辑模块,剪切操作模块,菜单控制模块和帮助及其他模块。下面分别简要介绍功能模块的功 能。 (1)文件操作模块。在文件操作模块中,主要完成文件的创建,打开,保存和另存操 作。用户可以选择 File 菜单上的 New 子菜单来完成新建文本文件操作;选择 File 菜单上的 Save 子菜单来完成保存文件操作选择 File 菜单上的 Open 子菜单来完成打开文件操作; 选择 Flie 菜单上的 Save as 子菜单来完成文件的另存为操作。在文件的打开,保存和另存为操作 中,系统会提示用户输入文件路径及文件名。值得一提的是,当用户打开一个文件时,指定 的文件必须存在,否则系统会报错。 (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 个菜单项的调用,即显示某项 菜单。 用户可按光标上移或下移键在某菜单项的子菜单之间循环移动, 也可使用光标的左移
2.文件操作模块
在此模块中,主要实现文件的新建、打开、保存和另存为操作。在此系统中,文件的新建操 作实现比较简单,文件另存为操作与保存操作类似,下面重点介绍在此文本编辑器程序中, 文件的打开和保存操作的具体设计和实现。 在介绍之前, 我们先简单描述一下程序中用到的 保存数据的数据结构。在此程序中,共有两种类型的单链表,我们称其为行单链表和列单链 表,一个列单链表用来保存一行的字符,有多少行即有多少个这样的单链表。行单链表只有 一个,它的每个节点的数据域用来保存不同列单链表的首节点的地址。例如,第 4 行第 4 列的字符保存在行单链表的第 4 个节点的数据域所指的列单链表的第 4 个节点的数据域中。 有关具体数据结构的定义,在后面的小节中会有具体介绍。 1)打开文件 文件的打开流程如图 .3 所示,它首先提示用户输入要打开文件的文件名,若该文件不存在 或由于其他原因打开失败, 则会结束文件打开操作。 若文件成功打开并且文件指针没有到文 件尾,则从文件中一次读取一个字符,并将该字符添加到一列单链表节点中,直至遇到换行 符 (ASCII 码 10) 或连续读取字符个数大于 76 (在此文件编辑器中, 每行最多为 76 个字符) 。 当列单链表形成后,它的首地址将被保存至行单链表的相应节点的数据域中,如此动作, 直 至文件指针指向文件尾部而结束。 注意:由于本程序中每行以回车符(ASCII 码为 13)结束,而当用 Windows 的记事本创 建一个文本文件, 打开此文件并用 fgetc()函数读取时, 程序写入列单链表节点中的值是 ASCII 码为 13 的回车符。 2)保存文件 保存文件操作主要完成将单链表中的数据写入文件中的任务,它的具体实现流程如下。 (1) 用户输入一个保存此单链表数据的文件名。 (2) 以只写方式打开此文件,若成功打开此文件,则执行步骤(3) ;否则退出。 (3) 读取行单链表中的节点数据域的值,若值不为空,则执行步骤( 4) ;否则执行步骤 (6) 。 (4) 依次读取行单链表节点中保存的首地址的相应列单链表节点的数据域的值,若其值 为回车符,则用换行符替代后将其写入文件中;否则直接将其值写入文件中,直至 该列单链表中指针域为 NULL 的最后一个元素结束。 (5) 读取行单链表中的下一个节点,并跳至步骤(3) 。 (6) 关闭文件,退出。
3 3.1 功能模块设计
总体设计
在.2 节中,简单描述了各功能模块的作用,下面分别介绍各功能模块的具体设计。在介 绍各功能模块的具体设计之前,有必要先描述一下主程序的执行流程。
1.
程序执行主流程
文本编辑器程序执行主流程如图 .2 所示,它是在 main()函数中实现的。他首先初始 化一些全局变量及结构数组,接着调用 drawmain() 函数来显示主窗口,然后调用 while(1) 进 入主循环,等待用户按键,最后程序根据用户的按键值,进行相应的处理,完成文本编辑的 相关工作。下面对图.2 中的按键判断和相关处理作补充说明。 (1)若按键为常规字符,即其 ASCII 码大于 32 小于 127,则继续判断在文本编辑区的 当前光标位置有没有字符,若有字符,则调用 insert() 函数,将此字符插入在当前位置,否 则在判断没有满行后,将此字符添加在单链表的数据域中,若此行已满,则执行添加新行操 作。 (2)若按键为 Enter 键,则将光标移至下一行的行首,等待用户输入新的字符。 (3)若按键为光标移动键(左,右,上,下)且移动后的位置满足相关条件,则执行 gotoxy() 操作,将光标移动至目标位置。 (4) 若按键为 BackSpace 键,则将调用 Del()函数将光标的前一个字符从单链表中删 除;若按键为 Del 键,也将调用 del()函数将光标的当前位置的字符从单链表中删除。 (5)若按键为 Ctrl 开头的按键,则执行与其相关的操作。具体来说,若为 Ctrl+左移键 (←) ,则将选定当前光标的位置开始向右的一个字符,若按住 Ctrl 键不放,连续按右移键, 可以选定多个字符。若为 Ctrl+左移键(←) ,则将执行与以上相同的操作。若为 Ctrl+X 键, 则将选定相关内容保存起来, 且从单链表中删除选定的字符后重新显示单链表的内容。 若为 Ctrl+C 键,则将选定的相关内容保存起来,重新显示单链表中的内容(目的:为了去除字符 的底色) 。若为 Ctrl+V 键,则调用 insert() 函数将保存起来的字符插入在单链表中,并重新显 示单链表中的内容。 (6)若按键为 F10 键,则调用 qview() 函数,实现文本的快速预览。 若按键为 F1,F2,F3 功能键,则调用 menuctrl() 菜单控制函数,在此函数中完成案件的具体判 断和执行相应功能操作。若为 F1 键,则调用 File 菜单;若为 F2 键,则调用 Edit 菜单;若 为 F3 键,则调用 Help 菜单。
相关文档
最新文档