数据结构文章编辑程序的设计Word版.docx

上传人:b****9 文档编号:26068096 上传时间:2023-06-17 格式:DOCX 页数:21 大小:77.03KB
下载 相关 举报
数据结构文章编辑程序的设计Word版.docx_第1页
第1页 / 共21页
数据结构文章编辑程序的设计Word版.docx_第2页
第2页 / 共21页
数据结构文章编辑程序的设计Word版.docx_第3页
第3页 / 共21页
数据结构文章编辑程序的设计Word版.docx_第4页
第4页 / 共21页
数据结构文章编辑程序的设计Word版.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

数据结构文章编辑程序的设计Word版.docx

《数据结构文章编辑程序的设计Word版.docx》由会员分享,可在线阅读,更多相关《数据结构文章编辑程序的设计Word版.docx(21页珍藏版)》请在冰豆网上搜索。

数据结构文章编辑程序的设计Word版.docx

数据结构文章编辑程序的设计Word版

 

数据结构(c语言版)

课程设计报告

文章编辑程序的设计

 

学院:

信息科学技术学院

班级:

信息工程09级1班

学号:

200941843107

姓名:

董升

指导教师:

何儒云

完成日期:

2010年12月

 

 

 

1.需求分析——文章编辑

题目:

22题,文章编辑。

功能:

从键盘输入一页文字,静态存储在一个文件中

要求:

(1)分别统计出其中英文字母数和空格数及整篇文章总字数;

(2)统计某一字符串在文章中出现的次数,并输出该次数;

(3)删除某一子串,并将后面的字符前移。

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

  输入数据的形式和范围:

可以输入大写、小写的英文字母、任何数字及标点符号。

输出形式:

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

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

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

 

2.程序设计

结构体的设计:

typedefstructessay

{

char*line;//动态分配的字符数组

structessay*next;//结构体指针

}ESS;

//创建结构体,行与行之间用链表的形式

函数的设计:

#include

#include

#include

voidcreate(ESS*&h)//创造链表

{

charm[1000];

ESS*p;

p=(ESS*)malloc(sizeof(ESS));

h=p;

inti,k;

FILE*fp;

fp=fopen("d:

\\text.txt","w");//所输入的文本将保存在d盘的rr文本文档中

printf("输入文章,用Ctrl+B结束输入:

\n");//按Ctrl+B(^B)将结束输入

while

(1)

{

gets(m);//输入字符串

if(strlen(m)>1000)

{

printf("超过1000字符\n");

break;

}

if(m[0]==2)break;//如果发现输入^B,则退出输入

p=p->next=(ESS*)malloc(sizeof(ESS));

p->line=(char*)malloc(sizeof(char)*strlen(m+1));//为结点分配空间

strcpy(p->line,m);//将字符串m,复制到p所指向的字符串中

for(i=0;i<(k=strlen(m))&&(p->line[i]!

=2);i++)

fwrite(&p->line[i],sizeof(char),1,fp);//写入文本文档中

fputc('\n',fp);

if(m[strlen(m)-1]==2)//除去最后一个控制符^B

{

p->line[strlen(m)-1]='\0';

break;

}

}

p->next=NULL;/*最后的一个指针为空*/

h=h->next;//将下一个节点赋值到头结点中

}

intCount(ESS*h)//统计数字

{

ESS*p=h;

intco=0;

inti;

intLenght;

do

{

Lenght=strlen(p->line);/*计算当前line里的数据元素的个数*/

for(i=0;i

if(p->line[i]>=48&&p->line[i]<=57)//用ASCII码来进行比较,48与57之间是数字

co++;

}

while((p=p->next)!

=NULL);//遍历链表不为空

returnco;

}

intLetter(ESS*h)//统计字母

{

ESS*p=h;

intco=0;

intLenght;

do

{

Lenght=strlen(p->line);/*计算当前line里的数据元素的个数*/

for(inti=0;i

if((p->line[i]>='a'&&p->line[i]<='z')||(p->line[i]>='A'&&p->line[i]<='Z'))/*计算字母数*/

co++;

}

while((p=p->next)!

=NULL);//遍历链表不为空

returnco;/*返回文章的字母总数*/

}

intchinese(ESS*h)//统计符号

{

ESS*p=h;

intco=0;

intLenght;

do

{

Lenght=strlen(p->line);/*计算当前line里的数据元素的个数*/

for(inti=0;i

if((p->line[i]>=1&&p->line[i]<=254))/*计算字符数字以及符号*/

co++;

}

while((p=p->next)!

=NULL);//遍历链表不为空

returnco;/*返回*/

}

intSpace(ESS*h)//统计空格

{

ESS*p=h;

intco=0;

intLenght;

do

{

Lenght=strlen(p->line);//计算当前line里的数据元素的个数

for(inti=0;i

if(p->line[i]==32)co++;//计算空格数,空格ASCII码为32

}

while((p=p->next)!

=NULL);//遍历链表

returnco;

}

intCountAll(ESS*h)//统计文章字数

{

ESS*p=h;//保存链表的首地址

intco=0;

do//计算总字符数

{

co+=strlen(p->line);

}

while((p=p->next)!

=NULL);//遍历链表

returnco;

}

intFind(ESS*h,char*s)//统计s出现次数

{

ESS*p=h;

intco=0;

intlen1=0;/*保存当前行的总字符数*/

intlen2=strlen(s);/*待统计字符串的长度*/

inti,j,q;

do

{

len1=strlen(p->line);/*当前行的字符数*/

for(i=0;i

{

if(p->line[i]==s[0])

{

q=0;

for(j=0;j

if(p->line[j+i]==s[j])q++;

if(q==len2){co++;i=i+q-1;}

}

}

}

while((p=p->next)!

=NULL);/*遍历链表*/

returnco;

}

voiddelstring(char*s,char*str)

/**s为输入的字符串,*str为将要删除的字符*/

{

char*p=strstr(s,str);/*从字符串s中寻找str第一次出现的位置*/

charm[80];

intlen=strlen(s);

inti=len-strlen(p);//比较两串字符串之间的字符个数

intj=i+strlen(str);

intco=0;

for(intk=0;k

for(intn=j;n

m[co]='\0';

strcpy(s,m);/*返回新的字符串*/

}

voidDelString(ESS*h,char*str)

{

ESS*p=h;

do

{

if(strstr(p->line,str)!

=NULL)

delstring(p->line,str);//调用删除每个字符串,只删一次。

}

while((p=p->next)!

=NULL);

}

voidOut(ESS*&h)//

{

ESS*p=h;

do

{

printf("%s\n",p->line);//显示字符串

}

while((p=p->next)!

=NULL);/*遍历链表*/

}

voiddisplay()

{

printf("\n");

printf("\n");

printf("***********************************************\n");

printf("********************统计数字******************\n");

printf("********************统计字母******************\n");

printf("********************统计空格******************\n");

printf("********************统计文章总字数************\n");

printf("********************统计重复字符串************\n");

printf("********************统计重复出现字符串********\n");

printf("********************删除功能******************\n");

printf("***********************************************\n");

printf("\n");

}//构造一个良好的界面良好的界面

主函数的设计:

intmain()

{

ESS*h;

create(h);

display();

Out(h);

printf("\n");

printf("数字个数:

%d\n",Count(h));

printf("全部字母数:

%d\n",Letter(h));

printf("中文字数:

%d\n",(CountAll(h)-chinese(h))/2);

printf("空格个数:

%d\n",Space(h));

printf("文章总字数(含空格):

%d\n",CountAll(h)-(CountAll(h)-chinese(h))/2);

printf("文章总字数(不含空格):

%d\n",CountAll(h)-Space(h)-(CountAll(h)-chinese(h))/2);

chars1[20],s2[20];

printf("\n");

printf("请输入要统计的字符串:

");

scanf("%s",s1);

printf("%s出现的次数为:

%d\n",s1,Find(h,s1));

printf("\n");

printf("请输入要删除的某一字符串:

");

scanf("%s",s2);

DelString(h,s2);

printf("删除%s后的文章为:

\n",s2);

Out(h);//调用删除函数后的显示

Return0;

}

 

 

3.测试分析

输入:

输出及其他操作:

4.用户说明

根据界面提示即可完成所有操作。

5.经验和体会

在这次课程设计中,我有将书本重新过了一边,不但巩固了以前就会的知识,还弥补了从前的空缺,学到了许多从前没有注意的知识。

在实践的过程中,遇到了许多问题,我查阅了许多资料,请教了一些朋友对于编程中应注意的问题又有了新的认识,我知道了许多书上没有的经验和教训。

通过进行这次课程设计,我对数据结构又有了更加深刻的认识,使我以后学习更加轻松,对于编程更又信心!

6.附录——程序完整原代码

#include

#include

#include

typedefstructessay

{

char*line;//动态分配的字符数组

structessay*next;//结构体指针

}ESS;

//创建结构体,行与行之间用链表的形式

 

voidcreate(ESS*&h)//创造链表

{

charm[1000];

ESS*p;

p=(ESS*)malloc(sizeof(ESS));

h=p;

inti,k;

FILE*fp;

fp=fopen("d:

\\text.txt","w");//所输入的文本将保存在d盘的rr文本文档中

printf("输入文章,用Ctrl+B结束输入:

\n");//按Ctrl+B(^B)将结束输入

while

(1)

{

gets(m);//输入字符串

if(strlen(m)>1000)

{

printf("超过1000字符\n");

break;

}

if(m[0]==2)break;//如果发现输入^B,则退出输入

p=p->next=(ESS*)malloc(sizeof(ESS));

p->line=(char*)malloc(sizeof(char)*strlen(m+1));//为结点分配空间

strcpy(p->line,m);//将字符串m,复制到p所指向的字符串中

for(i=0;i<(k=strlen(m))&&(p->line[i]!

=2);i++)

fwrite(&p->line[i],sizeof(char),1,fp);//写入文本文档中

fputc('\n',fp);

if(m[strlen(m)-1]==2)//除去最后一个控制符^B

{

p->line[strlen(m)-1]='\0';

break;

}

}

p->next=NULL;/*最后的一个指针为空*/

h=h->next;//将下一个节点赋值到头结点中

}

intCount(ESS*h)//统计数字

{

ESS*p=h;

intco=0;

inti;

intLenght;

do

{

Lenght=strlen(p->line);/*计算当前line里的数据元素的个数*/

for(i=0;i

if(p->line[i]>=48&&p->line[i]<=57)//用ASCII码来进行比较,48与57之间是数字

co++;

}

while((p=p->next)!

=NULL);//遍历链表不为空

returnco;

}

 

intLetter(ESS*h)//统计字母

{

ESS*p=h;

intco=0;

intLenght;

do

{

Lenght=strlen(p->line);/*计算当前line里的数据元素的个数*/

for(inti=0;i

if((p->line[i]>='a'&&p->line[i]<='z')||(p->line[i]>='A'&&p->line[i]<='Z'))/*计算字母数*/

co++;

}

while((p=p->next)!

=NULL);//遍历链表不为空

returnco;/*返回文章的字母总数*/

}

intchinese(ESS*h)//统计符号

{

ESS*p=h;

intco=0;

intLenght;

do

{

Lenght=strlen(p->line);/*计算当前line里的数据元素的个数*/

for(inti=0;i

if((p->line[i]>=1&&p->line[i]<=254))/*计算字符数字以及符号*/

co++;

}

while((p=p->next)!

=NULL);//遍历链表不为空

returnco;/*返回*/

}

 

intSpace(ESS*h)//统计空格

{

ESS*p=h;

intco=0;

intLenght;

do

{

Lenght=strlen(p->line);//计算当前line里的数据元素的个数

for(inti=0;i

if(p->line[i]==32)co++;//计算空格数,空格ASCII码为32

}

while((p=p->next)!

=NULL);//遍历链表

returnco;

}

intCountAll(ESS*h)//统计文章字数

{

ESS*p=h;//保存链表的首地址

intco=0;

do//计算总字符数

{

co+=strlen(p->line);

}

while((p=p->next)!

=NULL);//遍历链表

returnco;

}

 

intFind(ESS*h,char*s)//统计s出现次数

{

ESS*p=h;

intco=0;

intlen1=0;/*保存当前行的总字符数*/

intlen2=strlen(s);/*待统计字符串的长度*/

inti,j,q;

do

{

len1=strlen(p->line);/*当前行的字符数*/

for(i=0;i

{

if(p->line[i]==s[0])

{

q=0;

for(j=0;j

if(p->line[j+i]==s[j])q++;

if(q==len2){co++;i=i+q-1;}

}

}

}

while((p=p->next)!

=NULL);/*遍历链表*/

returnco;

}

voiddelstring(char*s,char*str)

/**s为输入的字符串,*str为将要删除的字符*/

{

char*p=strstr(s,str);/*从字符串s中寻找str第一次出现的位置*/

charm[80];

intlen=strlen(s);

inti=len-strlen(p);//比较两串字符串之间的字符个数

intj=i+strlen(str);

intco=0;

for(intk=0;k

for(intn=j;n

m[co]='\0';

strcpy(s,m);/*返回新的字符串*/

}

voidDelString(ESS*h,char*str)

{

ESS*p=h;

do

{

if(strstr(p->line,str)!

=NULL)

delstring(p->line,str);//调用删除每个字符串,只删一次。

}

while((p=p->next)!

=NULL);

}

voidOut(ESS*&h)//

{

ESS*p=h;

do

{

printf("%s\n",p->line);//显示字符串

}

while((p=p->next)!

=NULL);/*遍历链表*/

}

 

voiddisplay()

{

printf("\n");

printf("\n");

printf("***********************************************\n");

printf("********************统计数字******************\n");

printf("********************统计字母******************\n");

printf("********************统计空格******************\n");

printf("********************统计文章总字数************\n");

printf("********************统计重复字符串************\n");

printf("********************统计重复出现字符串********\n");

printf("********************删除功能******************\n");

printf("***********************************************\n");

printf("\n");

}//构造一个良好的界面良好的界面

voidmain()

{

ESS*h;

create(h);

display();

Out(h);

printf("\n");

printf("数字个数:

%d\n",Count(h));

printf("全部字母数:

%d\n",Letter(h));

printf("中文字数:

%d\n",(CountAll(h)-chinese(h))/2);

printf("空格个数:

%d\n",Space(h));

printf("文章总字数(含空格):

%d\n",CountAll(h)-(CountAll(h)-chinese(h))/2);

printf("文章总字数(不含空格):

%d\n",CountAll(h)-Space(h)-(CountAll(h)-chinese(h))/2);

chars1[20],s2[20];

printf("\n");

printf("请输入要统计的字符串:

");

scanf("%s",s1);

printf("%s出现的次数为:

%d\n",s1,Find(h,s1));

printf("\n");

 

printf("请输入要删除的某一字符串:

");

sca

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

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1