数据结构文章编辑程序的设计Word版.docx
- 文档编号:26068096
- 上传时间:2023-06-17
- 格式:DOCX
- 页数:21
- 大小:77.03KB
数据结构文章编辑程序的设计Word版.docx
《数据结构文章编辑程序的设计Word版.docx》由会员分享,可在线阅读,更多相关《数据结构文章编辑程序的设计Word版.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构文章编辑程序的设计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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 文章 编辑 程序 设计 Word