自定义函数

article/2025/8/28 8:22:50

目录

一、自定义函数

二、函数参数 、传值调用和传址调用

2、1    传值调用

2、2    传址调用

三、函数的嵌套和链式访问 

四、函数递归


一、自定义函数

C语言中有两类函数,一类是库函数,另外一类是自定义函数。自定义函数从字面意思上理解就是自己定义的函数,因为库函数不能满足大家的所有需求,所以有时候需要程序员自己编写属于自己的函数。

自定义函数的语法结构为:

ret_type   fun_name(variable )

{

statement ;

}

ret_type 是函数的返回类型

fun_name是函数名

variable是函数的变量

statement是语句;它同大括号一起组成函数的函数体

 看下面的一个代码:

#include<stdio.h>
int ADD(int x, int y)
{return  x + y;
}
int main()
{int number1 = 0;int number2 = 0;printf("请输入两个数字: ");scanf("%d%d",&number1,&number2);int ret = ADD(number1, number2);printf("%d+%d=%d ",number1,number2,ret);return 0;
}

在这里面我们使用了函数ADD实现两个数的求和;ADD函数中:

int ADD(int x, int y)
{
    return  x + y;
}

int 是返回类型

ADD是函数名

{

return x + y;

}

是函数体

二、函数参数 、传值调用和传址调用

函数参数分为实际参数和形式参数;真实传递给函数的参数叫实际参数;形式参数是指函数名后面括号中的变量。在下面函数的传值调用与传址调用 中可以更深层次的体会这两个参数的意义。

2、1    传值调用

看下面代码:

#include<stdio.h>
int ADD(int x,int y)
{return x + y;
}
int main()
{int a = 20;int b = 30;int ret = ADD(a, b);printf("%d",ret);return 0;
}

 在这里main函数里面的ADD函数里面的变量a与b叫实际参数(实参);然后main函数外边的函数名ADD里面的变量x与y叫形式参数(形参);之所以是传值调用是因为形参只是实际参数的一份临时拷贝,改变形式参数的值并不改变实际参数的值。他两不是指向同一个地址,可以通过下面的图片得到更深层次的理解:

上图可以看出,a的地址与接收它的形式参数x的地址不是同一个地址 ;b的地址与接收它的形式参数y的地址不是同一个地址。这里在x与y调用之后拥有了自己的空间,同时拥有了和实参一样的内容,可以简单认为:形参实例化之后其实相当于实际参数的一份临时拷贝。下面的一张图片可以说明上面这段字的内容。

2、2    传址调用

通过下面的代码讲解传址调用:

#include<stdio.h>
void exchange(int* x, int* y)
{int tmp = *x;*x = *y;*y = tmp;}
int main()
{int n =20;int k =30;	printf("交换前:n=%d  k=%d\n", n, k);exchange(&n, &k);printf("交换后:n=%d  k=%d", n, k);return 0;
}

 通过上面可以看到,实际参数n与形式参数x的地址是一样的,实际参数k与形式参数y的地址是一样的,也就是说n与x,k与y分别指向了同一个内存空间;这就是传址调用的特点: 

传址调用就是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。

这种方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量

三、函数的嵌套和链式访问 

函数的嵌套就是一个函数里面包含另外一个函数,值得注意的是函数可以嵌套使用;但是函数不能嵌套定义。

#include<stdio.h>
void hello_world()
{printf("hello world\n");
}
void test()
{hello_world();
}
int main()
{test();return 0;
}

例如上面的例子就是函数嵌套的典型案例;main函数里面嵌套了test()函数,test()函数嵌套使用了hello_world()函数

函数的返回值作为函数的参数就叫链式访问。

#include<stdio.h>
int ADD(int x, int y)
{return x + y;
}
int main()
{int a = 0;int b = 20;int ret = ADD(a, b);printf("%d ",ret);return 0;
}

上面代码a+b的返回值20赋值给ret之后;再打印ret的结果;可以做如下修改:

#include<stdio.h>
int ADD(int x, int y)
{return x + y;
}
int main()
{int a = 0;int b = 20;printf("%d ", ADD(a, b));return 0;
}

也就是直接把返回值作为printf函数的参数输出;这就叫链式访问。 

四、函数递归

程序调用自身的编程技巧叫递归,但是注意递归有限制条件,当满足这个限制条件时候,递归不在继续;每次递归之后越来越接近这个限制条件。

以一个例子讲解:用递归的方式打印n的k次方(使用Pow(n,k))

n的k次方可以转化为n*n的k减1次方

n的k-1次方可以转化为n*n的k减2次方

………………………………………………

分析:当k为大于0的数的时候,返回值为n*Pow(n,k-1)

          当k为小于0的数的时候,返回值为1/Pow(n,k);

          当k为0的时候,返回值为1;

代码如下所示:

#include<stdio.h>
double Pow(int n, int k)
{if (k > 0){return n* Pow(n, k - 1);}else if (k < 0){return 1/ Pow(n, -k);}else{return 1;}
}
int main()
{int n = 0;int k = 0;printf("请输入两个数:");scanf("%d%d",&n,&k);double  ret = Pow(n, k);printf("%d的%d次方为%lf",n,k,ret);return 0;
}

递归可以理解为传递和回归,下面一个例子来讲解这个思想:

#include<stdio.h>
int Power(int n)
{if (n>1){return n * Power(n - 1);}else {return 1;}
}
int main()
{int n = 0;scanf("%d",&n);int ret = Power(n);printf("%d",ret);
}

整个递归过程如下图所示:

函数的递归有两个层面的理解,第一个层面是传递,如上图中红色线条部分,另外一个层面是回归,如蓝色部分;但是在使用递归时,大家应当注意栈溢出的情况,不是所有的题目都可以选择使用递归来实现。递归也有他的局限性。 


http://chatgpt.dhexx.cn/article/0XV89P6N.shtml

相关文章

C语言自定义函数

函数定义 return_type function_name([datatype1 arg1],[datatype1 arg2],...) { //函数体 } 函数三要素 返回值类型 函数名 参数列表 自定义函数的完整写法 #include <stdio.h> // 函数原型 int sum(int,int); // 调用函数 int main() { int sum(); } // 函数定义 i…

学习pyqt 继承中self的疑问

前面学习了&#xff0c;面对对象编程&#xff0c;继承&#xff0c;有了一些理解。继续学习pyqt5 看到下面有了一些疑问。 import sys from PyQt5.QtWidgets import QApplication, QWidget from PyQt5.QtGui import QIconclass Example(QWidget):def __init__(self):super().…

Python中类函数中self是什么

首先我们来看两组代码运行的结果 代码组一&#xff1a; class C1:def func1():x10print("func1的x&#xff1a;",x)def func2(self):x20print("func2的x&#xff1a;",x)C1.func1() C1.func2()结果如下 代码组二&#xff1a; class C1:def func1():x…

python中return self用法详解

直接上代码来理解return self的用法&#xff01; 示例代码1&#xff1a; class Test(object):def __init__(self):self.age 25def add(self):self.age 1print(self.age)obj Test() obj.add()运行结果&#xff1a; 有时候当我们想对实例对象的方法进行连续调用时&#xff0…

Python——self参数

self 的意思是“自己”,表示的是对象自身,当某个对象调用成员方法的时候,Python 解释器会自动把当前对象作为第1个参数传给 self ,用户只需要传递后面的参数就可以了。 self 参数的应用&#xff1a; #program0706.py self 参数的应用 class Animal:类中未定义构造方法&#x…

php 中self什么意思,php中self的用法是什么

php中self的用法&#xff1a; self是指向类本身&#xff0c;也就是PHP self关键字是不指向任何已经实例化的对象&#xff0c;一般self使用来指向类中的静态变量。 1、self可以访问本类中的静态属性和静态方法&#xff0c;可以访问父类中的静态属性和静态方法。 相关推荐&#x…

纯C++实现24位bmp格式图片的读取和修饰

问题:现有一张bmp图片,要求将它读取到程序中并进行灰度化、水平翻转、模糊、茶色滤镜四种效果的一种,并输出新图片,如下所示: 命令行输入: 其中: 参数1:-b/g/s/r,先后表示blur(模糊),grey(灰度化),sepia(褐色),row reverse(水平翻转) 参数2:源文件名 参数3:新文…

SE78上传BMP格式图片出错,出错信息提示上传的不是BMP格式图片

如下图&#xff0c;导入文件为一BMP图片(红框部分), 然后点击确认键&#xff08;黑框部分&#xff09;。 结果却出错&#xff0c;提示不是BMP文件&#xff0c;如下图红框部分。 很纳闷明明是BMP怎么就提示说不是BMP呢&#xff1f;感觉应该是上传的图片有问题&#xff0c;所以想…

C++读取bmp格式图片

类的格式按照bmp的文件头、信息头、调色板和数据域写好即可 因为图片是按字节读的&#xff0c;所以要强制让编译器不对结构体进行字节对齐&#xff0c;否则会出错 因为bmp格式规定存储时每行的像素数要补齐至4的整数倍&#xff0c;所以读入和写出时要加一些对应的操作 ————…

android 图片格式,常见图片格式详解

做了几年有关图形、图像的工作,对图片格式算是小有经验,在此写成一文章总结下。虽然一开始并不想讲很理论的东西,但写完后发现几乎全是理论,细想一下关于图片格式的知识本身就是理论的东西,囧~~ 那就力求用最简单的方式将这些“理论”讲清楚吧。 常见的图片格式有bmp, jpg…

Qt之生成png/jpg/bmp格式图片

Qt之生成png/jpg/bmp格式图片 一、问题描述二、显示效果三、核心代码示例 一、问题描述 有时候需要把Qt绘制的一些图形保存为png/jpg/bmp格式的图片&#xff0c;下面就根据自己写的一个简单的测试程序来讲解一下Qt中保存图片的方法。本文主要讲解使用Qpainter和QImage组合使用…

MFC详解显示BMP格式图片

本文主要是讲述《数字图像处理》系列栏目中的第一篇文章.主要详细介绍了BMP图片格式,同时使用C和MFC显示BMP格式,主要结合自己的《数字图像处理》课程和以前的项目叙述讲解. 一.BMP图片格式定义 BMP文件格式是Windows操作系统推荐和支持的标准图像文件格式,是一种将内存或显示…

bmp格式说明

bmp24位位图格式 创建bmp24位位图格式的图片 打开Windows系统自带的画图软件&#xff0c;如下&#xff1a; 点击“文件 > 另存为”&#xff0c;在弹出的界面中有4种bmp格式可以选择&#xff0c;如下&#xff1a; 不知道bmp格式是不是只有上面的4种&#xff0c;还是有更多…

如何批量将 bmp 格式图片转换为 png 格式

概要&#xff1a;bmp 格式是纹的操作系统当中非常常见的一种图片格式&#xff0c;这种格式的特点是包含的图像信息较丰富&#xff0c;几乎不进行压缩&#xff0c;所以导致了它存在一个很大的缺点&#xff0c;那就是占用磁盘空间过大&#xff0c;那么我们怎么将 bmp 格式的图片转…

将BMP 格式图片转换为 JPEG 格式【c语言】

源码链接: https://blog.csdn.net/qq_44394952/article/details/122587475?spm1001.2014.3001.5502. 一、任务及目标 利用c语言&#xff0c;通过将 RGB 信息转换为 YCrCb 信息、离散余弦变化、量化和 z 型编码&#xff0c;再进行游程编码和霍夫曼编码&#xff0c;最后进行尾…

如何批量将 bmp 格式图片转换转换为 jpg

概要&#xff1a;png 和 jpg 这两种格式的图片相信大家都非常熟悉&#xff0c;但是 bmp 格式的图片可能大家接触得并没有那么多&#xff0c;bmp 是 Windows 操作系统中的标准图像文件格式&#xff0c;能够被多种 Windows 应用程序所支持&#xff0c;因此格式的图片在 Windows 操…

bmp格式图的解析

文章目录 前言 一、bmp格式图的特点 二、bmp格式图的解析 总结 前言 在图像处理中经常会遇到BMP格式图的解析问题&#xff0c;本文简单介绍了bmp格式图的解析方式&#xff0c;并附上相应的C代码。 一、bmp格式图的特点 bmp图通常由图片的头文件信息和像素数据组成&#xff0c…

R语言与多元线性回归分析计算实例

6.3.7 计算实例 例 6.9 某大型牙膏制造企业为了更好地拓展产品市场&#xff0c;有效地管理库存&#xff0c;公司董事会要求销售部门根据市场调查&#xff0c;找出公司生产的牙膏销售量与销售价格&#xff0c;广告投入等之间的关系&#xff0c;从而预测出在不同价格和广告费用下…

多元线性回归检验

多元线性回归模型通常用来研究一个应变量依赖多个自变量的变化关系&#xff0c;如果二者的以来关系可以用线性形式来刻画&#xff0c;则可以建立多元线性模型来进行分析。 1.t检验 t检验是对单个变量系数的显著性检验&#xff0c;一般看p值&#xff1b; 如果p值小于0.05表示该…

[DataAnalysis]多元线性回归深入浅出-案例+模型假设+参数估计方法+模型评判方法+变量选择+多重共线性问题

一、案例介绍 1、目的&#xff1a;利用上市公司当年的公开财务指标预测来年盈利情况最重要的投资人决策依据。 2、数据来源&#xff1a;随机抽取深市和沪市2002和2003年的500个上市公司样本预测来年的净资产收益率。 3、解释变量包括&#xff1a;资产周转率、当年净资产收益…