数结构课程设计报告
. 需求分析
1.题目求
名称:简单文编辑器
容:输入页文字程序统计出文字数字空格数静态存储页文章行超80字符N行
求:(1)分统计出中英文字母数空格数整篇文章总字数
(2)统计某字符串文章中出现次数输出该次数
(3)删某字符者子串面字符前移
(4)插入某字符者子串
(5)查找某字符者子串
存储结构线性表分子函数实现相应功输入数形式范围:输入写写英文字母数字标点符号
输出形式:
(1)分行输出户输入行字符
(2)分4行输出全部字母数数字数空格数文章总字数
(3)输出删某字符串文章
通题目求知程序应实现功:
(1) 文章容输入:包括字母标点符号数字等
(2) 文章容统计:包括文章中写字母写字母数字标点符号空格
文章字数数统计
(3) 文章容处理:包括文章容查找删指定位置进行插入操作
中查找程中统计出该字符字符串文章中出现次数
2.问题分析
程序段英文文章容进行处理存储方式采链式存储没文件操作程序文容操作链表中进行文输入采头插法文信息存储链表已申请存储空间中部分设计中问题输入文章程中输入字符数80时换行文容统计循环已存储文章进行匹配写字母数写字母数空格数数字数直接通较标点符号通ASCⅡ较文容处理查找部分循环已存储文章进行匹配判断需查找字符者字符串否文章中某部分容相果存相记录相数位置输出数位置删部分先程序查找功文章中需删字符者字符串进行查找然进行删插入部分通输入插入位置(行列)字符者字符串插入文章制定位置
二.概设计
数结构选择:程序输入文字进行操作数结构单链表操作根第部分问题分析该链表操作3部分:
Pre
Temp
Next
全局变量*head作文章头指针
创建结构体:
typedef struct _list
{ char data[80] 记录行字符
int length 记录行字符长度
struct _list *next 继指针
struct _list *pre 前趋指针
int row 记录整篇文章行数
}LinkList
文章容创建部分中线性表链式存储全局变量文种信息进行存储
文章容统计删查找插入采链表操作完成
程序菜单功完美化量do while 语句
概设计:
程序框架:
****************************************************
**** 欢迎简单文编辑器 ****
****************************************************
**** 菜单 ****
****************************************************
**** 1输入文容 ****
**** 2显示前文容 ****
**** 3文容统计菜单 ****
**** 4文容处理菜单 ****
**** 5关 ****
**** 6退出系统 ****
****************************************************
**** 注:第次系统时请选择1号功 ****
****************************************************
判断
1
2
3
4
5
6
文容输入CreatWord()文容输入已申请存储空间中
显示函数
PrintWord()前文中容显示出
文章容统计菜单
CountWord()菜单形式显示户文章容进行种方式统计
文章容处理菜单Bmenu()部分子菜单包括SearchWord()DeleteWord()
InsertWord()三函数文章容进行处理
类似作者信息代码AboutWord()显示作者信息
退出系统
图1 简单文编辑器框架
**********************************************
**** 文章容统计菜单 ****
*********************************************
**** 1文章中写字母数 ****
**** 2文章中写字母数 ****
**** 3文章中数字数 ****
**** 4文章中标点符号数 ****
**** 5文章中空格数 ****
**** 6文章中字数 ****
**** 7退出返回菜单 ****
**** 8直接退出系统 ****
*********************************************
判断
统计文中写字母数
1
统计文中写字母数
2
统计文中数字数
3
统计文中标点符号数
4
统计文中空格数
5
统计文字数
6
返回菜单
7
直接退出系统
8
两子菜单:
选择图中功3:
图2 简单文编辑器文容统计菜单
选择功4:
**********************************************
**** 文章容处理菜单 ****
*********************************************
**** 1查找文章中字符者字符串 ****
**** 2删文章中字符者字符串 ****
**** 3文章中插入字符者字符串 ****
**** 4显示前文章容 ****
**** 5返回菜单 ****
**** 6直接退出系统 ****
*********************************************
判断
1
2
3
4
5
6
子函数
SearchWord()存储链表中文进行字符者字符串查找
子函数
DeleteWord()存储链表中文进行字符者字符串删
子函数
InsertWord()存储链表中文进行字符者字符串插入
函数PrintWord()
前文信息显示出
返回菜单继续菜单
结束整程序
图3 简单文编辑器文容处理菜单
根图程序设计11函数
1HeadWord() 标题函数输出标题永远出现程序顶端
2CreatWord() 文输入函数实现图1菜单功1文容进行输入
3PrintWord() 前文容输出函数实现图1菜单功2图3中功4
前存储链表中文容输出
4CountWord() 文章容统计函数实现图1菜单功3存储链表中文容进
行统计包括文容中写字母写字母数字标点符号空格文章字
数数统计图2完整描述
5SearchWord() 文章容查找函数实现图3菜单功1中查找部分
6DeleteWord() 文章容删函数实现图3菜单功2中删部分
7InsertWord() 文章容插入函数实现图3菜单功3中插入部分
8Bmenu() 第二子菜单函数实现图1菜单功4图3函数实现结果5
67子函数集合函数中
9AboutWord() 显示作者信息函数实现图1菜单功5
10menu() 菜单函数结果图1显示部分123489等函数集合
11main()函数
函数关系流程图形式绘制:
menu
CreatWord
CountWord
Bmenu
SearchWord
DeleteWord
InsertWord
AboutWord
PrintWord
End
main
图4函数间关系
三.详细设计
1 定义单链表结点类型
typedef struct _list 行表结构
{
char data[80] 记录行字符
int length 记录行字符长度
struct _list *next 继指针
struct _list *pre 前趋指针
int row 记录整篇文章行数
}LinkList
2 全局变量定义
int NUMCN 定义全局变量Num记录行号C记录子串串中出现总次数
LinkList *head 定义全局变量*head文章首行头指针
3 子函数伪码
A) CreatWord()文容输入函数
具体创建程:
a 定义LinkList指针变量*temp LinkList *temp
b 定义文输入变量ch记录文行数变量j记录行字符数变量i
c 申请动态存储空间:head>next(LinkList *)malloc(sizeof(LinkList))
d 首行头指针前驱指针空:head>preNULL
首行指针: temphead>next
首行指针前驱指针空: temp>preNULL
定义没输入字符时文章长度0: temp>length0
初始化字符串结束标志防止出现乱码: for(i0i<80i++)
temp>data[i]'\0'
e 利循环进行文输入
for(j0j
{ chgetchar() 接收输入字符
temp>data[i]ch temp指行赋值
····
temp>length++行中字符长度加1
if(ch'#')
{NUMj break 文章结束时Num记录整文章行数
}}}
字符输入程中果单行输入字符超80字符需操作 :
输入字符数80重新分配空间建立行
temp>next(LinkList *)malloc(sizeof(LinkList))
temp前驱指针赋值:temp>next>pretemp
temp指前行: temptemp>next
行初始化字符串结束标志防止出现乱码:for(i0i<80i++)
temp>data[i]'\0'
记录整文章行数:temp>rowNUM+1
返回指行指针:return temp
文输入部分结束
B)PrintWord()前文输出函数
子函数功前存储链表中文信息输出屏幕具体伪码算法:
a 定义文行数变量j行字符数i:int ij
b 定义指针变量LinkList *p
c 指针p指链表表头 phead>next
d 利循环输出链表中信息
for(j0j
{printf(cp>data[i])}
pp>next }
文输出函数结束
C)CountWord() 文容统计函数
子函数文中容进行统计具体伪码算法
a 定义指针变量tempLinkList *temp
b 定义记录文行数变量j行字符数i
c 定义记录文写字母数写字母数空格数数字数标点数总字数变量:
int WORD0word0space0num0punct0sum0
d 指针temp指链表表头temphead>next
e 利循环链表中信息进行匹配判断写字母数写字母数空格数数字数标点数总字数统计出
for(j0j
{ chtemp>data[i]
if((ch>'A')&&(ch<'Z')) WORD++
else if((ch>'a')&&(ch<'z')) word++
else if((ch>'0')&&(ch<'9')) num++
else if(ch' ') space++
else if(ch33||ch34||ch39||ch44||ch46||ch58||ch59||ch63)
{punct++}
}
sumWORD+word+num
}
f 程序统计项目设计菜单提供户选择
菜单编写do while语句进行循环操作部分谈
D)SearchWord( ) 文容查找函数
子函数文容进行查找查找容进行统计出现次数
具体伪码算法:
a 定义数组记录需查找字符容char Data[20]
b 定义定义文行数变量j行字符数i记录字符出现次数变量:
int ijm0sum0
c 形参中定义指针变量进行操作指链表表头temphead>next
d VC++中拷贝函数形参中str1值赋Data:strcpy(Datastr1)
e 利循环进行查找操作核心算法:
if((temp>data[j])Data[k])
k++输入查找字符链表中信息较找第相字符
else if(Data[k]'\0')
{jjk k0 } 串第jk位置重新查找
if(Data[k]'\0')
{sum++字符出现次数加1
jjk+1 j记录该字符串出现位置
printf(\t\t第d次出现第d行第d列\nli+1j+1)
l++
k0
continue}
temptemp>next 指行
文容查找部分完成
E)DeleteWord( ) 文容删函数
子函数文容进行删具体伪码算法:
f 定义数组存储需删字符者字符串:char Data[20]
g 定义指针变量LinkList *temp*term
h 定义整形变量控制行数字符数:int ijkmynum
i VC++中拷贝函数讲形参中需删字符字符串赋值已定义数组
strcpy(Datastr2)
j 循环进行删操作
核心算法
for(i0i
{ if((temp>data[j])Data[k]) k++
else if(Data[k]'\0') {jjkk0}
if(Data[k]'\0')
{numj break } }
if(num<80) break
}
首先循环查找需删字符者字符串字符数字符者字符串位置便删
for(i
{ if(j+1
else temp>data[jk+1]temp>data[j+1] } 删字符串行行字符前移
termtemp
temptemp>next
j0 }循环查找字符者字符串开始进行删行删完毕转行进行删
删部分次完成
F)InsertWord() 文容插入函数
函数文中插入字符者字符串具体伪码:
a 定义需插入字符者字符串输入数组char Data[20]
b 定义需插入字符者字符串插入行列int hl
c 进行输入操作述两部分进行输入
d 定义整形变量确定插入具体位置: int i(h1)*80+l
e 定义指针变量LinkList *a
f 输入字符进行插入操作具体核心算法
int nstrlen(Data)
int m
int insertRowi80+1确定插入位置行数
int rowtemp>row全局变量记录行数赋值row
int j
if(insertRowrow)判断插入位置否行
{for(mtemp>length1m>(i80)&&n>0m)
temp>data[m+n]temp>data[m]行插入位置面字符移n位
for(m(i80)j0m
}
else果插入位置行
{ int r0
for(int pinsertRow p
else rn
for(mtemp>length1rm>0&&n>0m)
temp>data[m+n]temp>data[m]行整体移n位
a temp p指前行
temp temp>pretemp指前位
temp>length 80
for(m temp>lengthnj0m
a>data[j]temp>data[m] }前行n字符移行前n字符位置
for(mtemp>lengthn1m>(i80)m)
temp>data[m+n]temp>data[m]插入行位置字符移n位
for(m(i80)j0m<(i80)+nm++j++)
temp>data[m] Data[j]}插入字符赋值插入位置
return temp}
E)Bmenu()文容处理菜单
函数文容处理菜单循环语句文容处理部分子函数集中函数中
F)HeadWord()AboutWord() 输出信息函数
两子函数加输出程序信息函数
HeadWord()标题输出DOS节面端
AboutWord()显示作者信息
G)menu() main()
菜单函数函数
菜单单独创建子函数方便观然简单循环语句实现
函数
void main()
{head(LinkList *)malloc(sizeof(LinkList))
LinkList *temp
menu(temp)
}
先head申请存储空间然创建指针变量temp然直接菜单函数中进行操作
四.调试分析
1 机调试程中遇问题解决方法:
a) 程序操作部分常查找删插入基算法代码通查找资料没出现问题错误删插入等子函数中复杂操作程中出现问题
b) 删插入程中需子函数中定义数组变量存储输入信息然链表中信息进行较达删者插入达输入信息赋值子函数中定义数组特c++中strcpy()函数
c) 程序界面更加完美做3菜单写子函数专门标题显示程序端清屏函数system(cls)
2 时间空间性分析:
算法空间复杂度低需文行数(N—1)*80+L(行字符数)数组存放结果空间复杂度O(N)算法时间复杂度较高输出函数查找函数算法时间复杂度均O(N)删函数插入函数算法时间复杂度较高暂时问想时间复杂度更算法里法该算法进行优化
3 验体会:
文编辑器课程设计题目时较害怕制作windows系统中记事
样程序务书欣慰务书求输入信息进行操作常练容然时练更难更深度毕竟知道该什方努力应该编写程序整课程设计程中较轻松编写程中遇困难问题通查阅资料老师提问解决基课题明确解清楚什方写次课程设计体会写什程序首先问题分析透彻知道干什然干什
五.测试结果
测试文章
Real beauty comes from learning growing and loving in the ways of life That is the Art of Life You can learn slowly and sometimes painfully by just waiting for life to happen to you Or you can choose to accelerate your growth and intentionally devour life and all it offers You are the artist that paints your future with the brush of today
运行程序:
图5 程序菜单
注先选择1号功:
图6 文输入
输入完文字退回菜单然选择2号功
图7 前文输出
返回回菜单然选择3号功进入文容统计菜单
图8 文章容统计菜单
选择16号功:
图 9 统计功显示结果
果选择7回菜单选择8直接退出程序
回菜单选择4号功:
图10 文章容处理菜单
选择1:
图11 文查找结果
选择2:
图12 文章删结果
选择3:
图13 文章插入结果
全部结束5回菜单6直接退出程序
回菜单选择5:
图14 关界面
回菜单选择6退出程序
六.程序完整代码
#includestdioh
#includemalloch
#includestringh
#includeiostreamh
#includestdlibh
#includeconioh
#define Link_Size 100
int NUMCN
typedef struct list
{
char data[80]
int length
struct list *next
struct list *pre
int row
} LinkList
LinkList *head
void HeadWord()
{
system(cls)
printf(\t\t****************************************************\n)
printf(\t\t**** 欢迎简单文编辑器 ****\n)
printf(\t\t****************************************************\n)
}
LinkList *CreatWord()
{
LinkList *temp
char ch
int ij
head>next(LinkList *)malloc(sizeof(LinkList))
head>preNULL
temphead>next
temp>preNULL
temp>length0
for(i0i<80i++)
temp>data[i]'\0'
printf(开始创建文请输入文章(输入#号结束)\n)
for(j0j
for(i0i<80i++)
{
chgetchar()
temp>data[i]ch
temp>length++
if(ch'#')
{
NUMj
break
}
}
if(ch'#')
{
temp>lengthi
temp>nextNULL
break
}
temp>next(LinkList *)malloc(sizeof(LinkList))
temp>next>pretemp
temptemp>next
for(i0i<80i++)
temp>data[i]'\0'
}
temp>rowNUM+1
system(cls)
return temp
}
void PrintWord()
{
int ij
LinkList *p
phead>next
system(cls)
HeadWord()
printf(\n前文章容)
for(j0j
for(i0(i<80)&&(p>data[i])'#'i++)
{
printf(cp>data[i])
}
pp>next
}
}
void CountWord()
{
LinkList *temp
char ch
int ijt
int WORD0word0space0num0punct0sum0
temphead>next
for(j0j
for(i0(i<80)&&(temp>data[i])'#'i++)
{
chtemp>data[i]
if((ch>'A')&&(ch<'Z'))
WORD++
else if((ch>'a')&&(ch<'z'))
word++
else if((ch>'0')&&(ch<'9'))
num++
else if(ch' ')
space++
else if(ch33||ch34||ch39||ch44||ch46||ch58||ch59||ch63)
{punct++}
}
sumWORD+word+num
}
while(1)
{
printf(\n)
HeadWord()
printf(\t\t****************************************************\n)
printf(\t\t**** 文章容统计菜单 ****\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**** 8直接退出系统 ****\n)
printf(\t\t****************************************************\n)
printf(\t\t请选择需统计项目)
scanf(d&t)
switch(t)
{
case 1
system(cls)
HeadWord()
printf(\n\t\t文章中写字母数d\nWORD)
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
case 2
system(cls)
HeadWord()
printf(\n\t\t文章中写字母数d\nword)
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
case 3
system(cls)
HeadWord()
printf(\n\t\t文章中数字数d\nnum)
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
case 4
system(cls)
HeadWord()
printf(\n\t\t文章中标点符号数d\npunct)
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
case 5
system(cls)
HeadWord()
printf(\n\t\t文章中空格数d\nspace)
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
case 6
system(cls)
HeadWord()
printf(\n\t\t文章中字数d\nsum)
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
}
if(t7)
{system(cls) break}
if(t8) exit(0)
}
}
void SearchWord(char *str1LinkList* temp)
{
char Data[20]
int ijk0sum0
int l1
temphead>next
strcpy(Datastr1)
for(i0i
for(j0j<80j++)
{
if((temp>data[j])Data[k]) k++
else if(Data[k]'\0')
{
jjk
k0
}
if(Data[k]'\0')
{
sum++
jjk+1
printf(\t\t第d次出现第d行第d列\nli+1j+1)
l++
k0
continue}
}
temptemp>next
}
printf(\t\t\t字符串总出现次数d\n\nsum)
Csum
Ni*80+j
}
void DeleteWord(char *str2)
{ char Data[20]
LinkList *temp*term
int ijkmynum
strcpy(Datastr2)
for(y0y
num80
k0m0
temphead
for(i0i
termtemp
temptemp>next
for(j0j<80j++)
{
if((temp>data[j])Data[k]) k++
else if(Data[k]'\0') {jjkk0}
if(Data[k]'\0')
{
numj
break
}
}
if(num<80) break
}
for(i
for(j<80j++)
{
if(j+1
term>data[80k+num]temp>data[j+1]
}
else
temp>data[jk+1]temp>data[j+1]
}
termtemp
temptemp>next
j0
}
}
}
LinkList * InsertWord(LinkList *temp)
{
char Data[20]
int hl
printf(\n\t\t请输入插入字符字符串)
getchar()
gets(Data)
printf(\n\t\t前文章容)
PrintWord()
printf(\n\t\t请输入插入行)
scanf(d&h)
printf(\n\t\t请输入插入列)
scanf(d&l)
int i(h1)*80+l
LinkList *a
int nstrlen(Data)
int m
int insertRowi80+1
int rowtemp>row
int j
if(insertRowrow)
{
for(mtemp>length1m>(i80)&&n>0m)
temp>data[m+n]temp>data[m]
for(m(i80)j0m
temp>data[m]Data[j]
}
}
else
{
int r0
for(int pinsertRow p
if(p insertRow)
r0
else
rn
for(mtemp>length1rm>0&&n>0m)
temp>data[m+n]temp>data[m]
atemp
temp temp>pre
temp>length 80
for(m temp>lengthnj0m
a>data[j]temp>data[m]
}
for(mtemp>lengthn1m>(i80)m)
temp>data[m+n]temp>data[m]
for(m(i80)j0m<(i80)+nm++j++)
temp>data[m] Data[j]
}
return temp
}
void Bmenu(LinkList *temp)
{
char str1[20]
char str2[20]
int a
do
{
HeadWord()
printf(\n\t\t****************************************************\n)
printf(\t\t**** 文章容处理菜单 ****\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****************************************************\n)
printf(\t\t 请选择)
scanf(d&a)
switch(a)
{
case 1
system(cls)
HeadWord()
printf(\t\t\t请输入您需查找字符字符串)
getchar()
gets(str1)
SearchWord(str1temp)
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
case 2
system(cls)
HeadWord()
printf(\t\t\t请输入您需删字符字符串)
getchar()
gets(str2)
SearchWord(str2temp)
DeleteWord(str2)
printf(\t\t\t删 s 文章str2)
PrintWord()
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
case 3
system(cls)
HeadWord()
InsertWord(temp)
printf(\t\t\t插入字符字符串文章)
PrintWord()
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
case 4
system(cls)
HeadWord()
PrintWord()
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
}
if(a5)
{
system(cls)
break
}
if(a6) exit(0)
}while(1)
}
void AboutWord()
{
printf(\n\n\t\t 关 \n)
printf(\t\t****************************************************\n)
printf(\t\t** 系统07网络工程(2)班范亚运制作谢谢 **\n)
printf(\t\t****************************************************\n)
printf(\n)
}
void menu(LinkList *temp)
{
int t
do{
HeadWord()
printf(\n)
printf(\t\t****************************************************\n)
printf(\t\t**** 菜单 ****\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****************************************************\n)
printf(\t\t**** 注:第次运行程序时请选择1号功 ****\n)
printf(\t\t****************************************************\n)
printf( \t\t 请选择)
scanf(d&t)
if((t>6)&&(t<1))
{
printf(起功请输入正确功序号\n)
}
else
switch(t)
{
case 1
system(cls)
HeadWord()
tempCreatWord()
break
case 2
system(cls)
PrintWord()
printf(\n)
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
case 3
system(cls)
CountWord()
break
case 4
system(cls)
Bmenu(temp)
break
case 5
system(cls)
HeadWord()
AboutWord()
printf(回车键继续·····)
getchar()
getchar()
system(cls)
break
}
if(t6) break
}while(1)
}
void main()
{
head(LinkList *)malloc(sizeof(LinkList))
LinkList *temp
menu(temp)
}
七.总结体会
程序运行结果理推导结果完全吻合该算法程序设计满足课程设计求该程序优点简单易懂存理解障碍然想种解法
通数结构课程设计学知识更理解增强家动手力时发现足处知识应力欠缺应软件力编程水课程求更存差距
文档香网(httpswwwxiangdangnet)户传
《香当网》用户分享的内容,不代表《香当网》观点或立场,请自行判断内容的真实性和可靠性!
该内容是文档的文本内容,更好的格式请下载文档