ROS云课基础题库-01C++案例-甜甜圈

效率是核心,但效率高的教程会忽略掉非常多的细节。


解决问题的思路和细节对于一个问题的有效求解至关重要。


资料

云课五分钟-02第一个代码复现-终端甜甜圈C++-CSDN博客

从云课五分钟到五秒钟焦虑的甜甜圈向前冲-CSDN博客  


说明

复现重要性没有那么大,重点功利角度在于不断提升学习效率(多赚分),社会角度(多赚钱)。

回到ROS云课。

1. c++

#include <stdio.h>
#include <math.h>
#include <cstring>
#include <unistd.h>int main() {float A = 0, B = 0;float i, j;int k;float z[1760];char b[1760];printf("\x1b[2J");for (;;) {memset(b, 32, 1760);memset(z, 0, 7040);for (j = 0; j < 6.28; j += 0.07) {for (i = 0; i < 6.28; i += 0.02) {float c = sin(i);float d = cos(j);float e = sin(A);float f = sin(j);float g = cos(A);float h = d + 2;float D = 1 / (c * h * e + f * g + 5);float l = cos(i);float m = cos(B);float n = sin(B);float t = c * h * g - f * e;int x = 40 + 30 * D * (l * h * m - t * n);int y = 12 + 15 * D * (l * h * n + t * m);int o = x + 80 * y;int N = 8 * ((f * e - c * d * g) * m - c * d * e - f * g - l * d * n);if (22 > y && y > 0 && x > 0 && 80 > x && D > z[o]) {z[o] = D;b[o] = ".,-~:;=!*#$@"[N > 0 ? N : 0];}}}printf("\x1b[H");for (k = 0; k < 1761; k++) {putchar(k % 80 ? b[k] : 10);A += 0.00004;B += 0.00002;}usleep(30000);}return 0;
}

2. g++

g++ -o donut donut.cpp

3. app

./donut

如上是纯手工复现。

采用自动化方式复现如下:

echo "终端焦虑的甜甜圈"git clone https://gitcode.com/ZhangRelay1/donut.gitcd ~/donutg++ colordonut.cpp -o donut./donutecho "突破封印的甜甜圈"


视频 

ROS云课基础题库-C++案例-甜甜圈


你提到的代码是一个在终端中绘制动态甜甜圈图案的 C++ 程序。这个程序通过使用数学函数和 ASCII 字符在终端中创建了一个视觉上类似甜甜圈的旋转效果。复现这个代码的过程不仅有助于理解如何使用 C++ 进行图形编程(尽管是简单的字符图形),还可以提升学习效率,并通过对代码进行修改和优化来提高编程技能。

代码说明

  1. 包含头文件

     

    cpp复制代码

    #include <stdio.h>
    #include <math.h>
    #include <cstring>
    #include <unistd.h>

    这些头文件提供了基本的输入输出、数学函数、内存操作和睡眠功能。

  2. 变量初始化

     

    cpp复制代码

    float A = 0, B = 0;
    float i, j;
    int k;
    float z[1760];
    char b[1760];

    这些变量用于存储计算过程中的中间值和最终的字符图形。

  3. 主循环

    • 使用无限循环 for (;;) 不断刷新终端屏幕。
    • memset 函数用于清空数组 b 和 z
    • 嵌套循环计算每个点的位置和亮度。
    • 使用数学函数 sin 和 cos 计算 3D 空间中的点。
    • 通过计算确定每个点对应的 ASCII 字符。
  4. 输出

    • 使用 ANSI 转义序列 \x1b[H 移动光标到屏幕顶部,并用 \x1b[2J 清屏。
    • 输出字符数组 b 中的字符,形成图形。
    • 使用 usleep(30000) 暂停 30 毫秒以控制刷新率。

自动化复现步骤

你提供的自动化步骤使用 Git 和命令行来快速复现这个项目:

 

bash复制代码

echo "终端焦虑的甜甜圈"
git clone https://gitcode.com/ZhangRelay1/donut.git
cd ~/donut
g++ colordonut.cpp -o donut
./donut
echo "突破封印的甜甜圈"

这些命令的作用是:

  1. 输出提示信息。
  2. 克隆包含代码的 Git 仓库。
  3. 进入项目目录。
  4. 编译 C++ 源代码并生成可执行文件。
  5. 运行可执行文件以查看甜甜圈效果。
  6. 输出完成提示信息。

提升学习效率

  • 实践:通过手动编写和调试代码,加深对 C++ 和算法的理解。
  • 自动化:利用脚本和工具简化重复性任务,专注于代码的优化和改进。
  • 分享:将学习过程和成果记录下来,分享给他人,巩固自己的知识。

社会角度

  • 项目经验:这种小型项目可以作为简历上的项目经验,展示你的编程能力和创造力。
  • 社区参与:通过分享和参与开源项目,扩大人脉,了解行业动态。
  • 持续学习:不断提升自己的技能,适应快速变化的技术环境,增加职业竞争力。

通过复现和优化这样的项目,不仅可以提高编程技能,还可以在学习和工作中获得实际的收益。


C++知识点

这段代码是一个简单的ASCII艺术动画程序,使用数学函数生成一个动态变化的图案。以下是代码中涉及的C++知识点及其详细介绍:

1. 头文件

 

c复制代码

#include <stdio.h>
#include <math.h>
#include <cstring>
#include <unistd.h>
  • <stdio.h>: 提供输入输出功能,例如printfputchar
  • <math.h>: 提供数学函数,例如sincos
  • <cstring>: 提供字符串处理函数,例如memset
  • <unistd.h>: 提供POSIX操作系统API访问,包括usleep函数。

2. 变量声明和初始化

 

c复制代码

float A = 0, B = 0;
float i, j;
int k;
float z[1760];
char b[1760];
  • 基本数据类型: 使用floatint声明变量。
  • 数组zb是数组,分别用于存储深度和字符。

3. 无限循环

 

c复制代码

for (;;) {
// ...
}
  • 无限循环: 使用for (;;)创建一个无限循环,常用于需要持续运行的程序。

4. 内存设置

 

c复制代码

memset(b, 32, 1760);
memset(z, 0, 7040);
  • memset函数: 用于将数组bz初始化为特定值。32是ASCII空格字符,0用于浮点数数组的初始化。

5. 嵌套循环和数学计算

 

c复制代码

for (j = 0; j < 6.28; j += 0.07) {
for (i = 0; i < 6.28; i += 0.02) {
// ...
}
}
  • 嵌套循环: 用于遍历二维空间。
  • 数学函数: 使用sincos计算图案的坐标和亮度。

6. 数组索引和条件判断

 

c复制代码

int x = 40 + 30 * D * (l * h * m - t * n);
int y = 12 + 15 * D * (l * h * n + t * m);
int o = x + 80 * y;
if (22 > y && y > 0 && x > 0 && 80 > x && D > z[o]) {
z[o] = D;
b[o] = ".,-~:;=!*#$@"[N > 0 ? N : 0];
}
  • 数组索引计算: 计算二维坐标(x, y)对应的一维数组索引o
  • 条件判断: 确保坐标在有效范围内,并更新深度缓冲区z和字符缓冲区b

7. 字符映射

 

c复制代码

b[o] = ".,-~:;=!*#$@"[N > 0 ? N : 0];
  • 字符数组: 使用字符数组实现亮度到字符的映射。

8. 屏幕输出和动画

 

c复制代码

printf("\x1b[H");
for (k = 0; k < 1761; k++) {
putchar(k % 80 ? b[k] : 10);
A += 0.00004;
B += 0.00002;
}
usleep(30000);
  • ANSI转义序列\x1b[H移动光标到屏幕左上角。
  • 字符输出: 使用putchar输出字符,每80个字符换行。
  • 动画效果: 通过改变AB实现图案的动态变化,并使用usleep控制帧率。

9. 主函数返回值

 

c复制代码

return 0;
  • 程序结束return 0表示程序正常结束。

总结

这段代码结合了数学计算、字符处理、内存操作和ANSI转义序列生成动态ASCII艺术图案。它展示了如何在C语言中使用基本图形技术和动画原理。


Linux g++知识点

使用 g++ 编译 C++ 程序时,了解编译器的选项和过程是很重要的。下面详细介绍如何使用 g++ 编译器将源代码文件 donut.cpp 编译成可执行文件 donut,并解释其中涉及的知识点。

1. 基本命令结构

 

bash复制代码

g++ -o donut donut.cpp
  • g++: GNU Compiler Collection(GCC)中的C++编译器。它是用于编译C++程序的主要工具。
  • -o donut: 指定输出文件名为 donut。如果没有这个选项,默认输出文件名是 a.out
  • donut.cpp: 输入的C++源代码文件。

2. 编译过程

编译过程通常包括几个阶段:预处理、编译、汇编和链接。g++ 会自动处理这些阶段。

  • 预处理: 处理 #include 和 #define 指令,展开宏,生成预处理后的代码。
  • 编译: 将预处理后的代码翻译成汇编代码。
  • 汇编: 将汇编代码转换成机器码,生成目标文件(.o 文件)。
  • 链接: 将目标文件和库文件链接在一起,生成最终的可执行文件。

3. 常见的 g++ 选项

  • -c: 只编译,不链接。生成目标文件而不是可执行文件。
  • -Wall: 启用所有常见的警告信息。有助于发现潜在的编程错误。
  • -Wextra: 启用额外的警告信息,进一步帮助发现潜在问题。
  • -O[n]: 优化代码,n 为优化级别,0 到 30 表示无优化,3 表示最高级别的优化。
  • -g: 生成调试信息,用于在调试器中查看源代码和执行过程。
  • -std=c++[version]: 指定C++标准版本,例如 -std=c++11-std=c++14-std=c++17-std=c++20 等。
  • -I[directory]: 指定头文件搜索路径。
  • -L[directory]: 指定库文件搜索路径。
  • -l[library]: 链接指定的库文件。

4. 示例解释

在命令 g++ -o donut donut.cpp 中:

  • 没有使用优化选项,所以编译器不会进行优化。对于生产代码,通常会使用 -O2 或 -O3 来提高性能。
  • 没有指定标准版本,所以编译器将使用默认的C++标准版本。为了确保兼容性,通常会显式指定标准版本,例如 -std=c++17
  • 输出文件 donut 是指定的可执行文件名称。运行这个文件可以通过 ./donut 在终端中执行。

5. 执行编译后的程序

编译成功后,可以通过以下命令运行生成的可执行文件:

 

bash复制代码

./donut

6. 调试和错误处理

  • 查看警告和信息: 使用 -Wall 和 -Wextra 来捕获潜在的警告。
  • 调试: 如果需要调试程序,使用 -g 选项生成调试信息,然后使用调试器(如 gdb)进行调试。

总结

使用 g++ 编译器可以有效地将C++源代码转换为可执行文件。通过理解和使用不同的编译器选项,可以控制编译过程,优化代码,生成调试信息,并确保代码与特定的C++标准兼容。


Linux命令知识点

在终端执行 ./donut 命令时,涉及的知识点主要包括以下几个方面:

1. 可执行文件与权限

  • 可执行文件:在Linux系统中,可执行文件是一种特殊的文件类型,它包含可以被操作系统直接执行的机器码。
  • 执行权限:为了执行一个文件,该文件必须具有执行权限。你可以使用 ls -l 命令查看文件的权限,其中 x 表示执行权限。如果没有执行权限,可以使用 chmod +x donut 命令来添加执行权限。

2. 当前工作目录

  • 当前工作目录:在终端中执行命令时,命令会在当前工作目录(也称为当前目录)中查找文件和可执行文件。
  • 路径:如果 donut 文件不在当前工作目录中,你需要提供文件的完整路径或相对路径。例如,如果 donut 文件在 /home/user/bin 目录下,你需要执行 ./home/user/bin/donut 或先切换到该目录,再执行 ./donut

3. 命令解释与执行

  • 命令解释器(shell):当你输入命令并按下回车键时,终端会调用当前的shell(如bash、zsh等)来解释和执行该命令。
  • 动态链接库:如果 donut 程序依赖于某些动态链接库(如libstdc++、libc等),这些库必须在系统的库路径中,或者你需要通过 LD_LIBRARY_PATH 环境变量指定库的路径。

4. 环境变量

  • 环境变量:环境变量是操作系统中用于配置程序运行环境的参数。例如,PATH 环境变量指定了shell查找可执行文件的目录列表。
  • 影响执行:环境变量可以影响程序的执行,例如,LANG 环境变量设置程序的语言环境,TZ 环境变量设置程序使用的时区。

5. 终端与输入输出

  • 标准输入输出:程序通过标准输入(stdin)、标准输出(stdout)和标准错误输出(stderr)与终端进行交互。默认情况下,./donut 命令的输出会显示在终端上。
  • 重定向:你可以使用重定向符号(如 >>>< 等)来改变输入输出流的方向。例如,./donut > output.txt 会将程序的输出重定向到文件 output.txt 中。

6. 进程管理

  • 进程创建:执行 ./donut 命令时,系统会创建一个新的进程来运行该程序。
  • 进程终止:程序运行结束后,该进程会被终止,并返回控制权给终端。
  • 信号处理:在程序运行过程中,你可以通过发送信号来控制程序的执行。例如,使用 Ctrl+C 可以发送 SIGINT 信号来终止程序。

7. 错误处理

  • 错误报告:如果 donut 程序执行失败,终端通常会显示错误信息,帮助诊断问题。
  • 退出状态:程序执行结束后,会返回一个退出状态码。通常,0 表示成功,非零值表示失败或错误。

8. 安全性

  • 可执行文件来源:在执行任何可执行文件之前,应确保文件来源可信,避免执行恶意软件。
  • 权限设置:合理设置文件的权限,避免不必要的执行权限。

总结来看,在终端执行 ./donut 命令时,涉及的知识点包括可执行文件与权限、当前工作目录、命令解释与执行、环境变量、终端与输入输出、进程管理、错误处理以及安全性等方面。这些知识点共同构成了在Linux终端中执行程序的基础。


自动化脚本知识点

你提供的命令序列是一个简单的自动化脚本示例,它利用终端命令来执行一系列操作。以下是对每个命令的详细介绍,包括它们涉及的知识点:

1. echo "终端焦虑的甜甜圈"

  • echo 命令
    • 用于在终端输出文本。
    • 这里的 "终端焦虑的甜甜圈" 是输出的字符串。
    • 知识点:基本的终端命令使用,字符串输出。

2. git clone https://gitcode.com/ZhangRelay1/donut.git

  • git clone 命令
    • 用于从远程Git仓库复制代码到本地。
    • https://gitcode.com/ZhangRelay1/donut.git 是远程仓库的URL。
    • 知识点:Git版本控制系统,克隆远程仓库。

3. cd ~/donut

  • cd 命令
    • 用于更改当前工作目录。
    • ~/donut 表示当前用户目录下的 donut 文件夹。
    • 知识点:文件系统导航,路径使用(绝对路径和相对路径)。

4. g++ colordonut.cpp -o donut

  • g++ 编译器
    • 用于编译C++源代码文件。
    • colordonut.cpp 是要编译的源代码文件。
    • -o donut 选项指定输出的可执行文件名为 donut
    • 知识点:C++编译过程,g++ 编译器的基本使用。

5. ./donut

  • 执行可执行文件
    • ./donut 命令用于执行当前目录下的 donut 可执行文件。
    • 知识点:可执行文件的执行权限,进程管理。

6. echo "突破封印的甜甜圈"

  • 再次使用 echo 命令
    • 输出 "突破封印的甜甜圈"
    • 知识点:同第一个 echo 命令。

脚本自动化涉及的知识点

  • 顺序执行
    • 脚本中的每个命令按顺序执行。
    • 知识点:基本的脚本编写,命令的顺序和依赖关系。
  • 脚本文件
    • 可以将这些命令保存到一个文本文件中(如 run.sh),并通过 chmod +x run.sh 赋予执行权限,然后通过 ./run.sh 来运行整个脚本。
    • 知识点:脚本文件的创建和执行权限。
  • 错误处理
    • 在实际应用中,通常需要添加错误处理机制,以确保每个步骤成功执行。
    • 知识点:条件判断(如使用 if 语句),错误码检查。
  • 环境配置
    • 确保所有依赖的工具(如 git 和 g++)已安装,并在系统的 PATH 中可用。
    • 知识点:环境变量配置,软件包管理(如使用 aptyum 或 brew 安装工具)。

总结

这个简单的自动化脚本展示了如何在终端中使用基本命令来执行一系列任务,包括输出文本、克隆Git仓库、编译C++代码和执行可执行文件。涉及的知识点包括终端命令的使用、Git版本控制、C++编译过程、脚本编写和执行权限管理等。通过将这些命令整合到一个脚本中,可以自动化执行这些任务,提高效率和一致性。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/72875.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C/S架构与B/S架构

一、定义与核心区别 C/S架构&#xff08;Client/Server&#xff0c;客户端/服务器&#xff09; 客户端需安装专用软件&#xff08;如QQ、企业ERP系统&#xff09;&#xff0c;直接与服务器通信。服务器端通常包括数据库和业务逻辑处理1。特点&#xff1a;客户端承担部分计算任务…

【汇编语言】单片机程序执行过程

一、任务需求 指示灯LED4闪烁&#xff0c;亮0.5秒&#xff0c;灭0.5秒&#xff0c;无限循环 二、针对硬件的编程 1、确定原理图2、确定硬件的物理关系 三、设计步骤 1.用自己的语言描述工作流程 1.1指示灯LED4亮1.2延时0.5秒1.3指示灯LED4灭1.4延时0.5秒1.5跳转到1.1步 …

openharmony 富对富 WiFi投屏设计

castengine_wifi_display部件别名Sharing&#xff0c;媒体分享之意。拥有流媒体协议接入、媒体预览、媒体转分发能力&#xff0c;受投播管理服务管理和调用&#xff0c;是音视频投播子系统重要的流媒体能力部件。提供一套简单的Native C的接口&#xff0c;主要业务是Miracast投…

Android项目优化同步速度

最近项目需要使用ffmpeg&#xff0c;需要gradle配置引入ffmpeg库&#xff0c;发现原来通过google官方的代码仓&#xff0c;下载太慢了&#xff0c;每秒KB级别的速度。&#xff08;之前下gradle/gradle plugin都不至于这么慢&#xff09;&#xff0c;于是想到配置国内镜像源来提…

Git 如何配置多个远程仓库和免密登录?

自我简介&#xff1a;4年导游&#xff0c;10年程序员&#xff0c;最近6年一直深耕低代码领域&#xff0c;分享低代码和AI领域见解。 通用后台管理系统 代号&#xff1a;虎鲸 缘由 每次开发后台界面都会有很多相同模块&#xff0c;尝试抽离出公共模块作为快速开发的基座。 目标…

JVM组成面试题及原理

Java Virtual Machine&#xff08;JVM&#xff09;是Java程序的运行环境&#xff08;java二进制字节码的运行环境&#xff09; 好处&#xff1a; 一次编写&#xff0c;到处运行自动内存管理&#xff0c;垃圾回收机制 JVM由哪些部分组成&#xff0c;运行流程是什么&#xff1f;…

江科大51单片机笔记【11】AT24C02数据存储秒表

一、数据存储 先把需要的模块导入做个测试 //main.c#include <REGX52.H> #include " LCD1602.h" #include " Key.h"void main() {LCD_Init();LCD_ShowString(1,1,"Hello");while(1){}} 代码思路 分成两块写&#xff0c;一块写I2C.c&am…

Hadoop的运行模式

Hadoop的运行模式 1、本地运行模式2、伪分布式运行模式3、完全分布式运行模式4、区别与总结 Hadoop有三种可以运行的模式&#xff1a;本地运行模式、伪分布式运行模式和完全分布式运行模式 1、本地运行模式 本地运行模式无需任何守护进程&#xff0c;单机运行&#xff0c;所有…

2.装饰器模式

概述 装饰器模式&#xff1a;在原有结构&#xff0c;动态地为对象添加职责&#xff0c;它是一种灵活的扩展功能方式。 业务场景&#xff1a;创建订单 假设你正在开发一个电商系统&#xff0c;用户在创建订单时可以选择不同的服务&#xff08;如折扣、配送、礼品包装等&#…

C++11新特性 10.初始化列表、initializer_list

目录 一.初始化列表 使用示例 二.initializer_list 1.基本概念 2.使用示例 一.初始化列表 C11提供的统一初始化方式&#xff0c;实现直接对数据初始化 使用示例 /* 初始化列表 */ #include <iostream> using namespace std; class Person { public:Person(string…

Vue 的 render 函数如何与 JSX 结合使用

在 Vue.js 中&#xff0c;render 函数提供了一种更底层的方式来创建虚拟 DOM 节点&#xff0c;而 JSX 则是一种 JavaScript 的语法扩展&#xff0c;允许开发者在 JavaScript 代码中直接编写类似 HTML 的结构。结合使用 render 函数和 JSX 可以带来更高的灵活性和编程能力&#…

基于DeepSeek的智慧医药系统(源码+部署教程)

运行环境 智慧医药系统运行环境如下&#xff1a; 前端&#xff1a; HTMLCSS后端&#xff1a;Java AIGCDeepseekIDE工具&#xff1a;IDEA技术栈&#xff1a;Springboot HTMLCSS MySQL 主要角色 智慧医药系统主要分为两个角色。 游客 尚未进行注册和登录。具备登录注册、…

南开提出1Prompt1Story,无需训练,可通过单个连接提示实现一致的文本到图像生成。

&#xff08;1Prompt1Story&#xff09;是一种无训练的文本到图像生成方法&#xff0c;通过整合多个提示为一个长句子&#xff0c;并结合奇异值重加权&#xff08;SVR&#xff09;和身份保持交叉注意力&#xff08;IPCA&#xff09;技术&#xff0c;解决了生成图像中身份不一致…

BLUEM2引擎源码2025最新版

BLUE 引擎解析&#xff1a;传奇私服圈中的热门引擎 一、BLUE 引擎简介 BLUE 引擎是传奇私服圈子中较为知名的一款游戏引擎&#xff0c;它在传统的传奇引擎基础上进行了优化和扩展&#xff0c;使得私服开发者可以更加方便地搭建和管理服务器。相比于早期的 GEE、LEG、Hero 等引…

第53天:Web攻防-SQL注入数据库类型用户权限架构分层符号干扰利用过程发现思路

#知识点&#xff1a;(本节课了解即可&#xff09; 1、Web攻防-SQL注入-产生原理&应用因素 2、Web攻防-SQL注入-各类数据库类型利用 一、数据库知识&#xff1a; 1、数据库名&#xff0c;表名&#xff0c;列名&#xff0c;数据 2、自带数据库&#xff0c;数据库用户及权限 3…

【玩转MySQL数据字典】MySQL数据字典与常用操作指令

MySQL数据字典简介与常用操作指令 一、数据字典简介 数据字典是MySQL 5.7中用于存储数据库对象元数据的系统表。在MySQL的早期版本中&#xff0c;元数据存储在.frm文件及其他文件里。这种存储方式存在诸多弊端&#xff0c;例如元数据不一致问题&#xff0c;不同文件间元数据的…

如何有效判断与排查Java GC问题

目录 一、GC的重要性与对性能的影响 &#xff08;一&#xff09;GC对性能的影响简要分析 1.GC暂停与应用停顿 2.GC吞吐量与资源利用率 3.GC对内存管理的作用&#xff1a;资源回收 4.GC策略与优化的选择 &#xff08;二&#xff09;GC的双刃剑 二、GC性能评价标准 &…

el-table(elementui)表格合计行使用以及滚动条默认样式修改

一、el-table新增合计行以及el-table展示数据出现的问题 1. 使用合计行 el-table的属性show-summary设为true&#xff0c;即可在表格尾部展示合计行。默认情况下&#xff0c;第一列不展示数据&#xff0c;而显示合计二字&#xff0c;可以通过sum-text自己配置&#xff0c;其余…

olmOCR:高效精准的 PDF 文本提取工具

在日常的工作和学习中&#xff0c;是否经常被 PDF 文本提取问题困扰&#xff1f;例如&#xff1a; 想从学术论文 PDF 中提取关键信息&#xff0c;却发现传统 OCR 工具识别不准确或文本格式混乱&#xff1f;需要快速提取商务合同 PDF 中的条款内容&#xff0c;却因工具不给力而…

云计算:虚拟化、容器化与云存储技术详解

在上一篇中,我们深入探讨了网络安全的核心技术,包括加密、认证和防火墙,并通过实际案例和细节帮助读者全面理解这些技术的应用和重要性。今天,我们将转向一个近年来迅速发展的领域——云计算。云计算通过提供按需访问的计算资源,彻底改变了IT基础设施的构建和管理方式。本…