首页 > 编程语言 >实验1 现代C++基础编程

实验1 现代C++基础编程

时间:2024-10-15 23:21:05浏览次数:5  
标签:begin cout int 编程 C++ v0 v1 实验 include

任务1

源代码task1.cpp

// 本例用到以下内容:
// 1. 字符串string, 动态数组容器类vector、迭代器
// 2. 算法库:反转元素次序、旋转元素
// 3. 函数模板、const引用作为形参

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

using namespace std;

// 声明
// 模板函数声明
template<typename T>
void output(const T &c);

// 普通函数声明
void test1();
void test2();
void test3();

int main() {
    cout << "测试1: \n";
    test1();

    cout << "\n测试2: \n";
    test2();

    cout << "\n测试3: \n";
    test3();
}

// 函数实现
// 输出容器对象c中的元素
template <typename T>
void output(const T &c) {
    for(auto &i: c)
        cout << i << " ";
    cout << endl;
}

// 测试1
// 组合使用算法库、迭代器、string反转字符串
void test1() {
    string s0{"0123456789"};
    cout << "s0 = " << s0 << endl;

    string s1{s0};
    reverse(s1.begin(), s1.end());  // 反转指定迭代器区间的元素
    cout << "s1 = " << s1 << endl;

    string s2{s0};
    reverse_copy(s0.begin(), s0.end(), s2.begin()); // 将指定迭代区间的元素拷贝到指定迭代器开始的目标区间,并且在复制过程中反转次序
    cout << "s2 = " << s2 << endl;
}

// 测试2
// 组合使用算法库、迭代器、vector反转动态数组对象vector内数据
void test2() {
    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);
}

// 测试3
// 组合使用算法库、迭代器、vector实现元素旋转移位
void test3() {
    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());  // 旋转指定迭代器区间[v1.begin(), v1.end())之间的数据项,旋转后从迭代器v1.begin()+1位置的数据项开始
    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);
}

运行结果截图
实验结果截图

任务2

task2.cpp

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

using namespace std;

// 函数声明
// 模板函数声明
template<typename T>
void output(const T &c);

// 普通函数声明
int rand_int_100();
void test1();
void test2();

int main() {
    cout << "测试1: \n";
    test1();

    cout << "\n测试2: \n";
    test2();
}

// 函数实现
// 输出容器对象c中的元素
template <typename T>
void output(const T &c) {
    for(auto &i: c)
        cout << i << " ";
    cout << endl;
}

// 返回[0, 100]区间内的一个随机整数
int rand_int_100() {
    return rand() % 101;
}

// 测试1
// 对容器类对象指定迭代器区间进行赋值、排序
void test1() {
    vector<int> v0(10);  // 创建一个动态数组对象v0, 对象大小为10
    generate(v0.begin(), v0.end(), rand_int_100); // 产生[0, 100]之间的随机整数赋值给指定迭代器区间[v0.begin(), v0.end())内的每个数据项
    cout << "v0: ";
    output(v0);

    vector<int> v1{v0};
    sort(v1.begin(), v1.end()); // 对指定迭代器区间[v1.begin(), v1.end())内数据项进行升序排序
    cout << "v1: ";
    output(v1);

    vector<int> v2{v0};
    sort(v2.begin()+1, v2.end()-1); // 对指定迭代器区间[v1.begin()+1, v1.end()-1)内数据项进行升序排序
    cout << "v2: ";
    output(v2);
}

// 测试2
// 对容器类对象指定迭代器区间进行赋值、计算最大值/最小值/均值
void test2() {
    vector<int> v0(10);  
    generate(v0.begin(), v0.end(), rand_int_100); 
    cout << "v0: ";
    output(v0);

    auto iter1 = min_element(v0.begin(), v0.end());
    cout << "最小值: " << *iter1 << endl;

    auto iter2 = max_element(v0.begin(), v0.end());
    cout << "最大值: " << *iter2 << 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)/v0.size();
    cout << "均值: " << fixed << setprecision(2) << avg1 << endl;

    cout << endl;

    vector<int> v1{v0};
    cout << "v0: ";
    output(v0);
    sort(v1.begin(), v1.end());
    double avg2 = accumulate(v1.begin()+1, v1.end()-1, 0)/(v1.size()-2);
    cout << "去掉最大值、最小值之后,均值: " << avg2 << endl;
}

运行结果截图
实验2截图

实验3

task3.cpp

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

bool is_palindrome(std::string s);

int main() {
    using namespace std;
    string s;

    while(cin >> s)  // 多组输入,直到按下Ctrl+Z后结束测试
        cout << boolalpha << is_palindrome(s) << endl;
}

bool is_palindrome(std::string s){
	std::transform(s.begin(),s.end(),s.begin(),::tolower);
	int l=0;
	int r=s.size()-1;
	while(l<r){
		if(s[l]!=s[r]){
			return false;
		}
		l++;
		r--;
	}
	return true;
}

实验3截图
实验3截图

实验4

task4.cpp

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

std::string dec2n(int x, int n = 2);

int main() {
    using namespace std;

    int x;
    while(cin >> x) {
        cout << "十进制: " << x << endl;
        cout << "二进制: " << dec2n(x) << endl;
        cout << "八进制: " << dec2n(x, 8) << endl;
        cout << "十六进制: " << dec2n(x, 16) << endl << endl;
    }
}
std::string dec2n(int x, int n) {    
    const char digits[] = "0123456789ABCDE";  
    std::string result;  
    if(x==0){  
        return "0";  
    }    
    bool isNegative=false;  
    if(x<0){  
        isNegative=true;  
        x=-x;  
    }    
    while(x>0){  
        result+=digits[x%n];  
        x/=n;  
    }   
    if(isNegative){  
        result+="-";  
    }    
    std::reverse(result.begin(),result.end());  
    return result; }

实验4结果截图
实验4结果截图

实验5

task5.cpp

#include<iostream>
using namespace std;
int main()
{int a[26],k;
	char line1[26],line2[26];
	for(int i=0;i<26;i++)
	{
		line1[i]=i+65;
		line2[i]=i+97;
		a[i]=i+1;
	}
	cout<<"  ";
	for(int i=0;i<26;i++)
	{
		cout<<line2[i]<<" ";
	}
	cout<<endl;
	for(int i=0;i<26;i++){
	cout<<a[i]<<" ";
	for(int j=i;j<26;j++)
	{
		cout<<line1[j]<<" ";
	}for(k=0;k<i;k++)
	{
		cout<<line1[k]<<" ";
	}
	cout<<endl;
	}
}

实验5截图

实验6

task6.cpp

#include<iostream>
#include<stdlib.h>
#include<time.h>
using namespace std;
int suanfa(int a,int b,int c)
{
	if(c==1){
		return a+b;
	}
	else if(c==2){
		return a-b;
	}
	else if(c==3){
		return a*b;
	}
	else if(c==4){
		return a/b;
	}
}
int main()
{int a[10],b[10],c[10],d[10],zheng=0,t;
	srand((unsigned int)time(NULL));
	for(int i=0;i<10;i++)
	{
		a[i]=1+rand()%10;
		b[i]=1+rand()%10;
		c[i]=1+rand()%4;
	}
	for(int i=0;i<10;i++)
	{
		while(c[i]==2&&a[i]<b[i])
		{
		t=b[i];
		b[i]=a[i];
		a[i]=t;
		}
		while(c[i]==4&&a[i]%b[i]!=0)
		{
			a[i]=rand()%10+1;
			b[i]=rand()%10+1;
		}
	}
	for(int i=0;i<10;i++)
	{
		d[i]=suanfa(a[i],b[i],c[i]);
	}
	for(int i=0;i<10;i++)
	{
		cout<<a[i];
		if(c[i]==1)cout<<"+";
		else if(c[i]==2)cout<<"-";
		else if(c[i]==3)cout<<"*";
		else if(c[i]==4)cout<<"/";
		cout<<b[i]<<"=";
		cin>>t;
		if(t==d[i])zheng++;
	
	}cout<<"正确率:"<<zheng<<"0.00%"<<endl; 
}

实验6截图

实验总结

熟悉C语言基本语法和数据类型。
掌握C语言程序的编写和调试技巧。
培养解决问题的能力。
加深对计算机原理的理解。
提高团队合作和沟通能力。

标签:begin,cout,int,编程,C++,v0,v1,实验,include
From: https://www.cnblogs.com/fantasies31/p/18468763

相关文章

  • 成为编程高手 day3
    我觉得是时候该引用一句话"我的痛苦已经大于我的力量了"。原本昨天很早睡了,今天一醒来就9点20了,学习计划破碎。中午,晚上到是学习了一下代码哈哈感觉也没学啥,就学了个szieof,sign,unsign,好像就没了。哈哈哈晚上平板都带过去了,准备学代码,可是这工图作业是什么鬼?????????晚自修就这样......
  • 阿里 C++面试,算法题没做出来,,,
    我本人是非科班学C++ 后端和嵌入式的。在我面试的过程中,竟然得到了阿里​C++研发工程师的面试机会。因为,阿里主要是用Java比较多,C++的岗位比较少​,所以感觉这个机会还是挺难得的。阿里C++研发工程师面试考了我一道类似于快速排序算法的算法题,虽然我算法题又一次没做......
  • c++如何使用pthread_join函数配合pthread_create函数来创建和等待线程完成,实现线程同
    在C++中,pthread_create 和 pthread_join 是POSIX线程库(pthread)的一部分,用于创建和管理线程。pthread_create 用于创建一个新的线程,而 pthread_join 用于等待一个线程的执行完成,从而实现线程同步与控制。基本步骤使用 pthread_create 函数创建一个线程。线程的工作由......
  • C++中的魔鬼数字
    在编程中,魔鬼数字(magicnumbers)是指代码中直接使用的未经解释的常量数字,这些数字通常没有明确的含义,可能会使代码变得难以理解、维护或扩展。魔鬼数字的存在会让人难以判断这些数字的用途或来源,因此在代码中通常建议避免使用魔鬼数字,而是用具名的常量或宏来代替。在你提供的示例......
  • C++中的回调函数
    回调函数(callbackfunction)是指作为参数传递给另一个函数的函数,在某个事件发生或某个任务完成时被调用。回调函数在异步编程中非常常见,因为它们允许代码在某个操作完成后自动执行某些行为,而无需阻塞程序。回调函数的基本特征作为参数传递:回调函数通常是作为参数传递给另一个函......
  • 实验1 现代C++ 基础课程
    任务1:运行结果如图:     任务2:运行结果如图:任务3:运行结果如图: 任务4:运行结果如图:任务5:运行结果如图: 任务6: ......
  • C++中如何使用单例模式管理全局变量
    单例模式(SingletonPattern)是一种常用的设计模式,旨在确保一个类只有一个实例,并提供一个全局的访问点。要使用单例模式管理全局变量,可以通过控制类的实例化过程,防止多个对象的创建。这样做不仅可以保证数据一致性,还能避免使用直接的全局变量带来的命名冲突和潜在的多线程安全问题。......
  • 【优选算法篇】双指针的华丽探戈:深入C++算法殿堂的优雅追寻
    文章目录C++双指针详解:进阶题解与思维分析前言第一章:有效三角形的个数1.1有效三角形的个数示例1:示例2:解法一(暴力求解)解法二(排序+双指针)易错点提示代码解读第二章:和为s的两个数字2.1和为s的两个数字示例1:解法一(暴力解法)解法二(双指针-对撞指针)第三章:三......
  • C++互斥锁
    互斥锁(Mutex,全称:MutualExclusion)是一种用于多线程编程中的同步机制,用来确保在同一时刻只有一个线程可以访问共享资源。它通过锁定机制防止多个线程同时对共享资源进行读写操作,从而避免数据竞争和不一致性问题。互斥锁的核心思想是保证互斥访问,即当一个线程持有互斥锁并正在访问......
  • 实验2 C语言分支与循环基础应用编程-1
    实验一:#include<stdio.h>#include<stdlib.h>#include<time.h>#defineN5#defineN1397#defineN2476#defineN321intmain(){intcnt;intrandom_major,random_no;srand(time(NULL));cnt=0;while(cnt......