文章编辑设计报告.docx
- 文档编号:28797207
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:14
- 大小:151.44KB
文章编辑设计报告.docx
《文章编辑设计报告.docx》由会员分享,可在线阅读,更多相关《文章编辑设计报告.docx(14页珍藏版)》请在冰豆网上搜索。
文章编辑设计报告
数据结构课程设计报告
题目:
文字编辑
设计者:
专业班级:
学号:
所属系部:
计算机与信息科学系
完成日期:
2011年1月1日
目录
一、需求分析和实验任务……………………………………………………………2
二、概要设计…………………………………………………………………………3
1.定义结构体structline,文本行采用顺序存储,行与行之间采用链式存储………4
2.主函数设计…………………………………………………………………………………………5
三、详细设计编码………………………………………………………………………7
1.算法思想…………………………………………………………………………7
2.主要算法描述及原程序……………………………………………………………………7
四、用户使用说明………………………………………………………………………8
五、测试结果及其分析上机调试………………………..……………………………8
1、测试数据及结果……………….……………………………………………………9
2、问题思考…………………………………………………………………………..9
3、算法改进……………………………………………………………………………9
六.总结…………………………………………………………………………………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++;如果没查找到,重新进行第一步
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;/*创建一链表,同时向里面输入文本数据*/
voidCreate(LINE**head)
{
printf("请输入一页文章,以Ctrl+E(^E)为结尾(每行最多输入80字符!
):
\n");
LINE*p=newLINE;/*首先为链表建立一个附加表头结点*/
*head=p;/*将p付给表头指针*/
chartmp[100];
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);
if(tmp[strlen(tmp)-1]==5)/*除去最后一个控制符^E*/
{
p->data[strlen(tmp)-1]='\0';
break;
}
}
p->next=NULL;/*最后的一个指针为空*/
*head=(*head)->next;
}
/*统计字母数*/
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;/*返回文章的字母总数*/ } /*统计数字数*/ 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; } /*统计空格数*/ 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; } /*统计文章的总字数*/ intCountAll(LINE**head) { LINE*p=*head;/*保存链表的首地址*/ intcount=0; do/*计算总字符数*/ { count+=strlen(p->data); } while((p=p->next)! =NULL);/*遍历链表*/ returncount; } /*统计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; } /*删除指定的字符串*/ 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);/*遍历链表*/ } /*向屏幕输出文章*/ voidOutPut(LINE**head) { LINE*p=*head; do { printf("%s\n",p->data); } while((p=p->next)! =NULL);/*遍历链表*/ } 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+^D结尾 3.按要求进行字符统计 4.字符删除 五、调试分析: 1.测试数据及结果 2、问题思考: 输入文章时,计算机怎样识别文章是否结束? 输出文章时,怎样处理表示结束的字符? 解决方案: 输入文章时,以Ctrl+E(^E)为结尾,当tmp[0]==5时,发现输入^E,则退出输入。 输出时文章时,如果tmp[strlen(tmp)-1]==5即发现表示结束的字符^E,用p->data[strlen(tmp)-1]='\0'除去最后一个控制符^E。 3.算法改进: 本程序的文章为用户输入的文章,只能做即时输入的统计、编辑,而不能对已有的磁盘文件中的文章进行统计、编辑,如果引入文件流类,就可以打开磁盘文件,对其进行统计、编辑并保存,这是有待改进的。 六、总结 此次课程设计使我对数据结构方面的知识有了更加深入的了解,也使我认识到自己在学习编程方面还有很多的不足。 不能只拘泥于课本上的知识,并注重理论与实践的结合,多上机练习编写程序,提高自己的实际动手能力和独立思考能力,不断充实自己,更好的掌握编程思想。 7.参考资料 1.网络及书本资料
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文章 编辑 设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)