PAT 乙级 1052 卖个萌

本文深入探讨了如何通过算法生成个性化表情符号,包括输入解析、字符数组管理及异常处理等关键技术点,为表情符号的定制提供了实用的编程指导。

萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:

[左手]([左眼][口][右眼])[右手]

现给出可选用的符号集合,请你按用户的要求输出表情。

输入格式:

输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号 []内。题目保证每个集合都至少有一个符号,并不超过 10 个符号;每个符号包含 1 到 4 个非空字符。

之后一行给出一个正整数 K,为用户请求的个数。随后 K 行,每行给出一个用户的符号选择,顺序为左手、左眼、口、右眼、右手——这里只给出符号在相应集合中的序号(从 1 开始),数字间以空格分隔。

输出格式:

对每个用户请求,在一行中输出生成的表情。若用户选择的序号不存在,则输出 Are you kidding me? @\/@

输入样例:

[╮][╭][o][~\][/~]  [<][>]
 [╯][╰][^][-][=][>][<][@][⊙]
[Д][▽][_][ε][^]  ...
4
1 1 2 2 2
6 8 1 5 5
3 3 4 3 3
2 10 3 9 3

输出样例:

╮(╯▽╰)╭
<(@Д=)/~
o(^ε^)o
Are you kidding me? @\/@

这道题对我来说最大的难点就是怎么将这一系列字符给存成n行m列的字符数组,因为没有掌握字符数组的特性,所以一开始是建立了一维字符串数组,其实同二维字符数组是一样的。以建立二维字符数组为例,接下来需要做的就是分析输入的字符串,将“[”与“]”符号内包含的字符或字符串放置在取不同名称的二维字符数组内。根据行数便可以输出一整行的字符。、

getchar是读入函数的一种。它从标准输入里读取下一个字符,相当于getc(stdin)。返回类型为int型,为用户输入的ASCII码或EOF。 这一段加粗的部分来自百科,表示了getchar()函数的意思,char型的字符数组也可以存储int类型的变量,只要int类型是对应的ASCII码值,便会自动根据ASCII码值进行数字到字符的转换。还可以有(c=getchar())!='\n'的表达式。当一个表情输入完后,调整flag值,i++进入下一行,否则j++继续往下读直到另一个符号为‘]’为止。

两个问题值得注意,第一个是若输入的下标不正确怎么办,其中一个题目给出了示例,即下标为10,这时大于了最大值。但未考虑到下标小于1的情况,这是第一个值得注意的点。第二个是输出错误提示,其中‘/’符号无法被打出,因为这是转义符,不会被输出,需要再增加一个‘/’符号。

所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。(来自百科)

代码如下:

#include <iostream>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

using namespace std;

char hand[12][30];
char mouth[12][30];
char eye[12][30];

int get(char p[][30])
{
    int i=0,j=0,c;
    int count=0;
    int flag=0;
    while((c=getchar())!='\n')
    {
        if(c=='[')
        {
            flag=1;
            i++;
            j=0;
            count++;
        }//下标由1开始计算,方便对应
        else if(c==']')
        {
            flag=0;
            p[i][j]=0;
        }
        else
        {
            if(flag==1)
            {
                p[i][j]=c;
                j++;
            }
        }
    }
    return count;
}

int main()
{
    int len1,len2,len3;
    len1=get(hand);
    len2=get(eye);
    len3=get(mouth);
    int n;
    cin>>n;
    int h1,e1,m,e2,h2;
    while(n--)
    {
        cin>>h1>>e1>>m>>e2>>h2;
        if(h1>len1||h2>len1||e1>len2||e2>len2||m>len3)
        {
            cout<<"Are you kidding me? @\\/@"<<endl;
        }
        else if(h1<1||h2<1||e1<1||e2<1||m<1)
        {
            cout<<"Are you kidding me? @\\/@"<<endl;
        }
        else
        {
            cout<<hand[h1]<<"("<<eye[e1]<<mouth[m]<<eye[e2]<<")"<<hand[h2]<<endl;
        }
    }
    return 0;
}
//字符串该如何处理?

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值