文章编辑数据结构设计报告_第1页
文章编辑数据结构设计报告_第2页
文章编辑数据结构设计报告_第3页
文章编辑数据结构设计报告_第4页
文章编辑数据结构设计报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

文章编辑设计报告一、实训目的及要求数据结构是计算机课程的一门重要的根底课,它的教学要求大致有三个重要方面:其一就是让学生学会分析研究计算机加工的数据对象的特性,以便为数据选择适当的物理结构和逻辑结构;其二,根据结构,选择适当的算法,并初步掌握算法的时间分析和空间分析;其三,学习复杂的程序设计。本综合实训利用VisualStudio2008集成编程环境为实践工具,通过上机实践培养学生分析具体问题、解决实际问题的能力,训练和培养学生的数据抽象能力和程序设计的能力。数据结构是一门实践性较强的课程,以养学生的数据抽象能力和程序设计的能力为目的。在实训时应注重培养学生的实际操作能力。本综合实训安排了20学时的实验课时,完成4次上机作业。具体要求如下:1.学习和理解每个实训题目的根本理论和方法;2.掌握每个实验的实现步骤和关键技术;3.准备好实验所需要的资源和文档;4.上机实现程序,得到通过调试的正确程序。5.根据每个实验的不同要求,完成实验报告的word文档。实训环境WindowsXPVisualStudio2010实训内容文章编辑1)问题描述输入一页文字,程序可以统计出文字、数字、空格的个数。2)根本要求静态存储一页文章,每行最多不超过80个字符,共N行;要求〔1〕分别统计出其中英文字母数和空格数及整篇文章总字数;〔2〕统计某一字符串在文章中出现的次数,并输出该次数;〔3〕删除某一子串,并将后面的字符前移。〔4〕替换字符串〔5〕可以保存到文件中,也可以在文件中翻开四、算法描述及实训步骤定义一个串,可使用顺序串或者链表串。实现串的插入、删除、修改、替换、遍历等功能。并能够把串保存在文件中/*文本每行以字符串形式存储,行与行之间以链表存储*/usingnamespacestd;typedefstructline{ char*data; structline*next;}LINE;/*创立一链表,同时向里面输入文本数据*/int strlength(str*s)/*统计字母数*/intCountLetter(LINE*&head){LINE*p=head;intcount=0;do{intLen=strlen(p->data);/*计算当前data里的数据元素的个数*/for(inti=0;i<Len;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<Len;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<Len;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<len1;i++)/*字符匹配*/{if(p->data[i]==str[0]){k=0;for(j=0;j<len2;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<i;m++)tmp[count++]=s[m];for(intn=j;n<len;n++)tmp[count++]=s[n];tmp[count]='\0';strcpy(s,tmp);/*返回新的字符串*/}/*替换指定的字符串*/voidrepstringword(char*s,char*str,char*strb)/**s为输入的字符串,*str为将要被替换的字符,strb为替换字符*/{char*p=strstr(s,str);/*从字符串s中寻找str第一次出现的位置*/chartmp[80];intq=0;intk=strlen(strb);intlen=strlen(s);inti=len-strlen(p);intj=i+strlen(str);intcount=0;for(intm=0;m<i;m++)tmp[count++]=s[m];for(into=0;o<k;o++)tmp[count++]=strb[q++];for(intn=j;n<len;n++)tmp[count++]=s[n];tmp[count]='\0';strcpy(s,tmp);/*返回新的字符串*/}printf("\n\t\t*******************************************");printf("\n\t\t*1------统计数据*");printf("\n\t\t*2------统计字符串*");printf("\n\t\t*3------替换字符串*");printf("\n\t\t*4------删除字符串*");printf("\n\t\t*5------显示文章*");printf("\n\t\t*6------保存文章*");printf("\n\t\t*0------退出程序*");printf("\n\t\t*******************************************");printf("\n\t\t请选择操作序号:〔0---4〕:\n");五、总结及心得体会开始的需求分析、概念结构设计、逻辑结构设计、物理结构设计。很多东西书上写的很清楚,貌似看着也很简单,思路非常清晰。但真正需要自己想方法去设计的时候才发现其中的难度。经常做到后面突然就发现自己一开始的设计有问题,然后又回去翻工,在各种反复中不断完善自己的想法。因为没有事先做过仔细的分析需求,导致很多问题。这是作为设计开发人员需要特别警惕防止的,不然会给后来的工作带来很大的麻烦,甚至可能会需要全盘推倒重来。就比方没有注意到要换行输入所以最开始没有用链表结构,所以导致程序到最后全部否认重新开始设计。所以以后的课程设计要特别注意这一块的设计。

六、实训结果七、源代码:#include<iostream>#include<string.h>#include<stdio.h>#include<conio.h>/*文本每行以字符串形式存储,行与行之间以链表存储*/usingnamespacestd;typedefstructline{ char*data; structline*next;}LINE;/*创立一链表,同时向里面输入文本数据*///输入文字voidCreate(LINE*&head){ LINE*p=newLINE;/*首先为链表建立一个附加表头结点*/ head=p;/*将p付给表头指针*/ chartmp[1000]={0}; inttemp=0; printf("\n\t\t*******************************************"); printf("\n\t\t*1------输入文章*"); printf("\n\t\t*2------读取文章*"); printf("\n\t\t*******************************************"); printf("\n\t\t请选择操作的序号:"); //选择输入方式,1为键盘输入,2为读取文件输入 while(1) { scanf("%d",&temp); if(temp==1) //键盘输入 { fflush(stdin); //清空输入缓存 printf("请输入一页文章,以'#'为结尾(每行最多输入80字符!):\n"); while(1) { while(1) { gets(tmp);/*输入字符串!*/ if(strlen(tmp)>80) printf("每行最多输入80字符,请重新输入!\n"); else break; } p=p->next=newLINE; p->data=newchar[strlen(tmp)+1];/*为结点分配空间?*/ strcpy(p->data,tmp); if(tmp[strlen(tmp)-1]=='#')/*除去最后一个控制符#*/ { p->data[strlen(tmp)-1]='\0'; break; } } p->next=NULL;/*最后的一个指针为空?*/ head=head->next; FILE*fp; //键盘输入保存为文件 LINE*q=head; if((fp=fopen("d:\\write.txt","w+"))==NULL) { printf("翻开文件出错!\n"); system("pause"); exit(0); } while(q->next!=NULL) { fputs(q->data,fp); fputs("\n",fp); q=q->next; } fputs(q->data,fp); fputs("\n",fp); fputs("#",fp); fclose(fp); printf("保存到文件中成功!"); system("pause"); break; } elseif(temp==2) //文件读取输入 { inti,j=0; FILE*fp; //读取文件 charch; if((fp=fopen("d:\\write.txt","r"))==NULL) { printf("文件无法翻开,退出程序!\n"); system("pause"); exit(0); } while(1) { ch=fgetc(fp); while(ch!='\n') { tmp[j]=ch; if(ch=='#')break; j++; ch=fgetc(fp); } p=p->next=newLINE; p->data=newchar[strlen(tmp)+1];/*为结点分配空间?*/ strcpy(p->data,tmp); if(tmp[strlen(tmp)-1]=='#')/*除去最后一个控制符#*/ { p->data[strlen(tmp)-1]='\0'; fclose(fp); break; } for(i=0;i<j;i++) tmp[i]=0; j=0; } p->next=NULL;/*最后的一个指针为空?*/ head=head->next; break; } else //其他情况处理 { fflush(stdin); printf("请输入1或2!"); } }}/*统计字母数*/intCountLetter(LINE*&head){ LINE*p=head; intcount=0; do { intLen=strlen(p->data);/*计算当前data里的数据元素的个数*/ for(inti=0;i<Len;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<Len;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<Len;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<len1;i++)/*字符匹配*/ { if(p->data[i]==str[0]) { k=0; for(j=0;j<len2;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<i;m++) tmp[count++]=s[m]; for(intn=j;n<len;n++) tmp[count++]=s[n]; tmp[count]='\0'; strcpy(s,tmp);/*返回新的字符串*/}voidDelString(LINE*&head,char*str){ LINE*p=head; do //确定所有重复字符,并调用子函数删除 { do { if(strstr(p->data,str)!=NULL) delstringword(p->data,str); } while(strstr(p->data,str)!=NULL); } while((p=p->next)!=NULL);}/*向屏幕输出文章*/voidOutPut(LINE*&head){ LINE*p=head; do { printf("%s\n",p->data); } while((p=p->next)!=NULL);}voidrepstringword(char*s,char*str,char*strb)/**s为输入的字符串,*str为将要被替换的字符,strb为替换字符*/{ char*p=strstr(s,str);/*从字符串s中寻找str第一次出现的位置*/ chartmp[80]; intq=0; intk=strlen(strb); intlen=strlen(s); inti=len-strlen(p); intj=i+strlen(str); intcount=0; for(intm=0;m<i;m++) tmp[count++]=s[m]; for(into=0;o<k;o++) tmp[count++]=strb[q++]; for(intn=j;n<len;n++) tmp[count++]=s[n]; tmp[count]='\0'; strcpy(s,tmp);/*返回新的字符串*/}voidreplaceString(LINE*&head,char*str,char*stra){ LINE*p=head; do //确定所有重复字符,并调用子函数替换 { do { if(strstr(p->data,str)!=NULL) repstringword(p->data,str,stra); } while(strstr(p->data,str)!=NULL); } while((p=p->next)!=NULL);}intmain(){ LINE*head; charc; charstr1[20],str2[20],str3[80],str4[80]; Create(head); printf("输入的文章为:\n"); OutPut(head); printf("\n"); fflush(stdin); while(1) { system("cls");printf("\n\t\t*******************************************");printf("\n\t\t*1------统计数据*");printf("\n\t\t*2------统计字符串*");printf("\n\t\t*3------替换字符串*");printf("\n\t\t*4------删除字符串*");printf("\n\t\t*5------显示文章*");printf("\n\t\t*6------保存文章*");printf("\n\t\t*0------退出程序*");printf("\n\t\t*******************************************");printf("\n\t\t请选择操作序号:〔0---4〕:\n"); c=getch();if(c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论