文本编辑《数据结构》上机实验报告

上传人:第*** 文档编号:33595466 上传时间:2018-02-16 格式:DOC 页数:17 大小:114KB
返回 下载 相关 举报
文本编辑《数据结构》上机实验报告_第1页
第1页 / 共17页
文本编辑《数据结构》上机实验报告_第2页
第2页 / 共17页
文本编辑《数据结构》上机实验报告_第3页
第3页 / 共17页
文本编辑《数据结构》上机实验报告_第4页
第4页 / 共17页
文本编辑《数据结构》上机实验报告_第5页
第5页 / 共17页
点击查看更多>>
资源描述

《文本编辑《数据结构》上机实验报告》由会员分享,可在线阅读,更多相关《文本编辑《数据结构》上机实验报告(17页珍藏版)》请在金锄头文库上搜索。

1、成都信息工程学院计算机系课程实验报告实验课程: 数据结构实验项目: 文本编辑器的实现指导教师: 李莉丽学生姓名 : 陈德怀学生学号: 2009053035班 级: 数媒一班实验地点: 实验时间:20 10 年 月 日 点 点实验成绩:评阅老师:一【上机实验目的】要求功能与界面模拟 WINDOWS 记事本,支持鼠标,因为记事本功能较多,可以根据自己的能力模拟出部分功能,文本编辑这部分功能必须实现,主要利用串的知识。二【实验环境】PC 机每人 1 台三【上机实验内容】要求功能与界面模拟 WINDOWS 记事本,支持鼠标,因为记事本功能较多,可以根据自己的能力模拟出部分功能,文本编辑这部分功能必须实

2、现,主要利用串的知识。四【上机调试程序流程图】 (注:可打印)在此程序中,主要包含了添加、插入、删除、复制、剪切、粘贴、还有文件操作。五【上机调试中出现的错误信息、错误原因及解决办法】1、 开始的时候当我输入字符的时候,总是输不进去,经过检查才知道,我忘了把字符输出到屏幕上。2、 在删除的时候,当一行删除完的时候,光标并不会上移到上一行。然后我通过判断当这光标处的坐标减一后为零(表示这行没有字符了)的时候,然后重新读取光标,让光标显示在上一行。3、 在进行插入操作之后,移动光标会出现问题,就好像插入的字符并没有在链表当中一样。然后我写了一个测试函数,来判断插入后链表是否满足每列的字符数不得超过

3、 80个字符。然后让每列的字符数都在链表当中,满足要求。六【上机调试后的源程序及还存在的问题】 (注:源程序可打印)/*文本编辑器 editor 源代码*/#include #include #include #include #define LEFT 0x4b00 /*:光标左移*/#define RIGHT 0x4d00 /*:光标右移*/#define DOWN 0x5000 /*键:光标下移*/#define UP 0x4800 /*键:光标上移*/#define ESC 0x011b /*ESC 键:取消菜单打开操作*/#define ENTER 0x1c0d /*回车键:换行*/#

4、define BACK 3592 /*BackSpace 键:删除当前光标位置前一个字符*/#define CL 29440 /*ctrl+键:从右至左,选定文本*/#define CR 29696 /*ctrl+键:从左到右,选定文本 */#define Cc 11779 /*ctrl+c 键:将选定文本,复制一份到剪贴板中*/#define Cv 12054 /*ctrl+v 键:将剪贴板中的内容复制到当前位置*/#define Cx 11544 /*ctrl+x 键:对选定文本,执行剪切操作*/#define F1 15104 /*F1 键:打开文件菜单*/#define F2 1536

5、0 /*F2 键:打开编辑菜单*/#define F3 15616 /*F3 键:打开帮助菜单*/int value,backup;/*value 保存有值数组元素的最大下标值,backup 保存 value 的副本,NUM 保存当前行中的用户输入的字符个数*/typedef struct recordchar ch; /*保存一字符*/int col, line; /*x 轴和 y 轴坐标*/record;record r500; /*定义一个有 500 个元素的结构体数组,保存选定的文本字符的属性*/typedef struct node /*定义保存行中的单个字符的结构*/char ch

6、; /*数据域:保存一字符*/struct node *next; /*指针域:指向下一个结点的指针*/node;/*由此类型节点构成的单链表,命名为:列单链表*/typedef struct Hnode /*定义保存所有列单链表首节点的指针的结构*/node *next; /*指向列单链表的首节点的地址 */struct Hnode *nextl; /*指向下一个节点的指针*/Hnode;/*由此类型节点构成的单链表,命名为:行单链表*/void view(Hnode *q) /*按行显示保存在单链表中的文本字符,q 为指向行单链表中第一个节点的指针*/node *p; /*p 为保存列单链

7、表节点元素地址的指针 */ clrscr(); /*清屏*/*双重循环,读取并显示保存在单链表中字符 */dop=q-next;while(p!=NULL&p-ch=32&p-chch!=13&p-ch!=-1) /*指针 p 不能为空,且数据域必须为常规字符*/putch(p-ch);/*在文本窗口中输出该字符*/p=p-next; /*指向下一个节点*/q=q-nextl; /*指向下一个节点*/if(p-ch=13|p-ch=-1) /*若 ch 为回车或 EOF 标记,光标跳至下行的开始处*/while(q!=NULL); /*逐行逐列显示文本字符*/void control(int

8、A, Hnode *Hhead)void colorview(Hnode *,int,int); /*函数声明*/int x,y,flag=0;x=wherex(); y=wherey(); /*得到当前光标的坐标值 */if(A=CL)&(x!=1) /*ctrl+,当前光标不是在行首,光标移动*/gotoxy(wherex()-1,wherey();if(A=CL)&(x=1) /*ctrl+,在行首*/gotoxy(abs(judge(Hhead,wherey()-1),wherey()-1); /*judge(Hhead,wherey()-1)上一行的字符个数作为 x 值,光标移动 *

9、/if(A=CR)&check(Hhead,wherey(),wherex()0) /*ctrl+,当前光标的右边有字符,光标移动*/ flag=1; gotoxy(wherex()+1,wherey(); if(A=CR)&check(Hhead,wherey()+1,1)0&check(Hhead,y,x)=0) /*ctrl+,当前光标处没有字符但下一行的第一列有字符,光标移动*/ flag=1; gotoxy(1,wherey()+1); if(A=CR)&x=80) /*ctrl+,当前光标在当前行的行尾,光标移动*/ flag=1; gotoxy(1,wherey()+1); if

10、(A=CR&flag=1) /*ctrl+,光标已经跳至新处,将当前光标所在位置的字符的坐标和值保存在 r 数组中 */rabs(value).col=wherex(); rabs(value).line=wherey();rabs(value).ch=check(Hhead,rabs(value).line,rabs(value).col);if(rabs(value).ch=-1) rabs(value).ch=13; /*若第 line 行,第 col 列的字符为回车键,则返回-1*/value-;if(A=CL&(x!=1|y!=1) /*ctrl+,当前光标并不在窗口左上角,将当前光

11、标所在位置的字符的坐标和值保存在 r 数组中*/rabs(value).col=wherex();rabs(value).line=wherey();rabs(value).ch=check(Hhead,rabs(value).line,rabs(value).col);value+;colorview(Hhead,wherex(),wherey();/*用不同的前背景色显示选择的字符 */void colorview(Hnode *Hhead,int x,int y)int i;view(Hhead);/*重新显示所有文本字符*/for(i=0;inextl;p=q-next;/*获取第 m

12、 个节点的数据域*/for(i=1;inext;if(p-ch=13) return -1; /*若第 m 行,第 n 列的字符为回车键,则返回-1*/if(p-ch=32 /*若第 m 行,第 n 列的字符为常规字符,则返回该字符*/else return 0; /*若第 m 行,第又非常规字符,则返回 0*/int judge(Hnode *Hhead,int m) /*judge():返回第 m 行中的常规字符总的个数,不包括回车符*/Hnode *q;node *p;int i,num=0;q=Hhead;for(i=1;inextl;if(q=NULL) return -1; /*返

13、回-1,表示第 m 行不存在 */p=q-next;while(p-next!=NULL)p=p-next;num+; /*统计第 m 行的字符个数*/*行尾字符还没有判断,接下来判断行尾字符 */if(p-ch=13 /*返回 0,表示当前行只有一个回车字符*/if(p-ch=32 /*返回 num+1,表示当前行的最后一个字符为常规字符*/if(p-ch=13 /*返回 num,表示当前行的最后一个字符为回车符,不计算在内*/else return num;/*返回 num,表示当前行中只有一个字符,且没有回车符*/int del(Hnode *Hhead,int m,int n) /*d

14、el():删除第 m 行,第 n 列位置的字符*/Hnode *q,*q1;node *p1,*p2,*tail;int i ,j,flag=0;q=Hhead;if(n=0 /*第 1 行,第 0 列不存在*/if(n=0&m1) /*若为第 0 列字符,但行必须大于 1,执行向上行移处理*/m=m-1;gotoxy(judge(Hhead,wherey()-1)+1,m);/*移至第 m-1 行,第 76 列*/flag=1; /*移位的标志置 1*/for(i=1;inextl;p1=q-next;for(i=1;inext;p2=p1-next; /*p2 指向列单链表中的第 n 个元

15、素*/if(n=1) /*若是删除第 m 行第 1 列的字符*/q-next=p1-next;free(p1);elsep1-next=p2-next; /*在单链表中删除第 m 行第 n 列的元素*/free(p2);return flag; /*返回 0:表示没有换位,返回 1:表示有换位*/void insert(Hnode *Hhead,int m,int n, char a) /*第 m 行,第 n 列的位置之前一个位置,插入单字符*/int i;Hnode *q;node *p,*p1,*p2;q=Hhead;for(i=1;inextl;p1=q-next; for(i=1;inext;p=(node *)malloc(sizeof(node); /*创建一个新的列单链表节点*/p-ch=a; /*给此节点的数据域赋值*/if(n=1) /*插入之前,若只有一个字符在行中,则插在此节点之前*/p-next=q-next;q-next=p;elsep-next=p1-next; /*在第

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号