NO.32十六届蓝桥杯备战|函数|库函数|自定义函数|实参|形参|传参(C++)
函数是什么
数学中我们其实就⻅过函数的概念,⽐如:⼀次函数 y = kx + b ,k和b都是常数,给⼀个任意的x ,就得到⼀个 y 值。其实在C/C++语⾔中就引⼊了函数(function)的概念,有些翻译为:⼦程序,⼦程序这种翻译更加准确⼀些。函数就是⼀个完成某项特定的任务的⼀⼩段代码,这段代码是有特殊的写法和调⽤⽅法的。
其实⼤家在前⾯学习的时候,就⻅过函数了,⽐如:main函数、scanf函数、printf函数、pow函数、sqrt函数等。C/C++语⾔程序其实是由若⼲个⼩的函数组合⽽成的,也可以说:⼀个⼤的计算任务可以分解成若⼲个较⼩的函数(对应较⼩的任务)完成。同时⼀个函数如果能完成某项特定任务的话,这个函数也是可以复⽤的,提升了开发软件的效率。
#include <iostream>
using namespace std;
int main()
{ int arr[10] = { 0 }; //打印数组的内容 //给数组的元素赋值为1~10 //打印数组 return 0;
}
如果没有函数,我们能写出的代码如下的代码1,其中橙⾊部分的内容和绿⾊部分的代码是重复的,⽬的就是打印数组内容,那如果我能把这部分封装成⼀个函数,在需要的时候调⽤,就⽅便很多,这就是代码2
//代码1
#include<iostream>
using namespace std;
int main()
{ int arr[10] = { 0 }; //打印数组的内容 int i = 0; for (i = 0; i < 10; i++) { cout << arr[i] << " "; } cout << endl; //给数组的元素赋值为1~10 for (i = 0; i < 10; i++) { arr[i] = i + 1; } //打印数组 for (i = 0; i < 10; i++) { cout << arr[i] << " "; } cout << endl; return 0;
}
//代码2
#include<iostream>
using namespace std;
void print_arr(int arr[])
{ int i = 0; for (i = 0; i < 10; i++) { cout << arr[i] << " "; } cout << endl;
} int main()
{ int arr[10] = { 0 }; //打印数组的内容 print_arr(arr); //给数组的元素赋值为1~10 for (int i = 0; i < 10; i++) { arr[i] = i + 1; } //打印数组 print_arr(arr);return 0;
}
在代码2中 print_arr 就是我们⾃⼰定义的⼀个函数,使⽤函数能有什么好处呢?
- 模块化开发,⼀个⼤的功能,总能拆分成各种⼦功能,每个⼦功能都可以设计成⼀个函数,每个函数可以作为⼀个独⽴的模块存在,程序的逻辑更加清晰,逻辑关系更加明确。
- 代码可以复⽤,只要根据需要定义出⼀个函数,需要这个功能的地⽅,直接调⽤函数就⾏,降低了代码的冗余,提升了开发效率。
- ⽅便多个程序员之间协作开发,⽅便程序的多个模块之间互相交互。
- 熟悉函数的使⽤之后,代码的编写、阅读、调试、维护都变得更加容易。
函数的分类
在C/C++中,函数⼀般分为库函数和⾃定义函数
库函数
printf 、 scanf 都是库函数,库函数是标准库中提供的现成的函数,我们只要学习函数的功能,就能直接使⽤。有了库函数,⼀些常⻅的功能就不需要程序员⾃⼰实现了,⼀定程度提升了效率;同时库函数的质量和执⾏效率上都更有保证。
编译器的标准库中提供了⼀系列的库函数,这些库函数根据功能的划分,都在不同的头⽂件中进⾏了声明。
库函数的学习和查阅⼯具很多,⽐如:
C/C++官⽅参考⼿册:https://zh.cppreference.com/w/cpp/header
C/C++第三⽅⽹站:https://legacy.cplusplus.com/reference/
库函数中有数学相关的,有⽇期相关的,有算法相关的等等。这些库函数相关的信息都有⾃⼰对应的头⽂件,每⼀个头⽂件中都包含了相关的⼀组函数和类型等信息,库函数的学习不⽤着急⼀次性全部学会,慢慢学习,各个击破就⾏。
C++是兼容C语⾔,所以在C++中也包含了⼀些来⾃C语⾔的头⽂件,这些头⽂件的后缀是 .h ,如果需要也可以直接包含使⽤;有⼀些来⾃C语⾔的头⽂件,在C++中会在原来C语⾔的头⽂件进⾏了封装,在C++程序中更推荐C++的头⽂件写法,以下是常⻅C和C++对应的头⽂件:
解释 | C头文件 | C++头文件 |
---|---|---|
常用数学函数 | <math.h> | <cmath> |
浮点类型的极限 | <float.h> | <cfloat> |
C风格输入输出 | <stdio.h> | <cstdio> |
字符串处理 | <string.h> | <string> |
库函数使⽤举例
sqrt
double sqrt (double x);
- sqrt 是函数名
- x 是函数的参数,表⽰调⽤ sqrt 函数需要传递⼀个 double 类型的值
- double 是返回值类型,表⽰函数计算的结果是 double 类型的值
作用
Compute square root计算平⽅根
Returns the square root of x.(返回平⽅根)
头文件
库函数是在标准库中对应的头⽂件中声明的,所以库函数的使⽤,务必包含对应的头⽂件,不包含是可能会出现⼀些问题的。
#include <iostream>
#include <cmath> //数学函数头⽂件,不包含则⽆法使⽤sqrt函数
using namespace std;
int main()
{ double d = 16.0; double r = sqrt(d); cout << r << endl; return 0;
}
⾃定义函数
了解了库函数,其实库函数的功能是有限的,实际开发过程中还是得根据需要将代码封装成⾃定义的函数;⾃定义的函数就是⾃⼰设计和实现的函数
函数的语法形式
ret_type fun_name(形式参数)
{ }
- ret_type 是⽤来表⽰函数计算结果的类型,有时候返回类型可以是 void ,表⽰什么都不返回
- fun_name 是为了⽅便使⽤函数;就像⼈的名字⼀样,有了名字⽅便称呼,函数有了名字⽅便调⽤,所以函数名尽量要根据函数的功能起的有意义。
- 函数的参数就相当于⼯⼚加⼯需要的原材料,函数的参数也可以是 void ,明确表⽰函数没有参数。如果有参数,多个参数⽤逗号隔开,每个参数要分别交代清楚参数的类型和名字。
- {} 括起来的部分被称为函数体,函数体就是完成计算的过程。
函数定义
写⼀个加法函数,完成2个整型变量的加法操作
#include<iostream>
using namespace std;
int main()
{ int a = 0; int b = 0; //输⼊ cin >> a >> b; //任务:调⽤加法函数,完成a和b的相加 //求和的结果放在r中 //to do //输出 cout << r << endl; return 0;
}
给函数取名: Add ,函数 Add 需要接收2个整型类型的参数,函数计算的结果也是整型
#include<iostream>
using namespace std;
//这就是函数的定义
int Add(int x, int y)
{ int z = 0; z = x + y; return z;
} int main()
{ int a = 0; int b = 0; //输⼊ cin >> a >> b; //调⽤加法函数,完成a和b的相加 //求和的结果放在r中 int r = Add(a, b); //输出 cout << r << endl; return 0;
}
Add 函数也可以简化为
int Add(int x, int y)
{
return x + y;
}
函数的参数部分需要交代清楚:参数个数,每个参数的类型是啥,形参的名字叫啥
函数参数和返回值
实参和形参
实际上,在函数定义和使⽤的过程中,函数的参数要被分为两种:
- 实际参数,简称实参
- 形式参数,简称形参
实参
实际参数就是真实传递给函数的参数。
在上⾯代码中,第4~6⾏是 Add 函数的定义,有了函数后,再第19⾏调⽤ Add 函数的。
我们把第19⾏调⽤ Add 函数时,传递给函数的参数 a 和 b ,称为实际参数,简称实参。
形参
在上⾯代码中,第4⾏定义函数的时候,在函数名 Add 后的括号中写的 x 和 y ,称为形式参数,简称形参。
为什么叫形式参数呢?实际上,如果只是定义了 Add 函数,⽽不去调⽤的话, Add 函数的参数 x 和 y 只是形式上存在的,不会向内存申请空间,不会真实存在的,所以叫形式参数。形式参数只有在函数被调⽤的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就是形式的实例化。
实参和形参的关系
虽然我们提到了实参是传递给形参的,他们之间是有联系的,但是形参和实参各⾃是独⽴的内存空间。
这个现象是可以通过调试来观察的。请看下⾯的代码和调试演⽰:
#include<iostream>
using namespace std;
int Add(int x, int y)
{ int z = 0; z = x + y; return z;
}
int main()
{ int a = 0; int b = 0; //输⼊ cin >> a >> b; //调⽤加法函数,完成a和b的相加 //求和的结果放在r中 int r = Add(a, b); //输出 cout << r << endl; return 0;
}
我们在调试的可以观察到, x 和 y 确实得到了 a 和 b 的值,但是 x 和 y 的地址和 a 和 b 的地址不⼀样的,当 a 和 b 传参给形参x和y的时候, x 和 y 只是得到了 a 和 b 的值,他们得有⾃⼰独⽴的空间。所以我们可以理解为形参是实参的⼀份临时拷⻉。
函数传参
数组做函数参数
在使⽤函数解决问题的时候,难免会将数组作为参数传递给函数,在函数内部对数组进⾏操作。⽐如:写⼀个函数将⼀个整型数组的内容,全部置为 -1 ,再写⼀个函数打印数组的内容。
#inculude <iostream>
using namespace std;
int main()
{ int arr[] = {1,2,3,4,5,6,7,8,9,10}; set_arr(); //设置数组内容为-1 print_arr(); //打印数组内容 return 0;
}
这⾥的 set_arr 函数要能够对数组内容进⾏设置,就得把数组作为参数传递给函数,同时函数内部在设置数组每个元素的时候,也得遍历数组,需要知道数组的元素个数。所以我们需要给 set_arr传递2个参数,⼀个是数组,另外⼀个是数组的元素个数。仔细分析 print_arr 也是⼀样的,只有拿到了数组和元素个数,才能遍历打印数组的每个元素。
int main()
{ int arr[] = {1,2,3,4,5,6,7,8,9,10}; int sz = sizeof(arr)/sizeof(arr[0]); set_arr(arr, sz); //设置数组内容为-1print_arr(arr, sz); //打印数组内容return 0;
}
数组作为参数传递给了 set_arr 和 print_arr 函数了,那这两个函数应该如何设计呢?
这⾥我们需要知道数组传参的⼏个重点知识:
- 函数的实参的名字和形参的名字可以相同,也可以不同
- 函数的形式参数要和函数的实参个数匹配
- 函数的实参是数组,形参也写成数组形式的
- 形参如果是⼀维数组,数组⼤⼩可以省略不写
- 形参如果是⼆维数组,⾏可以省略,但是列不能省略
- 数组传参,形参是不会创建新的数组的
- 形参操作的数组和实参的数组是同⼀个数组
void set_arr(int arr[], int sz)
{ int i = 0; for(i = 0; i < sz; i++) { arr[i] = -1; }
}
void print_arr(int arr[], int sz)
{ int i = 0; for(i = 0; i < sz; i++) { cout << arr[i] << " "; } cout << endl;
}
字符串做函数参数
那如果将字符串做函数参数呢?其实也很简单,直接在形参的部分使⽤字符串来接收就可以。这⾥的形参 s 也是实参 s 的⼀份临时拷⻉,对形参的修改不能影响实参。
void test(string s)
{ cout << s << endl;
}
int main()
{ string s("hello world"); test(s);
}
全局变量不⽤传参
全局变量的作⽤域很⼤,在整个程序中都可以使⽤,那么只要把变量、数组等定义成全局变量,在函数中使⽤,是可以不⽤传参的,在竞赛中为了⽅便经常使⽤,但是在软件⼯程中很少这么使⽤
#include <iostream>
using namespace std;
int arr[10] = { 0 }; void print_arr()
{ int i = 0; for (i = 0; i < 10; i++) { cout << arr[i] << " "; } cout << endl;
} int main()
{ //打印数组的内容 print_arr(); //给数组的元素赋值为1~10 for (int i = 0; i < 10; i++) { arr[i] = i + 1;} //打印数组 print_arr(); return 0;
}
有时候变量或者数组,定义成全局的时候,是不能解决问题,⽐如:递归等场景,这时候,就得考虑传参的问题
相关文章:

NO.32十六届蓝桥杯备战|函数|库函数|自定义函数|实参|形参|传参(C++)
函数是什么 数学中我们其实就⻅过函数的概念,⽐如:⼀次函数 y kx b ,k和b都是常数,给⼀个任意的x ,就得到⼀个 y 值。其实在C/C语⾔中就引⼊了函数(function)的概念,有些翻译为&a…...

计算机视觉算法实战——老虎个体识别(主页有源码)
✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ 1. 领域介绍 老虎个体识别是计算机视觉中的一个重要应用领域,旨在通过分析老虎的独特条纹图案,自动识别和区…...

【移动WEB开发】rem适配布局
目录 1. rem基础 2.媒体查询 2.1 语法规范 2.2 媒体查询rem 2.3 引入资源(理解) 3. less基础 3.1 维护css的弊端 3.2 less介绍 3.3 less变量 3.4 less编译 3.5 less嵌套 3.6 less运算 4. rem适配方案 4.1 rem实际开发 4.2 技术使用 4.3 …...

25年携程校招社招求职能力北森测评材料计算部分:备考要点与误区解析
在求职过程中,能力测评是筛选候选人的重要环节之一。对于携程这样的知名企业,其能力测评中的材料计算部分尤为关键。许多求职者在备考时容易陷入误区,导致在考试中表现不佳。本文将深入解析材料计算部分的实际考察方向,并提供针对…...

【Elasticsearch入门到落地】9、hotel数据结构分析
接上篇《8、RestClient操作索引库-基础介绍及导入demo》 上一篇我们介绍了RestClient的基础,并导入了使用Java语言编写的RestClient程序Demo以及将要分析的数据库。本篇我们就要分析导入的宾馆数据库tb_hotel表结构的具体含义,并分析如何建立其索引库。 …...
现代互联网网络安全与操作系统安全防御概要
现阶段国与国之间不用对方路由器,其实是有道理的,路由器破了,内网非常好攻击,内网共享开放端口也非常多,更容易攻击。还有些内存系统与pe系统自带浏览器都没有javascript脚本功能,也是有道理的,…...

轻量级TCC框架的实现
现有seata、tcc-transaction等tcc框架实现都较为重量级,今天主要带来一种轻量级的实现,大概只用了1200行代码实现。不依赖具体框架grpc、http、dubbo等,只需要业务系统按照标准化实现Try、Commit、Cancel实现接口即可。 已解决悬挂、幂等、空…...

共绘智慧升级,看永洪科技助力由由集团起航智慧征途
在数字化洪流汹涌澎湃的当下,企业如何乘风破浪,把握转型升级的黄金机遇,已成为所有企业必须直面的时代命题。由由集团,作为房地产的领航者,始终以前瞻视野引领变革,坚决拥抱数字化浪潮,携手数字…...

小程序开发总结
今年第一次帮别人做小程序。 从开始动手到完成上线,一共耗时两天。AI 让写代码变得简单、高效。 不过,小程序和 Flutter 等大厂开发框架差距实在太大,导致我一开始根本找不到感觉。 第一,IDE 不好用,各种功能杂糅在…...

元脑服务器:浪潮信息引领AI基础设施的创新与发展
根据国际著名研究机构GlobalData于2月19日发布的最新报告,浪潮信息在全球数据中心领域的竞争力评估中表现出色,凭借其在算力算法、开放加速计算和液冷技术等方面的创新,获得了“Leader”评级。在创新、增长力与稳健性两个主要维度上ÿ…...
uniapp+node+mysql接入deepseek实现流式输出
node import express from express; import mysql from mysql2; import cors from cors; import bodyParser from body-parser; import axios from axios; import { WebSocketServer } from ws; // 正确导入 WebSocketServerconst app express();// Middlewares app.use(cors…...
PHP MySQL 创建数据库
PHP MySQL 创建数据库 引言 在网站开发中,数据库是存储和管理数据的核心部分。PHP 和 MySQL 是最常用的网页开发语言和数据库管理系统之一。本文将详细介绍如何在 PHP 中使用 MySQL 创建数据库,并对其操作进行详细讲解。 前提条件 在开始创建数据库之…...

UE4 World, Level, LevelStreaming从入门到深入
前言 在《塞尔达传说:旷野之息》中,玩家攀上初始高塔的瞬间,目光所及的山川湖泊皆可抵达;在《艾尔登法环》中,黄金树的辉光始终悬于地平线之上,指引玩家穿越无缝衔接的史诗战场。这些现代游戏杰作背后的核…...

3月8日实验
拓扑: 需求: 1.学校内部的HTTP客户端可以正常通过域名www.baidu.com访问到白度网络中的HTTP服务器 2.学校网络内部网段基于192.168.1.0/24划分,PC1可以正常访问3.3.3.0/24网段,但是PC2不允许 3.学校内部路由使用静态路由&#…...

IO多路复用实现并发服务器
一.select函数 select 的调用注意事项 在使用 select 函数时,需要注意以下几个关键点: 1. 参数的修改与拷贝 readfds 等参数是结果参数 : select 函数会直接修改传入的 fd_set(如 readfds、writefds 和 exceptfds…...
【漫话机器学习系列】122.相关系数(Correlation Coefficient)
深入理解相关系数(Correlation Coefficient) 1. 引言 在数据分析、统计学和机器学习领域,研究变量之间的关系是至关重要的任务。我们常常想知道:当一个变量变化时,另一个变量是否也会随之变化?如果会&…...
控制系统分类
文章目录 定义与特点1. 自治系统(Autonomous System)与非自治系统(Non-Autonomous System)自治系统非自治系统 2. 线性系统(Linear System)与非线性系统(Nonlinear System)线性系统非…...

文档操作方法得合理使用
博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
Python asyncIO 面试题及参考答案 草
目录 如何正确定义一个协程函数?直接调用协程会引发什么问题? 使用 async def 定义的协程与普通函数执行流程有何本质区别? 解释 asyncio.run () 的作用及与手动管理事件循环的差异 为什么协程中必须使用 await 而非 yield 挂起操作? 写出通过 async for 实现异步迭代器…...

计算机网络——交换机
一、什么是交换机? 交换机(Switch)是局域网(LAN)中的核心设备,负责在 数据链路层(OSI第二层)高效转发数据帧。它像一位“智能交通警察”,根据设备的 MAC地址 精准引导数…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...

嵌入式学习笔记DAY33(网络编程——TCP)
一、网络架构 C/S (client/server 客户端/服务器):由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序,负责提供用户界面和交互逻辑 ,接收用户输入,向服务器发送请求,并展示服务…...

面向无人机海岸带生态系统监测的语义分割基准数据集
描述:海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而,目前该领域仍面临一个挑战,即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]
报错信息:libc.so.6: cannot open shared object file: No such file or directory: #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...
6.9本日总结
一、英语 复习默写list11list18,订正07年第3篇阅读 二、数学 学习线代第一讲,写15讲课后题 三、408 学习计组第二章,写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语:复习l默写sit12list17&#…...
【2D与3D SLAM中的扫描匹配算法全面解析】
引言 扫描匹配(Scan Matching)是同步定位与地图构建(SLAM)系统中的核心组件,它通过对齐连续的传感器观测数据来估计机器人的运动。本文将深入探讨2D和3D SLAM中的各种扫描匹配算法,包括数学原理、实现细节以及实际应用中的性能对比,特别关注…...