数据结构课程设计湖南工程学院.docx
《数据结构课程设计湖南工程学院.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计湖南工程学院.docx(37页珍藏版)》请在冰点文库上搜索。
数据结构课程设计湖南工程学院
课程设计报告
课程名称数据结构
课题名称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定义单链表
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();//接收输入的字符给chtemp->data[i]=ch;//给temp指向的行赋值temp->length++;//行的字符长度加1if(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;//定义指针变量tempcharch;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的值赋给Datafor(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++;//此字符出现的次数加1k=0;continue;}}temp=temp->next;//指向下一行Delete()删除函数{charData[30];//定义一个数组用来存放需要删除的字符或字符串LinkList*temp,*te;//定义指针变量:LinkList*temp,*teinti,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指向的那行前移到前行}elsetemp->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;//将全局变量记录的行数赋值给lineintj;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;elser=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;//将全局变量记录的行数赋值给lineintj;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;elser=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_Size100typedefstructlist{chardata[60];//规定一行字不得大于60,大于则换行intline;//输入文章的总行书intlength;//一行字符的实际长度structlist*next;structlist*pre;}LinkList;LinkList*h;intLINE,C,N;LinkList*Bookin(){LinkList*temp;//定义指针变量*temp,类型LinkListcharch;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;//定义指针变量tempcharch;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();//接受回车键被接收
{for(i=0;i<60;i++)//控制一行
ch=getchar();//接收输入的字符给ch
temp->data[i]=ch;//给temp指向的行赋值
temp->length++;//行的字符长度加1
if(ch=='#')
{LINE=j;break;}//文章结束时,LINE整个文章的行数
}
{temp->length=i;
temp->next=NULL;
break;}
temp->next=(LinkList*)malloc(sizeof(LinkList));
//若换行,重新分配空间建立下一行
temp->next->pre=temp;//给temp的前驱指针赋值
temp=temp->next;//temp指向目前这一行
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])!
{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指向的那行前移到前行}elsetemp->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;//将全局变量记录的行数赋值给lineintj;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;elser=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;//将全局变量记录的行数赋值给lineintj;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;elser=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_Size100typedefstructlist{chardata[60];//规定一行字不得大于60,大于则换行intline;//输入文章的总行书intlength;//一行字符的实际长度structlist*next;structlist*pre;}LinkList;LinkList*h;intLINE,C,N;LinkList*Bookin(){LinkList*temp;//定义指针变量*temp,类型LinkListcharch;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;//定义指针变量tempcharch;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();//接受回车键被接收
num=60;
k=0,m=0;
temp=h;
for(i=0;i<=LINE;i++)//查找匹配的字符或字符串
te=temp;
temp=temp->next;
if((temp->data[j])==Data[k])k++;
='\0'){j=j-k;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指向的那行前移到前行}elsetemp->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;//将全局变量记录的行数赋值给lineintj;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;elser=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;//将全局变量记录的行数赋值给lineintj;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;elser=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_Size100typedefstructlist{chardata[60];//规定一行字不得大于60,大于则换行intline;//输入文章的总行书intlength;//一行字符的实际长度structlist*next;structlist*pre;}LinkList;LinkList*h;intLINE,C,N;LinkList*Bookin(){LinkList*temp;//定义指针变量*temp,类型LinkListcharch;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;//定义指针变量tempcharch;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();//接受回车键被接收
te->data[60-k+num]=temp->data[j+1];//删除的字符串不在最后一行,将由temp指向的那行前移到前行
else
temp->data[j-k+1]=temp->data[j+1];//当要删除的字符串在最后一行只要将最后一行的字符前移
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;elser=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;//将全局变量记录的行数赋值给lineintj;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;elser=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_Size100typedefstructlist{chardata[60];//规定一行字不得大于60,大于则换行intline;//输入文章的总行书intlength;//一行字符的实际长度structlist*next;structlist*pre;}LinkList;LinkList*h;intLINE,C,N;LinkList*Bookin(){LinkList*temp;//定义指针变量*temp,类型LinkListcharch;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;//定义指针变量tempcharch;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();//接受回车键被接收
{temp->data[m]=Data[j];}//将要插入的字符或者字符串赋值到要插入的位置
else//如果插入的位置不再最后一行
intr=0;
for(intp=insertLine;p{if(p==insertLine)r=0;elser=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;//将全局变量记录的行数赋值给lineintj;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;elser=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_Size100typedefstructlist{chardata[60];//规定一行字不得大于60,大于则换行intline;//输入文章的总行书intlength;//一行字符的实际长度structlist*next;structlist*pre;}LinkList;LinkList*h;intLINE,C,N;LinkList*Bookin(){LinkList*temp;//定义指针变量*temp,类型LinkListcharch;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;//定义指针变量tempcharch;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();//接受回车键被接收
if(p==insertLine)
r=0;
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请输入要替换的字符或字符串:
printf("\n\t\t请输入要替换的行:
printf("\n\t\t请输入要替换的列:
inti=(h-1)*60+l;//定义一个整形变量,确定需替换位置
intReplaceLine=i/60+1;//确定替换位置的行数
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;elser=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_Size100typedefstructlist{chardata[60];//规定一行字不得大于60,大于则换行intline;//输入文章的总行书intlength;//一行字符的实际长度structlist*next;structlist*pre;}LinkList;LinkList*h;intLINE,C,N;LinkList*Bookin(){LinkList*temp;//定义指针变量*temp,类型LinkListcharch;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;//定义指针变量tempcharch;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();//接受回车键被接收
{temp->data[m]=Data[j];}//将要替换的字符或者字符串赋值到要替换的位置
else//如果替换的位置不再最后一行
for(intp=ReplaceLine;p{if(p==ReplaceLine)r=0;elser=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_Size100typedefstructlist{chardata[60];//规定一行字不得大于60,大于则换行intline;//输入文章的总行书intlength;//一行字符的实际长度structlist*next;structlist*pre;}LinkList;LinkList*h;intLINE,C,N;LinkList*Bookin(){LinkList*temp;//定义指针变量*temp,类型LinkListcharch;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;//定义指针变量tempcharch;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();//接受回车键被接收
if(p==ReplaceLine)
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
LinkList*h;
intLINE,C,N;
LinkList*Bookin()
inti,j;
temp->length=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;//定义指针变量tempcharch;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();//接受回车键被接收
for(i=0;i<60;i++)//控制一行
ch=getchar();
temp->length++;
LINE=j;//文章结束时,LINE整个文章的行数
break;
temp->length=i;
temp->next=(LinkList*)malloc(sizeof(LinkList));//若换行,重新分配空间建立下一行
temp->line=LINE+1;}//计算整个文章的行数
returntemp;
voidDisplay()
LinkList*p;
for(i=0;(i<60)&&(p->data[i])!
printf("%c",p->data[i]);
p=p->next;
voidStatistic()
inti,j,t;
intWORD=0,word=0,space=0,num=0,punct=0,sum1=0,sum2=0;
for(i=0;(i<60)&&(temp->data[i])!
='#';i++){
ch=temp->data[i];
WORD++;
word++;
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("\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