实验一

Task 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 << "\n测试2:\n";
	test2();

	std::cout << "\n测试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());

	string s2(s0.size(), ' ');
	reverse_csigny(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_csigny(v0.begin(), v0.end(), v2.begin());
	cout << "v1: ";
	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);
}

测试截图

task1

问题

问题一

reverse()函数会修改原容器,直接进行反转的过程
reverse_csigny()函数不修改原容器,在反转操作之后直接复制到指定的容器中

问题二

rotate算法的原型是rotate(begin, mid , end)
(1)将[begin,end)范围内的元素进行循环旋转,使得mid位置的元素成为新的第一个元素
(2) begin:范围的开始(包含)
    mid:该位置的元素成为新的首元素
    end:范围的结束(不包含)

Task 2

源代码

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <iomanip>
#include <cstdlib>
#include <ctime>

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 << "最小值:" << *min_iter << endl;
	cout << "最大值:" << *max_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();
	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;
}

测试截图

task2

问题

问题一

generate()函数原型为generate(begin,end,value),作用是将begin到end的部分用vale值填充全部

问题二

minmax_element()函数比max_element()和min_element()函数加起来调用的时间更少,并且书写代码更少

问题三

可以替换,作用与generate_random_number()函数完全等同

Task 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';
}

测试截图

task3

问题

问题一

将小写和大写字母表循环,将字符替换为顺序表中的下一个(如a变成b,z变成a)

问题二

tolower()将字符串中的所有字符变成小写字符,符号数字除外
toupper()将字符串中的所有字符变成大写字符,符号数字除外

问题三

(1)将从s1.begin()到s1.end()的字符串用func()函数,将结果返回到以s2.begin()开始的字符串中
(2)修改后结果会直接返回在s1上,即s1会被改变

Task 4

源代码

#include <iostream>
#include <string>
#include <algorithm>
#include <cctype>

bool is_palindrome(const std::string& s);
bool is_palindrome_ignore_case(const std::string& s);
int main() {
	using namespace std;
	string s;
	// 多组输入,直到按下Ctrl+Z结束测试
	while (cin >> s) {
		cout << boolalpha
			<< "区分大小写: " << is_palindrome(s) << "\n"
			<< "不区分大小写: " << is_palindrome_ignore_case(s) << "\n\n";
	}
}

bool is_palindrome(const std::string& s) {
	std::string s0(s);
	reverse(s0.begin(), s0.end());
	for (auto i : s) {
		if (s != s0)
			return false;
	}
	return true;
}

bool is_palindrome_ignore_case(const std::string& s) {
	std::string s1,s2;
	for (auto c : s) {
		s1 +=std::tolower(c);
		s2 += std::tolower(c);
	}
	
	reverse(s2.begin(), s2.end());

	for (auto i : s) {
		if (s1 != s2)
			return false;
	}
	return true;
}

测试截图

task4

问题

用getline()函数代替cin,代码如下:

//将原文件第12行替换为:
while (getline(cin, s)) {
if (s.empty()) {
	break;
}

Task 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";
	}

	const std::string basic = "0123456789ABCDEFGHIJKLMNsignQRSTUVWXYZ";

	std::string result;

	while (x > 0) {
		int remainder = x % n;
		result += basic[remainder];
		x = x / n;
	}

	std::reverse(result.begin(), result.end());

	return result;
}

测试截图

task5

Task 6

源代码

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int main() {
	std::string v0{"abcdefghijklmnsignqrstuvwxyz"};

	std::string s;
	for (auto c : v0)
		s += std::toupper(c);

	std::cout << "  ";
	for (auto i : v0)
		std::cout << " " << i;
	std::cout << std::endl;

	int i = 1;
	for (i = 1; i <= 26; i++) {
		if (i < 10)
			std::cout << " " << i;
		else
			std::cout << i;

		int index;
		for (int j = 0; j < 26; j++) {
			index = (i + j) % 26;
			std::cout << " " << s[index];
		}

		std::cout << std::endl;
	}
}

测试截图

task6

Task 7

源代码

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main() {
    std::srand(std::time(0));

    int correctCount = 0;
    for (int i = 0; i < 10; i++) {
        int num1 = rand() % 10 + 1;
        int num2 = rand() % 10 + 1;

        int sign = rand() % 4;

        int userAnswer, correctAnswer;
        char signChar;

        switch (sign) {
        case 0:
            signChar = '+';
            correctAnswer = num1 + num2;
            break;

        case 1:
            if (num1 < num2) {
                swap(num1, num2);
            }
            signChar = '-';
            correctAnswer = num1 - num2;
            break;

        case 2:
            signChar = '*';
            correctAnswer = num1 * num2;
            break;

        case 3:
            while (num2 == 0 || num1 % num2 != 0) {
                num1 = rand() % 10 + 1;
                num2 = rand() % 10 + 1;
            }
            signChar = '/';
            correctAnswer = num1 / num2;
            break;
        }

        cout << num1 << " " << signChar << " " << num2 << " = ";
        cin >> userAnswer;

        if (userAnswer == correctAnswer) {
            correctCount++;
        }
    }

    double accuracy = static_cast<double>(correctCount) / 10 * 100;
    cout << "正确率:" << accuracy << "%" << endl;
}

测试截图

task7(1)

task7(2)

posted @ 2025-10-12 17:54  永和九年2  阅读(12)  评论(1)    收藏  举报