題目内容:
萌萌哒表情符号通常由“手”、“眼”、“口”三個主要部分組成。簡單起見,我們假設一個表情符号是按下列格式輸出的:[左手]([左眼][口][右眼])[右手]
現給出可選用的符号集合,請你按使用者的要求輸出表情。
輸入格式:
輸入首先在前三行順序對應給出手、眼、口的可選符号集。每個符号括在一對方括号[]内。題目保證每個集合都至少有一個符号,并不超過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? @\/@
思路分析:
這道題需要注意的兩點:
1、方括号之外會有其他幹擾符号,包括空格和…等。且标記表情的符号時‘[]’,這根scanf的掃描集标記符号沖突,無法用掃描集讀取是以錄入資料要用getchar一個一個處理。
2、Are you kidding me? @\/@這句的反斜杠輸出要用兩個反斜杠, @\/@
代碼:
#include <stdio.h>
#include <string.h>
char *pump(char a[]) // 表情提取函數,識别開始的'[' ,記錄表情,到']'結束,遇到換行符表示錄入結束,傳回NULL
{
char c = ;
memset(a, , );
while ((c = getchar()) != '[')
if (c == '\n') return NULL;
for (int i = ; (c = getchar()) != ']'; i++)
a[i] = c;
return a;
}
int store(char db[][], char a[]) // 存儲讀取到的表情,并傳回讀到的表情個數因為個數從0開始記,傳回i-1
{
int i = ;
for (; pump(a) != NULL; i++)
strcpy(db[i], a);
return i - ;
}
void print(char db[][][], int size[]) // 讀取請求并輸出表情
{
int a[], tag = ;
for (int i = ; i < ; i++) { // 讀取一組表情請求的序号
scanf("%d", a+i);
a[i] -= ; // 同樣的,轉換為0開始的序号
if (a[i] > size[i] || a[i] < ) tag = ; // 遇到不存在的序号,标記tag為0
}
if (tag) // 根據請求的序号是否全存在,選擇輸出模式
printf("%s(%s%s%s)%s\n", db[][a[]], db[][a[]], db[][a[]], db[][a[]], db[][a[]]);
// db為表情存儲數組,根據序号選擇對應表情
else
printf("Are you kidding me? @\\/@\n");
}
int main()
{
char a[], db[][][] = {};
int n, size[] = {};
for (int i = ; i < ; i++)
size[i] = store(db[i], a); // 根據store函數傳回的值,記錄改組表情的個數,進而判斷請求是否合理
size[] = size[], size[] = size[]; // 因為兩隻眼睛,兩隻手,是以3和4的可選範圍與左邊對稱
scanf("%d", &n);
for (int i = ; i < n; i++) // 輸出n次請求的表情
print(db, size);
return ;
}
點這裡進入試題網頁