当前位置: 首页 > news >正文

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 就是我们⾃⼰定义的⼀个函数,使⽤函数能有什么好处呢?

  1. 模块化开发,⼀个⼤的功能,总能拆分成各种⼦功能,每个⼦功能都可以设计成⼀个函数,每个函数可以作为⼀个独⽴的模块存在,程序的逻辑更加清晰,逻辑关系更加明确。
  2. 代码可以复⽤,只要根据需要定义出⼀个函数,需要这个功能的地⽅,直接调⽤函数就⾏,降低了代码的冗余,提升了开发效率。
  3. ⽅便多个程序员之间协作开发,⽅便程序的多个模块之间互相交互。
  4. 熟悉函数的使⽤之后,代码的编写、阅读、调试、维护都变得更加容易。

函数的分类

在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;  
}

![[Pasted image 20250309151822.png]]

⾃定义函数

了解了库函数,其实库函数的功能是有限的,实际开发过程中还是得根据需要将代码封装成⾃定义的函数;⾃定义的函数就是⾃⼰设计和实现的函数

函数的语法形式
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;  
}

![[Pasted image 20250309152147.png]]

函数的参数部分需要交代清楚:参数个数,每个参数的类型是啥,形参的名字叫啥

函数参数和返回值

实参和形参

实际上,在函数定义和使⽤的过程中,函数的参数要被分为两种:

  • 实际参数,简称实参
  • 形式参数,简称形参
实参

实际参数就是真实传递给函数的参数。
在上⾯代码中,第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;  
}

![[Pasted image 20250309152421.png]]

我们在调试的可以观察到, x 和 y 确实得到了 a 和 b 的值,但是 x 和 y 的地址和 a 和 b 的地址不⼀样的,当 a 和 b 传参给形参x和y的时候, x 和 y 只是得到了 a 和 b 的值,他们得有⾃⼰独⽴的空间。所以我们可以理解为形参是实参的⼀份临时拷⻉。
![[Pasted image 20250309153212.png]]

函数传参

数组做函数参数

在使⽤函数解决问题的时候,难免会将数组作为参数传递给函数,在函数内部对数组进⾏操作。⽐如:写⼀个函数将⼀个整型数组的内容,全部置为 -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++)

函数是什么 数学中我们其实就⻅过函数的概念&#xff0c;⽐如&#xff1a;⼀次函数 y kx b &#xff0c;k和b都是常数&#xff0c;给⼀个任意的x &#xff0c;就得到⼀个 y 值。其实在C/C语⾔中就引⼊了函数&#xff08;function&#xff09;的概念&#xff0c;有些翻译为&a…...

计算机视觉算法实战——老虎个体识别(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域介绍 老虎个体识别是计算机视觉中的一个重要应用领域&#xff0c;旨在通过分析老虎的独特条纹图案&#xff0c;自动识别和区…...

【移动WEB开发】rem适配布局

目录 1. rem基础 2.媒体查询 2.1 语法规范 2.2 媒体查询rem 2.3 引入资源&#xff08;理解&#xff09; 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年携程校招社招求职能力北森测评材料计算部分:备考要点与误区解析

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

【Elasticsearch入门到落地】9、hotel数据结构分析

接上篇《8、RestClient操作索引库-基础介绍及导入demo》 上一篇我们介绍了RestClient的基础&#xff0c;并导入了使用Java语言编写的RestClient程序Demo以及将要分析的数据库。本篇我们就要分析导入的宾馆数据库tb_hotel表结构的具体含义&#xff0c;并分析如何建立其索引库。 …...

现代互联网网络安全与操作系统安全防御概要

现阶段国与国之间不用对方路由器&#xff0c;其实是有道理的&#xff0c;路由器破了&#xff0c;内网非常好攻击&#xff0c;内网共享开放端口也非常多&#xff0c;更容易攻击。还有些内存系统与pe系统自带浏览器都没有javascript脚本功能&#xff0c;也是有道理的&#xff0c;…...

轻量级TCC框架的实现

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

共绘智慧升级,看永洪科技助力由由集团起航智慧征途

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

小程序开发总结

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

元脑服务器:浪潮信息引领AI基础设施的创新与发展

根据国际著名研究机构GlobalData于2月19日发布的最新报告&#xff0c;浪潮信息在全球数据中心领域的竞争力评估中表现出色&#xff0c;凭借其在算力算法、开放加速计算和液冷技术等方面的创新&#xff0c;获得了“Leader”评级。在创新、增长力与稳健性两个主要维度上&#xff…...

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 创建数据库 引言 在网站开发中&#xff0c;数据库是存储和管理数据的核心部分。PHP 和 MySQL 是最常用的网页开发语言和数据库管理系统之一。本文将详细介绍如何在 PHP 中使用 MySQL 创建数据库&#xff0c;并对其操作进行详细讲解。 前提条件 在开始创建数据库之…...

UE4 World, Level, LevelStreaming从入门到深入

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

3月8日实验

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

IO多路复用实现并发服务器

一.select函数 select 的调用注意事项 在使用 select 函数时&#xff0c;需要注意以下几个关键点&#xff1a; 1. 参数的修改与拷贝 readfds 等参数是结果参数 &#xff1a; select 函数会直接修改传入的 fd_set&#xff08;如 readfds、writefds 和 exceptfds&#xf…...

【漫话机器学习系列】122.相关系数(Correlation Coefficient)

深入理解相关系数&#xff08;Correlation Coefficient&#xff09; 1. 引言 在数据分析、统计学和机器学习领域&#xff0c;研究变量之间的关系是至关重要的任务。我们常常想知道&#xff1a;当一个变量变化时&#xff0c;另一个变量是否也会随之变化&#xff1f;如果会&…...

控制系统分类

文章目录 定义与特点1. 自治系统&#xff08;Autonomous System&#xff09;与非自治系统&#xff08;Non-Autonomous System&#xff09;自治系统非自治系统 2. 线性系统&#xff08;Linear System&#xff09;与非线性系统&#xff08;Nonlinear System&#xff09;线性系统非…...

文档操作方法得合理使用

博主介绍&#xff1a;✌全网粉丝5W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面有丰富的经验…...

Python asyncIO 面试题及参考答案 草

目录 如何正确定义一个协程函数?直接调用协程会引发什么问题? 使用 async def 定义的协程与普通函数执行流程有何本质区别? 解释 asyncio.run () 的作用及与手动管理事件循环的差异 为什么协程中必须使用 await 而非 yield 挂起操作? 写出通过 async for 实现异步迭代器…...

计算机网络——交换机

一、什么是交换机&#xff1f; 交换机&#xff08;Switch&#xff09;是局域网&#xff08;LAN&#xff09;中的核心设备&#xff0c;负责在 数据链路层&#xff08;OSI第二层&#xff09;高效转发数据帧。它像一位“智能交通警察”&#xff0c;根据设备的 MAC地址 精准引导数…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢

随着互联网技术的飞速发展&#xff0c;消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁&#xff0c;不仅优化了客户体验&#xff0c;还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用&#xff0c;并…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Python Ovito统计金刚石结构数量

大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

CSS | transition 和 transform的用处和区别

省流总结&#xff1a; transform用于变换/变形&#xff0c;transition是动画控制器 transform 用来对元素进行变形&#xff0c;常见的操作如下&#xff0c;它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

C# 表达式和运算符(求值顺序)

求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如&#xff0c;已知表达式3*52&#xff0c;依照子表达式的求值顺序&#xff0c;有两种可能的结果&#xff0c;如图9-3所示。 如果乘法先执行&#xff0c;结果是17。如果5…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...