pat basic 1109 擅长C

当你被面试官要求用 C 写一个“Hello World”时,有本事像下图显示的那样写一个出来吗?

输入格式:

输入首先给出 26 个英文大写字母 A-Z,每个字母用一个 7×5 的、由 C. 组成的矩阵构成。最后在一行中给出一个句子,以回车结束。句子是由若干个单词(每个包含不超过 10 个连续的大写英文字母)组成的,单词间以任何非大写英文字母分隔。

题目保证至少给出一个单词。

输出格式:

对每个单词,将其每个字母用矩阵形式在一行中输出,字母间有一列空格分隔。单词的首尾不得有多余空格。

相邻的两个单词间必须有一空行分隔。输出的首尾不得有多余空行。

输入样例:

(太长了……略过),最后一行:

HELLO~WORLD!

输出样例:

C...C CCCCC C.... C.... .CCC.
C...C C.... C.... C.... C...C
C...C C.... C.... C.... C...C
CCCCC CCCC. C.... C.... C...C
C...C C.... C.... C.... C...C
C...C C.... C.... C.... C...C
C...C CCCCC CCCCC CCCCC .CCC.

C...C .CCC. CCCC. C.... CCCC.
C...C C...C C...C C.... C...C
C...C C...C CCCC. C.... C...C
C.C.C C...C CC... C.... C...C
CC.CC C...C C.C.. C.... C...C
C...C C...C C..C. C.... C...C
C...C .CCC. C...C CCCCC CCCC.

解题思路:

每个大字母的形状可以用二维数组保存,用一个结构数组来保存26个字母的形状。先用一个函数读取每个大字母的形状,注意在每一行的最后面有个回车,可以用getchar()把它读掉。

输出也可以用函数来处理,把保存形状的结构数组、要输出的字符串和字符串长度作为参数传进去。用大写字母减去'A',就得到了结构数组的下标。先打印每个字母的第一行,再打印每个字母的第二行……以此类推,注意大字母间的空格,每行输出完成之后要换行。这样就能得到符合要求的结果了。

还有个问题就是处理字符窜之间的空行要求,我是用flag来判断输出的是否第一个字符串,除了一个字符串,其他的都在输出之前空行,这样就不会在结尾有多余的空行了。

更多的测试数据:

%%^^HELLO

HELLO~~##

HELLOowWORLD

~~--HELLO((^WORLD$$%

如果格式都没问题,那应该就能成功了。

#include <stdio.h>

typedef struct node *PtrC;
typedef struct node {
	char item[7][5];
} BigChar;

void ReadBigChar(PtrC template) {
	for ( int row=0; row<7; ++row ) {
		for ( int col=0; col<5; ++col ) {
			template->item[row][col] = getchar();
		}
		getchar();
	}
}

void Print(BigChar template[], char *str, int len) {
	int row, col, i;
	for ( row=0; row<7; ++row ) {
		for ( i=0; i<len; ++i ) {
			if ( i != 0 ) putchar(' ');
			for ( col=0; col<5; ++col )
				printf("%c", template[str[i]-'A'].item[row][col]);
		}
		if ( row != 6 ) putchar('\n');
	}
}

int main(int argc, const char *argv[]) {
	int i, flag;
	char c, str[12];
	BigChar template[26];
	for ( i=0; i<26; ++i )
		ReadBigChar(&template[i]);

	flag = i = 0;
	while ( (c = getchar()) != '\n' ) {
		if ( c >= 'A' && c <= 'Z' ) {
			str[i++] = c;
		} else {
			str[i] = 0;
			if ( i > 0 ) {
				flag ? printf("\n\n") : (flag = 1);
				Print(template, str, i);
			}
			i = 0;
		}
	}
	str[i] = 0;
	if ( i > 0 ) {
		flag ? printf("\n\n") : (flag = 1);
		Print(template, str, i);
	}

	return 0;
}

猜你喜欢

转载自blog.csdn.net/herbertyellow/article/details/127025352