当前位置:文档之家› 数据结构课程设计—文章编辑

数据结构课程设计—文章编辑

10信计2011-2012(一)

数据结构课程设计

设计题目文章编辑

设计时间2011.12.29 至2012.1.4

学生姓名

学生学号

所在班级

指导教师

徐州工程学院数学与物理科学学院

文章编辑

一、需求分析

本次课程设计,我做的是文章编辑。任务与要求包括:

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

静态存储一页文章,每行最多不超过80个字符,共N行;要求(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。

存储结构使用线性表,分别用几个子函数实现相应的功能。

输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。

输出形式:

(1)分行输出用户输入的各行字符;

(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"

(3)输出删除某一字符串后的文章。

运行环境包括: Windows xp操作系统、Visual C++6.0编译环境。

二、概要设计

对于文章的处理,我用的是for语句查找,即将符合条件的字符查找出来,然后通过函数实现字符的统计,删除等操作。同时,存储用线性表的链表结构,然后通过设计四个函数,实现设计要求的4个基本功能。

1、主要模块的描述

用while语句进行编写:

while(L->next)

{

for (p = L, q = s; *q != '\0' && p->next; p = p->next, q++) if (p->c != *q) break;

if (*q == '\0') n++;

L = L->next;

}

将链表指针指向输入的字符串开始字符,和文章中字符的首位,然后使用循环语句,将字符串的每一个字符依次比较,判断相同的字符,以便实现其他的查找,统计,删除等功能。

2、程序流程框图如图所示

3、各功能函数描述

本次设计共分为四个函数,分别实现四个功能:

(1)统计文章中的字符数,空格数,数字等——void print2(ca *L, int &p1, int &p2, int &p3, int &n) // 统计字符信息;

(2)删除输入的某一段字符——void print2(ca *L, int &p1, int &p2, int &p3, int &n) // 统计字符信息;

(3)字符串删除:——vca *DelStr(ca *L) //删除某一字段,统计某一字符,函数为:void StrNo(ca *L)

三、详细设计

1、存储结构设计

线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。

在实现线性表数据元素的存储方面,一般可用顺序存储结构和链式存储结构两种方法。本程序中采用链式存储。

2、算法设计

本课程设计中用指针链表,配合循环语句,完成字符串比较功能,从而完成统计字符串,删除字符串,统计字符信息的功能。

字符串删除:如果,输入字符的第一个字母与文本中的元字符有相同的时候,执行第一个for循环语句,对原文中的字符依次和输入的字符串比较,有不相同的跳出,如果完全相同,则将P指针给H指针,从而达到删除的作用。然后,进行上述操作,完成删除操作。

3、程序运行流程说明

程序运行时首先从主函数开始,先判断选择的操作。然后根据要求进行相应的查找,删除,统计,显示的操作,一次操作完之后,会回到开始的选择界面,用户可重新选择操作,如果用户选择退出,程序就停止。

#include

#include

#include

//文本每行以字符串形式存储,行与行之间以链表存储

typedef struct line

{

char *data;

struct line *next;

}LINE;

template

class wenben

{

public:

Create(LINE * &head);

CountLetter(LINE * &head);

CountNumber(LINE * &head);

CountSpace(LINE * &head);

CountAll(LINE * &head);

FindString(LINE * &head,char *str);

delstringword(char *s,char *str);

OutPut(LINE * &head);

};

void Create(LINE * &head)

{

cout<<"请输入文本,以Ctrl+E(^E)为结尾,每行最多输入80字符!"<

LINE *p=new LINE;

head=p;

char tmp[100];

while(1)

{

gets(tmp);

if(strlen(tmp)>80)

{

cout<<"每行最多输入80字符";

break;

}

if(tmp[0]==5)break;

p=p->next=new LINE;

p->data=new char[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;

}

//======================================================== ===========

//统计字母数

int CountLetter(LINE * &head)

{

LINE *p=head;

int count=0;

do

{

int Len=strlen(p->data);

for(int i=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);

return count;

}

//======================================================== ===========

//统计数字数

int CountNumber(LINE * &head)

{

LINE *p=head;

int count=0;

do

{

int Len=strlen(p->data);

for(int i=0;i

if(p->data[i]>=48 && p->data[i]<=57)count++;

//计算数字数,ASCII码

}

while((p=p->next)!=NULL); return count;

}

int CountSpace(LINE * &head)

{

LINE *p=head;

int count=0;

do

{

int Len=strlen(p->data);

for(int i=0;i

if(p->data[i]==32)count++; }

while((p=p->next)!=NULL);

return count;

}

int CountAll(LINE * &head)

{

LINE *p=head;

int count=0;

do

count+=strlen(p->data);

while((p=p->next)!=NULL);

return count;

}

int FindString(LINE * &head,char *str)

{

LINE *p=head;

int count=0;

int h=0;

int len1=0;

int len2=strlen(str);

int i,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);

return count;

}

void delstringword(char *s,char *str)

{

char *p=strstr(s,str);

char tmp[80];

int len=strlen(s);

int i=len-strlen(p);

int j=i+strlen(str);

int count=0;

for(int m=0;m

for(int n=j;n

tmp[count]='\0';

strcpy(s,tmp); } void DelString(LINE * &head,char *str)

{

LINE *p=head;

do

{

if(strstr(p->data,str)!=NULL)delstringword(p->data,str);

}

while((p=p->next)!=NULL);

}

void OutPut(LINE * &head)

{

LINE *p=head;

do

{

cout<data<

}

while((p=p->next)!=NULL); } void main()

{

LINE *head;

Create(head);

cout<<"文章为:"<

OutPut(head);

cout<

cout<<"数字个数:"<

cout<<"空格个数: "<

cout<<"文章总字数: "<

char str1[20],str2[20];

cout<

cin>>str1;

cout<

cout<

cin>>str2;

DelString(head,str2);

cout<<"删除"<

OutPut(head);

}

四、调试分析

设计程序初犯了一些错误,开始的布局比较混乱,程序为一块一块,连接不当,后来查看了别人的优秀作品仿照它们的顺序,完成了相对较为有序的程序。并且一开始在自己的电脑上运行时,出现了不少错误不能运行,为设计增加了难度。根据调试时提示的错误加上同学的帮忙,最后运行成功。为了避免在调试过程中出现输入错误的情况,写代码时写明注释对测试和寻找错误节省了很多时

间。

首先,在程序中输入一段文字,便实现统计这段文字中英文字符,空格,数字,和文章总字数的功能,如下图:

接着,对上面的文字进行统计字符数的操作,比如输入字符 chen ,统计到的字符数为4,如下图所示:

对输入的文字进行字符删除的操作,比如输入字符yue,如图所示

五、课设总结

本程序的设计目的是能更好更快的解决文章编辑问题。经过测试和试用,我相信本程序达到了方便和实用的设计目的,并在程序的实现方面有着独到之处。

这次课程设计使我对做自己真正的了解了。我真正体会到了在整个过程给我带来的无奈与快乐。可是我对数据结构掌握的还不行,在设计数据结构时候许多东西东都不会。我终于认识到问题的根源所在。然后我只好再次认真细致地对开发过程进行了规划和分析,才逐渐弄清了整个程序的流程。

在编写这个程序的过程中,我复习了之前学的基本语法,更加深刻的认识到循环是大部分程序的基本要素。结合了这学期学的数据结构,分析算法的时间复杂度,不断改进算法,更加巩固了之前学的知识,比以前更能灵活运用。

最后,这次课程设计给了我很大的好处,让我了解到自己的许多不足,让我知道以后一定要好好学习,不能再像以前那么懒散了。并且让我知道不管什么难题,只要尽自己的去努力去寻找问题的答案,最终一定能顺利解决。

相关主题
文本预览
相关文档 最新文档