文本编辑器课程设计2
课程设计
课程设计名称:文本编译器
专业班级:
学生姓名:
学号:
指导教师:
课程设计时间:6月23日
专业数据结构课程设计任务书
学生姓名专业班级学号
题目文本编辑器
课题性质工程设计课题来源自拟课题指导教师同组姓名无
主要内容
输入一页文字,程序可以统计出文字、数字、空格的个数。
静态存储一页文章,每行最多不超过80个字符,共N行;要求(1)分别统计出其中英文字母数和空格数及整篇文章总字数;(2)统计某一字符串在文章中出现的次数,并输出该次数;(3)删除某一子串,并将后面的字符前移。
存储结构使用线性表,分别用几个子函数实现相应的功能;
输入数据的形式和范围:可以输入大写、小写的英文字母、任何数字及标点符号。
输出形式:(1)分行输出用户输入的各行字符;(2)分4行输出"全部字母数"、"数字个数"、"空格个数"、"文章总字数"(3)输出删除某一字符串后的文章;
任务要求1.研究文本编辑器的数据存储方式
2.实现文本编辑器的主要算法
3.分析算法的运行效率
4.具有良好的运行界面
5.算法具有良好的健壮性
6.按要求撰写课程设计报告和设计总结。
参考文献
1.《数据结构(C语言版)》,严蔚敏、吴伟民,清华大学出版社,1997. 2.《Visual C++实用教程(第一版)》,张荣梅、梁晓林,冶金工业出版社,2004.
审查意见指导教师签字:
教研室主任签字:年月日
1 需求分析
输入一页文字,程序实现文字、数字、空格的统计;可以删除一行信息;查
找定位单词;定行位置插入;文件存盘;装入文件;并能显示输入的全部等功能。
2 概要设计
3 运行环境(软、硬件环境)
1) 硬件:PC 机
2) 操作系统:Windows 2000/XP/2003 3) 编译环境:Visual C++6.0
main
输
入信息
删
除一行信息
单词统计
查找定位单词
定行位置插入
文件存盘
装入文件
显示删除或插入后的信息
4 开发工具和编程语言
开发工具:VISCALL c++6.0;
编程语言:C语言。
5 详细设计
#include
#include
#include
#include
typedef struct line
{
char text[81];
int num;
struct line *next;
struct line *prior;
}txtLine;
txtLine *start;
txtLine *last;
txtLine *find(int linenum)
{
txtLine *info;
info=start;
while (info)
{
if (linenum==info->num)
{
return(info);
}
info=info->next;
}
return(NULL);
}
void patchup(int n,int incr)
{
txtLine *i;
i=find(n);
while(i)
{
i->num=i->num+incr;
i=i->next;
}
}
txtLine *insert_Line(txtLine *i) {
txtLine *old,*p;
if (last==NULL)
{
i->next=NULL;
i->prior=NULL;
last=i;
return(i);
}
p=start;
old=NULL;
while(p)
{
if (p->num
{
old=p;
p=p->next;
}
else
{
if (p->prior)
{
p->prior->next=i;
i->next=p;
p->prior=i;
return start;
}
i->next=p;
i->prior=NULL;
p->prior=i;
return(i);
}
}
old->next=i;
i->next=NULL;
i->prior=old;
last=i;
return start;
}
int enter(int linenum)
{
txtLine *info;
for (;;)
{
info=(txtLine *)malloc(sizeof(txtLine));
if (!info)
{
printf("\t!内存不足!\n");
return(NULL);
}
printf("%d:",linenum);
gets(info->text);
info->num=linenum;
if (*info->text)
{
if (find(linenum))
{
patchup(linenum,1);
}
if (*info->text)
{
start=insert_Line(info);
}
}
else
{
break;
}
linenum++;
}
return(linenum);
}
void delete_text()
{
txtLine *info;
char s[80];
int linenum;
printf("\t行号:");
gets(s);
linenum=atoi(s);
info=find(linenum);
if (info)
{
if (start==info)
{
start=info->next;
if (start)
{
start->prior=NULL;
}
else
{
last=NULL;
}
}
else
{
info->prior->next=info->next;
if (info!=last)
{
info->next->prior=info->prior;
}
else
{
last=info->prior;
}
}
free(info);
patchup(linenum+1,-1);
}
}
void list()
{
txtLine *info;
info=start;
while (info)
{
printf("%d:%s\n",info->num,info->text);
info=info->next;
}
printf("\n\n");
}
void wordnum()
{
line *p;
char keyword[80];
printf("请输入你要统计的单词:");
gets(keyword);
char *key=keyword,*q,*r;
int len=strlen(key),i=0;
p=start;
do
{
q=p->text;
q--;
do
{
if (q=strstr(++q,key))
{
r=q;
if
(!(((*r-1)>='a'&&*(r-1)<='z')||(*(r-1)>='A'&&*(r-1)<='Z')||((*(r+len)>='a'&&*(r+len)<='z')||(*(r+len )>='A'&&*(r+len)<='Z'))))
{
i++;
}
}
} while (q!=NULL);
p=p->next;
} while (p);
printf("你输入的单词在本文中出现的次数为:%d\n",i);
}
void wordfind()
{
txtLine *p;
char keyword[80];
printf("请输入你要查找的单词:");
gets(keyword);
char *key=keyword,*q,*r;
int len=strlen(key),i;
p=start;
do
{
q=p->text;
q--;
do
{
i=1;
if (q=strstr(++q,key))
{
r=q;
if
(!(((*r-1)>='a'&&*(r-1)<='z')||(*(r-1)>='A'&&*(r-1)<='Z')||((*(r+len)>='a'&&*(r+len)<='z')||(*(r+len )>='A'&&*(r+len)<='Z'))))
{
for (r=p->text;r!=q;r++)
{
if (!(*r>='a'&&*r<='z'||*r>='A'&&*r<='Z'))
{
i++;
}
}
printf("你查找的单词在第%d行第%d个\n",p->num,i);
printf("继续下一个查找输入'y'回车将停止查找:");
char s;
fflush(stdin);
scanf("%c",&s);
switch (s)
{
case 'y':
case 'Y':
continue;
default:
printf("\n查找已停止!\n");
return;
}
}
}
}while (q!=NULL);
p=p->next;
}while (p);
printf("查找完毕!");
}
void save(char *fname)
{
txtLine *info;
char *p;
FILE *fp;
if ((fp=fopen("text.txt","w"))==NULL)
{
printf("\t文件打不开!\n");
exit(0);
}
printf("\t正在存入文件:\n");
info=start;
while(info)
{
p=info->text;
while(*p)
{
putc(*p++,fp);
}
putc('\n',fp);
info=info->next;
}
fclose(fp);
}
void load(char *fname)
{
txtLine *info,*temp;
char *p;
FILE *fp;
int size,inct;
if ((fp=fopen("text.txt","r"))==NULL) {
printf("\t文件打不开!\n");
exit(0);
}
while(start)
{
temp=start;
start=start->next;
free(temp);
}
printf("\n\t正在装入文件!\n");
size=sizeof(txtLine);
start=(txtLine *)malloc(size);
if (!start)
{
printf("\n\t内存已经用完!");
return;
}
info=start;
p=info->text;
inct=1;
while ((*p=getc(fp))!=EOF)
{
p++;
while ((*p=getc(fp))!='\n')
{
p++;
}
//getc(fp); //丢掉'\n'
info->num=inct++;
info->next=(txtLine *)malloc(size);
if (!info->next)
{
printf("\n\t内存已经用完!");
return;
}
info->prior=temp;
temp=info;
info=info->next;
p=info->text;
}
temp->next=NULL;
last=temp;
free(info);
start->prior=NULL;
fclose(fp);
}
int menu_select()
{
char s[80];
int c;
printf("\t\t1.输入\n");
printf("\t\t2.删除一行\n");
printf("\t\t3.显示全部\n");
printf("\t\t4.单词统计\n");
printf("\t\t5.查找定位单词\n");
printf("\t\t6.定行位置插入\n");
printf("\t\t7.文件存盘\n");
printf("\t\t8.装入文件\n");
printf("\t\t9.退出\n");
do
{
printf("\n\n\t请按数字选择:");
gets(s);
c=atoi(s);
} while (c<1||c>9);
return(c);
}
void main()
{
char s[80],choice,fname[80];
int linenum=1;
last=NULL;
do
{
choice=menu_select();
switch (choice)
{
case 1:
printf("\t行号:");
gets(s);
linenum=atoi(s);
enter(linenum);
break;
case 2:
delete_text();
list();
break;
case 3:
list();
break;
case 4:
wordnum();
printf("回车返回主菜单!");
getchar();
break;
case 5:
wordfind();
printf("回车返回主菜单!");
getchar();
break;
case 6:
printf("\t插入的行号:");
gets(s);
linenum=atoi(s);
enter(linenum);
list();
break;
case 7:
printf("\t文件名:");
gets(fname);
save(fname);
break;
case 8:
printf("\t文件名:");
gets(fname);
load(fname);
break;
case 9:
exit(0);
}
} while (1);
}
6 调试分析
在调试过程中出现的一些问题:
1、输入语句中没有加取地址符号&
2、误把取地址运算符&当作逻辑与&&
3、误把赋值=当恒等==
4、条件语句(if)后误加分号
5、循环语句中改变了循环变量
6、作为输出结果的变量没有赋初值
7 测试结果
8 参考文献
[1] 边肇祺,模式识别(第二版),北京:清华大学出版社,1988,25~35
[2] 李永忠,几种小波变换的图像处理技术,西北民族学院学报(自然科学版),2001.6,22(3),15~18
[3]谭浩强,C程序设计题解与上机指导(第3版),清华大学出版社,2005.7.
[4][美]Harvey M. Deitel,Paul J. Deitel 著,聂雪军,贺军译,C程序设计经典教程(第4版),清华大学出版社,2006。3
课程设计总结
通过本次课程设计,我学到了很多:增强了查阅相关参考资料的能力;独立分析解决问题的能力;创新精神;自己的上机动手的能力;自己对课程设计的理解,得到很多启示,知道了以后要加强哪一方面,还有哪一方面有用,课程设计为我们提供了一个即动手又动脑、独立实践的机会,将课本上的知识理论和实际有机
的结合起来,锻炼了我们的分析解决实际问题的能力。提高离我们适应实际,实践编程的能力。