数据结构课程设计:行编辑程序

合集下载

数据结构行编辑程序报告

数据结构行编辑程序报告
SqStack S,S1;
InitStack(S);
InitStack(S1);
char ch,c;
ch=getchar();
while(ch!=EOF){//EOF为全文结束符
while(ch!=EOF&&ch!='\n'){
switch(ch){
case'#':Pop(S,c); break;//仅当栈非空时退栈
二.设计
用栈编辑一个输入缓冲区
1.用“#”符号删除前一个错误的字符,用Pop退出栈顶元素已删除最后一个错误元素。
2.用“@”符号删除前面一行元素,循环使用判断前是否还有元素,如有用Pop删除。直至判断栈空为止。实现退行功能。
此程序很恰当的运用了栈后进先出的特点,将栈定义,在算法中直接调用,帮助实现“#”符号的退格功能和“@”符号的退行功能。
}
Status GetTop(SqStack S,SElemType &e)
{//取栈顶元素
if(S.top==S.base) return ERROR;
e=*(S.top-1);
return OK;
}//GetTop
Status Push(SqStack &S,SElemType e)
{//入栈将e放入栈里面
case'@':{
while(!StackEmpty(S))
Pop(S,c);
};break;//构造空栈S
default:Push(S,ch); break;//有效字符进栈,未考虑栈满情形
}
ch=getchar();//从终端接收下一字符
}
while(!StackEmpty(S)){

数据结构课程设计_中文文本编辑(文本删除、修改、查询、统计、添加)

数据结构课程设计_中文文本编辑(文本删除、修改、查询、统计、添加)

数据结构课程设计:文本编辑(最后附完整代码)一.问题描述---------------------------------------------1二.设计思路---------------------------------------------1三.系统实现功能1.建立单链表-------------------------------------------22.显示文章内容---------------------------------------- 33.查找文章语句-----------------------------------------34.删除文章语句-----------------------------------------55.替换文章语句-----------------------------------------76.统计文章字数-----------------------------------------107.写入文本结束程序--------------------------------------10四.系统不足及需改进分------------------------------------11五.文件清单说明------------------------------------------11六:附录-------------------------------------------------12一:问题描述本次我所做的课程设计为:文本编辑,主要内容是对中文文本的显示、查找、删除、替换、统计、写入文本。

在程序选择功能后根据提示,输入任意长度中文语句即可对文章进行操作。

二:设计思路文本编辑,顾名思义就是对一遍文章进行编辑,我所设计的是对中文的编辑。

中文有两个字节(汉字、标点),通常情况下通过文件输入流仅仅可以取一个字节或者是以空格为分隔符取单词这仅仅对英文的文章适用,周六周日我从网上搜索相关方法,未找到一条切实可用的对中文字符操作的方法。

行编辑程序

行编辑程序

// 《数据结构》//第一组:行编辑程序(+注释)#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<string.h>#include<conio.h>#define STACK_MAX_SIZE 100 //初始化分配空间最大值#define STACKINCREMENT 10 //空间增量struct SqStack{char *base;char *top;int stacksize;}; //定义结构体,头尾指针void Initstack(SqStack &S) //建立栈{S.base=(char*)malloc(STACK_MAX_SIZE *sizeof(char)); //分配空间,每个元素为一个存储单元if(!S.base) exit(1); //存储分配失败S.top=S.base; //初始化,头尾指针指向同一位置S.stacksize=STACK_MAX_SIZE; //栈的容量为100}void push(SqStack &S,char e) //插入元素e为栈顶元素{if(S.top-S.base>=S.stacksize) //判断是否满栈{S.base=(char*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(char)); //追加栈的容量10if(!S.base) exit(1); //存储分配失败S.top=S.base+S.stacksize; //头指针指向栈顶元素的上一个位置S.stacksize+=STACKINCREMENT; //此时栈的长度为110}*S.top++=e;}char pop(SqStack &S,char e) //若栈不空,则删除S的栈顶元素,用e返回其值{if(S.top==S.base) //return false;e=*--S.top; // 等价于e=*(S.top-1); --S.top; e=*S.top;return e;}void clearstack(SqStack &S) //清空栈{S.top=S.base;}void destorystack(SqStack &S) //销毁栈{free(S.base); //释放空间S.top=S.base;}bool stackempty(SqStack &S) //查看栈是否为空,如果空,返回true,否则返回fasle {if(S.top==S.base)return true;return false;}void printstack(SqStack &S) //打印栈内元素{char e;while(!stackempty(S)) //判断循环{pop(S,e); //压栈,e为栈顶元素printf("%d",e); //输出e}}void main() //主函数{char ch,e;SqStack S,D; //定义两个栈S和Dprintf("请输入字符:\n");Initstack(S); //构造栈SInitstack(D); //构造栈Dch=getchar();while(ch!=EOF) //如果ch不是终止字符{while(ch!=EOF&&ch!='\n') //ch不是终止字符,且不是'\n'{switch(ch) //循环{case'#':pop(S,e); break; //遇#,删除栈顶元素case'@':clearstack(S); break; //遇@,清空栈Sdefault:push(S,ch); break; //否则,插入字符ch}ch=getchar(); //输入字符}while(!stackempty(S)) //如果栈S非空,循环{e=pop(S,e);push(D,e);}while(!stackempty(D)) //如果栈D非空,循环{e=pop(D,e);printf("%c",e);}clearstack(S);if(ch!=EOF)ch=getchar();}destorystack(S); //销毁栈S}/*遇到问题:1、头指针和尾指针的指向问题2、初始化空间容量问题,追加空间增量3、Switch分支语句判断问题*/。

行编辑程序

行编辑程序

计算机系上机实验报告实验项目名称行编辑程序所属课程名称数据结构实验类型综合型实验班级完整学号姓名成绩实验概述:【实验目的】1.练习行编辑程序并写出栈的逻辑结构表示2.掌握栈的特点并实现栈的存储表示3.用栈解决行编辑的问题【实验环境】(使用的软件)Visual C++ 6.0 控制台编程环境实验内容(不够附页):【实验方案设计与实验过程】(分析、设计、实验步骤、测试数据、实验结果)一、分析行编辑程序的功能:接受用户从终端输入的程序或数据,并存入用户的数据区。

较好的做法:设立一个输入缓冲区,用来接收用户输入的一行字符,然后逐行存入用户数据区。

例如,当用户发现刚刚键入放入一个字符是错的时,可补符进一个退格符“#”,以表示前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符“@”,以表示当前行中的字符均无效。

二、设计使用栈结构实现输入缓冲区从终端接收一个字符进行判断:1、不是“#”也不是“@”则压入栈顶2、是“#”,则栈顶元素出栈3、是“@”,则栈清空4、接收到行结束符或全文结束符将数据送入用户数据区三、实验步骤四、测试数据【实验小结】(实验过程中出现的问题、结果分析、出错原因分析等)(实验过程中出现问题举例)1.问题:在程序实现过程中,编译时没有出现错误:但在运行结果时却出现如下错误:仔细检查程序,发现是由于少写了如下一段程序:case'@':{while(!StackEmpty(S))Pop(S,c);};break;//构造空栈S加上以上语句,再编译执行,程序运行正常。

成绩:批阅日期:。

简单行编辑器 数据结构 课程设计

简单行编辑器 数据结构 课程设计

简单行编辑器数据结构课程设计概述:本文旨在设计一种简单的行编辑器,以满足基本的文本编辑需求。

行编辑器是一种常见的文本编辑工具,它允许用户在文本中进行插入、删除、挪移光标等操作。

为了实现这一目标,我们将采用数据结构来管理文本的存储和操作。

1. 数据结构设计:1.1 文本存储:我们可以使用链表作为文本的基本数据结构,每一个节点存储一个字符。

链表的每一个节点包含一个字符和指向下一个节点的指针。

这样的设计可以方便地进行插入和删除操作,同时保持文本的顺序。

1.2 光标位置:光标的位置可以用一个指针指向链表中的某个节点。

这个指针可以指向一个字符之前、之后或者字符本身的位置。

通过挪移光标指针,用户可以在文本中进行插入、删除和挪移操作。

2. 功能实现:2.1 插入操作:用户可以在光标当前位置插入一个字符。

插入操作包括以下步骤:- 创建一个新节点,存储要插入的字符。

- 将新节点插入到光标所在节点的前面或者后面,更新链表的指针。

2.2 删除操作:用户可以删除光标当前位置的字符。

删除操作包括以下步骤:- 找到光标所在节点。

- 更新链表的指针,将光标所在节点从链表中移除。

2.3 光标挪移操作:用户可以通过挪移光标来改变插入和删除操作的位置。

光标挪移操作包括以下步骤:- 根据用户输入的指令,将光标指针向前或者向后挪移一个节点。

2.4 文本显示:用户可以查看当前编辑的文本内容。

通过遍历链表,将字符挨次输出即可。

3. 用户界面设计:为了方便用户操作,我们可以设计一个简单的用户界面,包括以下组件:- 文本显示区域:显示当前编辑的文本内容。

- 光标位置指示器:显示光标当前位置。

- 命令输入框:接收用户输入的命令。

4. 实例演示:假设用户输入以下命令序列:- 插入字符 'A':光标指向开头,文本变为 "A"。

- 插入字符 'B':光标指向 'A' 后面,文本变为 "AB"。

行编辑程序说明书

行编辑程序说明书

摘要本课程设计是实现“简单的行编辑程序”,此编辑程序的主要用处是接受用户从终端输入的程序和数据,并存入用户的数据区。

这个行编辑程序需要实现的功能包括:能够设立一个输入缓冲区,用于接受用户输入的一行字符然后逐行存入用户数据区;用户在输入出差错时,并在发现有误时可以及时更改。

此程序是一个课程设计的程序,只是模拟的一个简单的行编辑器,如需要真正设计一个行编辑器,那么还需要更为完善的程序。

关键词:行编辑;数据结构;VC++;线性结构AbstractThis course is designed to achieve "a simple line editor", the main use of this editing program is to accept input from the terminal user programs and data, and the data stored in the user's area. This program needs to achieve line editing features include: the ability to set up an input buffer for receiving a line of characters entered by the user and stored in the user data area progressive; awry when the user input, and can be found in time to change the wrong time . This program is a curriculum design process, just simulate a simple line editor, such as the need to really design a line editor, you also need a more comprehensive program.Keyword:Line editing; data structure; VC + +; linear structure目录1课题设计要求 (1)1.1课程设计的题目及内容 (1)1.2 题目要求 (2)2概要设计 (3)2.1存储结构的定义 (3)2.2功能函数 (3)2.3主函数 (4)2.4 函数设计 (4)2.4.1 主函数界面设计 (4)2.4.2帮助函数界面设计 (5)2.4.3用户操作界面设计 (5)3详细设计 (10)3.1主函数的设计 (10)3.2帮助函数子程序设计 (10)3.3编辑函数子程序设计 (11)3.4活区显示函数子程序设计 (12)3.5活区切换函数子函数设计 (13)3.6行删除函数子程序设计 (14)3.7行插入行数子程序的设计 (15)4调试过程及实验结果 (16)4.1调试过程 (16)4.2实验结果 (16)4.2.1帮助函数调试结果 (16)4.2.2打开文件函数调试结果 (17)4.2.3活区显示函数调试结果 (17)4.2.4活区切换函数调试结果 (18)4.2.5行删除函数调试结果 (18)4.2.6行插入函数调试结果 (19)5结论 (20)参考文献 (21)致谢 (22)附录1:用户使用说明 (23)附录2:源程序 (24)1课题设计要求1.1课程设计的题目及内容本次课程设计的题目为:简单的行编辑程序。

简单行编辑器 数据结构 课程设计

简单行编辑器 数据结构 课程设计

中国矿业大学徐海学院计算机系《软件认知实践》报告姓名:学号:专业:设计题目:简单行编辑器指导教师:2012年12月25目录第1章题目概述 (1)第1.1节题目要求 (1)第1.2节主要难点 (2)第2章系统流程图 (3)第3章数据结构和算法 (4)第4章核心代码分析 (6)第5章复杂度分析 (10)第6章总结 (11)参考文献 (13)第1章题目概述在这次课程设计中我选的题目是文本编辑,文本编辑几乎是每个使用电脑的人都会遇到的问题,特别是网络小说作家们。

在文本的编辑中,我们会时常遇到文本信息的统计问题、小型子串的查找问题、子串的查找和删除问题等。

如果靠人自己去观察和执行相关操作的话,不仅累人,而且很容易出错。

而使用计算机程序去实现的话,则会省力不少,而且相对来说非常精确。

本程序使用了较快速的查找算法,可以大大提高检索的效率,相信这可一极大的方便用户用电脑编辑文本文件。

第1.1节题目要求文章编辑功能:输入一页文字,程序可以统计出文字、数字、空格的个数。

静态存储一页文章,每行最多不超过80个字符,共N行;要求(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。

存储结构使用线性表,分别用几个子函数实现相应的功能;输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。

输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章;实现功能(1)文章内容的输入:包括字母、标点符号、数字等;(2)文章内容的统计:包括文章中大写字母、小写字母、数字、标点符号、空格以及文章所有字数的个数的统计;(3)文章内容的处理:包括对文章内容的查找、删除以,其中在查找的过程中统计出该字符或字符串在文章中出现的次数;第1.2节主要难点本程序是对一段英文文章的内容进行处理,存储方式采用链式存储,没有文件操作,故本程序对其文本内容的所有操作都是在链表中进行的。

行编辑程序课程设计

行编辑程序课程设计

行编辑程序课程设计一、课程目标知识目标:1. 学生能理解行编辑程序的基本概念,掌握其功能和用途。

2. 学生能掌握行编辑程序的基本操作,如插入、删除、替换和查找。

3. 学生了解行编辑程序与文本处理软件(如记事本、Word等)的区别和联系。

技能目标:1. 学生能够独立使用行编辑程序进行文本编辑和操作。

2. 学生能够运用行编辑程序解决实际问题,如修改代码、配置文件等。

3. 学生通过行编辑程序的学习,培养逻辑思维和问题解决能力。

情感态度价值观目标:1. 学生对计算机编程产生兴趣,树立编程学习的自信心。

2. 学生培养良好的编程习惯,注重代码规范和团队协作。

3. 学生认识到行编辑程序在实际应用中的价值,激发学习计算机科学的热情。

分析课程性质、学生特点和教学要求:1. 课程性质:本课程为信息技术学科,以实践操作为主,理论讲解为辅。

2. 学生特点:六年级学生具备一定的计算机操作基础,思维活跃,好奇心强。

3. 教学要求:结合学生实际,注重实践操作,提高学生的动手能力和解决问题的能力。

二、教学内容1. 行编辑程序基本概念:介绍行编辑程序的定义、功能和用途,结合课本第二章第一节内容,让学生了解行编辑程序在计算机编程中的重要性。

2. 行编辑程序基本操作:详细讲解插入、删除、替换和查找等操作,对应课本第二章第二节,通过实例演示和练习,使学生熟练掌握操作方法。

3. 行编辑程序与文本处理软件的对比:分析行编辑程序与文本处理软件的异同,以课本第二章第三节为例,让学生明白两者在实际应用中的适用场景。

4. 实践操作:安排学生进行行编辑程序的操作练习,结合课本第二章练习题,巩固所学知识,提高实际操作能力。

5. 行编辑程序在实际应用中的案例:介绍行编辑程序在编程、配置文件等领域的应用,参照课本第二章案例分析,激发学生学习兴趣,培养实际应用能力。

6. 编程习惯与规范:讲解编程过程中应注意的规范和习惯,结合课本相关内容,培养学生良好的编程素养。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、需求分析由于被编辑的文本文件可能很大,全部读入编辑程序的数据空间(内存)的作法既不经济,也不总能实现。

而用行编辑把待编辑文件的一段放进内存,称为活区。

本行编辑程序是以每行不超过320个字符为前提的。

每次编辑会读入80行,活区每次只显示20行。

1.该程序要实现以下基本编辑命令和一些相关的命令:(1)行插入。

格式:i<回车><行号><回车><文本><回车>。

将<文本>插入活区第<行号>行之后。

(2)行删除。

格式:d<回车><行号1>,<行号2><回车>。

删除活区中第<行号1>行到第<行号2>行。

(3)活区切换。

格式:n<回车><页数><回车>。

由于每次从输入文件读入80行,而活区每页显示20行,而活区切换就是要切换到需编辑的页面上去。

(4)活区显示。

格式p<回车>。

显示当前要编辑的活区内容。

印出的每一行都有一个前置行号和一个空格符,行号固定为2位,增量为1。

(5)清屏。

格式:c<回车>。

(6)获得帮助。

格式:h<回车>。

(7)退出。

格式:e<回车>。

二、概要设计程序结构流程图:存储结构的定义如下:typedef struct text{char string[80];//存储每一行的元素struct text *next;//指向后一个节点的指针int flat;//确定此行是否被删除的标志}text,*textp;功能函数:Status Createlist(textp &head);功能:建立一个80个节点的链表,是整个活区的大小int del(textp head);功能:删除显示的活区的任意一行。

int display(textp &head);功能:按照每页20行的规格显示活区的内容。

void freemem(textp &head);功能:销毁链表,释放内存。

int insert(textp &head);功能:在显示的活区插入一行内容。

Status SaveFile(textp head,FILE *out);功能:将活区的内容保存到输出文件。

Status LoadFile(textp head,FILE *fp);功能:从输入文件读取内容到活区。

void HELP();功能:提供命令的格式。

主函数:void main(){初始化;输入命令;Switch(c){case ‘e’:退出并保存编辑的内容case ‘p’: 显示活区case ‘n’: 活区切换case ‘d’: 删除一行case ‘i’: 插入一行case ‘c’: 清屏case ‘h’: 获得帮助}}三、详细设计#include<string.h>#include<stdio.h>#include<stdlib.h>#include<io.h>#include<process.h>#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2typedef int Status;typedef struct text{char string[80];//存储每一行的元素struct text *next;//指向后一个节点的指针int flat;//确定此行是否被删除的标志}text,*textp;//函数声明Status Createlist(textp &head);int del(textp head);int display(textp &head);void freemem(textp &head);int insert(textp &head);Status SaveFile(textp head,FILE *out);Status LoadFile(textp head,FILE *fp);void HELP();void main()//主函数,用来接受命令//编辑函数,用来接受处理编辑命令{textp head,q,p,p1;int page=0;FILE *fp,*out;char c,inname[30],outname[30];printf("################################欢迎使用行编辑程序#############################\n");HELP();printf("按任意键开始。

");c=getchar();/*打开输入、输出文件*/printf("Enter the infile name:");scanf("%s",inname);printf("Enter the outfile name:");scanf("%s",outname);if((fp=fopen(inname,"r"))==NULL){ printf("can't open the file! \n");exit(0);}if((out=fopen(outname,"w"))==NULL){ printf("can't open the file!\n");exit(0);}Createlist(head); /*创建一个80个结点的链表*/p=head;LoadFile( head,fp);do{printf("input order:");fflush(stdin);c=getchar();switch(c){case 'e':SaveFile(head,out); /* 退出并保存编辑的内容*/fclose(fp);fclose(out);break;case 'p': q=p;display(p);page++;if(page>4)page=1;printf("**********************page%d************************\n",page);if(page==4){p=head;page=0;}break;case 'n': /*活区切换*/SaveFile(head,out);LoadFile(head,fp);page=1;q=p=head;display(p);printf("**********************page%d************************\n",page);break;case 'd':p=q; /*显示活区*/del(p);display(p);printf("**********************page%d************************\n",page);break;case 'i': /*插入行*/p=q;insert(p);if(head->flat==1)fputs(head->string,out);p=q=q->next;p1=head;head=head->next;free(p1);display(p);printf("**********************page%d************************\n",page);break;case 'c':system("cls");break;case 'h':HELP();break;default:printf("\n\n\ninput error"); /*命令格式非法提示*/}}while(c!='e');freemem(head);}Status Createlist(textp &head)//建立一个80个节点的链表,是整个活区的大小{int n=0;textp p1,p2;p1=p2=(textp)malloc(sizeof(text));head=NULL;while(n<80){n=n+1;if(n==1){ head=p1;head->flat=0;}else{p2->next=p1;p1->flat=0;}p2=p1;p1=(text *)malloc(sizeof(text));}p2->next=NULL;return OK;}int del(textp head)//删除d命令对应的函数,用来删max-min中的行,用结构体中的flat表示是否被删除{text *p1,*p2;int min,max,i;scanf("%d %d",&min,&max);if(head==NULL){printf("\nlist null!\n");return OK;}p1=p2=head;for(i=0;i<min-1;i++)/*找到要删除的第一行*/p1=p1->next;for(i=0;i<max;i++)/*找到要删除的最后一行*/p2=p2->next;for(;p1!=p2;p1=p1->next)/*删除中间的节点,将flat赋值0*/{p1->flat=0;}return OK;}int display(textp &head)//显示P命令对应的函数,用来显示活区的内容{int i;textp p;for(i=1,p=head;i<=20&&p;p=p->next)if(p->flat==1){printf("%2d",i); /*输出每一行的行号*/i++;printf(" %s",p->string);}head=p;return 0;}void freemem(textp &head)//释放链表所占的内存{text *p;for(p=head;head!=NULL;){head=p->next;free(p);p=head;}}int insert(textp &head)//插入i命令对应的函数{int hang,i;textp p,p1;scanf("%d",&hang);p=(textp)malloc(sizeof(text));//为插入行分配空间p->flat=1;fflush(stdin);fgets(p->string,80,stdin); /*输入插入行的内容*/p1=head;if(hang==1){ if(!head->flat) /*头结点已被删除*/for(;p1&&!p1->flat;p1=p1->next); /*找到第一个flat=1的点*/p->next=p1->next;p1->next=p;}else{for(i=1,p1=head;i<hang;p1=p1->next)//找到要插入行的后一行if(p1->flat==1)i++;p->next=p1->next;//从此行向下将插入行插入到链表中p1->next=p;}return OK;}Status LoadFile(textp head,FILE *fp) /*从文件读内容到活区*/{textp p;for(p=head;p&&(!feof(fp));p=p->next){ if(!fgets(p->string,80,fp))break;p->flat=1;}return 0;}Status SaveFile(textp head,FILE *out) /*存储活区的函数*/{ textp p;for(p=head;p;p=p->next)if(p->flat==1){fputs(p->string,out); /*输出活区的内容到指定的文件*/p->flat=0;}return OK;}void HELP()//帮助函数,显示一些命令的格式{printf("\n\t **********************************************************\n"); printf("\t ** 行插入格式:i<行号><回车><文本><回车> **\n");printf("\t ** 行删除格式:d<回车><行号1>[<空格><行号2>]<回车> **\n"); printf("\t ** 活区切换格式:n<回车> **\n");printf("\t ** 活区显示格式:p<回车> **\n");printf("\t ** 清屏格式:c<回车> **\n");printf("\t ** 帮助格式:h<回车> **\n");printf("\t **********************************************************\n");}四、调试分析测试数据:任意的TXT文件,只要每行不超过80个字符。

相关文档
最新文档