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

又是一道给出了明确规则/步骤的题目, 需要做的是明晰这些规则和步骤, 然后用编程语言进行描述。 题设给了四个字符串, 并说明了前两行需要一起使用, 后两行需要一起使用。

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

Table of Contents

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

PAT乙级BasicLevelPractice 1014

问题分析

又是一道给出了明确规则/步骤的题目, 需要做的是明晰这些规则和步骤, 然后用编程语言进行描述

明确规则

题设给了四个字符串, 并说明了前两行需要一起使用, 后两行需要一起使用。

  1. 找出前两行第1对相同的大写英文字母.
  2. (题目说明了, 相同的大写字母在字母表的位次代表了约会在一个星期中的位次。题目没说明如果字母表位置超过了7该怎么对应到星期上, 这里先盲猜测除以7取余或者只有前7个字母有效。) 计算找到的第一对大写字母在字母表中的位置, 用它来表示约会时间在一周的第几天
  3. 找出前两行第2对相同的字符. 用它在(0-9, A-N)中的位次来表示约会时间在一天中的第几个钟头。
  4. 找出后面两对字符串第一对相同的英文字符在字符串中的位置(从0开始计数), 用它来表示一小时中的第几分钟

完整地描述出步骤

  1. 获取4串字符串
  2. 开始一个循环, 获取第一个字符串与第二个字符串相同位置的字符,
    • 如果两个字符相同, 且字符是大写英文字母之一, 则它代表了周几, 需要计算它是第几个大写英文字母.
  3. 继续刚才的循环, 如果两个字符相同, 且是0-9或者A-N这些字符之一,
    • 则它代表了几点约会
  4. 开始一个新的循环, 获取第三个字符串与第四个字符串相同位置的字符,
    • 如果两个字符相同, 则计算它在字符串中的位置次序(从0开始计算), 用它代表几分的时候约会
  5. 按照约定格式输出约会时间

伪代码描述步骤

  1. 读取4个字符串

  2. for 索引i (0 <= i < (前两个字符串长度的最小值)),

    • 记第一个字符串中第i个字符为s1[i], 第二个字符串中第i个字符为s2[i], 以此类推
    • if 还没找到第一对相同的大写英文字母 and s1[i] == s2[i] and s1[i] in A~Z, 则计算是第几个英文字母, 表示星期几
    • if 已经出现过一次字符相同的情况 and s1[i] == s2[i], 则计算它在09, AN的位置, 代表在第几个小时约会
  3. for 索引i (0 <= i < (后两个字符串长度的最小值)),

    • if s3[i] == s4[i], 则i就是表示在第i分钟的时候约会
  4. 格式化约会时间并输出

【实现上需要补充的细节】

  1. C语言中, 如何确定"一个字符在A-Z之中"
    • 可以直接使用字符比较, C语言会比较字符的ascii码值, 如果一个字符在A到Z之间, 它的ascii码值也会在A的码值和Z的码值之间.
  2. 对于表示"星期"的字母是只有前7个有效, 还是26个都有效(对7取余), 通过修改逻辑提交代码观察测试通过情况, 得到以下字符有效范围:
    • 表示星期的字母: A到G, 共7个字母
    • 表示小时的字母: 0到9, A到N 共24个字母
    • 表示分钟的字母: a到z, A到Z 共52个字母
  3. 输出要求的格式中, 4要表示成04, C语言中写为printf("%02d")
    • "2d"表示输出2位;
    • "%02d"表示输出2位, 不足2位的位置以"0"占位.

完整提交代码

/*
问题分析:
又是一道给出了明确规则/步骤的题目, 需要做的是明晰这些规则和步骤, 然后用编程语言进行描述
 
## 明确规则
题设给了四个字符串, 并说明了前两行需要一起使用, 后两行需要一起使用。
1. 找出前两行第1对相同的大写英文字母.
2. (题目说明了, 相同的大写字母在字母表的位次代表了约会在一个星期中的位次。题目没说明如果字母表位置超过了7该怎么对应到星期上, 这里先盲猜测除以7取余或者只有前7个字母有效。)
计算找到的第一对大写字母在字母表中的位置, 用它来表示约会时间在一周的第几天
3. 找出前两行第2对相同的字符. 用它在(0-9, A-N)中的位次来表示约会时间在一天中的第几个钟头。
4. 找出后面两对字符串第一对相同的英文字符在字符串中的位置(从0开始计数), 用它来表示一小时中的第几分钟
 
# 完整地描述出步骤
1. 获取4串字符串
2. 开始一个循环, 获取第一个字符串与第二个字符串相同位置的字符,
    - 如果两个字符相同, 且字符是大写英文字母之一, 则它代表了周几, 需要计算它是第几个大写英文字母.
3. 继续刚才的循环, 如果两个字符相同, 且是0-9或者A-N这些字符之一,
    - 则它代表了几点约会
4. 开始一个新的循环, 获取第三个字符串与第四个字符串相同位置的字符,
    - 如果两个字符相同, 则计算它在字符串中的位置次序(从0开始计算), 用它代表几分的时候约会
5. 按照约定格式输出约会时间
 
# 伪代码描述步骤
 
1. 读取4个字符串
2. for 索引i (0 <= i < (前两个字符串长度的最小值)),
    - 记第一个字符串中第i个字符为s1[i], 第二个字符串中第i个字符为s2[i], 以此类推
    - if 还没找到第一对相同的大写英文字母 and s1[i] == s2[i] and s1[i] in A~Z, 则计算是第几个英文字母, 表示星期几
    - if 已经出现过一次字符相同的情况 and s1[i] == s2[i], 则计算它在0~9, A~N的位置, 代表在第几个小时约会
3. for 索引i (0 <= i < (后两个字符串长度的最小值)),
    - if s3[i] == s4[i], 则i就是表示在第i分钟的时候约会
 
4. 格式化约会时间并输出
 
【实现上需要补充的细节】
1. C语言中, 如何确定"一个字符在A-Z之中"
    - 可以直接使用字符比较, C语言会比较字符的ascii码值, 如果一个字符在A到Z之间, 它的ascii码值也会在A的码值和Z的码值之间.
2. 对于表示"星期"的字母是只有前7个有效, 还是26个都有效(对7取余), 通过修改逻辑提交代码观察测试通过情况, 得到以下字符有效范围:
    - 表示星期的字母: A到G, 共7个字母
    - 表示小时的字母: 0到9, A到N 共24个字母
    - 表示分钟的字母: a到z, A到Z 共52个字母
3. 输出要求的格式中, 4要表示成04, C语言中写为printf("%02d")
	- "2d"表示输出2位; 
	- "%02d"表示输出2位, 不足2位的位置以"0"占位.
*/
 
int find_the_day(char *text_1, char *text_2)
{
    for (int i = 0; text_1[i] && text_2[i]; i++)
    {
        if (text_1[i] == text_2[i] && text_1[i] >= 'A' && text_1[i] <= 'G')
        {
            return (int)text_1[i] - (int)'A';
        }
    }
    return 0;
}
 
int find_the_hour(char *text_1, char *text_2)
{
    int i;
    for (i = 0; text_1[i] && text_2[i]; i++)
    {
        if (text_1[i] == text_2[i] && text_1[i] >= 'A' && text_1[i] <= 'G')
        {
            break;
        }
    }
 
    for (i = i + 1; text_1[i] && text_2[i]; i++)
    {
        if (text_1[i] == text_2[i])
        {
            if (text_1[i] >= '0' && text_1[i] <= '9')
            {
                return (int)text_1[i] - (int)'0';
            }
            if (text_1[i] >= 'A' && text_1[i] <= 'N')
            {
                return (int)text_1[i] - (int)'A' + 10;
            }
        }
    }
 
    return 0;
}
int find_the_minute(char *text_3, char *text_4)
{
    for (int i = 0; text_3[i] && text_4[i]; i++)
    {
        if (text_3[i] == text_4[i])
        {
            if ('a' <= text_3[i] && text_3[i] <= 'z')
            {
                return i;
            }
            if ('A' <= text_3[i] && text_3[i] <= 'Z')
            {
                return i;
            }
        }
    }
 
    return 0;
}
 
int main()
{
    char text[4][61];
    for (int i = 0; i < 4; i++)
    {
        scanf("%s\n", text[i]);
    }
 
    int day_idx = find_the_day(text[0], text[1]);
    int hour_idx = find_the_hour(text[0], text[1]);
    int minute_idx = find_the_minute(text[2], text[3]);
 
    char number_to_day_name[7][4] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};
    printf("%s %02d:%02d", number_to_day_name[day_idx], hour_idx, minute_idx);
}
「PAT乙级真题解析」Basic Level 1014 (问题分析+完整步骤+伪代码描述+提交通过代码) | 生活糖果