荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: huhaiming (一生只爱她), 信区: Program
标  题: 如何输出结果
发信站: 荔园晨风BBS站 (Wed May 21 10:12:36 2003), 站内信件

一般说来,真到了要做结果输出这一块,程序也就写得差不多了。不过,这里面还
是有学问,只不过不太多而已。
  简单的输出我不再写出来,比如printf里的%d、%f、%g、%3d、%5.02f等等,
查查MSDN就知道用法了。我想向大家介绍的是关于整体输出格式的问题。

  一、关于空行(Blank line)
  很多题目都要求在输出数据的恰当位置加空行。那什么是空行呢?一个空行就
是一个单独的"\n"。
不过我想说的并不是这个,而是如何恰当地输出空行。
  大家已经做过不少题了,有的题中说:“After each test case, you should
 output one blank line”,而有的题目却说:“Between each test case,
you should ouput one blank line”请大家注意After和Between的区别,因为如果
多了一或少了空行,将导致Presentation Error甚至Wrong Answer!

  After
  这种情况最简单,只需要输出结果后,再加一个printf("\n")或puts("")就行
了,就像这样:
int i;
for (i = 0; i < 10; i++)
{
    printf("%d\n", a[i]);
    printf("\n");
}
    Between
  Between和After不同的是,最后一组结果后面不应该再加单独的"\n",以上面
的例子为例,就是这样:
int i;
for (i = 0; i < 10; i++)
{
    printf("%d\n", a[i]);
    if (i != 9)
        printf("\n");
}
  由于有时候我们并不知道测试数据有几组(比如测试数据是以end of file结
束的),用上面的方法就不行了,于是,我们换了一种写法:
int a;
bool bFirst = true;
while (scanf("%d", &a) == 1)
{
    if (!bFirst)
        puts("");
    else
        bFirst = false;
    printf("%d\n", a);
}
    这样,从第二组测试数据起,在输出每组测试数据的结果之前就会输出一个空
行,和我们想要的效果是一样的。我习惯用这种方法,不管我是否知道测试数据的组数。
  二、关于空格、逗号以及其他分隔符
  这种情况与空行的情况相当相似,处理方法也是一样的,只不过把"\n"改成相
应的分隔符就行了。
  三、带格式的字符串输出
  有些题目要求输出这样的字符串
abc*****de****f
  其中“*”代表空格。
  要求是这样的:str1在前5个字符中左对齐,str2在第6到第10个字符中右对齐
,str3在第11到第15
个字符中右对齐。
  我的做法是,先初始化一个数组,用' '(空格)填充,再在相应的位置填相
应的内容。思路不太
好用文字准确描述,用程序来表述吧:
01:char str[1000];
02:char str1[] = "abc", str2[] = "de", str3[] = "f";
03:memset(str, ' ', 1000 * sizeof(char));
04:sprintf(str, "%s", str1);
05:str[strlen(str1)] = ' ';
06:sprintf(str + 5, "%5s", str2);
07:str[10] = ' ';
08:sprintf(str + 10, "%5s", str3);
09:str[15] = '\0';
10:puts(str);
  关键的部分:一、在调用了sprintf后,要清除不恰当的字符串结束符(第5,
7行);
二、最后别忘
了在恰当的位置添加字符串结束符(第15行)。
  四、二维数组的输出
  和二维数组的输入一样,首先要考虑的是数组是按行排列还是按列排列,如果
是按行排列,就应该这样写:
int i, j;
01: for (i = 0; i < nRow; i++)
02: {
03:     for (j = 0; j < nCol; j++)
        {
            if (j > 0)
                printf(" ");
            printf("%d", a[i][j]);
        }
        puts("");
    }
  如果是按列,就要把1行和3行交换。
  五、模拟屏幕输出
  在一些模拟题中,题目要求输出一幅画,只不过这个画是由字符组成的。是不
是想到了BBS的ASCII Art版?
  对于这种情况,我采用和(三)相似的方法,先开一个字符数组(在这里,是
二维数组),然后把数组当成屏幕输出,屏幕的(i, j)点就是数组的(i, j)号元素。
最后,输出这个二维数组就行了。
  在输出的时候,我采用了一个非常小的技巧。
  一般来说,我们输出一个二维字符数组的方法和输出一般数组的方法是一样的
,用双重循环来做。
不过,我只用一个循环就可以了,原因是我在数组每行的恰当位置(一般是末尾)
加了一个'\0',那么,数组的每一行就成了一个字符串,于是,输出程序就变成了:
int i;
char str[100][100];
...
for (i = 0; i < nRow; i++)
    puts(str);
  结果的输出其实并没有太多的技术含量,主要是小技巧。
--

菩提本无树,明镜亦非台

本来无一物,何处惹尘埃

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.0.200]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店