文章编辑的实习报告.docx
- 文档编号:6584094
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:80
- 大小:247.75KB
文章编辑的实习报告.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={
基本操作P:
NewWord(&W,characters)
初始条件:
characters为字符序列。
操作结果:
生成一个其值为给定字符序列的单词。
DestroyWord(&W,characters)
初始条件:
单词W已存在。
操作结果:
销毁单词W的结构,并释放相应空间。
WordCmp(W1,W2)
初始条件:
单词W1,W2已存在。
操作结果:
若W1
PrintWord(W)
初始条件:
单词W已存在。
操作结果:
在计算机终端上显示单词W。
}ADTAWord
ADTTextString{
数据对象:
D={ai|ai∈字符集,i=1,2,…,n,n≥0}
数据关系R:
D中字符被“换行符”分割成若干行,每一行的字符间满足下列关系:
R1={
基本操作:
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, (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\
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文章 编辑 实习 报告