实验1
任务1
源代码
#include<iostream> #include<string> #include<vector> #include<algorithm> template<typename T> void output(const T& c); void test1(); void test2(); void test3(); int main() { std::cout << "测试1: \n"; test1(); std::cout << "测试2: \n"; test2(); std::cout << "测试3: \n"; test3(); } template<typename T> void output(const T& c) { for (auto& i : c) std::cout << i << ' '; std::cout << '\n' ; } void test1() { using namespace std; string s0{ "0123456789" }; cout << "s0 = " << s0 << endl; string s1(s0); reverse(s1.begin(), s1.end()); cout << "s1 = " << s1 << endl; string s2(s0.size(), ' '); reverse_copy(s0.begin(), s0.end(), s2.begin()); cout << "s2 = " << s2 << endl; } void test2() { using namespace std; vector<int> v0{ 2,0,4,9 }; cout << "v0: "; output(v0); vector<int> v1{ v0 }; reverse(v1.begin(), v1.end()); cout << "v1: "; output(v1); vector<int> v2{ v0 }; reverse_copy(v0.begin( ), v0.end( ), v2.begin( )); cout << "v2: "; output(v2); } void test3() { using namespace std; vector<int> v0{ 0,1,2,3,4,5,6,7,8,9 }; cout << "v0: "; output(v0); vector<int> v1{ v0 }; rotate(v1.begin(), v1.begin() + 1, v1.end()); cout << "v1: "; output(v1); vector<int> v2{ v0 }; rotate(v2.begin(), v2.begin() + 2, v2.end()); cout << "v2: "; output(v2); vector<int> v3{ v0 }; rotate(v3.begin(), v3.end() - 1, v3.end()); cout << "v3: "; output(v3); vector<int> v4{ v0 }; rotate(v4.begin(), v4.end() - 2, v4.end()); cout << "v4: "; output(v4); }
效果

1.reverse反转自身数组,而reverse_copy自身保持不变将数组反转后拷贝给另一个数组
2.将区间(first,middle)里的元素全都移到(middle,end)后面,而让middle位置原本元素变为新的起始位置,实现移动
旋转的起始位置,旋转的分界位置,旋转的结束位置
任务2
源代码
#include<vector> #include<algorithm> #include<numeric> #include<iomanip> #include<cstdlib> #include<ctime> #include <iostream> template<typename T> void output(const T& c); int generate_random_number(); void test1(); void test2(); int main() { std::srand(std::time(0)); std::cout << "测试1 : \n"; test1(); std::cout << "测试2 : \n"; test2(); } template <typename T> void output(const T& c) { for (auto& i : c) std::cout << i << ' '; std::cout << '\n'; } int generate_random_number() { return std::rand() % 101; } void test1() { using namespace std; vector<int> v0(10); generate(v0.begin(), v0.end(), generate_random_number); cout << "v0: ", output(v0); vector<int> v1{ v0 }; sort(v1.begin(), v1.end()); cout << "v1: ", output(v1); vector<int> v2{ v0 }; sort(v2.begin()+1, v2.end()-1); cout << "v2: "; output(v2); } void test2() { using namespace std; vector<int> v0(10); generate(v0.begin(), v0.end(), generate_random_number); cout << "v0: "; output(v0); auto min_iter = min_element(v0.begin(), v0.end()); auto max_iter = max_element(v0.begin(), v0.end()); cout << "最大值: " << *max_iter << endl; cout << "最小值: " << *min_iter << endl; auto ans = minmax_element(v0.begin(), v0.end()); cout << "最大值: " << *(ans.first) << endl; cout << "最小值: " << *(ans.second) << endl; double avg1 = accumulate(v0.begin(), v0.end(), 0.0) / (v0.size() - 2); cout << "均值: " << fixed << setprecision(2) << avg1 << endl; sort(v0.begin(), v0.end()); double avg2 = accumulate(v0.begin() + 1, v0.end() - 1, 0.0) / (v0.size() - 2); cout << "去掉最大值,最小值后的均值: " << avg2 << endl; }
效果

1.遍历数组,将返回值依次赋值给每个元素
2.效率更高,只需遍历一次容器
3.等同
任务3
源代码
#include<iostream> #include<string> #include<algorithm> #include<cctype> unsigned char func(unsigned char c); void test1(); void test2(); int main() { std::cout << "测试1: 字符串大小写转换\n"; test1(); std::cout << "\n测试2: 字符变换\n"; test2(); } unsigned char func(unsigned char c) { if (c == 'z') return 'a'; if (c == 'Z') return 'A'; if (std::isalpha(c)) return static_cast<unsigned char>(c + 1); return c; } void test1() { std::string s1{ "Hello world 2049!" }; std::cout << "s1 = " << s1 << '\n'; std::string s2; for (auto c : s1) s2 += std::tolower(c); std::cout << "s2 = " << s2 << '\n'; std::string s3; for (auto c : s1) s3 += std::toupper(c); std::cout << "s3 = " << s3 << '\n'; } void test2() { std::string s1{ "I love cosmos!" }; std::cout << "s1 = " << s1 << '\n'; std::string s2(s1.size(), ' '); std::transform(s1.begin(), s1.end(), s2.begin(), func); std::cout << "s2 = " << s2 << '\n'; }
效果

1.确认大小写字母
2.tolower将字符串全都小写 toupper将字符串全都大写
3.输入序列的起始位置 输入序列的结束位置 输出序列的起始位置 对输入序列中每个字符的变化函数
s1直接修改为变换后的结果,原来s1数据丢失
任务4
源代码
#include<iostream> #include<string> #include<algorithm> bool is_palindrome(const std::string& s); bool is_palindrome_ignore_case(const std::string& s); int main() { using namespace std; string s; while (cin >> s) { cout << boolalpha << "区分大小写: " << is_palindrome(s) << "\n" << "不区分大小写: " << is_palindrome_ignore_case(s) << "\n\n"; } } bool is_palindrome(const std::string& s) { int left = 0; int right = s.size() - 1; while (left < right) { if (s[left] != s[right]) return false; left++; right--; } return true; } bool is_palindrome_ignore_case(const std::string& s) { int left = 0; int right = s.size() - 1; while (left < right) { if (towlower(s[left]) != towlower(s[right])) return false; left++; right--; } return true; }
效果

1.while (cin >> s)改为while(getline(cin,s))
任务5
源代码
#include<iostream> #include<string> #include<algorithm> std::string dec2n(int x, int n = 2); int main() { int x; while (std::cin >> x) { std::cout << "十进制: " << x << '\n' << "二进制: " << dec2n(x) << '\n' << "八进制: " << dec2n(x, 8) << '\n' << "十二进制: " << dec2n(x, 12) << '\n' << "十六进制: " << dec2n(x, 16) << '\n' << "三十二进制: " << dec2n(x, 32) << "\n\n"; } } std::string dec2n(int x, int n) { if (x == 0) return "0"; std::string s; const char* digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; while (x > 0) { int r = x % n; s += digits[r]; x /= n; } std::reverse(s.begin(), s.end()); return s; }
效果

任务6
源代码
#include <iostream> #include <iomanip> int main() { std::cout << " "; for (char c = 'a'; c <= 'z'; ++c) { std::cout << std::setw(3) << c; } std::cout << std::endl; for (int i = 1; i <= 26; ++i) { std::cout << std::setw(2) << i; for (char c = 'a'; c <= 'z'; ++c) { char encrypted = 'A' + (c - 'a' + i) % 26; std::cout << std::setw(3) << encrypted; } std::cout << std::endl; } return 0; }
效果

任务7
源代码
#include <iostream> #include <iomanip> #include <cstdlib> #include <ctime> int getRandomNumber(int min, int max) { return rand() % (max - min + 1) + min; } void generateQuestion(int& num1, int& num2, char& op) { num1 = getRandomNumber(1, 10); num2 = getRandomNumber(1, 10); int opType = getRandomNumber(1, 4); switch (opType) { case 1: op = '+'; break; case 2: op = '-'; if (num1 < num2) { std::swap(num1, num2); } break; case 3: op = '*'; break; case 4: op = '/'; while (num1 % num2 != 0) { num1 = getRandomNumber(1, 10); num2 = getRandomNumber(1, 10); } break; } } int main() { srand(time(0)); int correctCount = 0; for (int i = 0; i < 10; ++i) { int num1, num2, userAnswer, correctAnswer; char op; generateQuestion(num1, num2, op); switch (op) { case '+': correctAnswer = num1 + num2; break; case '-': correctAnswer = num1 - num2; break; case '*': correctAnswer = num1 * num2; break; case '/': correctAnswer = num1 / num2; break; } std::cout << num1 << " " << op << " " << num2 << " = "; std::cin >> userAnswer; if (userAnswer == correctAnswer) { correctCount++; } } double accuracy = static_cast<double>(correctCount) / 10 * 100; std::cout << std::fixed << std::setprecision(2) << "正确率: " << accuracy << "%" << std::endl; return 0; }
效果


浙公网安备 33010602011771号