文章编辑的实习报告.docx

上传人:b****6 文档编号:6584094 上传时间:2023-01-08 格式:DOCX 页数:80 大小:247.75KB
下载 相关 举报
文章编辑的实习报告.docx_第1页
第1页 / 共80页
文章编辑的实习报告.docx_第2页
第2页 / 共80页
文章编辑的实习报告.docx_第3页
第3页 / 共80页
文章编辑的实习报告.docx_第4页
第4页 / 共80页
文章编辑的实习报告.docx_第5页
第5页 / 共80页
点击查看更多>>
下载资源
资源描述

文章编辑的实习报告.docx

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

文章编辑的实习报告.docx

文章编辑的实习报告

文章编辑的实习报告

题目:

输入一页文字,程序可以统计出文字、数字、空格的个数。

一需求分析:

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;j

if(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;n

tmp[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;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为将要删除的字符

{

//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;n

tmp[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\

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1