课程设计实验报告题目:编制一个将待格式化的文本按照一定的版面要求重新排版并输出到文件的程序一:需求分析➢1:文本文件非空且以文本文件形式存放(为空没有格式化意义)。
输入输出文件名均由用户从键盘输入。
➢2:字的定义:由非(‘@’,‘’(空格))的任意ASCII码字符组成。
➢3:文本文件的定义:由字母字符,数字字符,空格和可以用ASCII代码显示的字符组成。
‘@’只表示换行的意义。
‘’(空格)只表示一个字的结束的意义。
➢4:任何完整的字都没有被分割在两行:,行尾不齐没关系,但要实现左对齐。
每行字符数不超过60➢5:输出文件中字与字之间只留一个空格符,即实现多余空格符的压缩。
➢6:符号‘@’指示它后面的正文在格式化时应另起一段排放,段首缩入8个字符的位置。
二:概要设计➢1:void printOut(){ 该函数的功能是:格式化文本文件后必要提示用户的信息说明}➢2:void writeOut(FILE * fp2,char c1){ 该函数的功能是:将字符输出到文本文件和屏幕}➢3:int zuokongbai(FILE * fp2){ 该函数的功能是:实现文本参数格式(左空白)}➢4:void pageNumber(FILE * fp2,char * aIndex,int * page){ 该函数的功能是:输出当前页码}➢5:void out(int * columns,char * array,int * linage,FILE * fp2,int * page,int * size) { 该函数的功能是:判断是否输出到文本文件和屏幕}➢6:void linageFull(FILE * fp2,int * linage,int * columns,int * page){ 该函数的功能是:输出页首的格式(头长+左空白)}➢7:void readIn(FILE * fp1,FILE * fp2){ 该函数是整个程序的核心,执行程序的主要逻辑判断}➢8:void main(){ 该函数的功能是:程序的入口}三:详细设计1,头文件:noteParameter.h(参数的说明)int (PageLength) = 56; //页长(一页最大的行数)int PageWedth = 60; //页宽(一行最大的字符数)int LeftMargin = 10; //左空白(一行开始输出的空格数)int HeadingLength = 5; //头长(一页开始输出的空行数)int FootingLength = 5; //脚长(每页最后空5行)int StaringPageNumber = 1; //起始页号2,主程序中需要的全局变量和函数声明int page = 1; //记录页数int i = 0; //循环变量char a[5]; //记录page的char类型char * aIndex = a; //数组a的首地址//函数声明(后面的函数调用了它)void linageFull(FILE * fp2,int * linage,int * columns,int * page);3:主函数和其他函数的伪代码算法说明:为了便于描述。
‘文本文件1’代表用户输入的要格式化的文本文件。
‘文本文件2’代表用户输入的格式化之后保存的文本文件。
函数1:void printOut() //输出头文件中的所有整形变量{//这个函数中的参数全部来自头文件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:void writeOut(FILE * fp2,char c1) // 输出到文本文件2和屏幕{char ch1;ch1 = fputc(c1,fp2);//接收从文本文件1中读出的一个字符,并且保存到文本文件2中printf("%c",ch1); //把这个字符输出到外设(屏幕)}函数3:int zuokongbai(FILE * fp2) // 左空白{for(i=0; i<10; i++)writeOut(fp2,' '); //循环10次,输出10个空格到文本文件2中return i; //返回值为10.它赋给记录单行字节数的变量columns}函数4:void pageNumber(FILE * fp2,char * aIndex,int * page) //输出当前页码{int m,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:void out(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:void linageFull(FILE * fp2,int * linage,int * columns,int * page) // 开始下一页的打印{//完成页的尾部格式(空一行后居中输出页码page再空3行)writeOut(fp2,'\n'); //空一行for(i=0; i<29; i++) //居中输出页码{writeOut(fp2,' ');}pageNumber(fp2,aIndex,page);for(i=0; i<3; i++){writeOut(fp2,'\n'); //再空3行}*linage=0;//开始打印第二页。
实现输出页首的格式(头长+左空白)for(i=0; i<5; i++) // 头长5{writeOut(fp2,'\n');*linage++; //已经占有linage行}*columns = zuokongbai(fp2); // 左空白10}函数7:void readIn(FILE * fp1,FILE * fp2) // 读入文本文件{int blankNumber=0; // 记录空格的数量int linage = 0; // 记录行数int columns = 0; // 记录单行的字节数char array[61] = {"\0"};//存一个单词char * arrayIndex = array;int size = 0; // 初始化单词的长度for(i=0; i<5; i++) // 头长5{writeOut(fp2,'\n');linage++; //已经占有linage行}columns = zuokongbai(fp2); // 左空白10for(i=0; i<7; i++) //段首缩进8字节{writeOut(fp2,' ');columns++;}//以上代码实现了基本的版面参数要求,下面开始具体到字母的排版char c1;c1 = fgetc(fp1);//读入第一个字符while(c1!=EOF)//如果读到结尾了,退出这个函数。