用c++文章编辑器

  • 格式:doc
  • 大小:86.00 KB
  • 文档页数:8

文章编辑课程设计报告一、需求分析简单的文本编辑器内容:输入一页文字,程序可以统计出文字、数字、空格的个数。

静态存储一页文章,每行最多不超过80个字符,共N行。

要求:(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一字符或者子串,并将后面的字符前移。

(4)插入某一字符或者子串。

(5)查找某一字符或者子串。

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

输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章。

通过题目及其要求可知,本程序应实现以下功能:(1)文章内容的输入:包括字母、标点符号、数字等;(2)文章内容的统计:包括文章中大写字母、小写字母、数字、标点符号、空格以及文章所有字数的个数的统计;(3)文章内容的处理:包括对文章内容的查找、删除以及对指定位置进行插入操作,其中在查找的过程中统计出该字符或字符串在文章中出现的次数;问题分析本程序是对一段英文文章的内容进行处理,存储方式采用链式存储,没有文件操作,故本程序对其文本内容的所有操作都是在链表中进行的。

对于文本的输入,采用头插法将文本信息存储到链表已申请好的存储空间中,在此部分设计中最大的问题在于输入文章过程中输入的字符数大于80时如何换行;对于文本内容的统计,使用循环对已存储的文章进行匹配,大写字母数、小写字母数、空格数、数字数直接通过比较即可得到,标点符号通过ASCⅡ比较即可得到;对于文本内容的处理,查找部分仍是使用循环对已存储的文章进行匹配,判断需要查找的字符或者字符串是否与文章中某部分内容相同,如果存在相同的记录相同的个数及位置并输出个数及位置。

删除部分先使用程序的查找功能对文章中需要删除的字符或者字符串进行查找,然后对其进行删除。

插入部分为通过输入的插入位置(行、列)将字符或者字符串插入到文章制定位置。

二、概要设计1、存储结构此模块使用静态的字符数组作为存储结构,定义如下:char wz[N][80]; /* 存储文章的字符数组,为全局变量*/2、算法设计说明此模块主要有三个算法:(1)、统计字符个数算法流程图(2)、查找某一字符串出现的次数算法流程图(3)、删除某一字符串算法流程图三、详细设计:#include<stdio.h>#include<string.h>#define N 20 /* 文章的行数*/char wz[N][80]; /* 存储文章的字符数组,为全局变量*/ /*输入函数*/void readdat(){FILE *fp;int i,j,len;char *str;if(!(fp=fopen("E:/yy/wzin.dat","r+")))/*打开文件*/printf("The file can't found!\n");for(i=0;i<N;i++)fgets(wz[i],80,fp);/*读文件*/}/*输出函数*/void out(){int i=0;for(i=0;i<N;i++)printf("%s",wz[i]);}int countword(int n1,int n2)/*统计ASC 码在n1与n2之间的字符*/{int i,j,len;int n=0; /*统计字符数*/for(i=0;i<N;i++){len=strlen(wz[i]);for(j=0;j<=len;j++)if(wz[i][j]>=n1&&wz[i][j]<=n2)/*wz[i][j]的ASC 码在n1与n2之间,n++*/ n++;}return n;}int cz(char *s) /*查找某一字符串出现的次数*/{int n=0;int i;int lens;/*要查找字符串*S 的长度*/char *c;lens=strlen(s);for(i=0;i<N;i++){ c=strstr(wz[i],s);/*字符串*S在文章第i 行第一次出现的位置*/while(*c!=0){n++;c=strstr(c+lens,s);/*字符串*S在文章第i 行下一次出现的位置*/}}return n;}void del(char *s){int i,j,k,leni,lenc,lens;int p;char *c;lens=strlen(s);/*要删除字符串的长度*/for(i=0;i<N;i++){ c=strstr(wz[i],s);/*字符串s 在文章第i行首次出现的位置*/while(c!=0)/*c=0 则表明字符串s 在文章第i行没有出现*/{leni=strlen(wz[i]);/*文章第i 行的长度*/lenc=strlen(c);/*从字符串s 在文章第i行首次出现的位置处后的字符串的长度*/p=leni-lenc;/* 两个长度的差从此行的第p 个位置开始删除*/for(k=1;k<=lens;k++)/*删除lens次*/{for(j=p;j<=leni;j++)wz[i][j]=wz[i][j+1];/*字符前移*/leni=strlen(wz[i]);wz[i][j-1]='\0';leni=strlen(wz[i]);}c=strstr(wz[i],s);}}}main(){int word,space,num,zifu;/*字母数,空格数,数字数,字符数*/int n; /*某字符串数*/int leni;int i=0,j=0;char s1[80],*s;printf("Where do you want the file come from ?\n ");/*从文件读入数据,还是从键盘输入数据*/printf("From weijian please input 1 \nfrom keybrod please input 2 \n");/*从文件读入数据输入1,还是从键盘输入数据输入2*/scanf("%d",&n);getchar();switch(n){case 1:readdat();break;case 2:printf("please input the file untill @@\n");gets(s1);while(strcmp(s1,"@@")!=0&&i<N){strcpy(wz[i],s1);/*将s1中的内容复制到wz[i]中*/leni=strlen(s1);wz[i][leni]='\n';gets(s1);i++;}break;default:printf("Wrong input !\n");break;}printf("The file's content:\n ");out();word=countword('a','z')+countword('A','Z');/*统计字母*/printf("\nThe total word is :\t%d\n",word);space=countword(' ',' ');/*统计空格*/printf("The total space is :\t%d\n",space);num=countword('0','9');/*统计数字*/printf("The total shuzi is :\t%d\n",num);/*统计所有字符*/zifu=countword(32,44)+num+countword(59,94)+countword(97,126)+countword(174, 175);printf("The total zifu is :\t%d\n",zifu+space);/*字符串的查找*/printf("\nplease input a srting:\t");scanf("%s",s);n=cz(s);printf("\nThe string %s chuxian %d ci \n",s,n);getchar();/*字符串的删除*/printf("\nWhich string do you want to del:\n");printf("please input a string :\t");scanf("%s",s);printf("\nBefore del string %s:\n",s);out();n=cz(s);if(n==0)printf("\nCan't find the string!\n");else{del(s);printf("\nAfter del string %s :\n",s);out();}}四、调试分析:1、测试数据及结果2、时间复杂度分析统计字符个数算法时间复杂度为O(N*80)查找某一字符串出现的次数算法时间复杂度为O(N*80)删除某一字符串算法所耗费的时间最多,每次进行删除操作时都要读遍整篇文章,删除字符串s 时是将 s 中的字符一个个的删除,每删除一个字符都需要一次前移操作,所以平均时间复杂度为O(N*(N+1)/2)1、调试时的问题及思考调试时用键盘输入文章内容的语句为gets(s1),若要换成scanf(“%s”,s1);将会出现不能输入空格的问题。

所以在进行输入时要使用正确的输入语句不然就会出现这样那样的问题。

2、算法改进思想删除某一字符串算法的时间复杂度最大,原因在于每删除一个字符都要进行前移操作,占用了大量时间。

假如在进行删除时进行同时前移strlen(s)个字符,可能会减少一些时间。