当前位置:文档之家› 课程设计(文本格式化)

课程设计(文本格式化)

课程设计2013 年6 月17 日题目:文本格式化一,问题描述:试写一个文本格式化程序可以处理一个输入文件,它按照用户指定的下列版面规格参数重排版面:实现页内调整、分段、分页等文本处理功能,排版结果存入输出文本文件中。

(1)输出文件中字与字之间只留一个空格符,即实现多余空格符的压缩。

( 2)输出文件中,任何完整的字不能分割在两行,行尾可以不齐,但行首要对齐。

( 3)将页号印在页底空行中第 2 行的中间位置上。

( 4)版面要求的参数见题集p117。

(5)测试用例自己设计。

二,设计:1, 版面要求的参数要包含:页长(Page Length) ——每页内文字(不计页号)的行数。

页宽(Page Wedth) ----- 每行内文字所占最大字符数。

左空白(Left Margin) ——每行文字前的固定格数。

头长(Heading Length) ——每页页顶所空行数。

脚长(Footing Length) ——每页页底所空行数(含页号行)起始页号(Starting Page Number)------- 首页的页号。

2,概要设计: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 ()3,实验设计程序代码:#include<stdio.h>#include<stdlib.h> #include<string.h> int (PageLength ) = 56; int PageWedth = 60; int LeftMargin = 10; int HeadingLength = 5; intFootingLength = 5; intStaringPageNumber = 1;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 );// 函数 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 );//页长(一页最大的行数) //页宽(一行最大的字符数) //左空白(一行开始输出的空格数) //头长(一页开始输出的空行数) // 脚长(每页最后空 5 行) //起始页号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,' ');return i; // 函数 4:void pageNumber(FILE * fp2,char * aIndex,int * page) //输出当前页码{int m,n;/定义2个整形变量接收 page 和page%10的值 m = *page;//接收 page 的值 int i=0;while(m != 0) //判断条件为:m 的值不为0即page 的值不为0{ n = m % 10;*(alndex+i) = n+'0';//对数组a 进行赋值操作,把int 类型的page 的各位数转换为字符型 保存到数组 a 中,以便于向文本文件 2 中输出 pagei++;m = m /10;} //此时 page 已经保存在数组 a 中了,开始输出 pagefor(i=i-1; i>=0; i--){writeOut(fp2,*(alndex+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++){// 左空白 //循环 10 次,输出 10 个空格到文本文件 2中// 返回值为 10.它赋给记录单行字节数的变量 columnswriteOut(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){II完成页的尾部格式(空一行后居中输出页码page再空3 行) writeOut(fp2,'\n'); //空一行for(i=0; i<29; i++) II 居中输出页码{writeOut(fp2,' ');}pageNumber(fp2,aIndex,page);for(i=0; i<3; i++){writeOut(fp2,'\n'); II再空3 行}*linage=0;〃开始打印第二页。

实现输出页首的格式(头长+左空白)for(i=0; i<5; i++) II 头长5{writeOut(fp2,'\n');*linage++; II 已经占有linage 行}*columns = zuokongbai(fp2); II 左空白10}II函数7:void readIn(FILE * fp1,FILE * fp2) II 读入文本文件{II 记录空格的数量II 记录行数II 记录单行的字节数char array[61] = {"\0"};II 存一个单词char * arrayIndex = array;int size = 0; II 初始化单词的长度for(i=0; i<5; i++) II 头长5{writeOut(fp2,'\n'); linage++; // 已经占有linage 行}columns = zuokongbai(fp2); // 左空白10for(i=0; i<7; i++) //段首缩进8 字节{writeOut(fp2,' '); columns++;} //以上代码实现了基本的版面参数要求,下面开始具体到字母的排版开始下一页的打印int blankNumber=0; int linage = 0;int columns = 0;char c1;c1 = fgetc(fp1);// 读入第一个字符while(c1!=EOF)// 如果读到结尾了,退出这个函数。

相关主题