当前位置: 首页 > 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 语…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

关于nvm与node.js

1 安装nvm 安装过程中手动修改 nvm的安装路径&#xff0c; 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解&#xff0c;但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后&#xff0c;通常在该文件中会出现以下配置&…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)

服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

九天毕昇深度学习平台 | 如何安装库?

pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子&#xff1a; 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

FFmpeg:Windows系统小白安装及其使用

一、安装 1.访问官网 Download FFmpeg 2.点击版本目录 3.选择版本点击安装 注意这里选择的是【release buids】&#xff0c;注意左上角标题 例如我安装在目录 F:\FFmpeg 4.解压 5.添加环境变量 把你解压后的bin目录&#xff08;即exe所在文件夹&#xff09;加入系统变量…...