「PAT乙级真题解析」Basic Level 1109 擅长C (问题分析+完整步骤+伪代码描述+提交通过代码)

题设给定26个英文字母的输出格式, 然后给定几个单词(由非大写英文字母隔开), 要求用给定的输出格式输出这些英文单词。 那么事情就简单了, 如果我们只看后半部分的话, 那基本就相当于`if char == 'A': print('A')`的级别了, 只是现在给定了各个英文字母的输出格式, 所以是`if word == "HELLO": print(指定格式("HELLO"))`。 所以重点在于将指定的输出格式存储下来, 然后在最后检查英文句子的时候输出.

#c语言#算法#pat考试#数据结构#需求分析

Table of Contents

乙级的题目训练主要用来熟悉编程语言的语法和形成良好的编码习惯和编码规范。从小白开始逐步掌握用编程解决问题。

PAT (Basic Level) Practice 1109 擅长C

问题分析

  • 题设给定26个英文字母的输出格式, 然后给定几个单词(由非大写英文字母隔开), 要求用给定的输出格式输出这些英文单词。
  • 那么事情就简单了, 如果我们只看后半部分的话, 那基本就相当于if char == 'A': print('A')的级别了,
  • 只是现在给定了各个英文字母的输出格式, 所以是if word == "HELLO": print(指定格式("HELLO"))
  • 所以重点在于将指定的输出格式存储下来, 然后在最后检查英文句子的时候输出.

输出形式的存储

  • 单个字母的输出格式是7行5列的矩阵, 需要用二维数据存储
  • 存储26个字母也需要一维数组
  • 所以是一维数组的元素是二维数组, 相当于需要三维数组存储.

如何输出一个单词

  • 由于每一个字母都是7行5列的矩阵, 所以只要知道要输出的整个单词就可以输出. 方式如下:
    • (以"HI"为例)
    • 先输出"H"的第1行, 然后输出空格" ", 再输出"I"的第1行
    • 先输出"H"的第2行, 然后输出空格" ", 再输出"I"的第2行
    • ......
    • 先输出"H"的第7行, 然后输出空格" ", 再输出"I"的第7行

完整描述步骤

  1. 获取输入: 26个英文字母的输出格式, 英文句子
  2. 初始化记录器:
    • 上一个字符 = '@'
    • 当前单词起始位置 = 0
  3. 对于英文句子中的每一个索引位置:
    • 如果 当前索引位置的字符是大写英文字母 且 上一个字符不是大写英文字母:

      • 设置 当前单词起始位置 = 当前索引位置
    • 如果 当前索引位置的字符不是大写英文字母 且 上一个字符是大写英文字母:

      • (说明到达一个单词的末尾之后的位置)
      • 调用输出方法, 输出索引从「当前单词起始位置」到「当前索引的上一个位置」的内容
    • 上一个字符 = 当前索引位置字符

伪代码描述

  1. get input: figures of alphabet, sentence
  2. init recorder:
    • last_char = '@';
    • word_start_index = 0;
    • printed_word_count = 0;
  3. for current_index, char in sentence:
    • if 'A' <= char <= 'Z' and not ('A' <= last_char <= 'Z'):

      • word_start_index = current_index;
    • if not ('A' <= char <= 'Z') and 'A' <= last_char <= 'Z':

      • if printed_word_count > 0:
        • print("\n");
      • print_word(sentence, word_start_index, current_index);
      • printed_word_count++;
    • last_char = char;

注意事项

  1. 输入的句子可能用空格来分隔单词 (测试点0之外的测试点1, 2, 3, 4都有空格)
  2. 使用fgets读取输入时注意处理换行符。

完整提交代码

/*
# 问题分析
题设给定26个英文字母的输出格式, 然后给定几个单词(由非大写英文字母隔开), 要求用给定的输出格式输出这些英文单词。
那么事情就简单了, 如果我们只看后半部分的话, 那基本就相当于`if char == 'A': print('A')`的级别了,
只是现在给定了各个英文字母的输出格式, 所以是`if word == "HELLO": print(指定格式("HELLO"))`。
所以重点在于将指定的输出格式存储下来, 然后在最后检查英文句子的时候输出.
 
## 输出形式的存储
- 单个字母的输出格式是7行5列的矩阵, 需要用二维数据存储
- 存储26个字母也需要一维数组
- 所以是一维数组的元素是二维数组, 相当于需要三维数组存储.
 
## 如何输出一个单词
- 由于每一个字母都是7行5列的矩阵, 所以只要知道要输出的整个单词就可以输出. 方式如下:
    - (以"HI"为例)
    - 先输出"H"的第1行, 然后输出空格" ", 再输出"I"的第1行
    - 先输出"H"的第2行, 然后输出空格" ", 再输出"I"的第2行
    - ......
    - 先输出"H"的第7行, 然后输出空格" ", 再输出"I"的第7行
 
 
# 完整描述步骤
1. 获取输入: 26个英文字母的输出格式, 英文句子
2. 初始化记录器:
    - 上一个字符 = '@'
    - 当前单词起始位置 = 0
3. 对于英文句子中的每一个索引位置:
    - 如果 当前索引位置的字符是大写英文字母 且 上一个字符不是大写英文字母:
        - 设置 当前单词起始位置 = 当前索引位置
    - 如果 当前索引位置的字符不是大写英文字母 且 上一个字符是大写英文字母:
        - (说明到达一个单词的末尾之后的位置)
        - 调用输出方法, 输出索引从「当前单词起始位置」到「当前索引的上一个位置」的内容
 
    - 上一个字符 = 当前索引位置字符
 
# 伪代码描述
1. get input: figures of alphabet, sentence
2. init recorder:
    - last_char = '@';
    - word_start_index = 0;
    - printed_word_count = 0;
3. for current_index, char in sentence:
    - if 'A' <= char <= 'Z' and not ('A' <= last_char <= 'Z'):
        - word_start_index = current_index;
    - if not ('A' <= char <= 'Z') and 'A' <= last_char <= 'Z':
        - if printed_word_count > 0:
            - print("\n");
        - print_word(sentence, word_start_index, current_index);
        - printed_word_count++;
    
    - last_char = char;
 
# 注意事项
1. 输入的句子可能用空格来分隔单词 (测试点0之外的测试点1, 2, 3, 4都有空格)
2. 使用fgets读取输入时注意处理换行符。
 
*/
 
 
# include<stdio.h>
char figures[26][7][6];
 
void print_word(char* sentence, int start_index, int end_index){
    for (int row = 0; row < 7; row++){
        for (int col = start_index; col < end_index; col++){
            if (col != start_index){
                printf(" ");
            }
            printf("%s", figures[sentence[col] - 'A'][row]);
        }
        printf("\n");
    }
}
 
int is_upper_alphabet(char char_to_check){
    if ('A' <= char_to_check && char_to_check <= 'Z'){
        return 1;
    }
 
    return 0;
}
 
 
int main(){
    char sentence[10000];
 
    for (int i = 0; i < 26; i++){
        for (int j = 0; j < 7; j++){
            scanf("%s\n", figures[i][j]);
        }
    }
 
    fgets(sentence, 10000, stdin);
    char last_char = '@';
    int word_start_index = 0;
    int printed_word_count = 0;
    for (int i = 0; sentence[i]; i++){
        if (is_upper_alphabet(sentence[i]) && !is_upper_alphabet(last_char)){
            word_start_index = i;
        }
 
        if (!is_upper_alphabet(sentence[i]) && is_upper_alphabet(last_char)){
            if (printed_word_count > 0){
                printf("\n");
            }
 
            print_word(sentence, word_start_index, i);
            printed_word_count++;
        }
        
        last_char = sentence[i];
    }
    return 0;
}
「PAT乙级真题解析」Basic Level 1109 擅长C (问题分析+完整步骤+伪代码描述+提交通过代码) | 生活糖果