简单的行编辑器课程设计.docx
《简单的行编辑器课程设计.docx》由会员分享,可在线阅读,更多相关《简单的行编辑器课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
简单的行编辑器课程设计
程序设计课程设计报告
二00八年七月一号
1……………………………………………设计目的
2…………………………………………设计题目和要求
3…………………………………………总体设计
4…………………………………………详细设计
5…………………………………………源程序清单和执行结果
6…………………………………………总结
1设计目的
设计一个简单的行编辑器,了解行编辑器的应用
2设计题目和要求
题目:
简单的行编辑器
要求:
1)设计一个简单的行编辑器,每行以回车结束
2)数据以文件形式储存
3)编辑器具有查找修改删除数据的功能
3总体设计
简单的行编辑器
删除一行删除一行
显示一行显示一行
文件存盘文件存盘
装入文件装入文件
退出
4详细设计
1)结构体的应用
structline{
chartext[81];
intnum;/*行号*/
structline*next;/*指向下一个输入项目的指针*/
structline*prior;/*指向前一个项目的指针*/
};
structline*start;/*指向表中第一个项目的指针*/
structline*last;/*指向表中作后一个项目的指针*/
structline*find(int),*dls_store(structline*);
注:
在结构体中分别声明项目指针及项目中的指针变量
2)函数声明
voidpatchup(int,int),delete_text(),list(),save(char*),load(char*);
menu_select();
enter(intlinenum);
注:
在结构体外分别对输入、删除、显示等函数进行声明
3)主函数和switch语句
voidmain(intargc,char*argv[])
{
chars[80],choice,fname[80];
//structline*info;
intlinenum=1;
start=NULL;
last=NULL;
if(argc==2)load(argv[1]);/*装入命令行上的文件*/
do{
choice=menu_select();
switch(choice)
{
case1:
printf("\t行号:
");
gets(s);
linenum=atoi(s);
enter(linenum);
break;
case2:
delete_text();
break;
case3:
list();
break;
case4:
printf("\t文件名:
");
gets(fname);
save(fname);
break;
case5:
printf("\t文件名:
");
gets(fname);
load(fname);
break;
case6:
exit(0);
}
}while
(1);
}
注:
通过主函数分别对相应函数进行调用,利用switch选择语句来执行语句
4)菜单函数
menu_select()
{
chars[80];
intc;
printf("\t\t1.输入\n");
printf("\t\t2.删除一行\n");
printf("\t\t3.显示一行\n");
printf("\t\t4.文件存盘\n");
printf("\t\t5.装入文件\n");
printf("\t\t6.退出\n");
do
{
printf("\n\n\t\t请按数字选择:
");
gets(s);
c=atoi(s);
}while(c<0||c>6);
return(c);
}
注:
定义菜单显示内容,根据菜单要求运用程序
5源程序和执行结果
源程序:
#include
#include"stdio.h"
#include"stdlib.h"
structline{
chartext[81];
intnum;/*行号*/
structline*next;/*指向下一个输入项目的指针*/
structline*prior;/*指向前一个项目的指针*/
};
structline*start;/*指向表中第一个项目的指针*/
structline*last;/*指向表中作后一个项目的指针*/
structline*find(int),*dls_store(structline*);
voidpatchup(int,int),delete_text(),list(),save(char*),load(char*);
menu_select();
enter(intlinenum);
voidmain(intargc,char*argv[])
{
chars[80],choice,fname[80];
//structline*info;
intlinenum=1;
start=NULL;
last=NULL;
if(argc==2)load(argv[1]);/*装入命令行上的文件*/
do{
choice=menu_select();
switch(choice)
{
case1:
printf("\t行号:
");
gets(s);
linenum=atoi(s);
enter(linenum);
break;
case2:
delete_text();
break;
case3:
list();
break;
case4:
printf("\t文件名:
");
gets(fname);
save(fname);
break;
case5:
printf("\t文件名:
");
gets(fname);
load(fname);
break;
case6:
exit(0);
}
}while
(1);
}
/*显示菜单,供用户选择*/
menu_select()
{
chars[80];
intc;
printf("\t\t1.输入\n");
printf("\t\t2.删除一行\n");
printf("\t\t3.显示一行\n");
printf("\t\t4.文件存盘\n");
printf("\t\t5.装入文件\n");
printf("\t\t6.退出\n");
do
{
printf("\n\n\t\t请按数字选择:
");
gets(s);
c=atoi(s);
}while(c<0||c>6);
return(c);
}
/*将文本插在指定行端部*/
enter(intlinenum)
{
structline*info;
//chart[81];
for(;;)
{
/**/
info=(structline*)malloc(sizeof(structline));
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=dls_store(info);
}
elsebreak;
linenum++;
}
return(linenum);
}
/*当文本内容插在文件中间时其下面的内容的行号必须增加1,而*/
/*删除时,被删除的文本后面的行号必须减1*/
voidpatchup(intn,intincr)
{
structline*i;
i=find(n);
while(i){
i->num=i->num+incr;
i=i->next;
}
}
/*按行号排序后插入*/
structline*dls_store(structline*i)
{
structline*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;
returnstart;
}
i->next=p;
i->prior=NULL;
p->prior=i;
return(i);
}
}
old->next=i;
i->next=NULL;
i->prior=old;
last=i;
returnstart;
}
/*删除一行*/
voiddelete_text()
{
structline*info;
chars[80];
intlinenum;
printf("\t行号:
");
gets(s);
linenum=atoi(s);
info=find(linenum);
if(info)
{
if(start==info){
start=info->next;
if(start)start->prior=NULL;
elselast=NULL;
}
else{
info->prior->next=info->next;
if(info!
=last)
info->next->prior=info->prior;
elselast=info->prior;
}
free(info);
patchup(linenum+1,-1);
}
}
/*查找一行文本*/
structline*find(intlinenum)
{
structline*info;
info=start;
while(info){
if(linenum==info->num)return(info);
info=info->next;
}
return(NULL);
}
/*显示文本*/
voidlist()
{
structline*info;
info=start;
while(info){
printf("%d:
%s\n",info->num,info->text);
info=info->next;
}
printf("\n\n");
}
/*存文件*/
voidsave(char*fname)
{
structline*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('\r',fp);
putc('\n',fp);
info=info->next;
}
fclose(fp);
}
/*装入文件*/
voidload(char*fname)
{
structline*info,*temp;
char*p;
FILE*fp;
//intt,size,inct;
intsize,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(structline);
start=(structline*)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'*/
*p='\0';
info->num=inct++;
info->next=(structline*)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);
}
执行结果:
6总结
我们所做的每一道程序设计题基本涵盖了我们一学年的课程知识,而我侧有些力不从心,很多地方生疏不知,大部分程序借鉴他人,这一点我还需改进,不过通过此次课程设计,我对程序设计这门课程又有了新的理解。
从这次设计中,我更深刻的感受到了基础知识的重要性,我们应该更重视一下各知识间的连贯应用,和整合运用,单一知识点是无法编程一道好的程序的。