天天看點

PAT-B 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? @\/@
           

思路分析:

這道題需要注意的兩點:

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 ;
}
           

點這裡進入試題網頁