实验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 << "\n测试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());
	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);
}

运行结果截图

image

观察与思考

1.reverse直接反转原容器,reverse_copy不改变原容器,而是将反转后的结果复制到目标容器里
2.rotate(first,middle,last),middle位置的元素,变成整个区间第一个元素

任务二

源代码

点击查看代码
#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 << "\n测试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;
}

运行结果截图

image

观察与思考

1.generate算法是反复调用第三个参数的函数,把函数返回值赋值给容器元素
2.minmax_element只需要遍历一次序列,而分别调用min_element,max_element需要遍历两次,前者更高效
3.不用单独写函数声明、函数定义,就地定义匿名函数,代码紧凑,这个生成逻辑只在这里使用,不用单独命名函数。这个 lambda 是匿名的,别的地方不能复用;如果多个地方要用同一个生成逻辑,独立函数更合适

任务三

源代码

点击查看代码
#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';
}

运行结果截图

image

观察与思考

1.如果字符是小写z → 返回a;如果字符是大写Z → 返回A;如果是普通英文字母(不是 Z/z),返回下一个字母(c+1,如a→b,M→N);非字母字符(空格、!、数字等)直接原样返回
2.tolower(c)把英文字符转为小写;toupper(c)把英文字符转为大写
3.transform( first, last, result, op ),分别代表起始迭代器,末尾迭代器,目标容器的起始迭代器,变换函数(对源区间每个元素执行这个函数)

任务四

源代码

点击查看代码
#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";
    }
}
unsigned char to_lower_char(unsigned char c){
	return std::tolower(c);
}

bool is_palindrome(const std::string &s){
	std::string rev(s);
	reverse(rev.begin(),rev.end());
	return s==rev;
}

bool is_palindrome_ignore_case(const std::string &s){
	std::string lower_s(s.size(),' ');
	transform(s.begin(),s.end(),lower_s.begin(),to_lower_char);
	std::string rev_lower(lower_s);
	reverse(rev_lower.begin(),rev_lower.end());
	return lower_s == rev_lower;
}

运行代码截图

image

观察与思考

用getline(cin,s)按行读,保留空格

任务五

源代码

点击查看代码
#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){
	const std::string table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
	if(x == 0){
		return "0";
	}
	std::string res;
	while(x>0){
		int tem = x%n;
		res += table[tem];
		x/=n;
	}
	std::reverse(res.begin(),res.end());
	return res;
}

运行结果截图

image

任务六

源代码

点击查看代码
#include <iostream>
using namespace std;
int main()
{
    cout << "  a b c d e f g h i j k l m n o p q r s t u v w x y z" << endl;
    for (int row = 1; row <= 26; ++row)
    {
        cout << (row < 10 ? " " : "") << row;
        for (int col = 0; col < 26; ++col)
        {
            char ch = 'A' + (row - 1 + col) % 26;
            cout << " " << ch;
        }
        cout << endl;
    }
    return 0;
}

运行结果截图

image

任务七

源代码

点击查看代码
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>  
using namespace std;
int main()
{
    srand(time(0));
    int right = 0;
    for (int t = 1; t <= 10; t++)
    {
        int a, b;
        char op;
        int ans;
        int choose = rand() % 4;
        if (choose == 0)
        {
            op = '+';
            a = rand() % 10 + 1;
            b = rand() % 10 + 1;
            ans = a + b;
        }
        else if (choose == 1)
        {
            op = '-';
            a = rand() % 10 + 1;
            b = rand() % 10 + 1;
            if (a < b)
            {
                int temp;
                temp = a;
                a = b;
                b = temp;
            }
            ans = a - b;
        }
        else if (choose == 2)
        {
            op = '*';
            a = rand() % 10 + 1;
            b = rand() % 10 + 1;
            ans = a * b;
        }
        else
        {
            op = '/';
            while (true)
            {
                a = rand() % 10 + 1;
                b = rand() % 10 + 1;
                if (a % b == 0)
                {
                    break;
                }
            }
            ans = a / b;
        }
        int my_ans;
        cout << a << " " << op << " " << b << " = ";
        cin >> my_ans;
        if (my_ans == ans)
        {
            right = right + 1;
        }
    }
    double rate;
    rate = right / 10.0 * 100;
    cout << "正确率:" << fixed << setprecision(2) << rate << "%" << endl;
    return 0;
}
posted @ 2026-10-22 13:08  lp99  阅读(5)  评论(0)    收藏  举报