课程设计(文本格式化)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计
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; int
FootingLength = 5; int
StaringPageNumber = 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 中输出 page
i++;
m = m /10;
} //此时 page 已经保存在数组 a 中了,开始输出 page
for(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.它赋给记录单行字节数的变量 columns
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:
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); // 左空白10
for(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)// 如果读到结尾了,退出这个函数。
否则开始字符的输入输出操作{
if(c1==' ')// 如果字符为空格
{ if(strlen(array)==0)// 判断空格前是否有一个字
; // 没有字不打印
else//有一个字
{ //调用这个函数把这个字输出到文本文件2 和屏幕中
out(&columns,array,&linage,fp2,&page,&size);
}
}
else if(c1=='@') //如果字符为‘ @ '就要另起一段
{ //先输出if(strlen(array)==0) // 判断‘ @'前是否有一个字; //没有字不打印
else//有字要打印
{ //调用这个函数把这个字输出到文本文件2 和屏幕中
out(&columns,array,&linage,fp2,&page,&size);
}
//输出字后开始另起下一段if(linage>50) //判断这一页是否已经印满{
//印满了要换页输出linageFull(fp2,&linage,&columns,&page);
for(i=0; i<7; i++) //段首缩进8 字节
{ writeOut(fp2,' '); columns++;
}
}
else//这一页没有印满
{ writeOut(fp2,'\n');// 换行linage++; columns=0;
columns = zuokongbai(fp2); // 左空白10
for(i=0; i<7; 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:
//程序的入口
}
fp1 指向读入的文本文件, fp2 指向输出的文本文件 保存要格式化文本文件的文件名 保存格式化之后输出文本文件的文件名 printf(" 请输入要格式化文件的文件名 (包括后缀名 ):\n");
gets(fileName_one);
if((fp1=fopen(fileName_one,"r"))==NULL)
{
printf("The file \"%s\" was not fopen!\n",fileName_one); exit(0);
}
// 得到要进行格式化的文本文件 1 的地址
printf(" 请输入输出文件的文件名 (包括后缀名 ):\n"); gets(fileName_two);
if((fp2=fopen(fileName_two,"a"))==NULL)
{
printf("The file \"%s\" was not fopen!\n",fileName_two); exit(0);
}
//得到格式化后要保存到文本文件 2 的地址
readIn(fp1,fp2); // 读入文本文件开始格式化
printOut(); // 参数说明
// 关闭文件 (把文件缓冲区的数据送入硬盘中 ) // 关闭文件 (把文件缓冲区的数据送入硬盘中 )
void main()
{
FILE * fp1,* fp2;
// char fileName_one[100];
// char fileName_two[100]; //
fclose(fp1);
fclose(fp2);
3,调试过程:
(1):开始我设计页码是整形,当格式化文本文件过大时,页码输出就出现了问题。
实现输出页码是用fputc 这个函数,它是实现字符的输出,就把整形的页码数转换为ASCII 码形式输出了。
改为:把整形的页码转换为字符型用一个字符数组来保存。
每次输出页码是就是输出这个数组中的数据。
这样就实现了页码的完整输出。
(2)读一个字符判断是否为:空,‘@'。
(占不考虑其他条件)不是就直接输出。
导
致不能实现任何完整的字都没有被分割在两行这个功能。
改为:读一个字符判断是否为:
空字符,‘@ '。
(占不考虑其他条件)不是就保存在数组中,这个数组就是保存一个
字的作用。
判断输出就是一个一个字的输出,这样就实现了任何完整的字都没有被分割在
两行这个功能。
4,运行结果:
本人运行程序的到的结果:(测试数据 1.txt )
The use of silence in communication is different from culture to culture. Silence can communicate agreement, confusion, respect, sadness, or any number of meanings.
In eastern
cultures, silence has long been regarded as a virtue. While in western cultures, silence has
generally been considered socially disagreeable.
To most people in the United States, silence The use of silence The use of silence in communication is different from culture to culture. Silence can communicate agreement, confusion, respect,
sadness, or any number of meanings.
In eastern
cultures, silence has long been regarded as a virtue. While in western cultures, silence has
generally been considered socially disagreeable.
To most people in the United States, silence The use of silence The use of silence in communication is different from culture to culture. Silence can communicate agreement, confusion, respect,
sadness, or any number of meanings.
In eastern
cultures, silence has long been regarded as a virtue. While in western cultures, silence has
generally been considered socially disagreeable.
To most people in the United States, silence The use of silence The use of silence in communication is different from culture to culture. Silence can communicate agreement, confusion, respect,
sadness, or any number of meanings.
In eastern
cultures, silence has long been regarded as a virtue. While in western cultures, silence has
generally been considered socially disagreeable.
To most people in the United States, silence The use of silence The use of silence in communication is different from culture to culture. Silence can communicate agreement, confusion, respect,
sadness, or any number of meanings.
In eastern
cultures, silence has long been regarded as a virtue. While in western cultures, silence has
generally been considered socially disagreeable.
To most people in the United States, silence The use of silence The use of silence in communication is different from culture to culture. Silence can communicate agreement, confusion, respect,
sadness, or any number of meanings.
In eastern
cultures, silence has long been regarded as a virtue. While in western cultures, silence has
generally been considered socially disagreeable.
1
To most people in the United States, silence The use of silence The use of silence in communication is different from culture to culture. Silence can communicate agreement, confusion, respect,
sadness, or any number of meanings.
In eastern
cultures, silence has long been regarded as a virtue. While in western cultures, silence has
generally been considered socially disagreeable.
To most people in the United States, silence The use of silence The use of silence in communication is different from culture to culture. Silence can communicate agreement, confusion, respect,
sadness, or any number of meanings.
In eastern
cultures, silence has long been regarded as a virtue. While in western cultures, silence has
generally been considered socially disagreeable.
To most people in the United States, silence The use of silence
附截图:
I 苣理员C:\Windows\system32\cmd.exe
C:\Users\luan\Desktop>gcc -c a.c
C:\Users\luan\Desktop>gcc -o a a.o
C: MJsers\luan\Desktop>a
请输入要格式化文件的文件名〈包括后缀名》:
1.txt
请输入输岀文件的文件名〈包括后缀名> :
2.txt
The use of silence in communication is
different fron culture to culture. Silence can connunicate agreements confusion,
respect r sadness, or any nunber of meanings.
In eastern
cultures,, silence has long been regarded as a virtue. While in western cultures^ silence has generally been considered socially disagreeable.
nost people in the United States, silence The
use of silence The use of silence in connunication is different fron culture to culture. Silence can connunicate agreement, confusion^ respect F sadness^ or any nunber of meanings.
eastern
culturessHence has long been regarded as a uirtue. While in v/estern cultures, silence
has generally been considered socially disagreeable.
To nost people in the United States^ silence The
In
use of silence The use of silence in communication
苣51 员:C:\Windows\system32\cmd.exe
To nost people in the United States, silence The use of silence The use of silence in connunication is different fron culture to culture. Silence can connunicate agreenent, confusion, respect,
sadness, or any nunber of meanings.
In eas
cultures,, silence has long been regarded as a virtue. While in western cultures, silence
has generally been considered socially disagreeable.
To nost people in the United States, silence The use of silence The use of silence in connunication is different fron culture to culture. Silence can connunicotc agreementconfusion^ respect
sadness, or any nunber of meanings.
In eastern
cultures,, silence has long been regarded as a virtue. While in western cultures^ silence
has generally been considered socially disagreeable.
To nost people in the United States, silence The use of silence The use of silence in comnunication is different fron cul to culture. Silence can
connunicate agreenentconfusion,, respects sadness■ or anp nunber of meanings.
In eastern
cultures, silence has long been regarded as a virtue. While in western culturessilence
has generally been considered socially disagreeable.
To nost people in the United States,, silence The use of silence The use of silence in connunication is different fron culture to culture. Silence can connunicate agreement, confusion,,
respect.
5,经验和体会:
本次试验,花费时间有点长,但是在我多方面查找资料和询问同学下终于顺利完成了。
本次试验也很成功,让自己也很有成就感。
经过本次试验,让我熟悉了程序设计中应该注意的事项和容易出错的地方,但让我看到了很多自己算法设计上的不足,以后还需改进和提高的地方。
学无止境,通过本次试验,也同样让我明白了细节决定成败。
以后还要,加油!。