实验四 串及其应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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()

相关文档
最新文档