数据结构课程设计湖南工程学院.docx

上传人:b****3 文档编号:11092015 上传时间:2023-05-29 格式:DOCX 页数:37 大小:342.05KB
下载 相关 举报
数据结构课程设计湖南工程学院.docx_第1页
第1页 / 共37页
数据结构课程设计湖南工程学院.docx_第2页
第2页 / 共37页
数据结构课程设计湖南工程学院.docx_第3页
第3页 / 共37页
数据结构课程设计湖南工程学院.docx_第4页
第4页 / 共37页
数据结构课程设计湖南工程学院.docx_第5页
第5页 / 共37页
数据结构课程设计湖南工程学院.docx_第6页
第6页 / 共37页
数据结构课程设计湖南工程学院.docx_第7页
第7页 / 共37页
数据结构课程设计湖南工程学院.docx_第8页
第8页 / 共37页
数据结构课程设计湖南工程学院.docx_第9页
第9页 / 共37页
数据结构课程设计湖南工程学院.docx_第10页
第10页 / 共37页
数据结构课程设计湖南工程学院.docx_第11页
第11页 / 共37页
数据结构课程设计湖南工程学院.docx_第12页
第12页 / 共37页
数据结构课程设计湖南工程学院.docx_第13页
第13页 / 共37页
数据结构课程设计湖南工程学院.docx_第14页
第14页 / 共37页
数据结构课程设计湖南工程学院.docx_第15页
第15页 / 共37页
数据结构课程设计湖南工程学院.docx_第16页
第16页 / 共37页
数据结构课程设计湖南工程学院.docx_第17页
第17页 / 共37页
数据结构课程设计湖南工程学院.docx_第18页
第18页 / 共37页
数据结构课程设计湖南工程学院.docx_第19页
第19页 / 共37页
数据结构课程设计湖南工程学院.docx_第20页
第20页 / 共37页
亲,该文档总共37页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构课程设计湖南工程学院.docx

《数据结构课程设计湖南工程学院.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计湖南工程学院.docx(37页珍藏版)》请在冰点文库上搜索。

数据结构课程设计湖南工程学院.docx

数据结构课程设计湖南工程学院

课程设计报告

课程名称数据结构

课题名称txt文本编辑器

 

专业通信工程

班级

学号

姓名

指导老师张鏖烽彭祯黄哲

2015年7月5日

湖南工程学院

课程设计任务书

 

课程名称数据结构

课题txt文本编辑器

 

专业班级

学生姓名

学号

指导老师张鏖烽彭祯黄哲

审批张鏖烽

 

任务书下达日期2015年6月29日

任务完成日期2015年7月5日

 

 

需求分析

1.问题描述:

编制一个可实现txt文件编辑系统的程序;输入一个文本,其可统计文本中总字数、英文字母数、空格数等;查找、替换某个字符串;插入删除某个字符串。

2,基本要求:

统计:

统计文本中总字数、英文字母的数量;

查找:

查找某个字符串出现的次数以及位置;

替换:

将文本中的某个字符串全部替换为另一个字符串。

插入:

在某个位置i插入一个字符串;

删除:

在某个位置i开始删除连续j个字符。

3.输入形式:

数字,大小写英文字母,空格,标点符号

4.输出形式:

分行输出字符即文本内容,输出文本英文字母的数量和总字数,输出某一字符串被替换后的文本内容,输出某一字符串被删除后的文本内容,输出插入某一字符串后的文本内容。

5.测试数据:

从存储器中读取一个txt文件(或以自己的程序文件为例),输出每次操作之后的结果。

 

概要设计

1结构体的定义:

typedefstructlist

{

chardata[60];//规定一行字不得大于60,大于则换行

intline;//输入文章的总行书

intlength;//一行字符的实际长度

structlist*next;

structlist*pre;

}LinkList;

2主程序流程图

3各函数调用

(1)Bookin()文本输入函数

(2)Display()文本显示函数

(3)Search()查找函数

(4)Statistic()统计英文字母个数和总字数

(5)Delete()删除函数

(6)Resplace()替换函数

(7)Insert()插入函数

(8)Bmenu()分菜单函数

(9)menu()主菜单函数

(10)main()主函数

详细设计

1定义单链表

typedefstructlist

{

chardata[60];//规定一行字不得大于60,大于则换行

intline;//输入文章的总行书

intlength;//一行字符的实际长度

structlist*next;

structlist*pre;

}LinkList;

2全局变量的定义

LinkList*h;//定义文章首行的头指针

3函数伪码

Bookin()文本输入函数

LinkList*temp;//定义指针变量*temp,类型LinkList

charch;inti,j;//定义输入变量ch,变量i变量j分别表示行数和每行字符数;

h->next=(LinkList*)malloc(sizeof(LinkList));//申请存储空间

h->pre=NULL;//首行头指针的前驱指针为空

temp=h->next;//首行指针

temp->pre=NULL;//首行指针的前驱指针也为空

temp->length=0;//文章长度初始值为0

for(i=0;i<60;i++)

temp->data[i]='\0';

printf("请输入文章(输入#结束):

\n");//初始化为字符串结束标志

for(j=0;j

{for(i=0;i<60;i++)//控制一行

{

ch=getchar();//接收输入的字符给ch

temp->data[i]=ch;//给temp指向的行赋值

temp->length++;//行的字符长度加1

if(ch=='#')

{LINE=j;break;}//文章结束时,LINE整个文章的行数

}

if(ch=='#')

{temp->length=i;

temp->next=NULL;

break;}

temp->next=(LinkList*)malloc(sizeof(LinkList));

//若换行,重新分配空间建立下一行

temp->next->pre=temp;//给temp的前驱指针赋值

temp=temp->next;//temp指向目前这一行

for(i=0;i<60;i++)

temp->data[i]='\0';

}

temp->line=LINE+1;//计算整个文章的行数

Display()显示文章内容

{

inti,j;//定义变量j,i分别为行数和每行字符数

LinkList*p;//定义指针变量

p=h->next;//指针p指向链表表头

printf("\n目前文章的内容:

");

for(j=0;j<=LINE&&p!

=NULL;j++)//利用循环输出链表中信息即文本内容

{for(i=0;(i<60)&&(p->data[i])!

='#';i++)

{printf("%c",p->data[i]);}

p=p->next;}

}

Statistic()统计字数函数

LinkList*temp;//定义指针变量temp

charch;

inti,j,t;//定义变量j,i分别为行数和每行字符数

intWORD=0,word=0,space=0,num=0,sum1=0,sum2=0;

//定义变量大写字母数、小写字母数、空格数、数字数、英文字母数和总字数

temp=h->next;//指针temp指向链表表头

for(j=0;j<=LINE;j++)//利用循环对链表中信息进行判断

{for(i=0;(i<60)&&(temp->data[i])!

='#';i++)

{ch=temp->data[i];

if((ch>='A')&&(ch<='Z'))

WORD++;//记录大写字母数

elseif((ch>='a')&&(ch<='z'))

word++;//记录小写字母数

elseif((ch>='0')&&(ch<='9'))

num++;//记录数字数

elseif(ch=='')//记录空格数

space++;}

sum1=WORD+word;//英文字母数

sum2=WORD+word+num+spcace+punct;}//文本总字数

Search()查找函数

{

charData[30];//定义一个数组,表示需要查找的字符内容

inti,j,k=0,sum=0;//定义定义变量j,i,sum表示字母出现次数

intl=1;

temp=h->next;//使指针变量指向链表表头

strcpy(Data,str1);//将形参中str1的值赋给Data

for(i=0;i<=LINE;i++)

{

for(j=0;j<60;j++)

{

if((temp->data[j])==Data[k])k++;//将输入的查找字符与文本比较,找到第一个相同的字符

elseif(Data[k]!

='\0')

{j=j-k;

k=0;}//从主串第j-k个位置重新查找

if(Data[k]=='\0')

{

sum++;

j=j-k+1;

printf("\t\t第%d次出现在第%d行第%d列\n",l,i+1,j+1);

l++;//此字符出现的次数加1

k=0;

continue;

}

}

temp=temp->next;//指向下一行

Delete()删除函数

{charData[30];//定义一个数组用来存放需要删除的字符或字符串

LinkList*temp,*te;//定义指针变量:

LinkList*temp,*te

inti,j,k,m,y,num;//定义整形变量用来控制行数、字符数

strcpy(Data,str2);//使用copy函数讲形参中需要删除的字符或字符串赋值给已定义的数组

for(y=0;y

{

num=60;

k=0,m=0;

temp=h;

for(i=0;i<=LINE;i++)//查找匹配的字符或字符串

{

te=temp;

temp=temp->next;

for(j=0;j<60;j++)

{

if((temp->data[j])==Data[k])k++;

elseif(Data[k]!

='\0'){j=j-k;k=0;}

if(Data[k]=='\0')

{num=j;break;}

}

if(num<60)break;

}

for(;i<=LINE;i++)

{

for(;j<60;j++)

{

if(j+1

{

te->data[60-k+num]=temp->data[j+1];//删除的字符串不在最后一行,将由temp指向的那行前移到前行

}

else

temp->data[j-k+1]=temp->data[j+1];//当要删除的字符串在最后一行只要将最后一行的字符前移

}

te=temp;

temp=temp->next;

j=0;//在使用循环,从查找到的字符或者字符串开始一行一行的进行删除}

 

Insert()插入函数

{

charData[30];//定义需要插入的字符或者字符串的输入数组

inth,l;//定义需要插入的字符或者字符串的插入的行和列

printf("\n\t\t请输入要插入的字符或字符串:

");

getchar();

gets(Data);

printf("\n\t\t当前文章内容为:

");

Display();

printf("\n\t\t请输入要插入的行:

");

scanf("%d",&h);

printf("\n\t\t请输入要插入的列:

");

scanf("%d",&l);

inti=(h-1)*60+l;//定义一个整形变量,确定插入位置

LinkList*a;//定义一指针变量

intn=strlen(Data);

intm;

intinsertLine=i/60+1;//确定插入位置的行数

intline=temp->line;//将全局变量记录的行数赋值给line

intj;

if(insertLine==line)//判断插入位置是否在最后一行

{

for(m=temp->length-1;m>=(i%60)&&n>0;m--)

temp->data[m+n]=temp->data[m];//将最后一行插入位置后面的所有字符向后移n位

for(m=(i%60),j=0;m

{temp->data[m]=Data[j];}//将要插入的字符或者字符串赋值到要插入的位置

}

else//如果插入的位置不再最后一行

{

intr=0;

for(intp=insertLine;p

{

if(p==insertLine)

r=0;

else

r=n;

for(m=temp->length-1-r;m>=0&&n>0;m--)

temp->data[m+n]=temp->data[m];//将最后一行整体后移n位

a=temp;

temp=temp->pre;

temp->length=60;

for(m=temp->length-n,j=0;mlength;m++,j++)

a->data[j]=temp->data[m];//将前一行后n个字符移到下一行的前n个字符位置

}

for(m=temp->length-n-1;m>=(i%60);m--)

temp->data[m+n]=temp->data[m];//插入行位置后的字符后移n位

for(m=(i%60),j=0;m<(i%60)+n;m++,j++)

temp->data[m]=Data[j];//将要插入的字符赋值到插入的位置

};

Replace()替换函数

{

charData[30];//定义需要替换的字符或者字符串的输入数组

inth,l;//定义需要替换的字符或者字符串的替换的行和列

printf("\n\t\t请输入要替换的字符或字符串:

");

getchar();

gets(Data);

printf("\n\t\t当前文章内容为:

");

Display();

printf("\n\t\t请输入要替换的行:

");

scanf("%d",&h);

printf("\n\t\t请输入要替换的列:

");

scanf("%d",&l);

inti=(h-1)*60+l;//定义一个整形变量,确定需替换位置

LinkList*a;//定义一指针变量

intn=strlen(Data);

intm;

intReplaceLine=i/60+1;//确定替换位置的行数

intline=temp->line;//将全局变量记录的行数赋值给line

intj;

if(ReplaceLine==line)//判断替换位置是否在最后一行

{

for(m=(i%60),j=0;m

{temp->data[m]=Data[j];}//将要替换的字符或者字符串赋值到要替换的位置

}

else//如果替换的位置不再最后一行

{

intr=0;

for(intp=ReplaceLine;p

{

if(p==ReplaceLine)

r=0;

else

r=n;

for(m=(i%60),j=0;m<(i%60)+n;m++,j++)

temp->data[m]=Data[j];//将要替换的字符赋值到替换的位置

}

 

4各函数调用关系图

调试分析

1调试过程中遇到的问题

由于首先没设置数组最大值,导致数组不能正确输入,后来定义了#define maxsize 100才解决这个问题

开始统计中没有考虑空格和标点符号导致统计不正确

插入时根本找不着插入位置。

后来设置了头指针和指针变量

 

2算法时空分析

本算法的空间复杂度为O(N)。

输出函数、查找函数算法时间复杂度均为O(N),其他函数的时间复杂度较高

3经验与体会

通过这次充实的课程设计,我们的上机实践没有像这次课程设计一样做一个完整的程序来实现txt编辑器的功能。

因此,这次课程设计锻炼了我的实践能力,在课程设计的过程,我遇到了许多问题,多亏老师和同学的帮助。

 虽然结果十分重要,但是过程更加宝贵。

总体来说,课程设计锻炼了我的动手能力,相对加强了对课本知识的应用。

用户使用说明

进入主页后选择你想要的功能。

如果是第一次运行则需要选择1号功能输入文本,输入后若是想查看输入的文本则选择2,若是想退出系统则选择5;若是想统计英文字母数字和总数字则选择3。

若是想查找,删除,插入,替换字符或者字符串则选择4即可。

进入统计和处理分菜单后则可选择你想要的功能号,按照提示进行操作。

 

测试结果

进入主页,选择1号功能输入文本本:

显示输入的文本内容:

选择3号功能,进入文本内容统计页面:

选择想要统计的内容,比如选择1号统计大写字母的个数,Hello2015!

的大写字母有1个:

小写字母有4个:

总字数有11个,包括英文字母5个,标点符号1个,空格符号1个,数字4个:

退出统计界面,返回主菜单:

查找字符串2015:

删除字符串2015:

插入字符串2014:

用字符串good替换Hell:

退出系统:

附录

#include"stdio.h"

#include"malloc.h"

#include"string.h"

#include"iostream.h"

#include"stdlib.h"

#include"conio.h"

#defineLink_Size100

typedefstructlist

{

chardata[60];//规定一行字不得大于60,大于则换行

intline;//输入文章的总行书

intlength;//一行字符的实际长度

structlist*next;

structlist*pre;

}LinkList;

LinkList*h;

intLINE,C,N;

LinkList*Bookin()

{

LinkList*temp;//定义指针变量*temp,类型LinkList

charch;

inti,j;

h->next=(LinkList*)malloc(sizeof(LinkList));//申请存储空间

h->pre=NULL;//首行头指针的前驱指针为空

temp=h->next;//首行指针

temp->pre=NULL;//首行指针的前驱指针也为空

temp->length=0;

for(i=0;i<60;i++)

temp->data[i]='\0';

printf("请输入文章(输入#号结束):

\n");

for(j=0;j

{

for(i=0;i<60;i++)//控制一行

{

ch=getchar();

temp->data[i]=ch;//给temp指向的行赋值

temp->length++;

if(ch=='#')

{

LINE=j;//文章结束时,LINE整个文章的行数

break;

}

}

if(ch=='#')

{

temp->length=i;

temp->next=NULL;

break;

}

temp->next=(LinkList*)malloc(sizeof(LinkList));//若换行,重新分配空间建立下一行

temp->next->pre=temp;//给temp的前驱指针赋值

temp=temp->next;//temp指向目前这一行

for(i=0;i<60;i++)

temp->data[i]='\0';

}

temp->line=LINE+1;}//计算整个文章的行数

returntemp;

}

 

voidDisplay()

{

inti,j;

LinkList*p;

p=h->next;//指针p指向链表表头

printf("\n目前文章的内容:

");

for(j=0;j<=LINE&&p!

=NULL;j++)//利用循环输出链表中信息即文本内容

{

for(i=0;(i<60)&&(p->data[i])!

='#';i++)

{

printf("%c",p->data[i]);

}

p=p->next;

}

}

voidStatistic()

{

LinkList*temp;//定义指针变量temp

charch;

inti,j,t;

intWORD=0,word=0,space=0,num=0,punct=0,sum1=0,sum2=0;

temp=h->next;//指针temp指向链表表头

for(j=0;j<=LINE;j++)//利用循环对链表中信息进行判断

{

for(i=0;(i<60)&&(temp->data[i])!

='#';i++){

ch=temp->data[i];

if((ch>='A')&&(ch<='Z'))

WORD++;

elseif((ch>='a')&&(ch<='z'))

word++;

elseif((ch>='0')&&(ch<='9'))

num++;

elseif(ch=='')

space++;

elseif(ch==33||ch==34||ch==39||ch==44||ch==46||ch==58||ch==59||ch==63)

punct++;

}

sum1=WORD+word;

sum2=WORD+word+num+space+punct;

}

while

(1)

{

printf("\n");

printf("\t\t****文本内容统计****\n");

printf("\n");

printf("\t\t****1、文本中大写字母的个数****\n");

printf("\t\t****2、文本中小写字母的个数****\n");

printf("\t\t****3、文本中英文字母的个数****\n");

printf("\t\t****4、文本中数字的个数****\n");

printf("\t\t****5、文本中所有字数****\n");

printf("\t\t****6、返回主菜单****\n");

printf("\t\t****7、直接退出本系统****\n");

printf("\t\t请选择选项:

");

scanf("%d",&t);

switch(t)

{

case1:

printf("\n\t\t文本中大写字母的个数:

%d\n",WORD);

printf("按回车键继续·····");

getchar();//接受回车键被接收

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2