【华为od刷题(C++)】HJ17 坐标移动(continue语句、break语句)

我的代码:

#include <iostream>//用于输入输出
#include <string>//用于处理字符串
#include <vector>//用于存储动态数组

using namespace std;

int main() {
    string s;//用于存储输入的字符串
    cin >> s;// 输入字符串
    int len = s.size();//获取字符串的长度

    vector<string> str;
    //用来存储从输入字符串中提取出的子字符串(每个指令部分)

    int x = 0, y = 0;// 设置初始坐标
    int sublen = 0;//用于记录当前指令的长度

    for (int i = 0; i < len; i++) {
    //循环遍历输入的字符串
        if (s[i] != ';') {
            sublen++;
            //当字符不是分隔符 ; 时,说明当前指令还在继续,增加子字符串的长度
            continue;
            //continue; 语句用于循环结构中(如 for、while、do-while)
            //它的作用是跳过当前循环的剩余部分,直接进入下一次循环的判断和执行
        } else {
            string substrs = s.substr(i - sublen, sublen);
            //从字符串 s 中提取出一个以 i - sublen 为起始位置,长度为 sublen 的子字符串
            //并将其存储在 substrs 中
            str.push_back(substrs);
            //将 substrs 变量中的子字符串添加到 str 这个 vector<string> 容器的末尾
            sublen = 0;
            //遇到分隔符 ; 时,截取之前积累的指令并存入 str 数组,然后重置 sublen
        }
    }
    for (int i = 0; i < str.size();i++) { 
    // 对于每个子字符串分情况讨论
        int num = 0;
        if ((str[i].size() == 3) && (str[i][1] >= '0') && (str[i][1] <= '9') && (str[i][2] >= '0') && (str[i][2] <= '9')) {
            //子字符串长度为3且第二、第三个字符为数字
            num = (str[i][1] - '0') * 10 + (str[i][2] - '0');
            //将这两个数字字符转换为整数并组成一个两位数
        }
        if ((str[i].size() == 2) && (str[i][1] >= '0') && (str[i][1] <= '9')) {
        //子字符串长度为2且第二个字符为数字
            num = str[i][1] - '0';
        }
        switch (str[i][0]) { 
            //使用了 switch 语句,根据 str[i][0] 的值来执行不同的操作
            case 'A':
            x -= num;
            break;

            case 'D':
            x += num;
            break;

            case 'S':
            y -= num;
            break;

            case 'W':
            y += num;
            break;

            default:
            break;
//break:一旦匹配到某个 case 后,会执行 case 下的代码,然后通过 break 跳出 switch 语句
//如果没有 break,会继续执行下一个 case 直到遇到 break 或 switch 语句结束
        }
    }
    cout << x << ',' << y << endl; // 输出结果
}

这段代码的思路是根据输入的字符串,解析指令并计算出最终的坐标

  1. 头文件

    • #include <iostream>:用于输入输出操作
    • #include <string>:用于处理字符串相关操作
    • #include <vector>:用于存储动态数组(容器)
  2. 主函数初始化

    • string s:存储输入的字符串
    • cin >> s:输入一个字符串
    • int len = s.size():获取输入字符串的长度
    • vector<string> str:存储分割后的指令部分
    • int x = 0, y = 0:初始化坐标(x, y)为 (0, 0)
    • int sublen = 0:用于记录当前指令的长度
  3. 分割字符串

    • 遍历输入的字符串 s
      • 如果当前字符不是分隔符 ;,就说明指令还在继续,sublen 增加
      • 如果遇到分隔符 ;,就从当前指针回溯 sublen 个字符,提取出指令子字符串,并存入 str 容器
      • 每次遇到 ; 都重置 sublen,继续处理下一个指令
  4. 解析指令

    • 遍历 str 中的每个指令:
      • 如果指令长度是3且第二、第三个字符是数字(例如 "A12"),就提取这两个数字组成一个整数 num
      • 如果指令长度是2且第二个字符是数字(例如 "A5"),就直接提取该数字
    • 根据指令的第一个字符 (str[i][0]) 来判断移动方向:
      • 'A' 表示向左移动,x -= num
      • 'D' 表示向右移动,x += num
      • 'S' 表示向下移动,y -= num
      • 'W' 表示向上移动,y += num
  5. 输出结果cout << x << ',' << y << endl;:输出最终的坐标

代码功能:

  • 输入字符串形式的指令(如 "A10;D20;S5;W8"),每个指令用分号 ; 分隔。指令的格式类似于:
    • 'A''D''S''W' 代表方向
    • 后面跟一个或两个数字,表示移动的步数
  • 程序解析这些指令并计算出最终的 (x, y) 坐标,并输出

continue; 语句用于循环结构中(如 forwhiledo-while),它的作用是跳过当前循环的剩余部分,直接进入下一次循环的判断和执行

工作原理:

当程序执行到 continue; 时,控制流会跳到循环的下一次迭代,具体来说:

  • 在 for 循环 中,continue 会跳到循环条件的判断部分,决定是否进行下一轮循环
  • 在 while 和 do-while 循环 中,continue 会直接跳到循环条件的判断部分

在 for 循环中:

#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 5; i++) {
        if (i == 3) {
            continue;  // 跳过 i == 3 时的输出
        }
        cout << "i = " << i << endl;
    }
    return 0;
}

输出:

i = 1
i = 2
i = 4
i = 5

解释:

  • 当 i == 3 时,continue 会跳过 cout 语句,导致 3 不被输出,程序继续循环,打印 4 和 5

在 while 循环中:

#include <iostream>
using namespace std;

int main() {
    int i = 1;
    while (i <= 5) {
        if (i == 3) {
            i++;  // 手动增加 i 以避免无限循环
            continue;  // 跳过 i == 3 时的输出
        }
        cout << "i = " << i << endl;
        i++;
    }
    return 0;
}

输出:

i = 1
i = 2
i = 4
i = 5

解释:

  • 当 i == 3 时,continue 跳过当前迭代,跳到下一轮 while 循环,并且不会执行 cout 语句

注意:

  • continue 只能用在循环中
  • 它并不会结束整个循环,而是跳过当前的迭代,直接进入下一次判断
  • continue 的位置通常是循环体内的某些条件语句中,用来避免执行某些不需要的代码

break 语句用于立即终止当前的循环或 switch 语句,并跳出该结构;它通常在特定条件下使用,跳出循环或 switch,使程序控制流继续执行循环外的代码

在 for 循环中:

#include <iostream>
using namespace std;

int main() {
    for (int i = 1; i <= 5; i++) {
        if (i == 3) {
            break;  // 当 i == 3 时跳出循环
        }
        cout << "i = " << i << endl;
    }
    cout << "Loop ended." << endl;
    return 0;
}
i = 1
i = 2
Loop ended.

解释:

  • 当 i == 3 时,break 语句被触发,立即终止循环,跳出 for 循环,后面的 cout 语句不再执行,直接执行 cout << "Loop ended."

在 while 循环中:

#include <iostream>
using namespace std;

int main() {
    int i = 1;
    while (i <= 5) {
        if (i == 4) {
            break;  // 当 i == 4 时跳出循环
        }
        cout << "i = " << i << endl;
        i++;
    }
    cout << "Loop ended." << endl;
    return 0;
}

输出:

i = 1
i = 2
i = 3
Loop ended.

解释:

  • 当 i == 4 时,break 会跳出 while 循环,后面的循环体不再执行,直接跳到 cout << "Loop ended."

在 switch 语句中:

#include <iostream>
using namespace std;

int main() {
    int n = 2;

    switch (n) {
        case 1:
            cout << "n is 1" << endl;
            break;  // 跳出 switch 语句
        case 2:
            cout << "n is 2" << endl;
            break;  // 跳出 switch 语句
        default:
            cout << "n is something else" << endl;
            break;
    }
    
    return 0;
}

输出:

n is 2

解释:

  • 当 n == 2 时,匹配到 case 2,执行对应代码 cout << "n is 2" << endl;,然后遇到 break 语句跳出 switch,防止继续执行后续的 case 语句

注意事项:

  1. break 不会跳出所有循环break 只会跳出当前所在的循环结构,若有嵌套循环,需要使用标签(goto)或其他方法来跳出外层循环
  2. break 在 switch 中是必须的:如果没有 break,程序会“贯穿”到下一个 case,直到遇到 break 或 switch 结束
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值