萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:
[左手]([左眼][口][右眼])[右手]
现给出可选用的符号集合,请你按用户的要求输出表情。
输入格式:
输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号 []
内。题目保证每个集合都至少有一个符号,并不超过 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;
}
//字符串该如何处理?