第一版(0/21)
#include <iostream>
using namespace std;
string process1(string& a) {
for (char c : a) {
if ((c >= 'a' && c < 'z') || (c >= 'A' && c < 'Z')) {
c = c + 1;
} else if (c == 'z') {
c = 'A';
} else if (c == 'Z') {
c = 'a';
} else if (c >= '0' && c < '9') {
c = c + 1;
} else if (c == '9') {
c = '0';
}
}
return a;
}
string process2(string& b) {
for (char c : b) {
if ((c <= 'z' && c > 'a') || (c <= 'Z' && c > 'z')) {
c = c - 1;
} else if (c == 'A') {
c = 'z';
} else if (c == 'a') {
c = 'Z';
} else if (c <= '9' && c > '0') {
c = c - 1;
} else if (c == '0') {
c = '9';
}
}
return b;
}
int main() {
string s, t;
cin >> s;
cin >> t;
cout << process1(s) << endl;
cout << process2(t) << endl;
}
// 64 位输出请用 printf("%lld")
- 所有用例都没通过,第一怀疑是不符合题意,重读一遍题目发现没有做好大小写转换。
- 另外这个条件也写错了——
(c <= 'Z' && c > 'z')
。
第二版(0/21)
#include <cctype>
#include <iostream>
using namespace std;
string process1(string& a) {
for (char c : a) {
if (c >= 'a' && c < 'z') {
c = toupper(c + 1);
} else if (c >= 'A' && c < 'Z') {
c = tolower(c + 1);
} else if (c == 'z') {
c = 'A';
} else if (c == 'Z') {
c = 'a';
} else if (c >= '0' && c < '9') {
c = c + 1;
} else if (c == '9') {
c = '0';
}
}
return a;
}
string process2(string& b) {
for (char c : b) {
if (c <= 'z' && c > 'a') {
c = toupper(c) - 1;
} else if (c <= 'Z' && c > 'A') {
c = tolower(c) - 1;
} else if (c == 'A') {
c = 'z';
} else if (c == 'a') {
c = 'Z';
} else if (c <= '9' && c > '0') {
c = c - 1;
} else if (c == '0') {
c = '9';
}
}
return b;
}
int main() {
string s, t;
cin >> s;
cin >> t;
cout << process1(s) << endl;
cout << process2(t) << endl;
}
// 64 位输出请用 printf("%lld")
- 从代码逻辑上看,找不着问题。
- 智能反馈:
for (char c : a)
里,c是副本,对c的修改是无效的。
第三版(AC)
#include <cctype>
#include <iostream>
using namespace std;
string process1(string& s) {
for (int i = 0; i < s.size(); i++) {
if (s[i] >= 'a' && s[i] < 'z') {
s[i] = toupper(s[i] + 1);
} else if (s[i] >= 'A' && s[i] < 'Z') {
s[i] = tolower(s[i] + 1);
} else if (s[i] == 'z') {
s[i] = 'A';
} else if (s[i] == 'Z') {
s[i] = 'a';
} else if (s[i] >= '0' && s[i] < '9') {
s[i] = s[i] + 1;
} else if (s[i] == '9') {
s[i] = '0';
}
}
return s;
}
string process2(string& s) {
for (int i = 0; i < s.size(); i++) {
if (s[i] <= 'z' && s[i] > 'a') {
s[i] = toupper(s[i]) - 1;
} else if (s[i] <= 'Z' && s[i] > 'A') {
s[i] = tolower(s[i]) - 1;
} else if (s[i] == 'A') {
s[i] = 'z';
} else if (s[i] == 'a') {
s[i] = 'Z';
} else if (s[i] <= '9' && s[i] > '0') {
s[i] = s[i] - 1;
} else if (s[i] == '0') {
s[i] = '9';
}
}
return s;
}
int main() {
string s, t;
cin >> s;
cin >> t;
cout << process1(s) << endl;
cout << process2(t) << endl;
}
// 64 位输出请用 printf("%lld")
- 这个版本的代码修复了「修改副本因而无效」的问题——使用索引访问并修改字符串中的字符,而不是修改局部变量。
- 这个版本的代码存在不够简洁的问题,比如对字母和数字的判断。
第四版(优化但有错,5/21)
#include <cctype>
#include <iostream>
using namespace std;
string process1(string s) {
for (int i = 0; i < s.size(); i++) {
if (islower(s[i])) {
if (s[i] == 'z') s[i] = 'A';
else s[i] = toupper(s[i] + 1);
} else if (isupper(s[i])) {
if (s[i] == 'Z') s[i] = 'a';
s[i] = tolower(s[i] + 1);
} else if (isdigit(s[i])) {
if (s[i] == '9') s[i] = '0';
else s[i] = s[i] + 1;
}
}
return s;
}
string process2(string s) {
for (int i = 0; i < s.size(); i++) {
if (isupper(s[i])) {
if (s[i] == 'A') s[i] = 'z';
else s[i] = tolower(s[i]) - 1;
} else if (islower(s[i])) {
if (s[i] == 'a') s[i] = 'Z';
s[i] = toupper(s[i]) - 1;
} else if (isdigit(s[i])) {
if (s[i] == '0') s[i] = '9';
else s[i] = s[i] - 1;
}
}
return s;
}
int main() {
string s, t;
cin >> s;
cin >> t;
cout << process1(s) << endl;
cout << process2(t) << endl;
}
// 64 位输出请用 printf("%lld")
- 这个版本重新梳理了分支结构,顺便通过引用函数简化了判断逻辑。
- 这个版本还将参数改为值传递而不是引用传递,避免修改原始字符串。
- 这里发生了报错,检查后发现是漏写了两个
else
。
第五版(优化且AC)
#include <cctype>
#include <iostream>
using namespace std;
string encrypt(string s) {
for (int i = 0; i < s.size(); i++) {
if (islower(s[i])) {
if (s[i] == 'z') s[i] = 'A';
else s[i] = toupper(s[i] + 1);
} else if (isupper(s[i])) {
if (s[i] == 'Z') s[i] = 'a';
else s[i] = tolower(s[i] + 1);
} else if (isdigit(s[i])) {
if (s[i] == '9') s[i] = '0';
else s[i] = s[i] + 1;
}
}
return s;
}
string decrypt(string s) {
for (int i = 0; i < s.size(); i++) {
if (isupper(s[i])) {
if (s[i] == 'A') s[i] = 'z';
else s[i] = tolower(s[i]) - 1;
} else if (islower(s[i])) {
if (s[i] == 'a') s[i] = 'Z';
else s[i] = toupper(s[i]) - 1;
} else if (isdigit(s[i])) {
if (s[i] == '0') s[i] = '9';
else s[i] = s[i] - 1;
}
}
return s;
}
int main() {
string s, t;
cin >> s;
cin >> t;
cout << encrypt(s) << endl;
cout << decrypt(t) << endl;
}
// 64 位输出请用 printf("%lld")
- 修复了第四版的错误,顺带优化了函数的名字。