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

详讲函数知识

目录

1. 函数是什么?

2. C语言中函数的分类:

2.1 库函数:

2.2 自定义函数

函数的基本组成:

 3. 函数的参数

3.1 实际参数(实参):

3.2 形式参数(形参):

写一个函数可以交换两个整形变量的内容

错误示范:

正确代码如下:

小结:

4. 函数的调用 

4.1 传值调用

4.2 传址调用

4.3 练习

4.3.1 写一个函数可以判断一个数是不是素数

4.3.2 写一个函数判断一年是不是闰年

4.3.3 写一个函数,实现一个整形有序数组的二分查找

4.3.4 写一个函数,每调用一次这个函数,就会将num的值+1


1. 函数是什么?

在数学中函数的概念大家应该都有所了解:y = f(x) ;我们可以代入x求出相应的y。但是,你了解C语言中的函数吗?

  • 函数其实就是一部分的代码,它们可能有一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具有相对的独立性。
  • 一般有输入参数并会有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。

2. C语言中函数的分类:

库函数和自定义函数

2.1 库函数:

为什么会有库函数?

  • 我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上。(printf)
  • C语言官方了解到我们在编写代码的时候会有一些小动作会频繁大量的使用,如果有一个库函数来存放这些代码,这样我们就可以直接使用。如果没有这个库,那么同一个功能可能会有许多种写法,品质良莠不齐,可读性不高,可移植性不高。
  • 在C语言的标准库里提供了一系列C语言的库函数

学习库函数的网站:www.cplusplus.com

这里简单的介绍一下常用的库函数:

  • IO函数— — — — I=input; O=output; 输入输出函数:scanf、printf
  • 字符串操作函数— — — — strlen、strcmp……
  • 内存操作函数— — — — 大小写转换、字符分类
  • 时间/日期函数— — — — time
  • 数学函数— — — — pow、sqrt
  • 其他库函数

2.2 自定义函数

库函数不是万能的,只含有常用的函数,自定义函数更加重要!

自定义函数和库函数一样,有函数名,返回值类型和函数参数。

但是不一样的是自定义函数是由程序员自己设计的。这给程序员提供了一个很大的发挥空间。

函数的基本组成:

ret_type     返回类型 

fun-name   函数名

para 1        函数参数 — — 参数可以是0,可以是一个或多个

{   }内为函数体,函数体中包含的是语句项

 3. 函数的参数

3.1 实际参数(实参):

  • 真实传给函数的参数,叫实参。
  • 实参可以是:常量、变量、表达式、函数等。
  • 无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值都传给形参。

3.2 形式参数(形参):

形式参数是指函数名后括号中的变量,应为形式参数只有在函数被调用的过程中猜实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成后就自动销毁了。因此,形式参数只在函数中有效。

写一个函数可以交换两个整形变量的内容

1.定义a、b存放并输入整数

2.先在屏幕中显示出原来的两个整形顺序,然后用自定义函数调换,最后在屏幕中显示改变顺序的整形。

3.写自定义函数:采用取地址的方式,将a、b取地址,定义一个tmp存放临时的数字,进行调换,最后取地址回去

错误示范:

void Swap(int x,int y)
{int tmp = x;x = y;y = tmp;
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前:a=%d b=%d\n",a,b);Swap(a, b);printf("交换后:a=%d b=%d\n", a, b);return 0;
}

这里主要的错误就是调用函数部分,我们通过调试可以看到:

 虽然我们的数值是给到了x、y,但是x、y的地址和a、b的地址不一样,就导致了即使我们交换了x、y,  a、b的数值也没有改变。

因此,我们在写调用函数时不使用x、y,改为取a、b的地址(指针)

正确代码如下:

void Swap(int* pa,int* pb)
{int tmp = *pa;*pa = *pb;*pb = tmp;
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前:a=%d b=%d\n",a,b);Swap(&a, &b);printf("交换后:a=%d b=%d\n", a, b);return 0;
}

小结:

实参传递给形参的时候,形参是实参的一份临时拷贝,对形参的修改是不会影响实参的!

4. 函数的调用 

4.1 传值调用

  • 函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参。

(例如上面的错误示范)

4.2 传址调用

  • 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
  • 这种传参方式可以让函数和函数外边的变量建立起真正的练习,也就是函数内部可以直接操作函数外部的变量。

(例如上面的正确示范)

4.3 练习

  • 本章练习均以上一篇博客为基础忘记了的话可以看一下我前面的文章:C语言基础练习.2.里面有讲具体该如何操作

4.3.1 写一个函数可以判断一个数是不是素数

我们在之前写过一个“打印100-200之间的素数”,这次我们在原来的基础上面改动:

1.首先写主函数部分,定义i=100;使用for循环创建100-200之间的数字

2.用if语句,如果 i 是素数:打印并计数;

3.写调用函数,我在这里是创建is_prime为函数名。又因为我们最后要返回素数,所以返回类型为int

4.定义 j ,用for循环计算 i 是否为素数,如果是就返回1;如果不是则返回0,即不返回。

5.打印素数,并打印有几个素数

 代码如下:

int is_prime(int i)
{int j = 0;for (j = 2; j <= sqrt(i); j++){if (i % j == 0)return 0;}return 1;
}int main()
{int i = 0;int count = 0;for (i = 100; i <= 200; i++){if (1 == is_prime(i)){count++;printf("%d ", i);}}printf("\ncount=%d", count);return 0;
}

4.3.2 写一个函数判断一年是不是闰年

1.首先写主函数定义y=0;使用for循环创建出1000-2000之间的数字

2.用if语句判断是否为闰年,是就打印

3.写调用函数部分,使用if语句判断:是返回1,不是返回0

int is_leap_year(int y)
{if (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)))return 1;elsereturn 0;
}int main()
{int y = 0;for (y = 1000; y <= 2000; y++){if (1 == is_leap_year(y)){printf("%d ", y);}}return 0;
}

在此基础上,我们还能进行改良:

其实((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0))这一句如果正确返回值就为1

我们可以直接改为:

int is_leap_year(int y)
{return ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0));
}

4.3.3 写一个函数,实现一个整形有序数组的二分查找

1.首先写主函数,创建数组,定义要查找的数字并使其可输入。计算数组长度,便于使用下标查找。

2.使用if语句,如果返回值为-1,则没找到(为什么用-1:因为下标不可能为负数;为什么不用0:因为如果要查找的数字是第一个,下标为0,会混乱),如果返回值为下标,则找到。

3.写调用函数部分:创建左下标left、右下标right、中间下标mid。采用二分查找,使用while循环,如果找到返回值为mid,如果不是则继续循环,如果找不到则返回-1。

int search(int arr[], int k, int sz)
{int left = 0;int right = sz - 1;while (left <= right){int mid = left + (right - left) / 2;if (arr[mid] < k){left = mid + 1;}else if (arr[mid] > k){right = mid - 1;}else{return mid;}return -1;}
}int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10};int k = 0;scanf("%d\n", k);int sz = sizeof(arr) / sizeof(arr[0]);int ret = search(arr, k,sz );if (ret == -1){printf("没找到\n");}else{printf("找到了,下标是:%d\n",ret);}return 0;
}

4.3.4 写一个函数,每调用一次这个函数,就会将num的值+1

1.首先写主函数,定义num=0;使其每一次被调用后打印

2.写调用函数,因为在上面我们知道如果我们直接用num是不能改变原来的数值的,所以我们用指针,又因为我们只是改变值不需要返回值,所以用void类型

void Add(int*p) 
{*p = *p + 1;//或者(*p)++;这里将指针括起来是因为++的优先级大于*,如果不括起来就会是p++的指针
}int main()
{int num = 0;Add(&num);printf("%d\n", num);Add(&num);printf("%d\n", num);Add(&num);printf("%d\n", num);return 0;
}

相关文章:

详讲函数知识

目录 1. 函数是什么&#xff1f; 2. C语言中函数的分类&#xff1a; 2.1 库函数&#xff1a; 2.2 自定义函数 函数的基本组成&#xff1a; 3. 函数的参数 3.1 实际参数&#xff08;实参&#xff09;&#xff1a; 3.2 形式参数&#xff08;形参&#xff09;&#xff1a; …...

gin 框架初始教程文档

一 、gin 入门1. 安装gin &#xff1a;下载并安装 gin包&#xff1a;$ go get -u github.com/gin-gonic/gin2. 将 gin 引入到代码中&#xff1a;import "github.com/gin-gonic/gin"3.初始化项目go mod init gin4.完整代码package mainimport "github.com/gin-go…...

Maven的下载和安装【详细】

文章目录一、什么是Maven&#xff1f;二、Maven的安装与配置2.1下载Maven安装包2.2配置Maven环境变量2.3验证三、Idea配置Maven3.1配置 setting.xml文件3.2Idea配置Maven一、什么是Maven&#xff1f; Apache Maven是个项目管理和自动构建工具&#xff0c;基于项目对象模型&…...

[数据结构]:04-循环队列(数组)(C语言实现)

目录 前言 已完成内容 循环队列实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-QueueCommon.cpp 04-QueueFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代码。使用C引用主要是为了…...

buu [GWCTF 2019]BabyRSA 1

题目描述&#xff1a; import hashlib import sympy from Crypto.Util.number import *flag GWHT{******} secret ******assert(len(flag) 38)half len(flag) / 2flag1 flag[:half] flag2 flag[half:]secret_num getPrime(1024) * bytes_to_long(secret)p sympy.nextp…...

codeforces 1669F

题意: alice和bob从数组两边的吃糖果, 数组的值就是糖果重量 要求alice和bob吃的糖果重量必须一样, 输出能吃几个糖果 这题最先想到的是前后缀相加 模拟一个前缀和 和 后缀和 在n/2的位置向前找前缀和 在n/2的位置向后找后缀和 找到第一个前缀和后缀和的下标输出就好 …...

高数考试必备知识点

三角函数与反三角函数的知识点 正弦函数 ysin x&#xff0c; 反正弦函数 yarcsin x • y sin x&#xff0c; x∈R&#xff0c; y∈[–1&#xff0c;1]&#xff0c;周期为2π&#xff0c;函数图像以 x (π/2) kπ 为对称轴 • y arcsin x&#xff0c; x∈[–1&#xff0c;1]…...

[蓝桥杯] 二分与前缀和习题练习

文章目录 一、二分查找习题练习 1、1 数的范围 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 机器人跳跃问题 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 四平方和 1、3、1 题目描述 1、3、2 题解关键思路与解答 二、前缀和习题练习 2、1 前缀和 2、1、1 题目描述…...

SpringMvc中HandlerAdapter组件的作用

概述 我们在使用springMVC时&#xff0c;都知道其中不仅包含handlerMapping组件还包含handlerAdapter组件&#xff0c;为什么呢&#xff1f; springMVC请求流程图 HandlerAdapter组件使用了适配器模式 适配器模式的本质是接口转换和代码复用&#xff0c;这里使用适配器模式的…...

FreeRTOS优先级翻转

优先级翻转优先级翻转&#xff1a;高优先级的任务反而慢执行&#xff0c;低优先级的任务反而优先执行优先级翻转在抢占式内核中是非常常见的&#xff0c;但是在实时操作系统中是不允许出现优先级翻转的&#xff0c;因为优先级翻转会破坏任务的预期顺序&#xff0c;可能会导致未…...

服务器部署—部署springboot之Linux服务器安装jdk和tomcat【建议收藏】

我是用的xshell连接的云服务器&#xff0c;今天想在服务器上面部署一个前后端分离【springbootvue】项目&#xff0c;打开我的云服务器才发现&#xff0c;过期了&#xff0c;然后又买了一个&#xff0c;里面环境啥都没有&#xff0c;正好出一期教程&#xff0c;方便大家也方便自…...

golang项目----家庭收支记账软件

家庭收支记账软件实现基本功能(先使用面向过程&#xff0c;后面改成面向对象)项目代码实现改进面向过程源码面向对象源码utils包中main包中实现基本功能(先使用面向过程&#xff0c;后面改成面向对象) 编写文件TestMyAccount.go完成基本功能 功能一&#xff1a;先完成可以显示…...

中国LNG市场投资机会研究

中国LNG市场投资机会研究中国LNG市场是一个具有巨大潜力和发展机遇的市场&#xff0c;尤其是在政府大力推动清洁能源发展的背景下&#xff0c;LNG市场投资机会正在不断扩大。首先&#xff0c;政府大力支持LNG市场的发展。政府实施的“十三五”规划将LNG作为清洁能源的重要来源&…...

Elasticsearch:索引数据是如何完成的

在我在之前的文章 “Elasticsearch&#xff1a;彻底理解 Elasticsearch 数据操作” 文章中&#xff0c;我详细地描述了如何索引数据到 Elasticsearch 中。在今天的文章中&#xff0c;我想更进一步来描述这个流程。 Elasticsearch 是一个非常强大和灵活的分布式数据系统&#x…...

处理器管理

处理器状态处理器管理是操作系统中重要组成部分&#xff0c;负责管理、调度和分配计算机系统的重要资源——处理器&#xff0c;并控制程序执行由于处理器管理是操作系统最核心的部分&#xff0c;无论是应用程序还是系统程序&#xff0c;最终都要在处理器上执行以实现其功能&…...

跟着我从零开始入门FPGA(一周入门系列)第五

5、同步和异步设计 前面已有铺垫&#xff0c;同步就是与时钟同步。 同步就是走正步&#xff0c;一二一&#xff0c;该迈哪个脚就迈那个脚&#xff0c;跑的快的要等着跑的慢的。 异步就是搞赛跑&#xff0c;各显神通&#xff0c;尽最大力量去跑&#xff0c;谁跑得快&#xff0c;…...

【第42天】Arrays.sort 与 Collections.sort 应用 | 整形数组与集合的排序

本文已收录于专栏&#x1f338;《Java入门一百练》&#x1f338;学习指引序、专栏前言一.sort函数二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析三、推荐专栏序、专栏前言 本专栏开启&#xff0c;目的…...

LeetCode第334场周赛

2023.2.26LeetCode第334场周赛 A. 左右元素和的差值 思路 前缀和后缀和 代码 class Solution { public:vector<int> leftRigthDifference(vector<int>& nums) {int n nums.size();vector<int> l(n), r(n), ans(n);for (int i 1; i < n; i )l[…...

基于深度学习的三维重建网络PatchMatchNet(三):PatchMatchNet配置及代码主要运行流程

目录 1.PatchMatchNet环境配置 2. PatchMatchNet的大致执行流程(eval.py) 2.1 深度图的保存...

【一天一门编程语言】设计一门编程语言,给出基础语法代码示例,SDK设计。

文章目录设计一门编程语言&#xff0c;给出基础语法代码示例&#xff0c;SDK设计。一、编程语言设计1.1 语言名称1.2 数据类型1.3 基本运算符1.4 控制语句二、SDK设计2.1 基础库2.2 第三方库三、例子用 Mango 这门语言实现斐波那契数列。基础语法代码示例SDK 设计使用 Mango 语…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

在 Spring Boot 中使用 JSP

jsp&#xff1f; 好多年没用了。重新整一下 还费了点时间&#xff0c;记录一下。 项目结构&#xff1a; pom: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://ww…...

Python 高效图像帧提取与视频编码:实战指南

Python 高效图像帧提取与视频编码:实战指南 在音视频处理领域,图像帧提取与视频编码是基础但极具挑战性的任务。Python 结合强大的第三方库(如 OpenCV、FFmpeg、PyAV),可以高效处理视频流,实现快速帧提取、压缩编码等关键功能。本文将深入介绍如何优化这些流程,提高处理…...