课程设计文本格式化.docx
《课程设计文本格式化.docx》由会员分享,可在线阅读,更多相关《课程设计文本格式化.docx(17页珍藏版)》请在冰豆网上搜索。
课程设计文本格式化
附件1:
学号:
0121110340427
课程设计
题目
文本格式化
学院
计算机科学与技术学院
专业
计算机科学与技术
班级
计算机1104班
姓名
成霖
指导教师
吴利军
2013
年
6
月
17
日
题目:
文本格式化
一,问题描述:
试写一个文本格式化程序可以处理一个输入文件,它按照用户指定的下列版面规格参数重排版面:
实现页内调整、分段、分页等文本处理功能,排版结果存入输出文本文件中。
(1)输出文件中字与字之间只留一个空格符,即实现多余空格符的压缩。
(2)输出文件中,任何完整的字不能分割在两行,行尾可以不齐,但行首要对齐。
(3)将页号印在页底空行中第2行的中间位置上。
(4)版面要求的参数见题集p117。
(5)测试用例自己设计。
二,设计:
1,版面要求的参数要包含:
页长(PageLength)——每页内文字(不计页号)的行数。
页宽(PageWedth)——每行内文字所占最大字符数。
左空白(LeftMargin)——每行文字前的固定格数。
头长(HeadingLength)——每页页顶所空行数。
脚长(FootingLength)——每页页底所空行数(含页号行)
起始页号(StartingPageNumber)——首页的页号。
2,概要设计:
Ø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()
3,实验设计程序代码:
#include
#include
#include
int(PageLength)=56;//页长(一页最大的行数)
intPageWedth=60;//页宽(一行最大的字符数)
intLeftMargin=10;//左空白(一行开始输出的空格数)
intHeadingLength=5;//头长(一页开始输出的空行数)
intFootingLength=5;//脚长(每页最后空5行)
intStaringPageNumber=1;//起始页号
intpage=1;//记录页数
inti=0;//循环变量
chara[5];//记录page的char类型
char*aIndex=a;//数组a的首地址
//函数声明(后面的函数调用了它)
voidlinageFull(FILE*fp2,int*linage,int*columns,int*page);
//函数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;i<10;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的值
inti=0;
while(m!
=0)//判断条件为:
m的值不为0即page的值不为0
{
n=m%10;
*(aIndex+i)=n+'0';//对数组a进行赋值操作,把int类型的page的各位数转换为字符型保存到数组a中,以便于向文本文件2中输出page
i++;
m=m/10;
}
//此时page已经保存在数组a中了,开始输出page
for(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);//左空白10
for(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;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:
voidreadIn(FILE*fp1,FILE*fp2)//读入文本文件
{
intblankNumber=0;//记录空格的数量
intlinage=0;//记录行数
intcolumns=0;//记录单行的字节数
chararray[61]={"\0"};//存一个单词
char*arrayIndex=array;
intsize=0;//初始化单词的长度
for(i=0;i<5;i++)//头长5
{
writeOut(fp2,'\n');
linage++;//已经占有linage行
}
columns=zuokongbai(fp2);//左空白10
for(i=0;i<7;i++)//段首缩进8字节
{
writeOut(fp2,'');
columns++;
}
//以上代码实现了基本的版面参数要求,下面开始具体到字母的排版
charc1;
c1=fgetc(fp1);//读入第一个字符
while(c1!
=EOF)//如果读到结尾了,退出这个函数。