我的代码:
#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; // 输出结果
}
这段代码的思路是根据输入的字符串,解析指令并计算出最终的坐标
-
头文件:
#include <iostream>
:用于输入输出操作#include <string>
:用于处理字符串相关操作#include <vector>
:用于存储动态数组(容器)
-
主函数初始化:
string s
:存储输入的字符串cin >> s
:输入一个字符串int len = s.size()
:获取输入字符串的长度vector<string> str
:存储分割后的指令部分int x = 0, y = 0
:初始化坐标(x, y)为 (0, 0)int sublen = 0
:用于记录当前指令的长度
-
分割字符串:
- 遍历输入的字符串
s
:- 如果当前字符不是分隔符
;
,就说明指令还在继续,sublen
增加 - 如果遇到分隔符
;
,就从当前指针回溯sublen
个字符,提取出指令子字符串,并存入str
容器 - 每次遇到
;
都重置sublen
,继续处理下一个指令
- 如果当前字符不是分隔符
- 遍历输入的字符串
-
解析指令:
- 遍历
str
中的每个指令:- 如果指令长度是3且第二、第三个字符是数字(例如 "A12"),就提取这两个数字组成一个整数
num
- 如果指令长度是2且第二个字符是数字(例如 "A5"),就直接提取该数字
- 如果指令长度是3且第二、第三个字符是数字(例如 "A12"),就提取这两个数字组成一个整数
- 根据指令的第一个字符 (
str[i][0]
) 来判断移动方向:'A'
表示向左移动,x -= num
'D'
表示向右移动,x += num
'S'
表示向下移动,y -= num
'W'
表示向上移动,y += num
- 遍历
-
输出结果:
cout << x << ',' << y << endl;
:输出最终的坐标
代码功能:
- 输入字符串形式的指令(如 "A10;D20;S5;W8"),每个指令用分号
;
分隔。指令的格式类似于:'A'
、'D'
、'S'
、'W'
代表方向- 后面跟一个或两个数字,表示移动的步数
- 程序解析这些指令并计算出最终的
(x, y)
坐标,并输出
continue;
语句用于循环结构中(如 for
、while
、do-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
语句
注意事项:
break
不会跳出所有循环:break
只会跳出当前所在的循环结构,若有嵌套循环,需要使用标签(goto
)或其他方法来跳出外层循环break
在switch
中是必须的:如果没有break
,程序会“贯穿”到下一个case
,直到遇到break
或switch
结束