简单行编辑程序——课程设计(共19页).doc
精选优质文档-倾情为你奉上简单行编辑程序题目:简单行编辑程序班级:计算机科学与技术(非师范)姓名:学号:完成日期:2010-6-251需求分析以无歧义的陈述说明程序设计的任务,强调的是程序要做什么?并明确规定:文本编辑程序是利用计算机进行文字加工的基本软件工具,实现对文本文件的插入、删除等修改操作。限制这些操作以行为单位进行的编辑程序称为行编辑程序。(1) 输入的形式和输入值的范围;无范围(2) 输出的形式;字符串(3) 程序所能达到的功能;实现以下4条基本编辑命令:(1) 行插入。格式:i<行号><回车><文本><回车>将<文本>插入活区中第<行号>行之后(2)行删除。格式:d<行号1><行号2><回车>删除活区中第<行号1>行(到第<行号2>行)。两种格式的例子是:“d10”和“d1014”(3)活区切换。格式:n<回车>将活区写入输出文件,并从输入文件中读入下一段,作为新的活区。(4)活区显示。格式:p<回车>(4) 测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果。2概要设计说明本程序中用到的所有抽象数据类型的定义、主程序的流程以及各程序模块之间的层次(调用)关系。typedef struct text char string80;/存储每一行的元素 struct text *next;/指向后一个节点的指针 struct text *pre;/指向前一个节点的指针 int num;/每一行元素的长度 int flat;/确定此行是否被删除的标志text;FILE *fp,*out;/fp是执行被打开的文件,out指向被写入的文件text *head;/链表的头指针int n=0,sum,delnum,xiugai=0,page=0;/file:/修改用来指示文件是否被修改过,如果修改过才回存盘。page用来计算显示的/file:/页数.delnum用来存储被删除的字节数,sum存储一页的总字节数3详细设计实现概要设计中定义的所有数据类型,对每个操作只需要写出伪码算法;对主程序和其他模块也都需要写出伪码算法(伪码算法达到的详细程度建议为:按照伪码算法可以在计算机键盘直接输入高级程序设计语言程序);画出函数和过程的调用关系图。cmd=getchar(); printf("n请输入命令(按E键退出):"); cmd=getchar(); switch(cmd) case 'e': case 'E': if(xiugai=1) saveall(); freemem(); if(fp) fclose(fp); if(out) fclose(out); system("cls"); return 0; case 'o': case 'O': Openfiles(); break; case 'p': case 'P': Createlist(); display(); break; case 'n': case 'N': saveanddisplay(10); break; case 'd': case 'D': del(); break; case 'i': case 'I': insert(); break; default:printf("nnn!输入错误!");4调试分析当我调试程序时发现前面的子程序调用后面的子程序竟然是错误的,明明已经定义了的子程序竟然没有定义这令我大为不解不过后来当我把被调用的程序放到前面,程序就顺利运行了。5用户使用说明说明如何使用你编写的程序,详细列出每一步的操作步骤。当你使用这个程序时,会出现一个简单的提示界面,你可以选择相应的help选项,来看操作说明。6测试结果列出你的测试结果,包括输入和输出。这里的测试数据应该完整和严格,最好多于需求分析中所列。7附录带注释的源程序。如果提交源程序软盘,可以只列出程序文件名的清单。#define NULL 0#define OK 0#include <iostream>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#include <conio.h>typedef struct text char string80;/存储每一行的元素 struct text *next;/指向后一个节点的指针 struct text *pre;/指向前一个节点的指针 int num;/每一行元素的长度 int flat;/确定此行是否被删除的标志text;FILE *fp,*out;/fp是执行被打开的文件,out指向被写入的文件text *head;/链表的头指针int n=0,sum,delnum,xiugai=0,page=0;/file:/修改用来指示文件是否被修改过,如果修改过才回存盘。page用来计算显示的/file:/页数.delnum用来存储被删除的字节数,sum存储一页的总字节数void byebye()/没有具体用处,只是写着玩的,在屏幕上显示一个bye puts("ttt* * * *"); puts("ttt* * * * * "); puts("ttt* * * * * "); puts("ttt* * * * * "); puts("ttt* * *"); puts("ttt* * * * "); puts("ttt* * * * "); puts("ttt* * * * "); puts("ttt* * *");void HELP()/帮助函数,显示一些命令的格式 printf("nt*n"); printf("t* 打开文件: o<行号><文件名><回车> *n"); printf("t* 行插入格式: i<行号><回车><文本><回车> *n"); printf("t* 行删除格式: d<行号1><空格><行号2><回车> *n"); printf("t* 活区切换格式: n<回车> *n"); printf("t* 活区显示格式: p<回车> *n"); printf("t* 注意:在执行所有命令前必须先用o命令打开文件,并 *n"); printf("t* 用p命令显示出来! *n"); printf("t*n"); system("pause"); printf("nnn"); void ABOUT()/也是写着玩的 printf("ntt*n"); printf("tt* welcome to the program *n"); printf("tt* all work and no play make jack adull boy *n"); printf("tt* enjoy your work *n"); printf("tt*n"); system("pause"); system("cls"); printf("nnn");void Createlist()/建立一个十个节点的链表,是文本中的一页 text *p1,*p2; p1=p2=(text *)malloc(sizeof(text); head=NULL; while(n<10) n=n+1; if(n=1) head=p1; else p2->next=p1; p1->pre=p2; p1->flat=0; p2=p1; p1=(text *)malloc(sizeof(text); p2->next=NULL;void freemem()/释放链表所占的内存 text *p; for(p=head;head!=NULL;) head=p->next; free(p); p=head; int Openfiles()/打开文件的函数 char name30,outname30; puts("请输入要打开的文件名:"); scanf("%s",name); if(fp=fopen(name,"r+")=NULL) printf("打不开原文件! n"); exit(0); puts("请输入要写入的文件名:"); scanf("%s",outname); if(out=fopen(outname,"w+")=NULL) printf("打不开目标文件!n"); exit(0); return 0;int display()/从文件中读入到链表中,并显示出来 int i; char conti='y' text *p; while(!feof(fp)&&(conti='y'|conti='Y') page+; printf("tt第%d页n",page); for(i=0,p=head,sum=0;(i<10)&&(!feof(fp);i+,p=p->next) fgets(p->string,sizeof(p->string),fp); puts(p->string); p->flat=1; p->num=strlen(p->string); sum=sum+p->num; puts("Continue?(Y/N):"); conti=getche(); if(feof(fp) puts("n文件已经结束!"); return 0; return 0;int saveanddisplay(int hang)/命令n执行的函数,用来将活区的内容显示并读入下一页内容 int i,endflat=0; char conti='y' text *p=NULL; page+; for(i=0,p=head;i<hang;i+,p=p->next) /file:/将活区写入文件 if(p->flat=1) fputs(p->string,out); p->flat=0; if(!feof(fp) printf("tt第%d页n",page); for(i=0,p=head,sum=0;(i<10)&&(!feof(fp);i+,p=p->next)/从文件读入活区 if(fgets(p->string,sizeof(p->string),fp) puts(p->string); p->flat=1; p->num=strlen(p->string); sum=sum+p->num; if(feof(fp) printf("文件已经结束!"); return 0;int saveall()/退出编辑函数后执行的函数,将所有的内容存盘 int i,endflat=0; char conti='y' text *p; for(i=0,p=head;i<10;i+,p=p->next) /file:/将活区写入文件 if(p->flat=1) fputs(p->string,out); p->flat=0; while(!feof(fp)/将其余的内容写入文件 fputc(fgetc(fp),out); return 0;int del()/删除d命令对应的函数,用来删minmax中的行,用结构体中的flat表示是否被删除 text *p1,*p2,*p3; int min,max,i; xiugai=1; scanf("%d %d",&min,&max); if(head=NULL) printf("nlist null!n"); return 0; p1=p2=head; for(i=0;i<min-1;i+)/*找到要删除的第一行*/ p1=p1->next; for(i=0;i<max;i+)/*找到要删除的最后一行*/ p2=p2->next; for(delnum=0;p1!=p2;p1=p1->next)/*删除中间的节点,将flat赋值0*/ p1->flat=0; delnum=delnum+p1->num; for(i=0,p3=head;i<10;i+,p3=p3->next)/显示删除后的结果 if(p3->flat=1) puts(p3->string); saveanddisplay(10);/将删除后的结果存盘并显示下一页内容(十行) xiugai=1; return 0; int insert()/插入i命令对应的函数,在i行后插入文本 int hang,i,increhang=1,number=1; text *p,*p1,*p2; xiugai=1; scanf("%d",&hang); p=p1=NULL; for(i=0,p1=head;i<hang-1;i+,p1=p1->next);/找到要插入行的前一列 p=(text *)malloc(sizeof(text);/为插入行分配空间 p->flat=1; p->next=p1->next;/从此行向下四行将插入行插入到链表中 p->pre=p1; p1->next->pre=p; p1->next=p; p->string0=getchar(); p->string0=getchar(); for(i=1;(i<80)&&(p->stringi-1!='');i+) p->stringi=getchar(); if(i+1=80)&&(p->stringi!='')/如果插入的内容超过一行 /file:/的容量,则分配下一行空间 p1=p; /file:/并将其连入链表 p=(text *)malloc(sizeof(text); p->flat=1; p->next=p1->next; p->pre=p1; p1->next->pre=p; p1->next=p; i=0; increhang+; p->num=i; p->stringi-1='n' p->stringi='0' puts("修改后的链表:"); for(p2=head;p2!=NULL;p2=p2->next)/显示出修改后的链表 puts(p2->string); saveanddisplay(10+increhang);/将修改后的链表存盘并显示下一页内容 xiugai=1; return 0; int EDIT()/编辑函数,用来接受处理编辑命令 char cmd; do cmd=getchar(); printf("n请输入命令(按E键退出):"); cmd=getchar(); switch(cmd) case 'e': case 'E': if(xiugai=1) saveall(); freemem(); if(fp) fclose(fp); if(out) fclose(out); system("cls"); return 0; case 'o': case 'O': Openfiles(); break; case 'p': case 'P': Createlist(); display(); break; case 'n': case 'N': saveanddisplay(10); break; case 'd': case 'D': del(); break; case 'i': case 'I': insert(); break; default:printf("nnn!输入错误!"); while(cmd!='e'&&cmd!='E'); return 0;int main()/主函数,用来接受命令 char cmd; do printf("ntt*n"); printf("tt* 1 EDIT *n"); printf("tt* 2 HELP *n"); printf("tt* 3 ABOUT *n"); printf("tt* 4 EXIT *n"); printf("tt*n"); printf("nn请选择1,2,3,4:"); cmd=getche(); switch(cmd) case '4' : system("cls"); byebye(); break; case '2' : system("cls"); HELP(); cmd=0; break; case '3' : system("cls"); ABOUT(); cmd=0; break; case '1' : EDIT(); cmd=0; break; default : printf("nnn!输入错误!n"); while(cmd!='4'); return 0; 专心-专注-专业