C语言程序设计实践报告.pdf

上传人:叶*** 文档编号:36104745 上传时间:2022-08-25 格式:PDF 页数:41 大小:599.31KB
返回 下载 相关 举报
C语言程序设计实践报告.pdf_第1页
第1页 / 共41页
C语言程序设计实践报告.pdf_第2页
第2页 / 共41页
点击查看更多>>
资源描述

《C语言程序设计实践报告.pdf》由会员分享,可在线阅读,更多相关《C语言程序设计实践报告.pdf(41页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1中南大学Central South UniversityC 语言课程设计实践题目名称: 实现一个简单的文本文件编辑系统完成人姓名:郑艺颖专业班级:电气信息类 1117 班学号:09091117172摘要这个文本编辑器的功能类似 windows 的记事本,有新建、打开、保存、退出的文件操作功能,有复制、粘贴、剪切、清除的文件编辑功能,又有帮助与关于功能菜单。在主函数 main()中多次调用其他子函数是这个文本编辑器的最大特点。最主体的子函数莫过于 drawmenu()画出文本编辑器的功能列表,其他还有各种功能的子函数,如 drawmain()画出整个文本编辑器的主界面,如 del()定义删除功

2、能,在这里就不一一介绍,详见下面。3目录一、一、功能设计功能设计4二、二、详细设计详细设计7三、运行结果三、运行结果34四、结束语四、结束语414一、功能设计一、功能设计通过对 Windows 自配的记事本的功能研究,并结合老师对本次课程设计的要求, 让用户在我设计完成的文本编辑器中可以通过快捷和选择菜单项,完成基本的文本编辑和文件处理工作。该文本文件编辑系统应该至少具备有以下功能模块: 文件操作模块、 文本编辑模块、剪切操作模块、菜单控制模块和帮助及其他模块。(一)文件操作模块(一)文件操作模块1、新建:新建功能应该要可以不只是单纯地把输入文本框清空,而且还应该可以智能判断文本框中是否有数据

3、, 如果有数据未保存或者保存过后又有数据变动,则会弹出提示信息询问是否保存。新建功能可以通过选择 File 菜单上的 New 子菜单来实现。2、打开:打开功能应该要可以通过记事本读入文件。打开功能可以通过选择 File 菜单上的 Open 子菜单来实现。在文件打开时,保存和另存为操作中,系统会提示用户输入文件路径及文件名。特别注意的是, 当用户打开一个文件时, 指定的文件必须存在, 否则系统会报错。3、保存:保存功能应该要可以直接将文本框中的内容记忆保存。保存功能可以通过选择 File 菜单上的 Save 子菜单来实现。4、另存为:另存为功能应该要可以将文本框中的内容记忆保存,并且可以进一步把

4、整个文件保存到指定地方。 另存为功能可以通过选择File 菜单上的 Save as 子菜单来实现。5、退出:退出功能应该要可以直接退出文本文件编辑系统。退出功能可以通过选择 File 菜单上的 Exit 子菜单来实现。5(二)文本编辑器模块(二)文本编辑器模块1、添加:当光标所在位置及后面没有字符时,系统会以添加的方式输入字符。2、插入:当光标所在位置及后面有字符时,系统会以插入的方式输入字符。3、删除:用户可以通过 Backspace 键删除光标前一个字符,也可以使用 Del 键删除当前位置的字符。4、选定:用户可以使用左移键() 、右移键、上移键、下移键来移动光标位置。也可以通过 Ctrl

5、+左移键(或右移键)来选定多个字符。(三)剪贴板操作模块(三)剪贴板操作模块1、剪切:如果用户要剪切文本以便可以将它移动到其他位置,可通过 Ctrl+X 左移键(或右移键)先选定文本,然后选择 Edit 菜单上的Cut 子菜单或按 Ctrl+X 快捷键来完成剪切任务。2、复制:如果用户要复制文本以便可以将它到其他位置,必须先选定文本, 然后选择 Edit 菜单上的 Copy 子菜单或按 Ctrl+C 快捷键来完成复制任务。3、粘贴:如果用户要粘贴剪切或复制的文本,必须将光标置于要粘贴文本的位置, 然后选择 Edit 菜单上的 Paste 子菜单或按 Ctrl+V 快捷键来完成粘贴任务。(四)菜

6、单控制模块(四)菜单控制模块1、File 子菜单:用户可以按 F1 功能键来完成该菜单项的调用,即显示该项菜单。 用户可按光标上移或下移键在该菜单项的子菜单之间循6环移动, 也可以使用光标的左移键或右移键在 3 个菜单项之间循环移动。当光带移动到某个子菜单项上时,用户此时可使用 Enter 键来选取相关菜单选项。2、Edit 子菜单:用户可以按 F2 功能键来完成该菜单项的调用,即显示该项菜单。其他功能调用如上。3、Help 子菜单:用户可以按 F3 功能键来完成该菜单项的调用,即显示该项菜单。其他功能调用如上。(五)帮助及其他模块(五)帮助及其他模块1、帮助:帮助功能可以提示使用者如何进入菜

7、单中的各个项目。2、关于:关于功能是描述此文本文件编辑系统的设计者。3、快速预览:用户可按 F10 功能键来打开快速预览窗口,在快速预览窗口中没有功能菜单条。7二、详细设计二、详细设计1、程序预处理。、程序预处理。首先有头文件的加载,再有宏定义上下左右、退格、换行、复制、粘贴、剪切等热键,使用户可以直接从键盘上录入字符进行操控 (字符即 ASCII 码字符) , 为了方便下面程序的运行,还要定义 3 个结构体,分别与剪贴板、列单链表和行单链表相关。2、main()主函数主函数。因为程序是从 main()函数开始执行,在main()函数结束的,所以在 main()函数下。(1)首先在 main(

8、)中初始化一些全局变量及结构数组,接着调用drawmain()函数来显示主窗口,然后调用 while(1)进入主循环,等待用户按键,最后程序根据用户的按键值,进行相应的处理,完成文本编辑的相关工作。(2)若按键为常规字符,则继续判断在文本编辑区的当前光标位置有没有字符,若有字符,则调用 insert()函数,将此字符插入在当前位置,否则直接输入即可。(3)若按键为 Enter 键,则将光标移至下一行的行首,等待用户输入新的字符。(4)若按键为左,右,上,下,则执行 gotoxy()操作,将光标移动至目标位置。(5) 若按键为退格(BackSpace)键,则将调用 del()函数将光标的前一个字

9、符删除; 若按键为 Del 键, 也将调用 del()函数将光标的当前位置的字符中删除。(6)若按键为 Ctrl 开头的按键,则执行与其相关的操作。具体来8说,若为 Ctrl+左移键() ,则将选定当前光标的位置开始向右的一个字符,若按住 Ctrl 键不放,连续按右移键,可以选定多个字符。若为 Ctrl+左移键() ,则将执行与以上相同的操作。若为 Ctrl+X 键,则为剪切键(即将选定相关内容保存起来,且删除选定的字符) 。若为 Ctrl+C 键,则为复制键(即将选定的相关内容保存起来) 。若为Ctrl+V 键,则调用 insert()函数将保存起来的字符插入光标所在字符之前。(7)若按键为

10、 F10 键,则调用 qview()函数,实现文本的快速预览。若按键为 F1,F2,F3 功能键,则调用 menuctrl()菜单控制函数。若为 F1 键,则调用 File 菜单;若为 F2 键,则调用 Edit 菜单;若为 F3键,则调用 Help 菜单。具体程序如下:void main()char a;int i,A,x,y,flag=0,b;Hnode *Hhead,*q;node *p1,*p2;Hhead=(Hnode *)malloc(sizeof(Hnode);/*为行单链表中首节点分配内存空间*/q=Hhead;Hhead-nextl=NULL;p1=p2=q-next=(no

11、de *)malloc(sizeof(node); /*为列单链表中首节点分配内存空间*/p1-ch=13; p1-next=NULL;drawmain();/*显示主窗口*/window(2,2,79,23);textbackground(9);for(i=0;i=32&a127)/*若输入为常规字符或回车键*/if(check(Hhead,wherey(),wherex()ch=a;putch(a);if(NUM=76)/*连续输入满行,分别生成一个新的行单链表和列单链表节点*/p2-next=NULL;q-nextl=(Hnode *)malloc(sizeof(Hnode);q=q-n

12、extl;q-nextl=NULL;q-next=NULL;p1=p2=q-next=(node *)malloc(sizeof(node);p1-ch=13;p1-next=NULL;NUM=0;else /*连续输入未满一行,生成一个新的列单链表节点*/p2-next=(node *)malloc(sizeof(node);p2=p2-next;p2-ch=13;p2-next=NULL;else /*当前位置有字符且输入是常规字符,则执行插入字符操作*/x=wherex();y=wherey();insert(Hhead,wherey(),wherex(),a);NUM+;view(Hh

13、ead);gotoxy(x,y);if(a=13)/*若输入为回车键*/10gotoxy(1,wherey()+1);q-nextl=(Hnode *)malloc(sizeof(Hnode);q=q-nextl;q-nextl=NULL;q-next=NULL;p1=p2=q-next=(node *)malloc(sizeof(node);p1-ch=13; p1-next=NULL;NUM=0;x=wherex();y=wherey();/*文本窗口中左移,当前光标不在窗口的第 1 列*/if(A=LEFT)&(x!=1)gotoxy(wherex()-1,wherey();/*文本窗口

14、中左移,当前光标在窗口的第 1 列*/if(A=LEFT)&(x=1)gotoxy(abs(judge(Hhead,wherey()-1),wherey()-1);/*文本窗口中右移,若当前光标的右边一位有字符*/if(A=RIGHT)&check(Hhead,wherey(),wherex()0)gotoxy(wherex()+1,wherey();/*文本窗口中右移至下行的第1列,若当前光标位置没有字符且下行的第1列有字符*/if(A=RIGHT)&check(Hhead,wherey()+1,1)!=0&check(Hhead,y,x)=0)gotoxy(1,wherey()+1);/*

15、右移*/if(A=RIGHT)&x=76)gotoxy(1,wherey()+1) ;/*上移*/if(A=UP)&check(Hhead,wherey()-1,wherex()!=0)gotoxy(wherex(),wherey()-1);/*上移*/if(A=UP)&check(Hhead,wherey()-1,wherex()=0)if(judge(Hhead,wherey()-1)=0)gotoxy(-judge(Hhead,wherey()-1)+1,wherey()-1);elsegotoxy(-judge(Hhead,wherey()-1),wherey()-1);/*下移*/i

16、f(A=DOWN)&check(Hhead,wherey()+1,wherex()!=0)gotoxy(wherex(),wherey()+1);if(A=BACK) /*处理 BackSpace 键*/flag=del(Hhead,wherey(),wherex()-1);11x=wherex()-1;y=wherey();view(Hhead);if(flag=0)if(x!=0)gotoxy(x,y);elsegotoxy(x+1,y);if(flag=1)gotoxy(x+1,y);flag=0;/*处理菜单按键 F1 F2 F3*/if(A=F1)|(A=F2)|(A=F3)|(a1

17、27)A=menuctrl(Hhead,A);if(A=100)main(); /*新建文件*/if(A=101) /*打开文件*/Hhead=(Hnode *)malloc(sizeof(Hnode);opens(Hhead);getchar();clrscr();gotoxy(3,3);view(Hhead);/*保存文件*/if(A=102)save(Hhead);clrscr();cprintf(savesuccessfully!);getch();gotoxy(3,3);view(Hhead);/*文件另存为*/if(A=103)saveas(Hhead);clrscr();cpri

18、ntf(saveassuccessfully!);getch();gotoxy(3,3);view(Hhead);/*帮助*/if(A=120)clrscr();cprintf( F1:FilenF2:EditnF3:Help );getch();gotoxy(3,3);view(Hhead);if(A=121)clrscr();cprintf(ItisdesignedbyZhengYiying.);getch();gotoxy(3,3);view(Hhead);if(A=DEL)/*处理 DEL 键,删除当前位置的单个字符*/x=wherex();y=wherey();del(Hhead,w

19、herey(),wherex();view(Hhead);gotoxy(x,y);/*处理已经选定文本字符后,按 DEL 键的情况*/12if(A=DEL&value!=0)if(value0)x=wherex(),y=wherey();elsex=r0.col, y=r0.line;for(i=0;i0)del(Hhead,ri.line,ri.col);if(value0)x=wherex(),y=wherey();elsex=r0.col, y=ri.line;for(i=0;i0)del(Hhead,ri.line,ri.col);if(value0)del(Hhead,rabs(va

20、lue)-1-i.line,rabs(value)-1-i.col);backup=value; /*保存 r 数组的有值元素的最大下标值*/value=0;/*此 value 为全局变量*/view(Hhead);gotoxy(x,y);/*处理 Ctrl+c 按键*/if(A=Cc&value!=0)x=wherex();y=wherey();backup=value;value=0; /*此 value 为全局变量*/view(Hhead);gotoxy(x,y);13/*处理 Ctrl+v 按键*/if(A=Cv&backup!=0)x=wherex();y=wherey();if(b

21、ackup0) /*Ctrl+右移键选定的文本,贴切此当前位置*/for(i=0;i0) /*Ctrl+左移键选定的文本,贴切此当前位置*/for(i=0;ibackup;i+)insert(Hhead,y,x+i,rbackup-1-i.ch);view(Hhead);gotoxy(x,y);/*快速预览*/if(A=F10)qview(Hhead);view(Hhead);gotoxy(x,y);/*处理 Ctrl+左移键或右移键*/if(A=CL|A=CR)control(A,Hhead);/*显示当前行列号*/x=wherex();y=wherey();window(1,1,80,25

22、);textcolor(0);textbackground(7);gotoxy(10,25);/*第 25 行,第 10 列,输出当前行号 wherey()*/cprintf(%-3d,y);gotoxy(24,25); /*第 25 行,第 24 列*/cprintf(%-3d,x);window(3,3,78,23);textcolor(10);gotoxy(x,y);textcolor(10);textbackground(1);143、接下来是要处理其他在主函数中被调用的子函数。(1)void drawmain()功能:画主窗口。drawmain () 函数用于在程序中绘画出主窗口,

23、其中包括颜色、 边框、叶脚等。具体程序如下:void drawmain()/*画主窗口函数*/int i,j;gotoxy(1,1);/*在文本窗口中设置光标至(1,1)处*/textbackground(24);/*选择新的文本背景颜色*/textcolor(7);/*在文本模式中选择新的字符颜色*/insline();/*在文本窗口的(1,1)位置处中插入一个空行*/for(i=1;i=24;i+)gotoxy(1,1+i);/*(x,y)中 x 不变,y+*/cprintf(%c,4);/*画出主窗口的左边界 */gotoxy(80,1+i);cprintf(%c,5);/*画出主窗口的

24、右边界*/for(i=1;i=79;i+)gotoxy(1+i,2);/*在第 2 行,第 2 列开始*/cprintf(%c,3);/*画出主窗口的上边界*/gotoxy(1+i,25);/*在第 25 行,第 2 列开始*/cprintf(%c,2);/*画出主窗口的下边界*/gotoxy(1,1);cprintf(%c,3);gotoxy(1,24);cprintf(%c,3);gotoxy(80,1);cprintf(%c,3);gotoxy(80,24); cprintf(%c,3);gotoxy(7,1); cprintf(%c%c File %c%c,186,17,16,186)

25、;/* | |*/gotoxy(34,1); cprintf(%c%c Edit %c%c,186,17,16,186);/* | |*/gotoxy(60,1); cprintf(%c%c Help %c%c,186,17,16,186);/* | |*/gotoxy(5,25);/*跳至窗口底端*/textcolor(1);cprintf( Row:1Col:1);gotoxy(60,25);15cprintf(By Zheng yiying . );(2)void qview(Hnode*q)功能:快速预览文本。qview()函数让使用者可以通过 F10 键快速预览自己输入的文本。具体程

26、序如下:void qview(Hnode *q)/*快速预览文本*/void view(Hnode *q);/*view()函数声明*/node *p;int i;window(1,1,80,25);/*定义文本窗口大小*/clrscr();/*循环读取两个单链表中的值:q 是一个指向行单链表首节点的指针,此单链表数据域的值为实际保存各行字符的列单链表 p 中的首节点地址*/dop=q-next; /*p 指向保存行数据的列单链表的首节点的地址*/cprintf( );while(p!=NULL)/*循环读取单链表 p 中的值*/if(p-ch=13)putch( );elseputch(p-

27、ch);/*输出各行中的字符到预览窗口*/p=p-next;/*指向下一个节点*/q=q-nextl;/*指向下一个节点*/printf(n);/*输出一个回车*/while(q!=NULL);getch();clrscr();drawmain();/*输出一个回车*/window(2,2,79,23);textbackground(9);for(i=0;inext;while(p!=NULL&p-ch=32&p-chch!=13&p-ch!=-1) /*指针 p 不能为空,且数据域必须为常规字符*/putch(p-ch);/*在文本窗口中输出该字符*/p=p-next;q=q-nextl;i

28、f(p-ch=13|p-ch=-1)&q!=NULL)gotoxy(1,wherey()+1);/*若 ch 为回车或 EOF 标记,光标跳至下行的开始处*/while(q!=NULL); /*逐行逐列显示文本字符*/4)int check(Hnode *Hhead,int m,int n)功能:检查字符。check()函数用于在单链表中检查第 m 行,第 n 列位置的字符,若为常规字符,则返回该字符;否则返回 0 或-1.具体程序如下:int check(Hnode *Hhead,int m,int n)/*check():在单链表中检查第 m 行第 n 列位置的字符, 若为常规字符,则返回

29、该字符*/int i;Hnode *q;node *p;q=Hhead;for(i=1;inextl;17p=q-next;/*获取第 m 个节点的数据域*/for(i=1;inext;if(p-ch=13)return -1;/*若第 m 行,第 n 列的字符为回车键,则返回-1*/if(p-ch=32&p-chch; /*若第 m 行,第 n 列的字符为常规字符,则返回该字符*/else return 0;/*若第 m 行,第 n 列的字符既非回车符又非常规字符,则返回 0*/(5)int judje(Hnode*Hhead,int m))功能:返回字数个数。judge()函数用于返回第

30、m 行中不包括回车符在内的常规字符的个数。具体程序如下: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;/*返回-1,表示第 m 行不存在*/p=q-next;while(p-next!=NULL)p=p-next;num+;/*统计第 m 行的字符个数*/*行尾字符还没有判断,接下来判断行尾字符*/if(p-ch=13&num=0)return 0;/*返回 0,表示当

31、前行只有一个回车字符*/if(p-ch=32&p-chch=13&num!=0)return num;/*返回 num,表示当前行的最后一个字符为回车符,不计算在内*/else return 1;/*返回 num,表示当前行中只有一个字符,且没有回车符*/6)int del(Hnode*Hhead,int m,int n)功能:删除字符。18del()函数用于删除第 m 行,第 n 列位置的字符。具体程序如下:int del(Hnode *Hhead,int m,int n)/*del():删除第 m 行,第 n 列位置的字符*/Hnode *q,*q1;node *p1,*p2,*tail;

32、int i,num=0,j,flag=0;q=Hhead;if(n=0&m=1)return;/*第 1 行,第 0 列不存在*/if(n=0&m1)/*若为第 0 列字符,但行必须大于 1,执行向上行移处理*/n=76;m=m-1;gotoxy(n,m);/*移至第 m-1 行,第 76 列*/flag=1;/*移位的标志置 1*/for(i=1;inextl;p1=q-next;for(i=1;inext;p2=p1-next;/*p2 指向列单链表中的第 n 个元素*/if(n=1) /*若是删除第 m 行第 1 列的字符*/q-next=p1-next;free(p1);elsep1-

33、next=p2-next;/*在单链表中删除第 m 行第 n 列的元素*/free(p2);/*删除掉第 m 行第 n 列的元素后,处理行单链表中第 m 个节点后的数据向前移的任务*/while(num=judge(Hhead,m+)0)/*执行一次 judge(Head,m)后, m 才加 1.这里必须满足行常规字符数不为 0 的条件*/p1=q-next; q1=q;if(p1!=NULL) /*若当前行非空*/19while(p1-next!=NULL)p1=p1-next;tail=p1;/*tail 保存列单链表最后一个元素的地址*/q=q-nextl;/*指向下一行的元素的地址*/

34、p1=p2=q-next;tail-next=p1;/*tail 的指针域指向下一行的第一个元素的地址*/else/*若当前行的字符个数为 0,即删除该字符后,只剩下回车符,则将下一个行单链表中节点的数据域移至前一下节点的数据域*/q=q-nextl;p1=p2=q-next;q1-next=p1;/*q1-next指向下一行的第一个元素的地址*/for(i=0;inext;if(p2-ch=13)break; /*若为回车,跳出循环*/q-next=p2;/*在列单链表中去掉移至上行的元素*/p1-next=NULL;/*下行移至上行的最后一个元素,指针置空*/return flag;/*返

35、回 0:表示没有换位,返回 1:表示有换位*/7)int test(Hnode*Hhead,int n)功能:检验数据长度。test()函数用于执行后, 检验第 n 行及后面的数据,使其满足每行不多于 76 个字符的规则。具体程序如下:int test(Hnode *Hhead,int n)int i=0,num1=1;20node *p1,*p2,*tail,*temp1,*temp2;Hnode *q;q=Hhead;for(i=1;inextl;tail=p1=q-next;if(p1=NULL) return;/*若此行没有任何字符,则返回*/while(tail-next!=NULL

36、)/*定位至列单链表中的最后一个元素*/tail=tail-next;/*若此单链表中没有回车符且有超过 76 个节点时, 则 p1 会指向此列单链表中的第 76 个节点*/for(i=0;ich=13|p1-next=NULL)break;p1=p1-next;p2=p1-next;p1-next=NULL;/*在此行的最后一个字符的前一个字符处断行,因为插入在此行插入了一个新的字符*/if(tail-ch!=13)/*若此行行尾不是回车键*/if(p1-ch=13&q-nextl=NULL)/*若p1的数据域为回车符且行单链表中只有 n 个节点*/q-nextl=(Hnode *)mall

37、oc(sizeof(Hnode);/*新建一个行单链表节点,相当于添加一个新行*/q-nextl-nextl=NULL;tail-next=(node *)malloc(sizeof(node);/*在 tail 所指节点位置开始继续准备添加字符*/tail-next-ch=13;tail-next-next=NULL;q-nextl-next=p2;/*新行单链表节点保存此行多出的字符*/else/*若此行行尾和行中都没有回车键,或者 q-nextl 不为空*/q=q-nextl;/*q-nextl 有可能为空*/tail-next=q-next;/*将多出的字符与下一行的字符相连*/q-n

38、ext=p2;if(q!=NULL)test(Hhead,+n);/*若行单链表第 n 个节点后还有节点,继续 test()的相同处理*/21else/*若此列单链表最后一个元素为回车符*/temp2=p2; /*p2 指向第 77 个字符,或者为空(为空表示此行插入一个字符后,没有超出范围*/while(q!=NULL&p2!=NULL)/*q 指向行列表中的第 n 个节点.条件:行单链表中第 n 个节点存中且有第 77 个字符*/*条件: 在行单链表中只有n个节点,且字符超过了一行规定的76个, 且num1标志为 1*/if(q-nextl=NULL)&(p1!=tail|p2!=NULL

39、)&(num1=1)num1+;q-nextl=(Hnode *)malloc(sizeof(Hnode);/*新建一个行单链表节点,准备存储此行中多出的字符*/q-nextl-nextl=NULL;q-nextl-next=NULL;/*行单链表中第 n+1 个节点已经存在,下面为在行单链表中插入一个新的节点*/q=q-nextl;/*q 指向行列表中的第 n+1 个节点*/temp1=q-next;q-next=temp2; /*q 的数据域为此行中多出的字符所在的列单链表中的节点地址*/temp2=temp1;8)viod insert(Hnode*Hheadint m,int n,ch

40、ar a)功能:插入字符。insert()函数用于在第 m 行,第 n 列位置的前一个位置插入单个字符。具体程序如下: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)/*插入之前,若只有一个字

41、符在行中,则插在此节点之前*/p-next=q-next;q-next=p;elsep-next=p1-next; /*在第 m 行,第 n 列的字符前,插入一字符*/p1-next=p;test(Hhead,m);/*在插入新元素后, 检验并处理单链表中第 m 行开始的元素, 使其满足规则*/9)void control(intA,Hnode*Hhead)功能:控制左移、右移键。control()函数用于对左移键(右移键)进行响应。void control(int A, Hnode *Hhead)/*对控制键进行响应,A:按键的整数值,Hhead:行单链表的首地址*/void colorvi

42、ew(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 值,光标移动*/if(A=CR)&check(Hhead,wherey(),wherex()0)/

43、*ctrl+,当前光标的右边有字符,光标移动*/flag=1;gotoxy(wherex()+1,wherey(); if(A=CR)&check(Hhead,wherey()+1,1)0&check(Hhead,y,x)=0)flag=1;gotoxy(1,wherey()+1);if(A=CR)&x=76) /*ctrl+,当前光标在当前行的行尾,光标移动*/23flag=1;gotoxy(1,wherey()+1);if(A=CR&flag=1) /*ctrl+,光标已经跳至新处,将当前光标所在位置的字符的坐标和值保存在 r 数组中*/rabs(value).col=wherex();r

44、abs(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+,当前光标并不在窗口左上角,将当前光标所在位置的字符的坐标和值保存在 r 数组中*/rabs(value).col=wherex();rabs(value).line=wherey();rabs(value).ch=

45、check(Hhead,rabs(value).line,rabs(value).col);value+;colorview(Hhead,wherex(),wherey();10)void colorview(Hnode*Hhead,int x,int y)功能:用于用不同的前、背景色现实选择的字符。void colorview(Hnode *Hhead,int x,int y)/*用不同的前背景色显示选择的字符*/int i;view(Hhead);/*重新显示所有文本字符*/for(i=0;iabs(value);i+) /*value 为数组下标*/gotoxy(ri.col,ri.li

46、ne);textbackground(7);textcolor(0);if(ri.ch!=13&ri.ch!=-1)cprintf(%c,ri.ch);if(ri.ch=13|ri.ch=-1)cprintf( );24gotoxy(x,y);11)void drawmenu(int m,int n)功能:画菜单。drawmenu 函数用于画菜单,m 表示第几项菜单,n 表示第 m 项的第n 个子菜单项。具体程序如下:void drawmenu(int m,int n)/*画菜单,m:第几项菜单,n:第 m 项的第 n 个子菜单*/int i;if(m%3=0)/*画 File 菜单项*/wi

47、ndow(8,2,19,9);textcolor(0);textbackground(7);for(i=0;i7;i+) /*在上面定义的文本窗口中先输出 7 个空行*/gotoxy(1,1+i);insline();window(1,1,80,25);gotoxy(7,1);for(i=1;i=7;i+)gotoxy(8,1+i);cprintf(%c,179);/*窗口内文本的输出函数,在窗口左边输出 | */gotoxy(19,1+i);cprintf(%c,179);/*窗口内文本的输出函数,在窗口右边输出 | */for(i=1;i=11;i+)gotoxy(8+i,2);cprin

48、tf(%c,196);/*窗口内文本的输出函数,在窗口上边输出 - */gotoxy(8+i,9);cprintf(%c,196);/*窗口内文本的输出函数,在窗口下边输出 - */25textbackground(0);gotoxy(10,10); cprintf();/*输出下边的阴影效果*/for(i=0;i9;i+)gotoxy(20,2+i);cprintf();/*输出右边的阴影效果*/textbackground(7);gotoxy(8,2);cprintf(%c,218);/*输出四个边角表格符*/gotoxy(8,9);cprintf(%c,192);gotoxy(19,2)

49、; cprintf(%c,191);gotoxy(19,9); cprintf(%c,217);gotoxy(9,3);cprintf( New);gotoxy(9,4);cprintf( Open);gotoxy(9,5);cprintf( Save);gotoxy(9,6);cprintf( Save as);for(i=1;i=10;i+)gotoxy(8+i,7);cprintf(%c,196);/*在 Save as 下输出一行分隔符*/gotoxy(9,8);cprintf( Exit);textcolor(15);textbackground(0);gotoxy(7,1);cpr

50、intf(%c%c File %c%c,179,17,16,179);switch(n%5)case 0:gotoxy(9,3);cprintf( New); break;case 1:gotoxy(9,4);cprintf( Open); break;case 2:gotoxy(9,5);cprintf( Save); break;case 3:gotoxy(9,6);cprintf( Save as); break;case 4:gotoxy(9,8);cprintf( Exit); break;/*/if(m%3=1) /*画 Edit 菜单项*/window(35,2,45,7);te

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 公文通知

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁