您的位置:首页 > 其它

对ZOJ第1146题的解答:LC-Display

2008-02-28 04:43 253 查看
题目链接:http://acm.zju.edu.cn/show_problem.php?pid=1146

这是一道用于把数字显示成LCD样子的题目,输入每一行有两个整数,第一个整数n表示笔画大小,第二个是需要显示成LCD样子的数字。这道题没有什么太难的,但是却让我在输出格式上卡住了,始终是Presentation Error,让我百思不得其解。后来我才发现原来是因为题目叙述的不够精确,使我没有准确理解输出格式的要求,导致我每一行都多输出了一个结尾空格。找到问题后,当然立刻就AC了。代码也不具备什么含量。

由于没有什么难度的地方,并且我也加了一点点注释,所以就没什么可做更多叙述的了。这只是一道比较简单的题目,但是输出格式一定要正确理解。

ZOL 1146 CODE

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

void PrintVer(int,int,char*);

void PrintHor(int,int,char*);

void PrintNumbers(int,char*);

/*LCD的字型码*/

/* -0-

1 2

-3-

4 5

-6-

*/

int LCDCODES[10][7]=

{

{1,1,1,0,1,1,1},/*0*/

{0,0,1,0,0,1,0},/*1*/

{1,0,1,1,1,0,1},/*2*/

{1,0,1,1,0,1,1},/*3*/

{0,1,1,1,0,1,0},/*4*/

{1,1,0,1,0,1,1},/*5*/

{1,1,0,1,1,1,1},/*6*/

{1,0,1,0,0,1,0},/*7*/

{1,1,1,1,1,1,1},/*8*/

{1,1,1,1,0,1,1} /*9*/

};

char c_ver='|';

char c_hor='-';

/* 两个相邻字母中间隔了一个空列 ,因此平均每个字母占据n+3列,最后一列为间隔*/

/*打印竖直笔画,n-笔画长度,section=1或者4,numbers-数字字符串*/

void PrintVer(int n,int section,char *numbers)

{

char *line;

int i,len=(n+3)*strlen(numbers);

line=(char*)malloc(len+1);

if(line==NULL)

return;

memset(line,' ',len);

for(i=0;i<strlen(numbers);i++)

{

if(LCDCODES[*(numbers+i)-'0'][section])

*(line+(n+3)*i)=c_ver;

if(LCDCODES[*(numbers+i)-'0'][section+1])

*(line+(n+3)*i+(n+1))=c_ver;

}

/*检查最后一个字符,如果没有笔画,要使\0前移2格!*/

line[len-1]='\0';

/*打印n行*/

for(i=0;i<n;i++)

printf("%s\n",line);

free(line);

}

/*打印水平笔画,n-笔画长度,section=0,3,or 6,numbers-数字字符串*/

void PrintHor(int n,int section,char *numbers)

{

char *line;

int i,len=(n+3)*strlen(numbers);

line=(char*)malloc(len+1);

if(line==NULL)

return;

memset(line,' ',len);

for(i=0;i<strlen(numbers);i++)

{

if(LCDCODES[*(numbers+i)-'0'][section])

memset((line+(n+3)*i+1),c_hor,n);

}

/*注意最后一个数字后面无需空格了!所以多缩进一个位置*/

line[len-1]='\0';

/*打印1行*/

printf("%s\n",line);

free(line);

}

/* Print A set of Numbers : "23456" e.g. */

void PrintNumbers(int n,char *numbers)

{

PrintHor(n,0,numbers); /* ---- */

PrintVer(n,1,numbers); /* | | */

PrintHor(n,3,numbers); /* ---- */

PrintVer(n,4,numbers); /* | | */

PrintHor(n,6,numbers); /* ---- */

}

int main()

{

char line[20];

char *str1,*numbers,*delim=" ";

int n;

do

{

gets(line);

str1=strtok(line,delim);

numbers=strtok(NULL,delim);

n=atoi(str1);

if(n<=0)

break;

PrintNumbers(n,numbers);

/*每两行数字之间有一个空行*/

printf("\n");

}

while(1);

}
/*--------------------------------------------------

打印后正确的输出格式应该类似下面这样:(@表示行尾)

- - - - @

| | | | | | | | @

- - - - @

| | | | | | |@

- - - - @

----------------------------------------------------*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: