基于Newban的Nancyj字体Email签名工具

Palpitation

发布日期: 2018-10-21 10:55:52 浏览量: 791
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

一 需求分析

Newban是一个输出mail签名的工具,能够在终端将字符进行“图形化”输出。本程序就是用所给字体文件,在屏幕上输出该字体的签名,并要求实现如下功能:

  • 能设定输出宽度

  • 能设定输出对齐方式,可以设置左对齐、居中对齐、右对齐

  • 能指定字体

基本要求如下所示:

  • 字体信息必须以文件形式存放,文件名为 nancyj。输出时,从字体文件中取出相应字符图形

  • 输出宽度信息以命令行参数形式传递给程序,如果省略宽度信息,默认为80个字符宽度。参数开关为-w。例如,如果程序名为newban,则运行时指定输出宽度为200个字符的命令为:newban –w 200

  • 对齐方式以命令行参数形式传递给程序,如省略,默认为左对齐。参数开关为-l,-c,-r。对齐方式可以指定其中之一。-l表示左对齐,-c表示居中对齐,-r表示右对齐。例如:指定输出为右对齐方式,则命令格式为:newban –r

  • 可以同时设定输出的宽度和对齐方式。例如,命令:newban–r–w 80则指定输出右 对齐,输出宽度为80字符

  • (提高)可以设定输出字体,命令行参数用-f,后面接字体文件名。例如,以字体standard.data字体为输出字体,则命令为:newban –f standard.data

  • 程序运行后,接受用户输入,按回车后以指定格式和宽度显示内容,直到用户输入quit 结束

  • 字体文件中应含如下字符的图形信息:a b c d e f g h i j k l m n o p q r s t u v w x y z A B C D E F G H I J K L M N O P Q R S T U V W X Y Z 0 1 2 3 4 5 6 7 8 9

二 程序设计

2.1 总体设计

2.2 详细设计

2.2.1 主程序设计

1.主函数原型:int main(int argc, char*argv[])

2.功能:在主函数里调用其他功能函数,实现功能。

流程图如下所示:

说明:

  • 主函数中没有结束标志,当调用输入函数时,遇到 quit命令,会退出程序

  • num_word是单词数,每次循环都需要初始化,以免对二次输入产生影响

  • 判断命令行参数,将输出宽度信息存储在width中,将对其方式信息存储在 alignment中,将字体文件名信息存储在 filename中

判断命令行参数的具体流程如下:

2.2.2 读取文件

1.函数原型:void read()

2.功能:读取字体文件中的图形信息,并存入三维数组 Type中。

流程图如下所示:

说明:

  • 读取的高度信息,用 atoi 函数转化为整型数字,存储在 high 中

  • 读取的图形信息,存储在三维数组 Type 中

  • 由于读取是用的 fgets 函数,每个字符串后面均有一个换行符,所以要去掉换行符

2.2.3 用户输入

1.函数原型:void put_in()

2.功能:接收用户输入,并计算单词数。

流程图如下所示:

说明:

  • 用户输入的信息存储在 Text中,用 strcmp 函数与“quit“比较,判断是否退出程序

  • 计算的单词数存储在 num_word中

  • 调用控制单词长度函数,根据单词长度增加单词数,以达到控制单词长度的目的

2.2.4 控制单词长度

1.函数原型:void iswordover()

2.功能:判断每个单词的图形字符数总和,如果一个单词的字符数总和大于了规定宽度,则增加单词数,以便于下面利用储存单词函数把过长的部分储存成另一个单词。

流程图如下所示:

说明:

  • 功能主要判断每一个单词是否超过 width,根据超过的部分的长度增加单词数,以达到控制单词长度的目的。

2.2.5 储存单词

1.函数原型:void make_word()

2.功能:把每一个单词存放到在主函数中申请的num_word个动态数组中,以便于输出时调用。同时调用相邻字母衔接处的判断函数函数 issame()和相邻字母衔接处的修改函数alter() 实现相邻字母共用相同的字符。

流程图如下所示:

说明:

  • 将Text中的每一个字符进行处理

  • 将单词存储在动态数组 p_word 中,根据指针移动控制单词序数

  • 遇到空格,或者 p_word 储存的单词的长度达到规定宽度,移动指针到下一个单词,将下面的字符图形储存到下面的单词,达到将单词一个一个储存的目的

  • 在将字符图形连接到 p_word 前,先调用衔接处判断函数,判断是否需要修改衔接处,需要则调用衔接处修改函数

2.2.6 判断相邻字母衔接处

1.函数原型:int issame(int j)

2.功能:判断相邻字母的衔接处的字符是否相同或者有一方为空格。

流程图如下所示:

说明:

  • 当首尾衔接处的字符都相同,或者由一方为空格,则返回真值 1;否则返回 0

2.2.7 修改相邻字母衔接处

1.函数原型:void alter(int j)

2.功能:修改相邻字母衔接处的字符,实现相邻字母共用相同的字符串。

流程图如下所示:

说明:

  • copy、alter3是动态数组。

  • 在修改之前,要将图形信息复制给copy,以防改变字体形状数组 Type 中的值

2.2.8 缓存处理

1.函数原型:void buffer()

2.功能:将储存好的单词进行连接处理,判断何时输出与怎样输出。
流程图如下所示:

说明:

  • Out_word是用于输出的动态数组,储存的单词在这里进行连接和输出

  • 当判断out_word的长度加上空格长度加上将要连接的单词长度超过规定长度,则先输出,在进行覆盖,以达到控制输出宽度的目的

  • 空格,指的是在字体文件最后储存的一个空格图形,在 Type中的下标为62

2.2.9 输出

1.函数原型:void put_out()

2.功能:将out_word中储存的短语输出,同时调用输出对齐方式的控制函数out_type()函数计算出每行左边要输出的空格数。

流程图如下所示:

说明:

  • 为了控制输出的对齐方式,便采用在左端输出空格的方式实现,调用 out_type()函数计算空格数,在每行输出 out_word之前先输出空格

2.2.10 控制输出格式

1.函数原型:int out_type()

2.功能:根据规定的输出宽度和out_word中字符串宽度,计算出输出时左方应输出的空格数。

流程图如下所示:

说明:

  • alignment为对齐方式信息,width为规定的宽度,strlen(out_word->line)是要输出图形的长度

  • 当对齐方式为左对齐时,返回 0

  • 当对齐方式为左对齐时,返回(width-strlen(out_word->line))/2

  • 当对齐方式为左对齐时,返回 width-strlen(out_word->line)

2.2.11 字体文件

  • 文件概况:第一行为此字体文件的字体形状的高度信息;再往下为字体形状信息,按竖排分布,每次用 fgets函数读取一行

  • 文件制作程序:为了方便制作字体文件,编写了一个程序,可以将横排分布的字体文件转换为竖排分布

    文件截图如下所示:

三 运行测试

3.1 默认字体(nancyj)、对齐方式(左对齐)、输出宽度(80

3.2 居中对齐”-c”开关

3.3 右对齐”-r”开关

3.4 输出宽度”-w”开关

3.5 切换文件”-f”开关

(big字体)

(nscript字体)

3.6 字体文件制作程序

(源文件)

(目的文件)

上传的附件 cloud_download 基于Newban的Nancyj字体Email签名工具.zip ( 721.92kb, 18次下载 )
error_outline 下载需要5点积分

发送私信

做一个简单的人,踏实务实,不沉溺幻想,不庸人自扰

11
文章数
14
评论数
最近文章
eject