实验四 串及其应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验4:串及其应用
一、实验目的
掌握串类型的实现方法和文本模式匹配方法,熟悉一般文字处理软件的设计方法。二、问题描述
全屏幕文本编辑器通过终端对文本文件进行创建、插入、删除、修改、存储等操作。用户可完成对文本的插入、删除、修改等功能。
三、实验要求
1、对光标实现如下操作:上、下、左、右移动一个字符位置;向前、后翻页;光标移
至文件首、尾;光标移至本行首、尾。
2、实现基本编辑命令:
I----在当前光标前插入内容,按ESC结束
F----在当前光标后插入内容,按ESC结束
D----删除光标所在行
ND---删除光标位置开始的n行
N-----删除光标上的字符
W----将修改后的文本保存下来
Q----退出编辑状态。
四、实验环境
PC微机
DOS操作系统或Windows 操作系统
Turbo C 程序集成环境或Visual C++ 程序集成环境
五、实验步骤
1、在内存开辟可容纳80行大小的编辑工作区和buffer 的修改缓冲区。
2、要求用户输入编辑文件名,对读入的文件建立相应的页表和行表,在文本编辑程序
中设立页指针、行指针、字符指针,分别指示当前操作的页、行、字符。
3、执行插入、删除、修改操作时,将本次操作内容放到缓冲区;
4、操作确定后,将修改后的文本存到文件中。
六、测试数据
自行设定。
七、算法设计
串的基本操作:
一、串赋值:
Status StrAssign(HString &T,char *chars)
{ // 生成一个其值等于串常量chars的串T
int i,j;
if(T.ch)
free(T.ch); // 释放T原有空间
i=strlen(chars); // 求chars的长度i
if(!i)
{ // chars的长度为0
T.ch=NULL;
T.length=0;
}
else
{ // chars的长度不为0
T.ch=(char*)malloc(i*sizeof(char)); // 分配串空间 if(!T.ch) // 分配串空间失败
exit(OVERFLOW);
for(j=0;j
T.ch[j]=chars[j];
T.length=i;
}
return OK;
}
二、串初始化
void InitString(HString &T)
{ // 初始化(产生空串)字符串T。另加
T.length=0;
T.ch=NULL;
八、实验内容和过程
实验程序:
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; // Status是函数的类型,其值是函数结果状态代码,如OK等 struct HString
{
char *ch; // 若是非空串,则按串长分配存储区,否则ch为NULL
int length; // 串长度
};
/***************文本编辑器的程序
**********************/
#define MAX_LEN 50 // 文件最大行数
#define LINE_LEN 80 // 每行字符数最大值+1
#define NAME_LEN 20 // 文件名最大长度(包括盘符、路径)+1
Status StrAssign(HString &T,char
*chars)
{ // 生成一个其值等于串常量chars的串
T
int i,j;
if(T.ch)
free(T.ch); // 释放T原有空间
i=strlen(chars); // 求chars的长度i if(!i)
{ // chars的长度为0
T.ch=NULL;
T.length=0;
}
else
{ // chars的长度不为0
T.ch=(char*)malloc(i*sizeof(char)); // 分配串空间
if(!T.ch) // 分配串空间失败
exit(0);
for(j=0;j
T.ch[j]=chars[j];
T.length=i;
}
return OK;
}
void InitString(HString &T)
{ // 初始化(产生空串)字符串T。另加
T.length=0;
T.ch=NULL;
}
void StrPrint(HString T)
{ // 输出T字符串。另加
int i;
for(i=0;i printf("%c",T.ch[i]); printf("\n"); } // 全局变量 HString T[MAX_LEN]; char str[LINE_LEN],filename[NAME_LEN]=""; FILE *fp; int n=0; // 文件行数 void Open() { // 打开文件(新或旧) int i; if(filename[0]) // 文件已打开 printf("已存在打开的文件\n"); else { printf("请输入文件名(可包括盘符、路径,不超过%d个字符): ",NAME_LEN-1); scanf("%s%*c",filename); fp=fopen(filename,"r"); if(fp) // 已存在此文件 { do { fgets(str,LINE_LEN,fp); i=strlen(str); str[i-1]=0; // 将10强制改为0 i--; if(i>0) { StrAssign(T[n],str); n++; if(n>MAX_LEN) { printf("文件太大\n"); return; } } }while(i>0); fclose(fp); } else printf("新文件\n"); } } void List() { // 显示文件内容 int i; for(i=0;i { printf("%d: ",i+1); StrPrint(T[i]); } getchar(); } void Insert()