文本编辑器课程设计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->numnum)

{

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

课程设计总结

通过本次课程设计,我学到了很多:增强了查阅相关参考资料的能力;独立分析解决问题的能力;创新精神;自己的上机动手的能力;自己对课程设计的理解,得到很多启示,知道了以后要加强哪一方面,还有哪一方面有用,课程设计为我们提供了一个即动手又动脑、独立实践的机会,将课本上的知识理论和实际有机

的结合起来,锻炼了我们的分析解决实际问题的能力。提高离我们适应实际,实践编程的能力。

相关文档
最新文档