c++算法入门教程(3)

C++是一种功能强大且广泛应用的编程语言,对于想要深入学习编程和算法的人来说,掌握C++是一个重要的里程碑。本文将带你逐步了解C++编程的基础知识,并介绍一些算法和编程技巧帮你入门c++算法。


c++算法入门教程(1)和c++算法入门教程(2)-中,我讲了什么是编程、安装编译环境、输出、变量、输入、for循环、if和switch选择语句、循环结构、数组、函数,没看第一、二篇的可以去看看。

这篇博文续接c++算法入门教程(2),再次深入数组和函数。

一、数组

数组是C++中一种基础而强大的数据结构,用于存储相同类型的一组元素。在之前的文章中,我们已经简要介绍了数组的概念,现在我们进一步探讨其使用细节和应用场景。

1. 定义与初始化

数组的定义需要指定元素类型、数组名以及元素数量。例如,创建一个包含五个整数的数组`nums`:

int nums[5];  // 声明一个长度为5的整数数组

初始化数组可以在声明时直接给出初始值,使用花括号 `{}` 包裹各个元素:

int scores[] = {85, 9½, 78, 92, 88};  // 初始化一个整数数组

若未指定数组长度,编译器会根据初始值的数量自动推断。另外,数组的索引是从0开始的,因此`scores[0]`对应第一个元素`85`,`scores[4]`对应最后一个元素`88`。

2. 访问与修改

通过数组名和索引来访问或修改数组中的元素:

cout << "First score is: " << scores[0] << endl;  // 输出第一个分数
scores[2] = 80;  // 将第三个分数改为80

3. 二维数组

数组还可以是多维的,最常见的是二维数组,相当于一个表格。例如,定义一个3行4列的整数数组`matrix`:

int matrix[3][4];  // 声明一个3行4列的二维整数数组

初始化和访问二维数组与一维数组类似,只需增加一个索引维度:

int chessboard[8][8] = {
    {0, 1, 0, 1, 0, 1, 0, 1},
    {1, 0, 1, 0, 1, 0, 1, 0},
    // ...
};
cout << "Top-left square is: " << chessboard[0][0] << endl;  // 输出左上角方格值

4. 数组操作注意事项

使用数组时务必注意以下几点:

1. 避免数组越界访问

数组的索引是从0开始的,这意味着一个长度为N的数组其有效索引范围是0N-1。试图访问超出此范围的元素会导致未定义行为,可能会引发程序崩溃、数据损坏,甚至安全漏洞。例如,对于数组int arr[5],正确的访问应该是arr[0]arr[4]。对arr[-1]arr[5]及更远位置的访问都是非法的:

int arr[5] = {1, 2, 3, 4, 5};
cout << arr[4];  // 合法:输出5
cout << arr[5];  // 非法:可能导致程序崩溃或意外行为

确保在编写涉及数组索引的代码时,始终对索引值进行有效的边界检查。尤其是在循环中遍历数组时,务必确保循环条件正确限制了索引范围。

2. 数组大小一旦确定,无法动态改变

在C++中,数组的大小在声明时就已经确定,且在程序运行期间无法更改。这意味着一旦创建了一个具有特定大小的数组,你无法在程序运行时增加或减少其元素数量。例如:

int arr[5];  // 创建一个长度为5的数组
arr[5] = 6;  // 错误:尝试在数组尾部添加新元素,数组大小并未改变

// 或者
arr.resize(10);  // 错误:C++数组没有resize方法,不能动态改变大小

如果需要动态调整元素数量,应该使用std::vector,它是一个可变大小的数组类模板,提供了添加、删除元素以及动态调整容量的方法。

3. 数组名作为指针使用

在某些上下文中,数组名可以被视为指向其首元素的指针。这意味着可以使用数组名进行指针运算,如解引用或进行指针偏移。但是要注意,尽管数组名和指针在某些情况下可以互换使用,它们在语义上并不完全相同:

int arr[5] = {1, 2, 3, 4, 5};
int* ptr = arr;  // 将数组名赋值给指针,ptr现在指向arr的第一个元素

cout << *ptr++;  // 输出1,然后ptr指向arr的第二个元素
cout << *ptr;    // 输出2

尽管数组名可以作为指针使用,但不能对数组名本身进行赋值操作,如arr = new int[10];是非法的。

4. 数组复制与赋值

直接复制或赋值整个数组通常需要手动逐个元素复制,或者使用标准库提供的std::copy函数。C++11引入了std::array,它提供了拷贝构造函数和赋值运算符,使得数组的复制更为方便。对于std::vector,则可以直接使用赋值运算符(=)或std::vector::assign方法进行数组的复制。

二、函数

函数是组织和复用代码的重要手段,它将一组相关操作封装在一个独立的单元中,便于管理和调用。在C++中,函数的定义和使用涉及以下几个方面:

1. 声明与定义

函数声明告诉编译器函数的存在、返回类型以及参数列表,而定义则提供了函数的具体实现。例如,声明一个计算两数之和的函数add

1int add(int a, int b);  // 声明函数add,接收两个int参数,返回int类型

对应的函数定义:

1int add(int a, int b) {
2    return a + b;  // 函数体实现两数相加,并返回结果
3}

2. 参数传递

函数参数可以通过值传递、引用传递或指针传递。值传递时,函数接收到参数的一个副本;引用传递和指针传递则允许函数直接修改原始变量的值。例如:

// 值传递
void incrementByValue(int num) {
    num += 10;  // 变量num的副本在函数内部增加10,不影响外部变量
}

// 引用传递
void incrementByRef(int& num) {
    num += 10;  // 直接修改传入的num变量
}

// 指针传递
void incrementByPtr(int* numPtr) {
    *numPtr += 10;  // 通过指针修改指向的变量
}

3. 返回值

函数可以返回一个值(如add函数),也可以没有返回值(声明为void)。如果函数有多条return语句,仅最后一条被执行,其他return语句通常用于提前结束函数执行。

4. 函数重载

C++允许同一作用域内具有相同名字但参数列表不同的函数,称为函数重载。重载有助于提高代码的可读性和一致性:

int max(int a, int b) {
    return a > b ? a : b;
}

double max(double a, double b) {
    return a > b ? a : b;
}

至此,我已全面介绍了C++中的if语句、switch语句、循环结构(for、while、do-while)、数组、函数。这些基础知识是构建复杂算法的基础。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JetBrains GoLand v2024.1 激活版 (Go语言集成开发IDE)

前言 JetBrains GoLand是一款专门为Go语言开发人员构建的跨平台的集成开发环境。动态错误检测和修复建议、快速安全重构、智能代码完成、无效代码检测和文档提示可以帮助新手和有经验的Go开发人员高效地创建可靠的代码。GoLand还支持JavaScript&#xff0c;TypeScript&#xf…

AIX7环境上一次艰难的Oracle打补丁经历

系统环境 AIX &#xff1a;7200-05-03-2148 Oracle&#xff1a;11.2.0.4 PSU: 11.2.0.4.201020&#xff08;31718723&#xff09; perl:5.28 问题一&#xff1a;AUTO patch #/u01/app/11.2.0/grid/OPatch/opatch auto /tmp/31718723 错误信息如下&#xff1a;匹配mos 2516761.1…

K8s: 公有镜像中心和私有镜像中心的搭建

公有镜像中心的搭建和使用 1 &#xff09;在 官方docker镜像中心推送 在 hub.docker.com 上注册账号 (国内一般访问不了&#xff0c;原因不多说) 找到 Create Repository 按钮就行仓库的创建 这样就在官方创建了一个仓库&#xff0c;比如地址为: xx/y-y xx 是我的账户名y-y 是…

MATLAB - 机器人动力学 - 质心(Center of Mass)

系列文章目录 前言 一、用法 com centerOfMass(robot) com centerOfMass(robot,configuration) [com,comJac] centerOfMass(robot,configuration) 二、说明 com centerOfMass(robot) 计算机器人模型在原点构型处相对于基础坐标系的质心位置。com centerOfMass(robot,conf…

TCP关闭连接时的一些思考

TCP协议是TCP/IP栈中最复杂的协议&#xff0c;它最大的优点是传输的可靠性&#xff0c;这通过面向连接、按序传输、超时重传、流量控制等机制保证其传输的可靠性。但这并不是我们今天要讨论的重点&#xff01; TCP通信的过程分别是三个阶段&#xff1a;建立连接、传输数据、关…

VMware ESXi虚拟机备份的方法和步骤

关于虚拟机备份 VMware ESXi 是 VMware vSphere 企业虚拟化套件的核心组件。在版本4.1之前&#xff0c;它一直被称为ESX。ESXi是一种裸机管理程序&#xff0c;直接安装在物理服务器上&#xff0c;它提供对底层资源的直接访问和控制&#xff0c;允许您在单个物理主机上创建和运…

私有化部署 Llama3 大模型, 支持 API 访问

私有化部署 Llama3 大模型, 支持 API 访问 视频 https://www.bilibili.com/video/BV1wD421n75p/ 前言 原文 https://ducafecat.com/blog/llama3-model-api-local 通过 ollama 本地运行 Llama3 大模型其实对我们开发来说很有意义&#xff0c;你可以私有化放服务上了。 然后通…

练习题(2024/4/26)

1所有可能的路径 给你一个有 n 个节点的 有向无环图&#xff08;DAG&#xff09;&#xff0c;请你找出所有从节点 0 到节点 n-1 的路径并输出&#xff08;不要求按特定顺序&#xff09; graph[i] 是一个从节点 i 可以访问的所有节点的列表&#xff08;即从节点 i 到节点 graph…

科普童话新课堂杂志社科普童话新课堂编辑部2024年第16期目录

作品选 封2,封3-封4 探索新知《科普童话》投稿&#xff1a;cn7kantougao163.com 泱泱国之风 悠悠诗之情 沈灿宇1-3 试论"文化意识"视角下的高中英语阅读教学 董娜4-6 立足小组合作探究优化写作能力培养 时同祥7-9 以"导"促学:全面提升学生的文学核心素养 吴…

[网络安全] apt攻击是什么?

什么是APT攻击&#xff1a;APT攻击的主要特征包括&#xff1a;APT攻击的防御措施&#xff1a;零基础入门学习路线视频配套资料&国内外网安书籍、文档网络安全面试题 什么是APT攻击&#xff1a; APT&#xff08;Advanced Persistent Threat&#xff0c;高级持续性威胁&…

软件过程与项目管理期末复习

文章目录 1. 课程导论1) 什么是项目&#xff1f;具有什么特征&#xff1f;2) 项目管理的4阶段5过程的具体内容是什么&#xff1f;3) 项目管理的10大知识域是哪些&#xff1f;其中4个是核心知识域&#xff1f;4个核心知识域之间是什么关系&#xff1f;4) 什么是质量管理三角形&a…

汇舟问卷:做国外问卷调查需要准备些什么

大家好&#xff0c;我是汇舟问卷。海外问卷调查在这两年一直是个热门的项目&#xff0c;做这个项目所需要投入的成本是多少&#xff1f;如果我们要做这个项目需要准备什么以及要花多少钱&#xff1f;今天我来为大家讲解一下: 首先准备一台电脑 (内存建议16G&#xff0c;处理器…

C语言进阶:进阶指针(下)

一、 函数指针数组 我们都知道 数组是一个存放相同类型数据的存储空间 那我们已经学习了指针数组 那么函数有没有对应的指针数组呢&#xff1f; 如果有那应该怎么定义呢&#xff1f; 1. 函数指针数组的定义 我们说 函数指针数组的定义 应该遵循以下格式 int (*p[10])(); 首…

UniAD:以规划为导向的端到端自动驾驶

文章链接 这个文章是CVPR2023 Best Paper https://arxiv.org/pdf/2212.10156 提出背景 以往的自动驾驶多数是为不同的任务场景设计部署单独的模型&#xff0c;这样子组成的系统会很复杂如图a。 图b这是多任务共享一个主干&#xff0c;但还是要分离训练&#xff0c;而且不是…

03_Scala变量和数据类型

文章目录 [toc] **变量和数据类型****1.注释****2.变量和常量****3. 标识符的命名规范****4.scala的字符串****5.键盘输入****5.1 StdIn.readLine()****5.2 从文件中读取数据****5.3 Scala向外写数据** 变量和数据类型 1.注释 和Java完全一样 ** ** 2.变量和常量 var name…

外包干了4个月,技术退步明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…

攻防世界 easyphp

本题主要利用的知识点是php绕过 一、PHP代码分析 首先先看一下代码 我们需要利用get方式上传3个参数a,b,c&#xff0c;这3个分别需要满足不同的条件: a&#xff1a;设置a值&#xff1b;值大于6000000&#xff1b;长度不超过3&#xff1b; b&#xff1a;设置b值&#xff1b;MD…

《QT实用小工具·三十五》基于PathView,Qt/QML做的一个可以无限滚动的日历控件

1、概述 源码放在文章末尾 改项目实现了基于PathView&#xff0c;Qt/QML做的一个可以无限滚动的日历控件&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下所示&#xff1a; import QtQuick 2.7 import QtQuick.Controls 1.4 import QtQuick.Controls.Styles 1.4Bu…

基于Spring Boot的口腔管理平台设计与实现

基于Spring Boot的口腔管理平台设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 管理员登录界面图&#xff0c;管理员登录进入口腔管理平…

Spring Cloud OpenFeign使用

OpenFeign源于Netflix的Feign&#xff0c;是http通信的客户端。屏蔽了网络通信的细节&#xff0c;直接面向接口的方式开发&#xff0c;让开发者感知不到网络通信细节。 所有远程调用&#xff0c;都像调用本地方法一样完成。 Spring Cloud OpenFeign 是 Spring Cloud 对 Feign …