文章编辑的实习报告.docx
《文章编辑的实习报告.docx》由会员分享,可在线阅读,更多相关《文章编辑的实习报告.docx(80页珍藏版)》请在冰豆网上搜索。

文章编辑的实习报告
文章编辑的实习报告
题目:
输入一页文字,程序可以统计出文字、数字、空格的个数。
一需求分析:
1本程序要求输入一页文章,每行做多不超过80个字符,共N行,分别统计出其中英文字母数和空格数及整篇文章总字数;
2统计某一字符串在文章中出现的次数,并输出该次数;删除某一子串,并将后面的字符前移;
3输入结束时以Ctrl+E结束;
4在统计时均采用的是链表的形式统计,删除指定的字符串等其它操作
5测试数据见后
二、概要设计
1抽象数据结构类型的定义如下:
ADTAWord{
数据对象:
D={ai|ai∈字幕字符集,i=1,2,…,n,n≥0}
数据关系:
R1={|ai-1,ai∈D,i=1,2,…,n}
基本操作P:
NewWord(&W,characters)
初始条件:
characters为字符序列。
操作结果:
生成一个其值为给定字符序列的单词。
DestroyWord(&W,characters)
初始条件:
单词W已存在。
操作结果:
销毁单词W的结构,并释放相应空间。
WordCmp(W1,W2)
初始条件:
单词W1,W2已存在。
操作结果:
若W1W2,则返回1。
PrintWord(W)
初始条件:
单词W已存在。
操作结果:
在计算机终端上显示单词W。
}ADTAWord
ADTTextString{
数据对象:
D={ai|ai∈字符集,i=1,2,…,n,n≥0}
数据关系R:
D中字符被“换行符”分割成若干行,每一行的字符间满足下列关系:
R1={|ai-1,ai∈D,i=1,2,…,n}
基本操作:
Initation(&f)
初始条件:
文件f已存在。
操作结果:
打开文件f,设定文件指针指向文件中第一行第一个字符。
GetAWord(f,&W)
初始条件:
文件f已打开。
操作结果:
从文件指针所指字符起提取一个单词w。
ExtractWords(f,&L)
初始条件:
文件f已打开,文件指针指向文件中第一行第一个字符。
操作结果:
提取该行中所有单词,并构成单词的有序表L;本操作结束时,文件指针指向f中下一行的第一个字符。
Match(f,pat,&Result)
初始条件:
文件f已打开,文件指针指向文件中第一个字符;pat为包含所有待查询单词的有序表。
操作结果:
Result为查询结果。
}ADTTextString
2主程序:
voidmain(){
}
3其它的函数:
主要函数:
统计str在文章中出现的次数:
intFindString(LINE*&head,char*str){
}
统计字母数
intCountLetter(LINE*&head){
do{
}while
}
统计数字数
intCountNumber(LINE*&head){
do{
}while
}
其它的函数模板与这以上时一样的
三详细分析:
1创建一链表,同时向里面输入文本数据
typedefstructline
{
char*data;
structline*next;
}LINE;
2统计str在文章中出现的次数
intFindString(LINE*&head,char*str)统计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;jif(p->data[i+j]==str[j])
k++;
if(k==len2)
{
count++;
i=i+k-1;
}
}
}
}
while((p=p->next)!
=NULL);//遍历链表
returncount;
}
实现思想:
1)从字符串s中寻找str第一次出现的位置*p=strstr(s,str)
2)len=strlen(s);i=len-strlen9p即前i项恰好不含要删除的字符串,将前i项复制到tmp中
3)j=i+strlen(str)即要删除的字符串在i+1和j之间,将j之后的字符串复制到tmp中
4)将tmp赋给串s,返回s
2向创建的链表中输入数据:
voidCreate(LINE*&head)
{
printf("请输入一页文章,以Ctrl+E(^E)为结尾(每行最多输入80个字符!
):
\n");
LINE*p=newLINE;//首先为链表建立一个附加表头结点
head=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)
{
p->data[strlen(tmp)-1]='\0';
break;
}
}
p->next=NULL;//最后的一个指针为空
head=head->next;
}
3统计文章的总字数
intCountAll(LINE*&head)
{
LINE*p=head;//保存链表的首地址
intcount=0;
do//计算总字符数
{
count+=strlen(p->data);
}
while((p=p->next)!
=NULL);//遍历链表
returncount;
}
4删除指定的字符串
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
tmp[count++]=s[m];
for(intn=j;ntmp[count++]=s[n];
tmp[count]='\0';
strcpy(s,tmp);//返回新的字符串
}
四调试分析:
1再输入文章时,计算机怎样识别文章是否结束?
输出文章时,怎样处理表示结束的字符?
通过调试,找到了解决方案:
输入文章时,以Ctrl+E(^E)为结尾,当tep[0]==5时,发现输如^E则退出输入。
输出文章时,如果tmp[strlen[(tmp)-1]==5即发现表示结束的字符^E,用p->data[strlen(tmp)-1]=\0除去最后一个控制符^E
2算法改进:
本程序的文章用户输入文章,只能做即时输入统计,编译,而不能对已有
的磁盘文件中的文章进行统计,编译,如果引进文件流类,就可以打开磁盘文件。
对其进行统计,编译并保存,还是有待提高改进的。
五测试结果:
1输入数据的测试:
2删除某一字符串的数据:
六附录:
#include
#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;iif((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;iif(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;iif(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;jif(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为将要删除的字符
{
//while
(1){
//if(strstr(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;ntmp[count]='\0';
strcpy(s,tmp);
//break;
//}/*返回新的字符串*/
//else
//cout<<"未找到记录,请重新输入要删除的字符:
"<//}
}
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()
{
chark;
inti;
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");
while
(1){
printf("1.统计某一字符串在文章所出现的次数\n");
printf("2.删除文章中的某一字符串\n");
printf("3.退出系统\n");
printf("请选择所要操作的选项:
\n");
scanf("%d",&i);
if(i==1){
while
(1){
printf("请输入要统计的字符串:
");
scanf("%s",str1);
printf("%s出现的次数为:
%d\n",str1,FindString(head,str1));
printf("\n");
cout<<"请选择操作方式:
"<cout<<"继续统计请选1,退出请选0.\n"<scanf("%s",&k);
if(k=='0')break;
}
}
elseif(i==2){
while
(1){
printf("请输入要删除的某一字符串:
");
scanf("%s",str2);
DelString(head,str2);
printf("删除%s后的文章为:
\n",str2);
OutPut(head);
cout<<"请选择操作方式:
"<cout<<"继续删除请选1,退出请选0.\n"<scanf("%s",&k);
if(k=='0')break;
}
}
else
break;
}
}
七设计体会心得:
此次课设使我对数据结构方面的知识有了更深层的了解,也使我认识到自己在学习编程方面有很多的不足。
今后我要多读一些编程方面的书籍,不能只拘泥于课本上的知识,并注重理论与实践的结合,多上机练习编写程序,提高自己的实际动手能力和独立思考的能力,不断充实自己,更好的掌握编程思想。
线索二叉树的实习报告
题目:
建立中序二叉树,并且中序遍历,求中序线索二叉树上已知结点中序的前驱和后继。
一需求分析
1先建立二叉树,然后开始线索二叉树,中序遍历
2在中序线索二叉树上寻找指定结点的前驱结点和后继结点
3在建立二叉树时,要自己先组建一课二叉树,根据它进行输入;
4输出结点信息后,再输入一结点信息,查找它的前驱和后继
5输入过程中一定要正确输入
6测试数据:
1)输入一个数值
2)再分别输入建立的左右子数
3)输出结点信息
二概要分析
1抽象数据类型树的定义如下:
ADTBinaryTree{
数据对象D:
D是具有相同特性的数据元素的集合
数据关系R:
若D=Φ,则R=Φ,称BinayTree为空二叉树;
若D≠Φ,则R={H},H是如下二元关系:
(1)在D中存在唯一的称为根的数据元素root,它在关系H喜爱无前驱;
(2)若D-{root}≠Φ,则存在D-{root}={D1,Dr},且D1∩Dr=Φ;
(3)若D1≠Φ,则D1中存在惟一的元素X1,∈H,且存在D1上的关系H1∈H;若Dr≠Φ,则Dr中存在惟一的元素Xr,∈H,且存在Dr上的关系Hr属于H,H={,,,H1,Hr};
(4)(D1,{H1})是一颗符合本定义的二叉树,称为根的左子树,(D1,{H1})是一棵符合本定义的二叉树,称为根的右子树。
基本操作:
InitBiTree(&T);
操作结果:
构造空二叉树。
CreateBiTree(&T,definittion);
初始条件:
definittion给出的二叉树T的定义。
操作结果:
按definittion构造二叉树T。
BiTreeEmpty(T);
初始条件:
二叉树T存在
操作结果:
若T为空二叉树,则返回TRUE,否则FALSE。
Value(T,e);
初始条件:
二叉树T存在
操作结果:
返回E的值。
Assign(T,&e,value);
初始条件;二叉树T存在,e是T中的某个结点。
操作结果:
结点e赋值为value.
Leftchild(T,e);
初始条件;二叉树T存在,e是T中的某个结点。
操作结果;返回e的左孩子。
若e无右孩子,则返回“空”。
Rightchild(T,e);
初始条件;二叉树T存在,e是T中的某个结点。
操作结果;返回e的右孩子。
若e无右孩子,则返回“空”。
LeftSibling(T,e);
初始条件;二叉树T存在,e是T中的某个结点。
操作结果;返回e的左兄弟。
若e是T的左孩子或无左兄弟,则返回“空”。
Rightsibling(T,e);
初始条件;二叉树T存在,e是T中的某个结点。
操作结果;返回e的右兄弟。
若e是T的右孩子或无右兄弟,则返回“空”。
PreDrderTraverse(T,Visit());
初始条件;二叉树T存在,Visit是对应结点操作的应用函数。
操作结果:
先遍历T,对每个结点调用函数Visit一次且一次,一旦visit()失败,则操作失败。
InOrderTraverse(T,Visit());
初始条件;二叉树T存在,Visit是对应结点操作的应用函数。
操作结果:
中序遍历T,对每个结点调用函数Visit一次且一次,一旦visit()失败,则操作失败。
PostOrderTraverse(T,Visit());
初始条件;二叉树T存在,Visit是对应结点操作的应用函数。
操作结果:
后序遍历T,对每个结点调用函数Visit一次且一次,一旦visit()失败,则操作失败。
LeveOrderTraverse(T,Visit());
初始条件;二叉树T存在,Visit是对应结点操作的应用函数。
操作结果:
层序遍历T,对每个结点调用函数Visit一次且一次,一旦visit()失败,则操作失败。
}ADTBinaryTree
2主程序
voidmain()
{
ThreadTreet,p;
charch[20],x[20];
intflag=1;
while(flag){
printf("\n请选择需要进行的操作:
\n");
printf("\n1:
创建二叉树\n");
printf("\n2:
线索二叉树\n");
printf("\n3:
中序线索二叉树\n");
printf("\n4:
寻找结点p的中序前驱结点\n");
printf("\n5:
寻找结点p的中序后继结点\n");
printf("\n6:
查找值为X的结点\n");
printf("\n0:
退出!
\n\n");
scanf("%d",&flag);
switch(flag){
case1:
printf("\n开始创建二叉树\n");
printf("\n请输入一个数值:
");
scanf("%s",ch);
t=CreatThreadTree(ch);
printf("\n\n\n\n\