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

PTA 乙级 Basic Level 1009

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

Table of Contents

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

PTA 乙级 Basic Level 1009

问题分析

题目给定一句英语, 要输出这句英语中所有单词的顺序颠倒后的内容. 我们先来明确两个概念(如果是在业务开发中, 那么就是明确我们本次功能涉及的对象以及功能概念)

"单词"

如果判断句子中的某个单词? 当我们说"Hello World Here I Come"中包含5个单词"Hello", "World", "Here", "I", "Come" 我们其实在说, 以空格分隔的五个字符串。 比如"sadhacias sadjioancio asjdioajd"这里有三个单词: "sadhacias", "sadjioancio", "asjdioajd" 尽管你可能不认识这三个单词, 或者甚至他们在英语字典中找不到, 但是在这个题目设定下, 就是我们所谓的"单词"

"顺序颠倒"

"Hello", "World", "Here", "I", "Come"在句子中从左到右出现的次序是: 1, 2, 3, 4, 5 顺序颠倒则意味着这5个单词在输出结果中出现的次序要是5, 4, 3, 2, 1

步骤描述

厘清我们要逻辑要涉及的对象以及要输出的结果形式之后, 我们可以将步骤描述如下:

  1. 找出语句中的单词
    • 找到空格, 两个空格之间的部分, 第一个空格和句首之间的部分, 最后一个空格到句尾的部分, 认为是一个单词
  2. 标记五个单词的次序
  3. 颠倒五个单词的次序
  4. 按照颠倒后的次序以空格连接各个单词, 连接后的内容作为答案输出

将步骤以更贴近编程语言的形式描述, 如下:

  1. 对给定的英文句子进行循环:

    • 如果找到空格, 则该空格与上一个空格之间的部分是一个单词
      • 如果找到的空格是第一个空格, 则从开头到这个空格之前一个字符的内容是一个单词
    • 循环结束后, 最后一个出现的空格之后的第一个字符到句子末尾的部分是一个单词
  2. 次序指单词出现的先后, 所以按照循环过程中先找到先存, 存完之后从存储的那组字符串末尾开始输出, 使得输出顺序和查找/出现/存储顺序相反, 即可达到颠倒次序的目的

(也可以不用存, 直接从句子后面开始循环, 找到之后当即输出, 由于输出之后不会再使用到这个单词, 也就不需要存储; 【原则: 数据存储是为了数据使用】)

完整提交代码

/*
问题分析:
题目给定一句英语, 要输出这句英语中所有单词的顺序颠倒后的内容.
我们先来明确两个概念(需要在业务开发中, 那么就是明确我们本次功能涉及的对象以及功能概念)
"单词"
如果判断句子中的某个单词?
当我们说"Hello World Here I Come"中包含5个单词"Hello", "World", "Here", "I", "Come"
我们其实在说, 以空格分隔的五个字符串。
比如"sadhacias sadjioancio asjdioajd"这里有三个单词: "sadhacias", "sadjioancio", "asjdioajd"
尽管你可能不认识这三个单词, 或者甚至他们在英语字典中找不到, 但是在这个题目设定下, 就我们所谓的"单词"
 
"顺序颠倒"
"Hello", "World", "Here", "I", "Come"在句子中从左到右出现的次序是: 1, 2, 3, 4, 5
顺序颠倒则意味着这5个单词在输出结果中出现的次序要是5, 4, 3, 2, 1
 
厘清我们要逻辑要涉及的对象以及要输出的结果形式之后, 我们可以将步骤描述如下:
1. 找出语句中的单词
    - 找到空格, 两个空格之间的部分, 第一个空格和句首之间的部分, 最后一个空格到句尾的部分, 认为是一个单词
2. 标记五个单词的次序
3. 颠倒五个单词的次序
4. 按照颠倒后的次序以空格连接各个单词, 连接后的内容作为答案输出
 
 
将步骤以更贴近编程语言的形式描述, 如下:
1. 对给定的英文句子进行循环:
    - 如果找到空格, 则该空格与上一个空格之间的部分是一个单词
        - 如果找到的空格是第一个空格, 则从开头到这个空格之前一个字符的内容是一个单词
    - 循环结束后, 最后一个出现的空格之后的第一个字符到句子末尾的部分是一个单词
 
2. 次序指单词出现的先后, 所以按照循环过程中先找到先存, 存完之后从存储的那组字符串末尾开始输出,
    使得输出顺序和查找/出现/存储顺序相反, 即可达到颠倒次序的目的
(也可以不用存, 直接从句子后面开始循环, 找到之后当即输出, 由于输出之后不会再使用到这个单词, 也就不需要存储; 【原则: 数据存储是为了数据使用】)
 
 
*/
 
# include<stdio.h>
 
int main(){
    char content[100];
    gets(content);
 
    int content_length = 0;
    for (; content[content_length];){
        content_length ++;
    }
 
    int end_of_word = content_length;
    int start_of_word = 0;
    for (int i = content_length - 1; i >= 0; i--){
        if (content[i] == ' '){
            start_of_word = i + 1;
            for (int j = start_of_word; j < end_of_word; j++){
                printf("%c", content[j]);
            }
            printf(" ");
            end_of_word = i;
        }
    }
 
    for (int j = 0; j < end_of_word; j++){
        printf("%c", content[j]);
    }
 
    printf("\n");
    return 0;
}