资源描述
沈阳航空航天大学
课 程 设 计 报 告
课程设计名称:数据结构课程设计
课程设计题目:小型文本编辑器设计
院(系):计算机学院
专 业:
班 级:
学 号:
姓 名:
指导老师:
目 录
沈阳航空航天大学 II
1 程序模块说明 3
1.1 程序模块 3
1.2 模块功效说明 3
2 程序步骤图说明 4
2.1 主函数步骤图 4
2.2 显示模块步骤图 5
2.3 查找模块步骤图 6
2.4 替换模块步骤图. 7
2.5 将文本初始化 8
3 函数描述 9
3.1 串初始化 9
3.2 查找函数 9
3.3 替换函数 9
3.4 串块链存放 9
4 程序测试和运行结果 10
4.1 初始化一个串 10
4.1.1 10
4.1.2. 10
4.2 查找和替换字符串 10
4.2.1 10
4.2.2 11
4.2.3 11
4.2.4 11
4.2.5 11
4.2.6 12
参考文件 13
附 录(关键部分程序清单) 14
查找和替换函数 14
生成一个其值等于chars串T,成功返回1,不然返回0 16
输出字符串T 18
源代码 20
1 程序模块说明
1.1 程序模块
为了更方便地完成字符串查找,此程序采取串块链式存放结构存放方法。经过主模块调用四个小模块完成文本编辑多种功效。用户可在主模块上循环对程序进行操作。
主模块
查
找
模
块
替
换
模
块
编
辑
文
本
信
息
退
出
模
块
1.2 模块功效说明
1.主模块:用户可编辑任一文档,输入要在文本中查找信息。初始化一个字符串,并用串块链式存放结构存放。
2. 编辑文本信息:将用户编辑文本信息分行输出来,并输出字符串长度和行数。
3.查找模块:遍历整个文本,查找字符串在串中位置,并输出其所在位置,直到遍历完整个文本结束。
4.替换模块:先查找你要替换字符所在位置,然后依据用户选择是否替换该字符。
5.退出模块:退出程序,等候用户下次重行运行该程序。
2 程序步骤图说明
2.1 主函数步骤图
图2.1.主程序步骤图
用户可依据此函数输入想要进行操作来实现其对应编辑文本信息、查找字符在文本中所在位置、替换文本中字符串及查看目前文本字符数和行数信息等一系列功效。详见图2.1.
2.2 显示模块步骤图
图2.2 显示模块步骤图
此模块关键实现用户所编辑文本信息行数和字符总个数,和输出文本字符信息。显示出用户所编辑文本信息,并输出到屏幕上,为满足用户需求,此模块可循环操作。详见步骤图2.2。
2.3 查找模块步骤图
图2.3 查找步骤图
此模块关键是完成字符串查找和替换文本中字符信息等功效。查找字符串关键是经过将所查找字符串和主串开始从第一个字符开始比较,假如相同,比较下一个字符,不然将指向目前字符串中字符指针向前移动已比较字符个数个单位,而且在想后移一个字符,然后再从头开始和和所查找字符穿一一比较。查找成功则返回字符所在位置并输出,接着继续进行下一轮查找,一直循环到将文本中信息读完为止,详见步骤图2.3。
2.4 替换模块步骤图.
图2.4. 替换步骤图
此模块关键是完成字符串查找和替换文本中字符信息等功效。查找字符串关键是经过将所查找字符串和主串开始从第一个字符开始比较,假如相同,比较下一个字符,不然将指向目前字符串中字符指针向前移动已比较字符个数个单位,而且在想后移一个字符,然后再从头开始和和所查找字符穿一一比较。查找成功则返回字符所在位置并输出,接着继续进行下一轮查找,一直循环到将文本中信息读完为止。替换功效是在查找基础上进行,即也就是先查找到要替换词位置,然后依据用户选择在此位置是否替换,一样也是一直循环到读完整个文本信息为止。详见步骤图2。4。
2.5 将文本初始化
图2.5 初始化文本信息
将文本信息初始化到用块链式存放串中
3 函数描述
3.1 串初始化
初始化一个空串,然后将输入文本信息存放到此串中,因为这是采取块链式存放,用户能够自定义行大小即一个节点存放字符串个数,所申请总节点数也就是字符行数。
3.2 查找函数
查找字符串关键是经过将所查找字符串和主串开始从第一个字符开始比较,假如相同,用for循环比较下一个字符,不一样则将指向目前字符串中字符指针向前移动已比较字符个数个单位,而且再向后移一个字符,然后再从头开始和和所查找字符穿一一比较。查找成功则返回字符所在位置并输出,接着继续进行下一轮查找,一直循环到将文本中信息读完为止。
3.3 替换函数
替换功效是在查找基础上进行,即也就是先查找到要替换词位置,然后依据用户选择在此位置是否替换,若需替换,则进入for循环完成替换,然后再经过比较查找到下一个需替换位置,一样也是一直循环到读完整个文本信息为止。
3.4 串块链存放
采取串块链式存放优点是用户可依据自已实际需要来定义每个节点大小,这么可降低空间浪费,除此之外,链式存放还方便查找。×
4 程序测试和运行结果
为方便查阅,所以选一串比较短字符串为例,以英文字符“ABCDEFGHIJKLMN”为例,来实现下面全部功效
4.1 初始化一个串
4.1.1首先用户可输入用户所需要文本信息,如“ABCDEFGHIJKLMN”
程序开始运行界面图4.1.1所表示。
截图4.1.1 初始化一字符串
4.1.2.初始化“ABCDEFGHIJKLMN”后,结果以下图4.1.2所表示,分行输出文本字符信息和文本长度和行数。
截图4.1.2 初始化一字符串
4.2 查找和替换字符串
4.2.1.编辑完文本后,用户可自定义查找和替换字符,选择查找和替换选项(即第二个选项),;以下图4.2.1所表示。根听说明输入指令2进行查找××××××
截图4.2.1查找字符串
4.2.2输入你要查找字符串,以回车结束。图4.2.2所表示。依据提醒,输入你要查找字符,如“L”;
截图4.2.2查找字符串
4.2.3输入你需要替换后字符,如“S”;详见图4.2.3所表示。
截图4.2.3查找字符串
4.2.4查找出所查找词在串中第一个位置,输出该位置并弹出指令用户是否需要替换此位置词。图4.2.4所表示。
截图4.2.4替换字符串
4.2.5依据用户选择,如输入Y;则替换掉该位置词并接着查找下一个所查找字符所在位置或查找结束,图4.2.5所表示。
截图4.2.5替换字符串
4.2.6若用户不需要替换该位置字符,输入“N”程序将跳过该位置替换直接进入下一轮查找。图4.2.6所表示。
截图4.2.6 不替换字符串
回到主程序,查找下一个字符,或继续进行下一轮操作。
参考文件
[1] 高富平,张楚 . 电子商务法[M]. 北京:北京大学出版社,
[2]谭浩强著. C程序设计( 第三版). 北京: 清华大学出版社,
[3]数据结构: C语言版 /严蔚敏,吴伟明编著.—北京:清华大学出版社,
附 录(关键部分程序清单)
查找和替换函数
void chazhao(LString *T,char *chars,char *chars1)//所查找字符和替换后字符
{
Chunk *p,*q;
int m=0,c=0,a=1,b=0,d=0,a1=0,c1=0,c2=0,x=0;
char u;
p=q=T->head;
while(1)
{
if(c==CHUNKSIZE)
{
q=q->next;
a++;
c=0;
}
for(x=0;q->ch[c]==chars[m];x++)
{
m++;c++;
if(x==0)
{
b=a;d=c-1; }
if(c==CHUNKSIZE)
{
q=q->next;c=0;
}
if(chars[m]=='\0')//字符查完
{
printf("所查字符所在行位置是%d,第%d个位置开始\n",b,d+1);
printf("若需替换该字符,输入Y,不然输入N\n");
scanf("%c",&u);
fflush(stdin);
if(u!='N')
{
p=T->head;
a=b;c=d;
for(a1=1;a1<a;a1++)
p=p->next;
q=p;
for(;c1<m;c1++)//替换后字符chars1
{
if(c==CHUNKSIZE)
{
q=q->next;
c=0;
}
q->ch[c]=chars1[c2];
c2++;c++;
}
c2=0;c1=0;
StrPrint(*T);
}//替换完成
c=d;a=b;
}
}
if(!*(q->ch+c+1+m))//串查完/
{
printf("查找完成,已无匹配字符\n");
break;
}
else
{
p=T->head;
for(a1=1;a1<a;a1++)
{
p=p->next;q=p;
}
c=c+1;m=0;
}
}
}
生成一个其值等于chars串T,成功返回1,不然返回0
int StrAssign(LString *T,char *chars)
{
int i,j,k,l,m=0;
Chunk *p,*q;
i=strlen(chars); // i为串长度
if(!i)
return 0;
(*T).curlen=i;
j=i/CHUNKSIZE; // j为块链结点数,块个数 ,即行数
if(i%CHUNKSIZE>0) //不足一个块,当成一个块即块数加1
j++;
printf("长度是%d\n行数是%d\n",i,j);
for(k=0;k<j;k++)
{
p=(Chunk*)malloc(sizeof(Chunk));
if(!p)
return 0;
if(k==0)
(*T).head=q=p;
else
{
q->next=p;
q=p;
}
for(l=0;l<CHUNKSIZE&&*chars;l++)
{
q->ch[l]=chars[m];m++;}
if(!*chars)
{
(*T).tail=q;
q->next=NULL;
for(;l<CHUNKSIZE;l++)
*(q->ch+l)=blank;
}
}
return 1;
}
输出字符串T
void StrPrint(LString T)
{
int i=0,j;
Chunk *h;
h=T.head;
while(i<T.curlen)
{
for(j=0;j<CHUNKSIZE;j++)
if(*(h->ch+j)!=blank) // 不是填补空余字符
{
printf("%c",*(h->ch+j));
i++;
}
printf("\n");
h=h->next;
}
printf("\n");
}
课程设计总结:
指导老师评语:
指导老师(签字): 年 月 日
课程设计成绩
源代码
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <stdlib.h>
#include <string.h>
#define CHUNKSIZE 4
#define n 26
char blank = '#'; // 全局变量,用于填补空余
typedef struct Chunk
{
char ch[CHUNKSIZE];
struct Chunk *next;
}Chunk;
typedef struct
{
Chunk *head,*tail;
int curlen;
}LString;
void InitString(LString *T)// 初始化(产生空串)字符串T。
{
(*T).curlen=0;
(*T).head=NULL;
(*T).tail=NULL;
}
int StrAssign(LString *T,char *chars)// 生成一个其值等于chars串T, 成功返回1,不然返回0
{
int i,j,k,l;
Chunk *p,*q;
i=strlen(chars); // i为串长度
if(!i||strchr(chars,blank)) // 串长为0或chars中包含填补空余字符
return 0;
(*T).curlen=i;
j=i/CHUNKSIZE; // j为块链结点数,块个数
if(i%CHUNKSIZE) //不足一个块,当成一个块即块数加1
j++;
printf("长度是%d\n行数是%d\n",i,j);
for(k=0;k<j;k++)
{
p=(Chunk*)malloc(sizeof(Chunk));
if(!p)
return 0;
if(k==0) // 第一个链块
(*T).head=q=p;
else
{
q->next=p;
q=p;
}
for(l=0;l<CHUNKSIZE&&*chars;l++)
*(q->ch+l)=*chars++;
if(!*chars) // 最终一个链块
{
(*T).tail=q;
q->next=NULL;
for(;l<CHUNKSIZE;l++)// 用填补空余字符(blank=‘#’)填满链表
*(q->ch+l)=blank;
}
}
return 1;
}
int StrEmpty(LString S)
{
if(S.curlen)
return 0;
else
return 1;
}
void StrPrint(LString T)// 输出字符串T
{
int i=0,j;
Chunk *h;
h=T.head;
while(i<T.curlen)
{
for(j=0;j<CHUNKSIZE;j++)
if(*(h->ch+j)!=blank) // 不是填补空余字符
{
printf("%c",*(h->ch+j));
i++;
}
printf("\n");
h=h->next;
}
printf("\n");
}
void chazhao(LString *T,char *chars,char *chars1)///查找和替换函数///
{
Chunk *p,*q;
int m=0,c=0,a=1,b=0,d=0,a1=0,c1=0,c2=0,x=0;
char u;
p=q=T->head;
while(1)
{
if(c==CHUNKSIZE)
{
q=q->next;
a++;
c=0;
}
for(x=0;q->ch[c]==chars[m];x++)
{
m++;c++;
if(x==0)
{
b=a;d=c-1; }
if(c==CHUNKSIZE)
{q=q->next;c=0;}
if(chars[m]=='\0')//字符查完
{
printf("所查字符所在行位置是%d,第%d个位置开始\n",b,d+1);
printf("若需替换该字符,输入Y,不然输入N\n");
scanf("%c",&u);
fflush(stdin);
if(u!='N')
{
p=T->head;
a=b;c=d;
for(a1=1;a1<a;a1++)
p=p->next;
q=p;
for(;c1<m;c1++)//替换后字符chars1
{
if(c==CHUNKSIZE)
{
q=q->next;
c=0;
}
q->ch[c]=chars1[c2];
c2++;c++;
}
c2=0;c1=0;
StrPrint(*T);
}//替换完成
c=d;a=b;
}
}
if(!*(q->ch+c+1+m))//串查完/
{
printf("查找完成,已无匹配字符\n");
break;
}
else
{
p=T->head;
for(a1=1;a1<a;a1++)
{p=p->next;q=p;}
c=c+1;m=0;
}
}
}
void main()
{
char s1[n],s2[n],s3[n];//char *s3="22",*s2="aa";
LString t1;
int k,meum=0,L,h;
printf("\t=========说明:首先连续输入多个字符初始化串,以回车结束.==== ==\n");
printf("\t=====================1:查看串信息=====================\n\n");
printf("\t=====================2:查找和替换=====================\n\n");
printf("\t=====================3:退 出=====================\n\n");
printf("请输入文本信息!\n");
scanf("%s",&s1);fflush(stdin);
L=strlen(s1);
h=L/CHUNKSIZE;h++;
InitString(&t1);printf("初始化串t1后, \n");
k=StrAssign(&t1,s1);
StrEmpty(t1);
if(k==1)
{
printf("串t1为:\n ");
StrPrint(t1);
}
else
printf("犯错\n"); // 不能生成空串
while(1)
{
printf("\t请输入命令!(参考说明)\n");
scanf("%d",&meum);fflush(stdin);
switch(meum)
{
case 1:
{
printf("初始化串t1后, \n");
StrEmpty(t1);
k=StrAssign(&t1,s1);
if(k==1)
{
printf("串t1为:\n ");
StrPrint(t1);
}
else
printf("犯错\n"); // 不能生成空串
}break;
case 2:
{
printf("请输入查找字符!\n");
scanf("%s",&s2);
fflush(stdin);
printf("请输入替换后字符!\n");
scanf("%s",&s3);
fflush(stdin);
chazhao(&t1,s2,s3);
}break;
case 3:{exit(0);}break;
default:
printf("输入错误!!请重新输入!\n");
break;
}
}
}
展开阅读全文