版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1自动驾驶编程原理与应用2背景:全球大力部署自动驾驶汽车领域各国持续加大自动驾驶汽车战略规划部署,推动相关法律法规修订,加速推进高级别自动驾驶测试,示范应用与商业化探索。英国:允许搭载ALKS(L3级)自动驾驶系统的车辆上路行驶。2021年欧盟:所有新车具备通信功能;德国:规划在2022年成为“世界第一个允许无人驾驶汽车常态化运行的国家”。2022年英国:CAM(connectedandautomatedmobility)货运服务小规模使用。2023年韩国:全国主要道路的L4级完全自动驾驶商用化。2027年2025年中国:2025年L2、L3级自动驾驶汽车销量占汽车总销量超过50%,C-V2X(以蜂窝通信为基础的移动车联网)终端新车装配率达50%。日本:私家车和卡车运输实现高速公路L4级自动驾驶。瑞典:实现自动驾驶公交应用。英国:最后一公里CAM货运服务具备竞争力。2026年瑞典:建立全国性Maas(mobilityasaservice)服务。英国:CAM成为公共出行服务的首选。3第一章
绪论知识点:了解自动驾驶技术架构相关原理,以及源码开发环境搭建对系统软硬件的基本要求。重点:重点掌握自动驾驶系统技术架构主要组成模块和各模块的基本功能。难点:自学Ubuntu系统安装。自动驾驶编程原理与应用41.1自动驾驶系统技术架构51.1自动驾驶系统技术架构自动驾驶系统(AutonomousDrivingSystem,ADS)自动驾驶系统是一个高度复杂的软硬件集成体系,通过激光雷达传感器、全球卫星导航系统接收机等多源异构传感器获取感知定位信息,配合高性能计算平台与底盘系统执行机构,构建起完整的“感知-决策-执行”闭环。61.1自动驾驶系统技术架构Autoware开源自动驾驶框架采用模块化分层式设计,大致可以将系统功能划分为感知定位层、决策规划层以及执行控制层,各功能层通过标准化数据接口实现高效协同。71.1自动驾驶系统技术架构感知定位层:主要负责环境感知与车辆定位,通过多传感器组合的方式实现对车辆定位以及其周围环境的全方位实时监测。81.1自动驾驶系统技术架构感知定位层环境感知功能模块主要依赖激光雷达传感器、视觉传感器、毫米波雷达传感器、超声波传感器等车载传感设备,对行驶路径(包括结构化道路标线、非结构化可行驶区域等)周边物体(包括车辆、行人、交通标志与信号灯等)驾驶状态(包括本车及周边车辆行驶状态)驾驶环境(包括路况、交通流量、天气等)等对象进行感知识别,为决策规划层路径规划和速度规划提供依据。91.1自动驾驶系统技术架构感知定位层车辆定位功能模块主要依赖全球卫星导航系统接收机、惯性测量单元、激光雷达传感器、视觉传感器等车载传感设备,通过算法获取车辆自身的位置姿态(包括航向角、俯仰角、横摆角等)等信息,从而为决策规划层和执行控制层相关模块提供车辆定位信息。101.1自动驾驶系统技术架构决策规划层:主要负责行为决策和轨迹规划两大核心功能,该层级通过整合感知定位层提供的信息,进行多维度分析与决策判断,并规划合理的期望车速和期望路径,以确保车辆能够安全、高效地适应复杂多变的交通环境。111.1自动驾驶系统技术架构决策规划层行为决策功能模块主要用于实现交通法规和安全约束条件下车辆行为的选择,具体包括停车、超车、变道、跟驰等典型场景的决策。轨迹规划功能模块主要用于规划车辆在未来时域、空域一系列动作,并生成时空维度上的可行轨迹,通常涵盖了全局和局部的速度和路径的规划。行为决策功能模块为轨迹规划提供目标导向,而轨迹规划功能模块则将行为决策转化为可执行的具体期望车速和期望路径。121.1自动驾驶系统技术架构执行控制层:主要功能是根据决策规划层生成的期望车速和期望路径,通过车辆的纵向和横向控制,实现相应的速度跟踪及路径跟踪。131.1自动驾驶系统技术架构执行控制层在车辆纵向控制方面,速度跟踪控制功能模块一般通过计算期望车速与实际车速的偏差,控制车辆的驱动系统和制动系统实现相应的加减速,从而准确跟踪规划速度。在车辆横向控制方面,路径跟踪控制功能模块一般通过计算期望路径与实际路径的横向偏差,控制车辆的转向系统实现车辆的横向移动,确保车辆运动过程中能够消除横向偏差并沿着规划路径稳定行驶。141.1自动驾驶系统技术架构执行控制层此外,执行控制层还需考虑纵向与横向控制之间耦合问题,以保证车辆的行驶安全性和乘坐舒适性。整个执行控制过程的实现依赖于多源传感器数据的高精度融合与高效控制算法的协同工作。系统需要实时采集轮速传感器、转向角传感器、惯性测量单元等数据,并通过卡尔曼滤波等数据融合算法构建准确的车辆状态估计。同时,基于先进的算法快速处理传感器数据并生成最优控制指令,以确保自动驾驶车辆在复杂交通场景下能够实现快速的动态响应,从而有效应对突发的交通状况。151.2自动驾驶系统开发环境161.2自动驾驶系统开发环境操作系统要求:Autoware不同版本需要不同的Linux(Ubuntu)操作系统Autoware版本操作系统Ubuntu14.04Ubuntu16.04Ubuntu18.04v1.13.0
√v1.12.0
√√v1.11.1
√
v1.11.0
√
v1.10.0
√
v1.9.1√√
v1.9.0√√
171.2自动驾驶系统开发环境操作系统要求如若不方便直接在个人计算机上安装Ubuntu操作系统,建议考虑支持外接移动固态硬盘的UbuntuToGo方案,其基本可满足本课程内容学习需要。开机后切换系统181.2自动驾驶系统开发环境软件要求:在安装Autoware源码前,需要先安装ROS、Qt等软件。不同的Linux(Ubuntu)操作系统下的软件配置要求不同软件版本操作系统Ubuntu14.04Ubuntu16.04Ubuntu18.04软件ROSIndigoKineticMelodicQt4.8.6及以上5.2.1及以上5.9.5及以上CUDA(可选)8.0GA9.010.019结束谢谢聆听!20自动驾驶编程原理与应用21第二章开源自动驾驶框架Autoware知识点:了解Autoware开源自动驾驶框架基本概况,以及Autoware基于源码安装方式;掌握常用功能组件的功能和使用方法。重点:重点掌握启动文件、坐标变换库、数据可视化工具、数据记录与回放工具等常用组件的相关命令。难点:ROS安装与环境配置。自动驾驶编程原理与应用22本章节目录2.1基本介绍Autoware开源自动驾驶框架2.2源码安装终端常用命令ROS安装系统依赖Autoware安装Autoware运行2.3常用功能组件说明启动文件坐标变换库数据可视化工具数据记录与回放工具232.1基本介绍242.1基本介绍Autoware是名古屋大学ShinpeiKato教授团队于2015年推出的开源自动驾驶软件框架,作为全球首个基于ROS(RobotOperatingSystem)的全栈自动驾驶解决方案,它开创了开源自动驾驶软件的先河。252.1基本介绍该框架深度整合了ROS的模块化架构和丰富工具链,构建了完整的自动驾驶开发生态系统。262.1基本介绍ROS作为Autoware的中间件,运行于Linux(Ubuntu)操作系统之上,不仅提供基于TCP/UDP网络封装的发布/订阅、客户端/服务端等实现数据传输的通信机制,而且还集成功能强大的库和工具:Catkin-原始构建系统;OpenCV-图像处理库;rosbag-数据记录与回放工具;RViz-数据可视化工具;tf-坐标变换库;RQT-基于Qt的GUI开发工具。这些工具和库共同构成了Autoware的底层支撑,使其能够高效实现车辆定位、环境感知、决策规划、运动控制等自动驾驶核心功能,同时保持高度的灵活性和可扩展性。272.2源码安装282.2源码安装本课程基于Ubuntu18.04系统/ROSMelodic以及Autoware1.12.0版本指导安装运行代码所需环境。292.2源码安装终端常用命令使用快捷键Ctrl+Alt+T打开终端。302.2源码安装终端常用命令终端操作常用命令及其相应功能介绍:a)cd<目录路径>功能:切换工作目录。b)pwd功能:显示出当前工作目录的绝对路径。c)mkdir[选项]<目录名称>功能:创建目录。选项:-p(递归创建父目录)。312.2源码安装终端常用命令终端操作常用命令及其相应功能介绍:d)ls[选项]<目录名称>功能:列出目录的内容。选项:-l(详细列表)、-a(显示隐藏文件)。e)touch[选项]文件名称功能:创建空文件;若文件已存在,则更新其访问和修改时间戳。f)mv[选项]<源文件或目录><目地文件或目录>功能:为文件/目录改名,或将文件由一个目录移入另一个目录中。322.2源码安装终端常用命令终端操作常用命令及其相应功能介绍:g)cp[选项]<源文件名称或目录名称><目的文件名称或目录名称>功能:把给出的一个文件或目录拷贝到另一文件或目录中,或者把多个源文件复制到目标目录中。选项:-r(递归复制目录)、-i(覆盖前提示)。h)sudo[选项][指令]功能:以超级用户(root)权限执行命令。默认需输入当前用户密码。332.2源码安装ROS安装以Melodic版本为例介绍ROS的安装方法。(1)添加ROS软件源,在终端输入以下命令:(2)添加密钥,在终端输入以下命令:$sudoshc'echo"deb/ros/ubuntu$(lsb_release-sc)main">/etc/apt/sources.list.d/ros-latest.list'
$sudoapt-keyadv--keyserver'hkp://:80'--recv-keyC1CF6E31E6BADE8868B172B4F42ED6FBAB17C654
342.2源码安装ROS安装以Melodic版本为例介绍ROS的安装方法。(3)安装ROS,在终端输入以下命令:(4)初始化rosdep,在终端输入以下命令:$sudoaptupdate$sudoaptinstallros-melodic-desktop-full$sudorosdepinit$rosdepupdate352.2源码安装ROS安装以Melodic版本为例介绍ROS的安装方法。(5)设置环境变量,在终端输入以下命令:(6)安装rosinstall,在终端输入以下命令:$echo"source/opt/ros/melodic/setup.bash">>~/.bashrc$source~/.bashrc$sudoaptinstallpython-rosinstallpython-rosinstall-generatorpython-wstoolbuild-essential362.2源码安装系统依赖在终端输入以下命令:$sudoaptupdate$sudoaptinstall–ypython–catkin–pkgpython–rosdepros–$ROS_DISTRO–catkin$sudoaptinstall–ypython3–pippython3–colcon–common–extensionspython3–setuptoolspython3–vcstool$pip3install–Usetuptools372.2源码安装Autoware安装(1)创建工作空间,在终端输入以下命令:(2)以1.12.0版本Autoware.AI为例,下载Autoware.AI工作区配置,在终端输入以下命令:$mkdir–pautoware.ai/src$cdautoware.ai
$wget-Oautoware.ai.repos"/autowarefoundation/autoware.ai/autoware/raw/1.12.0/autoware.ai.repos?inline=false"382.2源码安装Autoware安装(3)将Autoware.AI下载到工作区,在终端输入以下命令:(4)使用rosdep安装依赖项,在终端输入以下命令:$vcsimportsrc<autoware.ai.repos$rosdepupdate$rosdepinstall–y––from-pathssrc–ignore–src–rosdistro$ROS_DISTRO392.2源码安装Autoware安装5)编译工作区情况1未安装CUDA,在终端输入以下命令:情况2已安装CUDA,在终端输入以下命令:$colconbuild––cmake–args-DCMAKE_BUILD_TYPE=Release$AUTOWARE_COMPILE_WITH_CUDA=1colconbuild‐cmake‐args‐DCMAKE_BUILD_TYPE=Release402.2源码安装Autoware运行以运行官方示例数据为例,在终端多标签中分别输入以下命令运行Autoware:(1)示例数据a)下载示例点云/矢量地图数据:b)下载rosbag格式示例数据(LiDAR:VELODYNEHDL-32E;GNSS:JAVADGPSRTKDelta3):$wget/sample_moriyama_data.tar.gz$wget/sample_moriyama_150324.tar.gz412.2源码安装Autoware运行(2)运行示例a)假设示例数据下载至~/Downloads文件夹。在Home目录下创建.autoware文件夹并拷贝“~/Downloads”文件夹中的示例数据到“~/.autoware”文件夹内(需要查看文件夹时直接使用快捷键Ctrl+H显示隐藏文件夹.autoware),然后解压:$cd~$mkdir.autoware$cd.autoware$cp~/Downloads/sample_moriyama_*.$tarzxfvsample_moriyama_150324.tar.gz422.2源码安装Autoware运行(2)运行示例输入以下命令启动地图(启动地图后如需终止进程,可在终端界面使用快捷键Ctrl+C强制中断程序):c)使用快捷键Shift+Ctrl+T在终端新建标签,在新标签中输入以下命令启动定位:$cdautoware.ai$sourceinstall/setup.bash$roslaunchautoware_quickstart_examplesmy_map.launch$sourceinstall/setup.bash$roslaunchautoware_quickstart_examplesmy_localization.launch432.2源码安装Autoware运行(2)运行示例使用快捷键Shift+Ctrl+T在终端新建标签,在新标签中输入以下命令打开可视化工具RViz:打开RViz后显示的是默认初始界面,为了配合示例,需要加载官方的配置文件。在RViz可视化工具界面中依次选择File→OpenConfig或是直接使用快捷键Ctrl+O打开对话框加载文件“~/autoware.ai/src/autoware/documentation/autoware_quickstart_examples/launch/rosbag_demo/default.rviz”,然后点击Open进行配置。$sourceinstall/setup.bash$rviz442.2源码安装Autoware运行(2)运行示例e)使用快捷键Shift+Ctrl+T在终端新建标签,在新标签中输入以下命令回放解压后示例文件sample_moriyama_150324.bag中的数据(回放过程中可在终端界面点击空格键Space暂停或继续):$cd~/.autoware$rosbagplaysample_moriyama_150324.bag452.3常用功能组件说明462.3常用功能组件说明启动文件启动文件(.launch)是一种通过XML文件实现多节点配置和启动的途径,其不仅可以同时启动一组节点,还可以自动启动节点管理器,而且可以实现每个节点的各种配置(相关节点和节点管理器的内容会在下一章系统介绍)。在上一节运行示例启动地图时,用到了启动文件“~/autoware.ai/src/autoware/documentation/autoware_quickstart_examples/launch/rosbag_demo/my_map.launch”。$cdautoware.ai$sourceinstall/setup.bash$roslaunchautoware_quickstart_examplesmy_map.launch472.3常用功能组件说明启动文件以“my_map.launch”为例。<launch><!--loadparametersforndt_matching--><rosparamcommand="load"file="$(findautoware_quickstart_examples)/config/headless_setup.yaml"/><!--TF--><includefile="$(envHOME)/.autoware/data/tf/tf.launch"/>
<!--PointCloud--><nodepkg="map_file"type="points_map_loader"name="points_map_loader"args="noupdate$(envHOME)/.autoware/data/map/pointcloud_map/bin_Laser-00167_-00864.pcd$(envHOME)/.autoware/data/map/pointcloud_map/bin_Laser-00153_-00852.pcd$(envHOME)/.autoware/data/map/pointcloud_map/bin_Laser-00159_-00859.pcd$(envHOME)/.autoware/data/map/pointcloud_map/bin_Laser-00160_-00861.pcd$(envHOME)/.autoware/data/map/pointcloud_map/bin_Laser-00148_-00849.pcd$(envHOME)/.autoware/data/map/pointcloud_map/bin_Laser-00168_-00866.pcd…"/>
<!--VectorMap--><nodepkg="map_file"type="vector_map_loader"name="vector_map_loader"args="$(envHOME)/.autoware/data/map/vector_map/lane.csv$(envHOME)/.autoware/data/map/vector_map/line.csv$(envHOME)/.autoware/data/map/vector_map/utilitypole.csv$(envHOME)/.autoware/data/map/vector_map/curb.csv$(envHOME)/.autoware/data/map/vector_map/node.csv$(envHOME)/.autoware/data/map/vector_map/gutter.csv$(envHOME)/.autoware/data/map/vector_map/point.csv…"/>
</launch>482.3常用功能组件说明启动文件启动文件my_map.launch中包含一个根元素<launch>和两个节点元素<node>。XML文件中必须包含一个根元素,其用<launch>标签定义,而启动节点则是用<node>标签定义。启动文件“my_map.launch”中用到了pkg、type、name和args四个属性。其中,pkg定义节点所在的功能包名称,type定义节点的可执行文件名称,name定义节点运行的名称,args定义节点需要的输入参数。此外,启动文件“my_map.launch”中的<rosparam>用于实现参数设置,可以通过设置command属性为“load”将YAML格式文件中的参数加载到参数服务器。492.3常用功能组件说明坐标变换库车辆在道路环境下实现自动驾驶往往涉及大量组件元素,不同组件元素有各自对应的坐标系(如世界坐标系、车辆坐标系、传感器坐标系与地图坐标系等),坐标系之间存在一定的变换关系。以“~/.autoware/data/tf”为例,tf是一个允许用户随时跟踪多个坐标系的功能包(相关功能包的内容会在下一章系统介绍),其使用树形数据结构让用户可以完成任意坐标系上点、向量等在两个坐标系间的变换。建立好世界坐标系、车辆坐标系与地图坐标系三者之间的关系后,车辆在世界坐标系中的位置就可以用一个向量来表示。502.3常用功能组件说明坐标变换库一般车辆坐标系的坐标原点O位于车辆后轴中心,xOz平面处于车辆左右对称的平面内,其中x轴正方向平行于车辆底盘平面指向车辆的前方,z轴正方向指向正上方,y轴正方向指向车辆左侧。512.3常用功能组件说明坐标变换库使用view_frames工具生成tf树的信息,在终端输入以下命令:$cd~/.autoware/data/tf$rosruntfview_frames$evinceframes.pdf522.3常用功能组件说明坐标变换库使用上述命令会生成.pdf文件并通过打开文件显示整棵tf树的信息。532.3常用功能组件说明坐标变换库如tf树的信息所示,在当前系统存在世界坐标系(worldframe)、地图坐标系(mapframe)、车辆坐标系(base_linkframe)、激光雷达坐标系(velodyneframe)、GPS坐标系(gpsframe)以及移动坐标系(mobilityframe)。可以使用tf_echo工具查看指定两坐标系之间的变换关系。以“查看‘<source_frame>/世界坐标系’与‘<target_frame>/地图坐标系’之间的变换关系”为例,在终端新建标签,在新标签中输入以下命令:$rosruntftf_echo/world/map542.3常用功能组件说明数据可视化工具三维可视化工具RViz的操作主界面主要由以下五部分组成:(1)工具栏区域:有视角控制、目标设置、地点发布等工具,还可以添加自定义的一些插件。
(2)3D视图显示区域:用于图形化显示外部信息可监测数据。(3)显示项目区域:显示当前选择的插件,并且能够对插件的属性进行设置。(4)观测视角设置区域:设置不同的观测视角。(5)时间显示区域:显示包括系统时间和ROS时间等。552.3常用功能组件说明数据可视化工具3D视图显示区域工具栏区域显示项目区域观测视角设置区域时间显示区域562.3常用功能组件说明数据可视化工具在RViz中可以通过点击显示项目区域左侧下方的Add添加相应插件订阅消息实现对数据的可视化显示。添加完成后,在显示项目区域会列出已经添加的显示插件。如果订阅成功,3D视图显示区域会出现可视化后的数据;如果显示有问题,可以查看下拉属性中“Status”是否显示OK以及数据发布是否正常。RViz的显示插件除了默认的之外,还能够自定义显示插件。572.3常用功能组件说明数据可视化工具RViz默认显示项582.3常用功能组件说明数据记录与回放工具为实现数据复用、方便离线调试,ROS提供了功能包rosbag用于记录与回放话题数据(相关话题的内容会在下一章系统介绍)。在记录数据之前,可以在终端输入以下命令查看当前系统中存在的话题:$rostopiclist-v592.3常用功能组件说明数据记录与回放工具然后使用rosbag工具记录话题数据,可以在终端输入以下命令抓取需要记录的话题数据并打包放置在自定义的文件夹bagfiles(如需终止数据记录,可在数据记录运行的终端界面使用快捷键Ctrl+C强制中断程序):$mkdir~/bagfiles$cd~/bagfiles$rosbagrecord-a602.3常用功能组件说明数据记录与回放工具其中rosbagrecord是记录话题数据的命令,-a表示记录所有发布的话题数据。终止数据记录后,打开文件夹bagfiles就有成功生成的.bag数据记录文件。rosbag工具除了提供数据记录功能外,还具备数据回放的功能。参考上一节运行Autoware官方示例数据,可以使用rosbagplay命令回放所有记录在官方提供的数据记录文件“sample_moriyama_150324.bag”中的话题数据。$mkdir~/bagfiles$cd~/bagfiles$rosbagrecord-a61结束谢谢聆听!62自动驾驶编程原理与应用63第三章Autoware编程基础知识点:了解Autoware与ROS之间的联系;掌握基于C++语言的ROS编程基本概念和方法。重点:重点掌握ROS编程常用命令行工具、工作空间与功能包、发布/订阅话题消息以及客服端请求与服务端应答相关定义和使用方法。难点:模块化设计思想以及发布订阅模式。自动驾驶编程原理与应用64本章节目录3.1C++编程基础IO库复合类型变量迭代语句条件语句类模板3.2ROS编程基础文件系统与通讯机制常用命令行工具工作空间编译话题发布与订阅编程话题消息定义与使用服务请求与应答编程服务数据定义与使用653.1C++编程基础663.1C++编程基础由于Autoware是基于ROS搭建的,且其源码为C++语言,所以基于Autoware平台学习搭建自动驾驶系统就必须具备一定C++和ROS编程基础。673.1C++编程基础C++是一门高效、灵活且功能强大的通用编程语言,由丹麦计算机科学家BjarneStroustrup于1983年在贝尔实验室设计开发。作为C语言的超集(Superset),它不仅继承了C语言在高性能计算和底层系统控制方面的优势,还通过引入面向对象编程和泛型编程等特性,大幅提升了代码的可重用性、可扩展性和可维护性。683.1C++编程基础C++的标准模板库(STL,StandardTemplateLibrary)提供了一系列高效、泛型化的容器和算法,显著简化了常见数据结构和算法的实现流程,使开发者能够更专注于业务逻辑而非底层细节。在Autoware系统的开发实践中,C++的诸多核心特性发挥着关键作用。下面就Autoware系统编程中涉及的IO库、复合类型变量、迭代语句、条件语句、类及模板等C++编程基础内容逐一展开介绍。693.1C++编程基础IO库C++语言本身并未定义任何用于输入输出(IO)操作的语句,而是通过一个功能丰富的标准库(standardlibrary)来提供IO功能。本节示例主要使用标准库中的组件iostream库,该库包含istream(输入流)和ostream(输出流)两个基础类型。其中,术语流(stream)表示从IO设备读取或写入的字符序列,其概念强调字符是随时间推移按顺序生成或消耗的。iostream库定义了4个IO对象,其中包括用于处理输入的istream类型对象cin(标准输入)和用于处理输出的ostream类型对象cout(标准输出)。703.1C++编程基础IO库使用iostream库需要在#include指令后方尖括号中指出头文件(header),该示例中头文件为iostream。#include指令一般位于源文件的开始位置,且必须出现在所有函数之外。#include<iostream>
intmain(){std::cout<<"Entertwonumbers:"<<std::endl;inta=0,b=0;std::cin>>a>>b;std::cout<<"Thesumof"<<a<<"and"<<b<<"is"<<a+b<<std::endl;return0;}示例713.1C++编程基础IO库该示例主函数(main函数)中的第一条语句执行了一个表达式(通常是由运算对象和运算符组成),该表达式使用了两次输出运算符<<在标准输出cout上打印消息。#include<iostream>
intmain(){std::cout<<"Entertwonumbers:"<<std::endl;inta=0,b=0;std::cin>>a>>b;std::cout<<"Thesumof"<<a<<"and"<<b<<"is"<<a+b<<std::endl;return0;}示例输出723.1C++编程基础IO库在该表达式中,第一个输出运算符<<左侧的运算对象为ostream类型对象,输出运算符<<右侧的运算对象为打印的消息,而第一个输出运算符<<的运算结果成为了第二输出运算符<<左侧的运算对象,如此一来便可将打印消息连接起来。#include<iostream>
intmain(){std::cout<<"Entertwonumbers:"<<std::endl;inta=0,b=0;std::cin>>a>>b;std::cout<<"Thesumof"<<a<<"and"<<b<<"is"<<a+b<<std::endl;return0;}示例输出733.1C++编程基础IO库需要说明的是,该示例主函数第一条语句中的第二输出运算符用于打印endl,这是一种操纵符的特殊值,其表示结束当前行。此外,该示例主函数第一条语句中使用的是std::cout和std::endl,而非直接使用cout和endl,前缀std::表明cout和endl定义在名为std的命名空间(namespace),命名空间机制能够有效避免同名冲突。#include<iostream>
intmain(){std::cout<<"Entertwonumbers:"<<std::endl;inta=0,b=0;std::cin>>a>>b;std::cout<<"Thesumof"<<a<<"and"<<b<<"is"<<a+b<<std::endl;return0;}示例输出743.1C++编程基础IO库该示例主函数第二条语句中定义两个int类型(整型)变量a和b来存储输入内容,并对其进行初始化。#include<iostream>
intmain(){std::cout<<"Entertwonumbers:"<<std::endl;inta=0,b=0;std::cin>>a>>b;std::cout<<"Thesumof"<<a<<"and"<<b<<"is"<<a+b<<std::endl;return0;}示例753.1C++编程基础IO库该示例主函数第三条语句中使用输入运算符>>,输入运算符>>左侧的运算对象为istream类型对象,输入运算符>>右侧的运算对象为存入对象,输入运算符>>返回其左侧运算对象作为其运算结果。#include<iostream>
intmain(){std::cout<<"Entertwonumbers:"<<std::endl;inta=0,b=0;std::cin>>a>>b;std::cout<<"Thesumof"<<a<<"and"<<b<<"is"<<a+b<<std::endl;return0;}示例输入763.1C++编程基础IO库最后,打印运算结果,包括字符串字面值常量(如“Thesumof”,“and”,“is”)、int值(如a,b,a+b)等。#include<iostream>
intmain(){std::cout<<"Entertwonumbers:"<<std::endl;inta=0,b=0;std::cin>>a>>b;std::cout<<"Thesumof"<<a<<"and"<<b<<"is"<<a+b<<std::endl;return0;}示例773.1C++编程基础复合类型变量在C++中,对象通常也被称为变量。变量是程序中具有名称的可操作存储空间,其内存占用大小、布局方式、数值范围以及支持的运算均由其数据类型决定。数据类型可分为算术类型和void类型。常见的算术类型有字符char、整型int、布尔类型bool、单精度浮点数float及双精度浮点数double等,其中布尔类型bool的取值为真(true)或假(false)。void类型没有关联具体的值,最常见的就是使用void类型作为无返回值函数的返回类型。783.1C++编程基础复合类型变量引用是C++中为已存在的对象创建的别名,它本身并不是独立的对象,而是绑定到另一个已存在对象的标识符。引用类型通过将声明符写成&refVal的形式来定义引用类型,其中refVal表示声明的变量名称,第二条语句表示refVal指向ival,即refVal是ival的别名。intival=1024;int&refVal=ival;示例引用793.1C++编程基础复合类型变量通常,当我们初始化变量时,会将初始值的副本存入新创建的对象中。而对于引用的定义,我们并非复制初始值,而是将引用直接绑定到初始化对象上。引用一旦完成初始化,就会永久绑定其初始对象,无法重新绑定到其他对象。正因如此,引用必须在定义时进行初始化,这一点与指针有所不同。intival=1024;int&refVal=ival;示例引用803.1C++编程基础复合类型变量指针是C++中另一种常见的复合类型,它和引用一样可用于间接访问对象,但在本质上存在显著差异。作为独立对象,指针支持赋值和拷贝操作,并可在生命周期内改变所指向的对象。与引用必须初始化的特性不同,指针允许延迟初始化,若在块作用域内定义的指针未初始化,其值将处于未定义状态,这点与其他内置类型一样。指针stringstr="astring",*pt=&str;autonum=str.size();num=(*pt).size();num=pt->size();示例813.1C++编程基础复合类型变量指针类型通过将声明符写成*pt的形式来定义引用类型,其中pt表示声明的变量名称,第一条语句表示pt是指向变量str的指针,即pt存放着变量str的地址。需要说明的是,指针使用操作符&是作为取址符出现在表达式中,而引用使用操作符&则是作为声明的一部分紧随类型名出现。指针stringstr="astring",*pt=&str;autonum=str.size();num=(*pt).size();num=pt->size();示例用途:如遍历数组823.1C++编程基础复合类型变量第二条语句运行string对象str的size成员并赋值给auto类型变量num。指针stringstr="astring",*pt=&str;autonum=str.size();num=(*pt).size();num=pt->size();示例833.1C++编程基础复合类型变量第三条语句运行pt所指对象的size成员。指针stringstr="astring",*pt=&str;autonum=str.size();num=(*pt).size();num=pt->size();示例843.1C++编程基础复合类型变量第四条语句中表达式pt->size()等价于第三条语句中表达式(*pt).size()。指针stringstr="astring",*pt=&str;autonum=str.size();num=(*pt).size();num=pt->size();示例853.1C++编程基础迭代语句迭代语句通常称为循环,用于在条件为真时重复执行操作。C++提供了多种循环结构,其中while和for是最常用的两种。这两种循环均采用先判断条件后执行的方式:while循环在条件持续为真时重复执行语句,而for循环则通过初始化、条件判断和迭代更新三个部分提供更紧凑的循环控制结构。它们适用于不同的场景,如while适合不确定迭代次数的情况(如读取输入),而for更适合已知或需要精确控制循环次数的任务(如遍历数组)。863.1C++编程基础迭代语句以计算输入数字之和为例。在源文件的开始位置使用using声明则不用添加std::形式便可访问命名空间std里的成员(如主函数中的第二条语句可直接使用cin,无须写成std::cin的形式,读取输入数字num)。while#include<iostream>usingnamespacestd;
intmain(){intnum,sum=0;cin>>num;while(num!=0){sum+=num;cin>>num;}return0;}示例873.1C++编程基础迭代语句主函数中的第三条语句中使用了while语句,表示只要num不等于0,循环就会继续执行。while语句在条件持续为真时重复执行目标语句,首次条件为假则跳过循环,且条件不可为空(通常为表达式或已初始化变量声明)。while#include<iostream>usingnamespacestd;
intmain(){intnum,sum=0;cin>>num;while(num!=0){sum+=num;cin>>num;}return0;}示例883.1C++编程基础迭代语句通过主函数中的第四条语句将每次输入的数字num累加到变量sum中。while#include<iostream>usingnamespacestd;
intmain(){intnum,sum=0;cin>>num;while(num!=0){sum+=num;cin>>num;}return0;}示例893.1C++编程基础迭代语句在循环内部读取下一个输入,直至输入0跳过循环。while#include<iostream>usingnamespacestd;
intmain(){intnum,sum=0;cin>>num;while(num!=0){sum+=num;cin>>num;}return0;}示例迭代语句for语句头初始化部分一般情况下只初始化一个值,这个值会随着循环的进行而改变。条件判断部分作为循环控制的条件,当判断语句为真时,则执行循环体,当判断语句为假时,则终止循环。迭代更新部分负责在每次循环后对初始部分中的变量进行修改。#include<iostream>#include<vector>usingnamespacestd;
intmain(){vector<int>num;for(inti=1;i<=5;i++){num.push_back(i*i);}return0;}903.1C++编程基础for示例初始化部分条件判断部分迭代更新部分迭代语句以计算1到5的整数平方为例。主函数中的第一条语句中创建一个空的vector对象num,用于存储整型元素。#include<iostream>#include<vector>usingnamespacestd;
intmain(){vector<int>num;for(inti=1;i<=5;i++){num.push_back(i*i);}return0;}913.1C++编程基础for示例迭代语句主函数中的第二条语句使用for语句头初始化整型变量i,通过判断i是否小于等于5决定是否执行循环体,每次循环后对变量i的值进行修改。923.1C++编程基础#include<iostream>#include<vector>usingnamespacestd;
intmain(){vector<int>num;for(inti=1;i<=5;i++){num.push_back(i*i);}return0;}for示例迭代语句循环体中使用命名空间vector中的成员函数push_back,将i的平方(i*i)添加到vector对象num的末尾。当判断语句i<=5不为真时,则终止循环。933.1C++编程基础#include<iostream>#include<vector>usingnamespacestd;
intmain(){vector<int>num;for(inti=1;i<=5;i++){num.push_back(i*i);}return0;}for示例943.1C++编程基础条件语句C++提供了if和switch两种条件执行语句,分别适用于不同的分支控制场景。其中if语句主要根据布尔条件决定控制流,可嵌套使用;而switch语句则是根据整型表达式结果选择执行路径,通过case标签实现多路分支,通常需要配合break使用。条件语句if语句的作用是判断一个指定的条件是否为真,根据判断结果决定程序执行路径。当判断语句为真时,则执行对应的语句;当判断语句为假时,则跳过对应的语句。953.1C++编程基础ifif(grade<60)lettergrade=scores[0];else{lettergrade=scores[(grade-50)/10];if(grade!=100)if(grade%10>7)lettergrade+='+';elseif(grade%10<3)lettergrade+='-';}示例条件语句以给等级制考核合格成绩(等级制与百分制成绩转换按:90-100分计优秀,80-89分计良好,70-79分计中等,60-69分计及格,<60计不及格)后面添加加减号为例,第一条语句用于判断百分制成绩grade的值是否小于60。963.1C++编程基础ifif(grade<60)lettergrade=scores[0];else{lettergrade=scores[(grade-50)/10];if(grade!=100)if(grade%10>7)lettergrade+='+';elseif(grade%10<3)lettergrade+='-';}示例条件语句当判断语句为真时,则执行第二条语句将scores[0]赋值给等级制成绩lettergrade;973.1C++编程基础ifif(grade<60)lettergrade=scores[0];else{lettergrade=scores[(grade-50)/10];if(grade!=100)if(grade%10>7)lettergrade+='+';elseif(grade%10<3)lettergrade+='-';}示例条件语句否则,执行第四条语句将scores[(grade-50)/10]赋值给lettergrade。983.1C++编程基础ifif(grade<60)lettergrade=scores[0];else{lettergrade=scores[(grade-50)/10];if(grade!=100)if(grade%10>7)lettergrade+='+';elseif(grade%10<3)lettergrade+='-';}示例条件语句然后,判断grade的值是否不等于100。993.1C++编程基础ifif(grade<60)lettergrade=scores[0];else{lettergrade=scores[(grade-50)/10];if(grade!=100)if(grade%10>7)lettergrade+='+';elseif(grade%10<3)lettergrade+='-';}示例条件语句当判断语句为真时,则根据算术运算符%求取余数,判断余数大于7还是小于3决定添加加号“+”还是减号“-”。1003.1C++编程基础ifif(grade<60)lettergrade=scores[0];else{lettergrade=scores[(grade-50)/10];if(grade!=100)if(grade%10>7)lettergrade+='+';elseif(grade%10<3)lettergrade+='-';}示例#include<iostream>usingnamespacestd;
intmain(){intaCount=0,eCount=0,iCount=0,oCount=0,uCount=0;charch;while(cin.get(ch)){switch(ch){case'a':++aCount;break;case'e':++eCount;break;case'i':++iCount;break;case'o':++oCount;break;case'u':++uCount;break;}}return0;}条件语句1013.1C++编程基础示例switch语句提供了一种便捷的方式来从多个固定选项中选择执行路径。switch#include<iostream>usingnamespacestd;
intmain(){intaCount=0,eCount=0,iCount=0,oCount=0,uCount=0;charch;while(cin.get(ch)){switch(ch){case'a':++aCount;break;case'e':++eCount;break;case'i':++iCount;break;case'o':++oCount;break;case'u':++uCount;break;}}return0;}条件语句1023.1C++编程基础switch示例以文本片段中五个元音字母('a'、'e'、'i'、'o'、'u')各自出现的次数为例。主函数中的第三条语句使用while语句循环读取输入的每个字符。#include<iostream>usingnamespacestd;
intmain(){intaCount=0,eCount=0,iCount=0,oCount=0,uCount=0;charch;while(cin.get(ch)){switch(ch){case'a':++aCount;break;case'e':++eCount;break;case'i':++iCount;break;case'o':++oCount;break;case'u':++uCount;break;}}return0;}条件语句1033.1C++编程基础switch示例主函数中的第四条语句利用switch语句匹配不同ch的值对应的case(该示例中case标签为五个元音字母)。#include<iostream>usingnamespacestd;
intmain(){intaCount=0,eCount=0,iCount=0,oCount=0,uCount=0;charch;while(cin.get(ch)){switch(ch){case'a':++aCount;break;case'e':++eCount;break;case'i':++iCount;break;case'o':++oCount;break;case'u':++uCount;break;}}return0;}条件语句1043.1C++编程基础switch示例执行与元音匹配的case分支代码,将该元音对应的计数值(aCount、eCount、iCount、oCount、uCount)加1。#include<iostream>usingnamespacestd;
intmain(){intaCount=0,eCount=0,iCount=0,oCount=0,uCount=0;charch;while(cin.get(ch)){switch(ch){case'a':++aCount;break;case'e':++eCount;break;case'i':++iCount;break;case'o':++oCount;break;case'u':++uCount;break;}}return0;}条件语句1053.1C++编程基础switch示例case分支以break语句结尾跳出,将控制权转移到while语句循环中。1063.1C++编程基础类在C++中,类(Class)是一种用户自定义的数据类型,用于封装数据(成员变量)和操作数据的方法(成员函数)。类的主要目的是提高代码的模块化、可重用性和安全性。作为面向对象编程的核心概念,类具有封装和继承的特性:封装是指将数据和操作隐藏在一个单元中,通过访问控制保护内部状态,用户只能使用接口而无法访问实现部分;继承是指允许派生类继承基类的成员,实现代码复用。1073.1C++编程基础类通常使用访问说明符public或private控制类中成员(变量和函数)的可见性和访问权限:定义在public说明符之后的成员在整个程序内可被访问(public成员定义类的接口对外提供功能)。定义在private说明符之后的成员可被类的成员访问,但是不能被使用该类的代码访问(private封装了类的实现细节)。类1083.1C++编程基础#include<iostream>#include<string>usingnamespacestd;
classStudent{private:stringname;intage;
public:voidsetName(stringn){name=n;}voidsetAge(inta){age=a;}voiddisplay(){cout<<"姓名:"<<name<<",年龄:"<<age<<endl;}};
intmain(){Studentstu;stu.setName("张三");stu.setAge(20);stu.display();
return0;}示例以定义和使用一个简单的Student类为例。定义一个Student类,通过private说明符指定外部无法直接访问成员name和age。类1093.1C++编程基础#include<iostream>#include<string>usingnamespacestd;
classStudent{private:stringname;intage;
public:voidsetName(stringn){name=n;}voidsetAge(inta){age=a;}voiddisplay(){cout<<"姓名:"<<name<<",年龄:"<<age<<endl;}};
intmain(){Studentstu;stu.setName("张三");stu.setAge(20);stu.display();
return0;}示例再者通过public说明符指定成员setName、setAge和display作为可被外部访问的接口。类1103.1C++编程基础#include<iostream>#include<string>usingnamespacestd;
classStudent{private:stringname;intage;
public:voidsetName(stringn){name=n;}voidsetAge(inta){age=a;}voiddisplay(){cout<<"姓名:"<<name<<",年龄:"<<age<<endl;}};
intmain(){Studentstu;stu.setName("张三");stu.setAge(20);stu.display();
return0;}示例主函数中的第一条语句创建Student类型对象stu。类1113.1C++编程基础#include<iostream>#include<string>usingnamespacestd;
classStudent{private:stringname;intage;
public:voidsetName(stringn){name=n;}voidsetAge(inta){age=a;}voiddisplay(){cout<<"姓名:"<<name<<",年龄:"<<age<<endl;}};
intmain(){Studentstu;stu.setName("张三");stu.setAge(20);stu.display();
return0;}示例主函数中的第二、三条语句调用函数setName和setAge分别设置private成员name和age。类1123.1C++编程基础#include<iostream>#include<string>usingnamespacestd;
classStudent{private:stringname;intage;
public:voidsetName(stringn){name=n;}voidsetAge(inta){age=a;}voiddisplay(){cout<<"姓名:"<<name<<",年龄:"<<age<<endl;}};
intmain(){Studentstu;stu.setName("张三");stu.setAge(20);stu.display();
return0;}示例主函数中的第四条语句调用函数display输出“姓名:张三,年龄:20”。1133.1C++编程基础模板模板是一种泛型编程工具,它允许开发者编写与数据类型无关的通用代码。通过定义函数模板和类模板,可以实现同一套逻辑适用于多种数据类型,有效避免重复编写相似代码。函数模板用于创建处理不同数据类型的通用函数。类模板则用于构建处理不同数据类型的通用类。通常模板定义以关键字template开始,后跟模板参数列表,模板参数列表不能为空,表中的模板参数用于表示在类或函数定义中用到的类型或值,类型参数前一般使用关键字class或typename(两个关键字的含义相同,可以互换使用)。1143.1C++编程基础模板模板本身并不是具体的类或函数,而是编译器生成具体代码的蓝图。只有当提供具体的模板参数时(这个过程称为实例化),编译器才会根据模板生成实际的类或函数。模板1153.1C++编程基础以交换两个变量的值为例。定义一个函数模板用于实现交换两个变量的值的功能。#include<iostream>usingnamespacestd;
template<typenameT>voidswapValues(T&a,T&b){Ttemp=a;a=b;b=tem
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 仓储物流配送协议(生鲜电商)2026
- 营销活动策划方案手册
- 新生儿红臀预防护理作业规范
- 企业安全教育培训档案管理办法
- 生产废水处理设施运行管理规定
- 年度家政员招聘计划执行方案
- 服务项目定价策略分析
- 苹果蚜虫杀虫剂安全使用规范
- 播种机调试作业技术管理方案
- 排污口规范化建设管理方案
- 生物浙江宁波市三锋联盟2025-2026学年度高一年级第二(下)学期期中联考(4.22-4.24)
- 2026年二级建造师二建法规考前预测重点知识强化记忆总结笔记
- 2026云南省有色地质局楚雄勘查院下属企业招聘工作人员11人笔试备考试题及答案解析
- 心血管科试卷及分析
- 2026四川发展(控股)有限责任公司所属公司招聘5人笔试参考题库及答案解析
- 湖北省武汉市2026届高三毕业生四月调研考试语文试卷(含答案)
- 养老机构防灾避险课件
- 江苏省兴化市2026届中考数学模拟预测题含解析
- 2026年辽宁能源集团招聘考试指南及模拟题解析
- 2026广东广州市黄埔区大沙街道招聘编外聘用人员4人备考题库及参考答案详解
- 老龄政策课件
评论
0/150
提交评论