课程设计实验报告题目:编制一个将待格式化的文本按照一定的版面要求重新排版并输出到文件的程序一:需求分析1:文本文件非空且以文本文件形式存放(为空没有格式化意义)。输入输出文件名均由用户从键盘输入。2:字的定义:由非(‘@’,‘’(空格))的任意ASCII码字符组成。3:文本文件的定义:由字母字符,数字字符,空格和可以用ASCII代码显示的字符组成。‘@’只表示换行的意义。‘’(空格)只表示一个字的结束的意义。4:任何完整的字都没有被分割在两行:,行尾不齐没关系,但要实现左对齐。每行字符数不超过605:输出文件中字与字之间只留一个空格符,即实现多余空格符的压缩。6:符号‘@’指示它后面的正文在格式化时应另起一段排放,段首缩入8个字符的位置。二:概要设计1:voidprintOut(){该函数的功能是:格式化文本文件后必要提示用户的信息说明}2:voidwriteOut(FILE*fp2,charc1){该函数的功能是:将字符输出到文本文件和屏幕}3:intzuokongbai(FILE*fp2){该函数的功能是:实现文本参数格式(左空白)}4:voidpageNumber(FILE*fp2,char*aIndex,int*page){该函数的功能是:输出当前页码}5:voidout(int*columns,char*array,int*linage,FILE*fp2,int*page,int*size){该函数的功能是:判断是否输出到文本文件和屏幕}6:voidlinageFull(FILE*fp2,int*linage,int*columns,int*page){该函数的功能是:输出页首的格式(头长+左空白)}7:voidreadIn(FILE*fp1,FILE*fp2){该函数是整个程序的核心,执行程序的主要逻辑判断}8:voidmain(){该函数的功能是:程序的入口}三:详细设计1,头文件:noteParameter.h(参数的说明)int(PageLength)=56;//页长(一页最大的行数)intPageWedth=60;//页宽(一行最大的字符数)intLeftMargin=10;//左空白(一行开始输出的空格数)intHeadingLength=5;//头长(一页开始输出的空行数)intFootingLength=5;//脚长(每页最后空5行)intStaringPageNumber=1;//起始页号2,主程序中需要的全局变量和函数声明intpage=1;//记录页数inti=0;//循环变量chara[5];//记录page的char类型char*aIndex=a;//数组a的首地址//函数声明(后面的函数调用了它)voidlinageFull(FILE*fp2,int*linage,int*columns,int*page);3:主函数和其他函数的伪代码算法说明:为了便于描述。‘文本文件1’代表用户输入的要格式化的文本文件。‘文本文件2’代表用户输入的格式化之后保存的文本文件。函数1:voidprintOut()//输出头文件中的所有整形变量{//这个函数中的参数全部来自头文件printf(\n);printf(格式化文本文件结束\n);printf(版面的参数如下:\n);printf(页长:%d\n,PageLength);printf(页宽:%d\n,PageWedth);printf(左空白:%d\n,LeftMargin);printf(头长:%d\n,HeadingLength);printf(脚长:%d\n,FootingLength);printf(起始页号:%d\n,StaringPageNumber);printf(\n);printf(特别说明:本程序只支持英文格式化,对于中文格式化存在乱码问题。\n);printf(\n);}函数2:voidwriteOut(FILE*fp2,charc1)//输出到文本文件2和屏幕{charch1;ch1=fputc(c1,fp2);//接收从文本文件1中读出的一个字符,并且保存到文本文件2中printf(%c,ch1);//把这个字符输出到外设(屏幕)}函数3:intzuokongbai(FILE*fp2)//左空白{for(i=0;i10;i++)writeOut(fp2,'');//循环10次,输出10个空格到文本文件2中returni;//返回值为10.它赋给记录单行字节数的变量columns}函数4:voidpageNumber(FILE*fp2,char*aIndex,int*page)//输出当前页码{intm,n;//定义2个整形变量接收page和page%10的值m=*page;//接收page的值i=0;while(m!=0)//判断条件为:m的值不为0即page的值不为0{n=m%10;*(aIndex+i)=n+'0';//对数组a进行赋值操作,把int类型的page的各位数转换为字符型保存到数组a中,以便于向文本文件2中输出pagei++;m=m/10;}//此时page已经保存在数组a中了,开始输出pagefor(i=i-1;i=0;i--){writeOut(fp2,*(aIndex+i));//向文本文件2中输出page}(*page)++;//指向下一页}函数5:voidout(int*columns,char*array,int*linage,FILE*fp2,int*page,int*size)//输出{if(((*(columns))+1+strlen(array))60)//判断这一行是否还能够输出空格加一个单词{//这一行不能再输出了,开始换行if((*(linage))50)//判断这一页是否已经印满{linageFull(fp2,linage,columns,page);//转到下一页for(i=0;i*(size);i++){writeOut(fp2,*(array+i));//把保存在数组中的一个字输出到文本文件2中(*(columns))++;//输出一个字符,这一行的字符数就增加一个}(*(size))=0;//输出之后就开始重新向数组array中读入字符,所以size要归0(*(array))='\0';//如果是多个空格连在一起,那么就需要把array数组第一个设为结束字符。}else//这一页还没印满,换行后开始输出{writeOut(fp2,'\n');//换行(*(linage))++;//*(columns)=0;(*(columns))=zuokongbai(fp2);//左空白10for(i=0;i(*(size));i++){writeOut(fp2,(*(array+i)));//通过循环向文本文件2中输入字(*(columns))++;}(*(size))=0;(*(array))='\0';}}else//这一行还没有满,还可以再输出{writeOut(fp2,'');(*(columns))++;for(i=0;i*size;i++){writeOut(fp2,*(array+i));(*(columns))++;}(*(size))=0;(*(array))='\0';}}函数6:voidlinageFull(FILE*fp2,int*linage,int*columns,int*page)//开始下一页的打印{//完成页的尾部格式(空一行后居中输出页码page再空3行)writeOut(fp2,'\n');//空一行for(i=0;i29;i++)//居中输出页码{writeOut(fp2,'');}pageNumber(fp2,aIndex,page);for(i=0;i3;i++){writeOut(fp2,'\n');//再空3行}*linage=0;//开始打印第二页。实现输出页首的格式(头长+左空白)for(i=0;i5;i++)//头长5{writeOut(fp2,'\n');*linage++;//已经占有linage行}*columns=zuokongbai(fp2);//左空白10}函数7:voidreadIn(FILE*fp1,FILE*fp2)//读入文本文件{intblankNumber=0;//记录空格的数量intlinage=0;//记录行数intcolumns=0;//记录单行的字节数chararray[61]={\0};//存一个单词char*arrayIndex=array;intsize=0;//初始化单词的长度for(i=0;i5;i++)//头长5{writeOut(fp2,'\n');linage++;//已经占有linage行}columns=zuokongbai(fp2);//左空白10for(i=0;i7;i++)//段首缩进8字节{writeOut(fp2,'');columns++;}//以上代码实现了基本的版面参数要求,下面开始具体到字母的排版charc1;c1=fgetc(fp1);//读入第一个字符while(c1!=EOF)//如果读到结尾了,退出这个函数。否则开始字符的输入输出操作{if(c1=='')//如果字符为空格{if(strlen(array)==0)//判断空格前是否有一个字;//没有字不打印else//有一个字{//调用这个函数把这个字输出到文本文件2和屏幕中out(&columns,array,&linage,fp2,&page,&size);}}elseif(c1=='@')//如果字符为‘@’就要另起一段{//先输出if(strlen(array)==0)//判断‘@’前是否有一个字;//没有字不打印else//有字要打印{//调用这个函数把这个字输出到文本文件2和屏幕中out(&columns,array,&linage,fp2,&page,&size);}//输出字后开始另起下一段if(linage50)//判断这一页是否已经印满{//印满了要换页输出linageFull(fp2,&linage,&columns,&page);for(i=0;i7;i++)//段首缩进8字节{writeOut(fp2,'');columns++;}}Else//这一页没有印满{writeOut(fp2,'\n');//换行linage++;columns=0;columns=zuokongbai(fp2);//左空白10for(i=0;i7;i++)//段首缩进8字节{writeOut(fp2,'');columns++;}}}else//此时c1是一个要输出的字符{array[size]=c1;//保存到数组中size++;array[size]='\0';}c1=fgetc(fp1);//上一个字符处理完了,开始从文本文件1中读出下一个字符if(c1==EOF)//首先判断是不是结束了{//文本文件已经读完。把前面已经读出保存在数组中的字输出到文本文件2中out(&columns,array,&linage,fp2,&page,&size);break;//结束while循环}if(strlen(array)61)//程序中设计一个字不能超过60个字符,这里判断条件为61是加了一个结束符‘\0’.{printf(字符格式错误!哪有这么长的单词!\n);break;//结束while循环}}}函数8://程序的入口voidmain(){FILE*fp1,*fp2;//fp1指向读入的文本文件,fp2指向输出的文本文件charfileName_one[100];//保存要格式化文本文件的文件名charfileName_two[100];//保存格式化之后输出文本文件的文件名printf(请输入要格式化文件的文件名(包括后缀名):\n);gets(fileName_one);if((fp1=fopen(fileName_