【2019冬PAT乙级真题】7-4 擅长C (20分)

7-4 擅长C (20分)

当你被面试官要求用 C 写一个“Hello World”时,有本事像下图显示的那样写一个出来吗?
题目原图
输入格式:
输入首先给出 26 个英文大写字母 A-Z,每个字母用一个 7 的、由 C 和 . 组成的矩阵构成。最后在一行中给出一个句子,以回车结束。句子是由若干个单词(每个包含不超过 10 个连续的大写英文字母)组成的,单词间以任何非大写英文字母分隔。
题目保证至少给出一个单词。

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

输入样例:
…C…
.C.C.
C…C
CCCCC
C…C
C…C
C…C
CCCC.
C…C
C…C
CCCC.
C…C
C…C
CCCC.
.CCC.
C…C
C…
C…
C…
C…C
.CCC.
CCCC.
C…C
C…C
C…C
C…C
C…C
CCCC.
CCCCC
C…
C…
CCCC.
C…
C…
CCCCC
CCCCC
C…
C…
CCCC.
C…
C…
C…
CCCC.
C…C
C…
C.CCC
C…C
C…C
CCCC.
C…C
C…C
C…C
CCCCC
C…C
C…C
C…C
CCCCC
…C…
…C…
…C…
…C…
…C…
CCCCC
CCCCC
…C
…C
…C
…C
C…C
.CCC.
C…C
C…C.
C.C…
CC…
C.C…
C…C.
C…C
C…
C…
C…
C…
C…
C…
CCCCC
C…C
C…C
CC.CC
C.C.C
C…C
C…C
C…C
C…C
C…C
CC…C
C.C.C
C…CC
C…C
C…C
.CCC.
C…C
C…C
C…C
C…C
C…C
.CCC.
CCCC.
C…C
C…C
CCCC.
C…
C…
C…
.CCC.
C…C
C…C
C…C
C.C.C
C…CC
.CCC.
CCCC.
C…C
CCCC.
CC…
C.C…
C…C.
C…C
.CCC.
C…C
C…
.CCC.
…C
C…C
.CCC.
CCCCC
…C…
…C…
…C…
…C…
…C…
…C…
C…C
C…C
C…C
C…C
C…C
C…C
.CCC.
C…C
C…C
C…C
C…C
C…C
.C.C.
…C…
C…C
C…C
C…C
C.C.C
CC.CC
C…C
C…C
C…C
C…C
.C.C.
…C…
.C.C.
C…C
C…C
C…C
C…C
.C.C.
…C…
…C…
…C…
…C…
CCCCC
…C
…C.
…C…
.C…
C…
CCCCC
HELLO~WORLD!

输出样例:
输出样例
这道题神坑,重点在于输出和存储上,曾想过用vector三维数组存储,但是发现自己怎么也写不出三维数组的定义,后来也尝试过能不能把vector二维数组放进结构体里,最后也是失败了……再后来想到能不能用vectoer二维数组带’[ 26 ]’这种括号的形式去存,编译过了,但是运行的时候发现直接out round系统崩了……最后的最后我发现,使用struct结构体node,体内定义一个char型二维数组arr再配合上main函数里的vector可以说完美解决存储问题,存储结束后,注意对输入字符串的处理,题干表名,除了大写字符之外的字符都为类似于分隔符之类的东西,我选择遍历s,将!isupper(s[i])的所有字符都变为空格,然后使用stringstream流处理,依次读入单词,为了方便后面控制输出格式,我采用了cnt计数,虽然这里略显繁琐,但是这是目前想到最好的办法,因为vector里存的是0-25的索引,所以,选择用index存储每个单词中每个字母的int型索引值,记得转小写。坑点:题目要求的输出是横向输出,也就是说对于循环的控制需要重新构思,不能按照正常思路对每一个字母输出了,我最后选择使用以7行为最外层循环,第二层循环是当前单词每一个字母,将其index求出后,第三层循环用来输出,这样,就变成了对于将这个单词对饮的二维数组一行一行输出,而不是一个单词一个单词的输出,题干说要求每两个单词之间要有空格,刚好,在第三层循环结束的时候,即一个字母的第i行输出结束后,如果当前列数不等于4,那么输出空格即可,对于空行的输出,因为7行中的每一行输出结束后都需要有一个空行,但是最后一个单词后不能有多于空行,我这里这样来表示“如果当前单词不是最后一个单词,可以输出回车,就算当前是最后一个单词,那么只要满足当前行数不等于6也可以输出换行”表示成代码就是这样if(key != cnt || i != 6) cout<<endl;“,至此题干还要求每两个单词间需要一个空行,其实就是需要两个回车,我们现在只有一个回车,所以,在一个单词输出结束后,只要不是最后一个单词,在输出一次换行即可

#include<iostream>
#include<vector>
#include<sstream>
#include<cctype> //大小写字母转换
using namespace std;
struct node{
    char arr[7][5];
};
int main() {
    node temp;
    vector<node> vt;
    for (int i = 0; i < 26; ++i) {
        for (int j = 0; j < 7; ++j) {
            for (int k = 0; k < 5; ++k) {
                cin >> temp.arr[j][k];
            }
        }
        vt.push_back(temp);
    }
    string s;
    cin >> s;
    for (int i = 0; i < s.length(); ++i) {
        if (!isupper(s[i]))
            s[i] = ' ';
    }
    stringstream ss(s);
    string a;
    int cnt = 0;
    while (ss >> a) cnt++;
    stringstream ss1(s);
    string b;
    int key = 0;
    while (ss1 >> b) {
        key++;
        for (int i = 0; i < 7; ++i) {
            for (int j = 0; j < b.length(); ++j) {
                int index = tolower(b[j]) - 'a';
                int k;
                for (k = 0; k < 5; ++k) {
                    cout << vt[index].arr[i][k];
                }
                if (k != 4) cout << ' ';
            }
            if (key != cnt || i != 6) cout << endl;
        }
        if (key != cnt) {
            cout << endl;
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苯酸氨酰糖化物

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值