C++课程设计简单行编辑器.docx
- 文档编号:15263347
- 上传时间:2023-07-03
- 格式:DOCX
- 页数:28
- 大小:129.86KB
C++课程设计简单行编辑器.docx
《C++课程设计简单行编辑器.docx》由会员分享,可在线阅读,更多相关《C++课程设计简单行编辑器.docx(28页珍藏版)》请在冰点文库上搜索。
C++课程设计简单行编辑器
简单的行编辑器
第一章课程设计的目的和要求
此章节详细介绍了课程设计的目的和要求。
1.1课程设计的目的
课程设计的目的是通过实践环节的训练,使学生进一步加深对C语言知识的综合理解,提高C语言应用技能,并结合专业特点培养学生计算机程序的应用能力。
结合计算机科学专业的特点是培养学生阅读本专业相关领域C语言程序的能力,分析并掌握程序的设计思想和方法。
通过课程设计,培养学生查阅C语言相关资料能力、分析和阅读程序的能力,应用C语言基本知识设计小型应用程序的能力。
其中,需要掌握C语言中的结构体,指针,函数(系统函数,自定义函数),文件操作等知识,通过对系统的分析和设计,进一步巩固C语言的学习,以提高对开发环境的进一步认识和综合编程能力。
在学习课程设计之前,要掌握好程序设计的基本概念、方法和思维方式。
开发程序的目的是为了解决问题,而解决问题首先需要找出合适的解决方案,然后用合适的语言把方案描述出来。
显然,该过程的关键是分析问题并找出解决方案,而不是描述方案。
因此,程序设计的首要目标,是培养解决问题的基本思维方式,其次才是语言知识。
1.2课程设计的要求
程序设计报告应该能够反映学生完成课程设计题目的全部情况,包括对课程设计题目要求的分析、应用程序的设计、程序的测试过程以及程序的运行情况等,因此,编写课程设计报告是课程设计一个不容忽视的重要环节。
一个高质量的报告需要学生掌握以下几点:
1)运用有关课程的基础理论和技能解决实际问题;
2)能用文字、图形和现代设计方法系统地、正确地表达设计成果;
3)分析应用的功能构成、数据对象及其关联,实现系统的类的设计;
4)对所设计应用进行调试。
第二章课程设计任务内容
此章节主要从课程设计的要求,功能需求两方面讲述课程设计的有关内容。
2.1课程设计要求
1)设置一个简单的行编辑器,每行以回车结束;
2)数据以文件形式存储;
3)编辑器具有查找、替换、修改数据的功能。
2.2功能需求
该程序具有行的查找、替换、删除的功能。
行编辑器是文本编辑器的一种,针对行进行编辑。
现在看来当然非常地老式,这种编辑器起源于操作员还使用电传打字机的年代,也就是一个打印机连着键盘,因为没有显示屏,也就无法在文档中移动光标。
行编辑器只能从事最基本的文本输入与输出。
输入、编辑、文档显示并不能同步地进行。
一般而言,用户无法直接输入文本,而只能在文本终端上通过简要的命令,对已区”的做法显然不是最恰当的。
较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区。
允许用户输入出差错,并在发现有误时可以及时更正。
例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符"#",以表示有文档进行添加或编写。
命令和文本,以及编辑器的相应输出,会根据他们的输入顺序,从底部开始逐一显示。
虽然命令一般会显示被修改的行,但如果要将行连同文档中的上下文一起显示,则需要另外单独的命令。
现在常见的编辑器,都是通过移动光标,来选取要编辑的文本段落,与此不同的是,行编辑器只能对“当前行”进行编辑。
一般也可在行内进行上下文匹配,或者选择特定行,以决定哪部分文档将被编辑或显示。
当然,这些编辑每次都只能针对一行。
一个简单的行编辑程序的功能是:
接受用户从终端输入的程序或数据,并存入用户的数据区。
由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据前一个字符无效;如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符"@",以表示当前行中的字符均无效。
2.3功能模块图
根据上面的功能需求分析,,可以将这个系统的设计分为如下六大模块:
输入,替换,删除,查找,修改,保存(见图2-1)。
图2-1功能模块图
第三章详细设计说明
此章节通过程序设计思路,函数说明两大章节详细的描述了程序的函数功能说明,参数说明等。
3.1程序设计思路
课程设计要求设计一个简单的行编辑器,该程序具有行的查找、替换、删除等功能,设计这个程序是为了对行的各种功能进行了解。
定义一个结构体来包含对行编辑器的一般操作,如输入函数printf(),删除需要一个删除函数delete_text(),保存一个文件需要使用save()等,主函数模块中需要运用switch()多分支选择语句和dowhile()循环语句来调用上述所需要的函数。
3.2函数说明
3.2.1main()主函数
主函数是程序入口,采用模块化设计。
其主要功能有:
1)使用一个主菜单来显示编辑器的各项操作;2)运用一个多选择分支switch()语句来实现要进行的操作;3)菜单函数通过dowhile()循环中的get来输出,内嵌套switch语句来总体实现主函数的所有功能;其中用到了字符串数组argv,用来存放指向字符串参数的指针数组,即每一个元素指向一个参数,整数argc,用来统计你运行程序时送给main函数的命令行参数的个数,代码中包括六个case。
程序如下(见图3-1):
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:
exi4t(0);
}
}while
(1);
图3-1main主函数
3.2.2menu_select菜单选择函数
这是一个菜单显示界面,显示:
输入,删除一行,显示一行等,之后输入数字选择所需要的功能。
定义整型变量c,使用printf输出函数实现。
程序如下(见图3-2):
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);
图3-2menu_select菜单选择函数
3.2.3enter输入函数
此函数是将所需要的文本信息插在指定行端部,其中,使用到了内存分配函数,如果分配成功则返回指向被分配内存的指针,否则返回空指针NULL。
使用操作符sizeof,判断数据类型长度符,其作用是返回一个对象或者类型所占的内存字节数,程序中使用了if语句,printf输出函数,gets输入函数(见图3-3)。
图3-3enter输入函数
3.2.4delete_text删除函数
此函数主要实现行编辑器的删除功能,其中主要使用条件语句if…else…,输入函数gets,输出函数printf,代码中atoi的作用是把字符串转换成整型数,并多次使用指针的指向语句,比如:
info->next->prior=info->prior(见图3-4)。
图3-4delete_text删除函数
3.2.5find函数
查找函数主要用来根据用户的需要查找一行文本。
程序如下(见图3-5):
structline*info;
info=start;
while(info){
if(linenum==info->num)return(info);
info=info->next;
}
return(NULL);
图3-5find函数
3.2.6list函数
显示文本,显示用户在查找函数中选择的文本。
程序如下(见图3-6):
structline*info;
info=start;
while(info){
("%d:
%s\n",info->num,info->text);
info=info->next;
}
printf("\n\n");
图3-6list函数
3.2.7save函数
将文件储存在指定的文件夹里,以备以后查找使用。
其中,定义了字符型的指针p,使用了while循环语句,输出函数putc(见图3-7)。
图3-7save储存函数
3.2.8load函数
将文件以.txt的形式装入,如果文件打不开,则装入不成功,如果文件正在装入,结束后,按任意键退出。
定义整型变量size,inch,其中,使用if判断语句,while循环语句,printf输出函数,定义了字符型指针变量p,使用了指针的指向语句,如:
start=start->next;info->prior=temp等(见图3-8)。
图3-8load函数
3.3调试
编辑执行时,出现一个warming,错误出现在menu_select()中,丢掉了return语句,return表示中止当前函数的运行,并将操作权返回给调用者,就算不写,在函数执行完毕后也会返回操作权给调用者。
写return是一种清晰的风格,可以防止一些意外的错误。
如图所示:
图3-9调试框所显示错误
图3-10错误所在处
图3-11错误修改后
图3-12编译
图3-13执行
第四章软件使用说明
简单的行编辑器,主要包括五个内容:
第一,字符的按行录入及储存;第二,文件内容的显示;第三,文件内容的查找;第四,文件内容的替换第五,文件的修改。
开始进入初始化界面,按数字进行所需要的操作:
图4-1主画面
按数字一,任意输入行号:
图4-2输入界面
按数字二,选择所需要删除的行号:
图4-3删除界面
按数字三,显示删除后其余的行号:
图4-4显示界面
按数字四,输入某个文件命名,将该文件存盘:
图4-5存储界面
按数字五,将选定的文件装入:
图4-6装入界面
第五章课程设计心得与体会
三周的课程设计,终于结束了,这次课程设计,让我明白了很多,自己以前学的那些东西,只是皮毛,是为了应付考试才看书学习的,自己根本没有真正掌握所学的专业知识,这次的课程设计,下了很大功夫,一开始,以为课程设计很简单,在网上随便XX一个课程设计报告就可以了,可是没想到,网上找的都不能用,代码都是有错误的,只好自己编写代码,重新开始好好看书,学习C语言知识,上网查阅资料,去图书馆翻阅有关书籍,每天想的只有课程设计,因为自己基础很差,编写起来代码很困难,一开始编写出来的代码错误很多,很沮丧,很伤心,想着这次课程设计一定完蛋了,停下来休息了一天继续修改自己的程序,最终把代码修改到完善,心里终于落下了一块大石头,以为一切搞定了,却发现,还有写报告这件重头戏,每天继续奔波于机房和图书馆之间,通过老师的帮助和自己不断的努力,终于完成了报告。
看着自己的报告,又激动又害怕,第一次自己下很大心血完成的东西,让人很兴奋,却也担心自己的报告得不到老师的肯定。
这次课程设计,让我明白了,一个报告里,最重要的是编写代码以及流程图,虽然自己基础很差,不过通过这次课程设计,我的专业知识提高了很多,明白了,只有通过真正的实践,才能明白自己真正学了多少知识,自己有多少知识能拿到实际中运用,比如说编写代码时,当你把代码编译并让其运行,发现很多错误,再回头检查错误出在哪里,是很费力的一件事情,因此分析和规划代码是很重要的,最重要的是要把整体的逻辑结构写好,这样就不会出现大问题,写代码就要先找出核心的内容,用多种方法来实现核心部分,这样可以尽可能的避免发现逻辑或编译不支持的错误。
通过这次的课程设计,让我初步学会了一个课程设计的基本方法有哪些,学会了如何借鉴别人的方法和经验,如何将所有的资料整合起来并加以运用,这次报告的设计,为以后课程设计以及毕业论文打下了很好的基础。
三周当中,会因为程序的事而心烦意乱,不过,人总是在挫折中成长的,积累的失败的经验多一些,对成长有很大的帮助。
这次的报告,有很多不尽人意的地方,很感谢荀老师的帮助,报告的完善,大部分都是在老师的帮助下完成的,这次的报告,融入了自己很大的心血,我觉得我的报告很好,以后,需要更加刻苦的学习自己的专业知识,不断的提高自己的能力。
附录1参考文献
[1]谭浩强编著.C++程序设计.北京:
清华大学出版社,2005
[2]谭浩强编著.C++程序设计解题与上机指导.北京:
清华大学出版社,2005
[3]谭浩强编著.C程序设计(第二版).北京:
清华大学出版社,1999
[4]谭浩强编著.C程序设计设计解题与上机指导(第二版).北京:
清华大学出社,1999
[5]黄迪明主编C++语言程序设计基础.北京:
电子工业出版社2003.6
[6]钱能主编C++程序设计教程.北京:
清华大学出版社1999.4
[7]郑莉、董渊编着C++语言程序设计.北京:
清华大学出版社1999.12
[8]吴访升编着C++程序设计.北京:
机械工业出版社2002
[9]吴访升编着C++程序设计学习指导与上机实践.北京:
机械工业出版社出版2002
[10]孙淑霞等C/C++程序设计教程(第2版),电子工业出版社,2007.2
[11]郑莉董渊C++语言程序设计,清华大学出版社,郑莉、董渊,1999.12
[12]王正军VisualC++6.0程序设计从入门到精通北京:
人民邮电出版社2006.1
附录2程序清单
#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){
("%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;
}
i
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C+ 课程设计 简单 编辑器