文字编辑.docx
- 文档编号:10171862
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:12
- 大小:130.21KB
文字编辑.docx
《文字编辑.docx》由会员分享,可在线阅读,更多相关《文字编辑.docx(12页珍藏版)》请在冰豆网上搜索。
文字编辑
目录
一、需求分析1
二、概要设计1
1、定义结构体structline1
2、主要函数2
3、实现思想3
三、详细设计3
1、创建链表函数4
2、统计字母函数5
3、统计数字数函数5
4、统计空格数函数5
5、统计文章的总字数函数6
6、统计str在文章中出现的次数函数6
7、删除指定的字符串函数7
8、向屏幕输出文章函数7
9、主函数7
四、调试分析8
1、测试数据及结果8
2、问题思考:
9
3、算法改进:
9
五、总结与心得体会9
一、需求分析
功能:
从键盘输入一页文字,静态存储在一个文件中
要求:
(1)分别统计出其中英文字母数和空格数及整篇文章总字数;
(2)统计某一字符串在文章中出现的次数,并输出该次数;
(3)删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:
可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:
(1)分行输出用户输入的各行字符;
(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"
(3)输出删除某一字符串后的文章;
二、概要设计
1、定义结构体structline
文本行采用顺序存储,行与行之间采用链式存储
2、主要函数
intFindString(LINE*&head,char*str)/*统计str在文章中出现的次数*/
求在一行中Str出现的次数的流程图:
①.查找第一个字符,如果有第一个字符即p->data[i]==str[0],设计数器k=0
②.查找这个字符后面的字符与要查找的字符串是否匹配即p->data[i+j]==str[j],如果匹配k++
③.重复第二步,如果k=len2,则查找到,count++;如果没查找到,重新进行第一步
3、实现思想
voiddelstringword(char*s,char*str)/*删除字符串*s中的字符串*str*/
①.从字符串s中寻找str第一次出现的位置*p=strstr(s,str);
②.len=strlen(s);i=len-strlen(p)即前i项恰好不含要删除的字符串,将前i项复制到tmp中
③.j=i+strlen(str)即要删除的字符串在i+1和j之间,将j之后的字符串复制到tmp中
④.将tmp赋给串s,返回s
三、详细设计
#include
#include
#include
/********文本每行以字符串形式存储,行与行之间以链表存储**********/
typedefstructline
{
char*data;
structline*next;
}LINE;
1、创建链表函数
voidCreate(LINE*&head)
{
printf("请输入一页文章,以Ctrl+E(^E)为结尾(每行最多输入80字符!
):
\n");
LINE*p=newLINE;/*首先为链表建立一个附加表头结点*/
head=p;/*将p付给表头指针*/
chartmp[80];
FILE*fp;/*的定义文件指针fp*/
fp=fopen("d:
\\c.txt","w");/*以写的方式打开一个文件*/
while
(1)
{
gets(tmp);/*输入字符串!
*/
if(strlen(tmp)>80)
{
printf("每行最多输入80字符");
break;
}
if(tmp[0]==5)break;/*如果发现输入^E,则退出输入*/
p=p->next=newLINE;
p->data=newchar[strlen(tmp)+1];/*为结点分配空间*/
strcpy(p->data,tmp);
for(i=0;i<(t=strlen(tmp))&&(p->data[i]!
=5);i++)
fwrite(&p->data[i],sizeof(char),1,fp);/*按行把字符一个一个写进文件里*/
fputc('\n',fp);
if(tmp[strlen(tmp)-1]==5)/*除去最后一个控制符^E*/
{
p->data[strlen(tmp)-1]='\0';
break;
}
}
p->next=NULL;/*最后的一个指针为空*/
head=head->next;
}
2、统计字母函数
intCountLetter(LINE*&head)
{
LINE*p=head;
intcount=0;
do
{
intLen=strlen(p->data);/*计算当前data里的数据元素的个数*/
for(inti=0;i if((p->data[i]>='a'&&p->data[i]<='z')||(p->data[i]>='A'&&p->data[i]<='Z')) count++;/*计算字母数*/ } while((p=p->next)! =NULL);/*遍历链表*/ returncount;/*返回文章的字母总数*/ } 3、统计数字数函数 intCountNumber(LINE*&head) { LINE*p=head; intcount=0; do { intLen=strlen(p->data);/*计算当前data里的数据元素的个数*/ for(inti=0;i if(p->data[i]>=48&&p->data[i]<=57)count++; /*计算数字数,ASCII码*/ } while((p=p->next)! =NULL);/*遍历链表*/ returncount; } 4、统计空格数函数 intCountSpace(LINE*&head) { LINE*p=head; intcount=0; do { intLen=strlen(p->data);/*计算当前data里的数据元素的个数*/ for(inti=0;i if(p->data[i]==32)count++;/*计算空格数,空格ASCII码为32*/ } while((p=p->next)! =NULL);/*遍历链表*/ returncount; } 5、统计文章的总字数函数 intCountAll(LINE*&head) { LINE*p=head;/*保存链表的首地址*/ intcount=0; do/*计算总字符数*/ { count+=strlen(p->data); } while((p=p->next)! =NULL);/*遍历链表*/ returncount; } 6、统计str在文章中出现的次数函数 intFindString(LINE*&head,char*str) { LINE*p=head; intcount=0; inth=0; intlen1=0;/*保存当前行的总字符数*/ intlen2=strlen(str);/*待统计字符串的长度*/ inti,j,k; do { len1=strlen(p->data);/*当前行的字符数*/ for(i=0;i { if(p->data[i]==str[0]) { k=0; for(j=0;j if(p->data[i+j]==str[j])k++; if(k==len2){count++;i=i+k-1;} } } } while((p=p->next)! =NULL);/*遍历链表*/ returncount; } 7、删除指定的字符串函数 voiddelstringword(char*s,char*str) /**s为输入的字符串,*str为将要删除的字符*/ { char*p=strstr(s,str);/*从字符串s中寻找str第一次出现的位置*/ chartmp[80]; intlen=strlen(s); inti=len-strlen(p); intj=i+strlen(str); intcount=0; for(intm=0;m for(intn=j;n tmp[count]='\0'; strcpy(s,tmp);/*返回新的字符串*/ } voidDelString(LINE*&head,char*str) { LINE*p=head; do { if(strstr(p->data,str)! =NULL) delstringword(p->data,str); } while((p=p->next)! =NULL);/*遍历链表*/ } 8、向屏幕输出文章函数 voidOutPut(LINE*&head) { LINE*p=head; do { printf("%s\n",p->data); } while((p=p->next)! =NULL);/*遍历链表*/ } 9、主函数 voidmain() { LINE*head;/*定义头指针*/ Create(head);/*创建链表*/ printf("输入的文章为: \n"); OutPut(head); printf("\n"); printf("全部字母数: %d\n",CountLetter(head)); printf("数字个数: %d\n",CountNumber(head)); printf("空格个数: %d\n",CountSpace(head)); printf("文章总字数: %d\n",CountAll(head)); charstr1[20],str2[20]; printf("\n"); printf("请输入要统计的字符串: "); scanf("%s",str1); printf("%s出现的次数为: %d\n",str1,FindString(head,str1)); printf("\n"); printf("请输入要删除的某一字符串: "); scanf("%s",str2); DelString(head,str2);/*调用删除函数*/ printf("删除%s后的文章为: \n",str2); OutPut(head); } 四、调试分析 1、测试数据及结果 2、问题思考: 输入文章时,计算机怎样识别文章是否结束? 输出文章时,怎样处理表示结束的字符? 解决方案: 输入文章时,以Ctrl+E(^E)为结尾,当tmp[0]==5时,发现输入^E,则退出输入。 输出时文章时,如果tmp[strlen(tmp)-1]==5即发现表示结束的字符^E,用p->data[strlen(tmp)-1]='\0'除去最后一个控制符^E。 如何把字符写进文件里面? 先用写的方式打开一个文件fp=fopen("d: \\c.txt","w"),然后用fwrite函数把字符写到指定的文件里。 特别要注意千万别把结束字符写进去,采用的办法是除去最后那个结束字符按行再把字符一个一个写进文件里。 3、算法改进: 本程序的文章为用户输入的文章,只能做即时输入的统计、编辑,而不能对已有的磁盘文件中的文章进行统计、编辑。 如果可以打开磁盘文件,对其进行统计、编辑并保存,这是有待改进的。 还有在删除指定字符时只能删除字符在第一次出现的字符而不能删除所有出现过的字符。 五、总结与心得体会 此次课程设计使我对数据结构方面的知识有了更加深入的了解,也使我认识到自己在学习编程方面还有很多的不足。 尽管把这次课程设计的题目给作出来了。 但是,也通过这次练习使我明白了动手动脑的重要性。 在我碰到这次设计中的一个难题——如何把字符写进文件里。 当时我就傻了眼准备放弃。 想也没想就拖着老师问。 就在这一问中,老师给了我一个很重要的启示: 不会的事情要学会去尝试。 带着这句话我就慢慢的去实践。 在老师的帮助之下,终于学会了如何把一个字符写进文件里。 然后再自己的摸索之下又学会了把一个字符串写进文件里。 经过一番努力终于达到了这个题目的要求: 把一页文章写进文件里。 我在此次课程设计中学到的最重要的一个道理: 凡事不要轻易放弃,学会去尝试。 今后我要多读一些编程方面的书籍,不能只拘泥于课本上的知识,并注重理论与实践的结合,多上机练习编写程序,提高自己的实际动手能力和独立思考的能力,在实践中提高自己,更好的掌握编程思想。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文字 编辑