第一版(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")

  1. 所有用例都没通过,第一怀疑是不符合题意,重读一遍题目发现没有做好大小写转换。
  2. 另外这个条件也写错了——(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")

  1. 从代码逻辑上看,找不着问题。
  2. 智能反馈: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")

  1. 这个版本的代码修复了「修改副本因而无效」的问题——使用索引访问并修改字符串中的字符,而不是修改局部变量。
  2. 这个版本的代码存在不够简洁的问题,比如对字母和数字的判断。

第四版(优化但有错,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")

  1. 这个版本重新梳理了分支结构,顺便通过引用函数简化了判断逻辑。
  2. 这个版本还将参数改为值传递而不是引用传递,避免修改原始字符串。
  3. 这里发生了报错,检查后发现是漏写了两个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")

  1. 修复了第四版的错误,顺带优化了函数的名字。