C语言大型连续剧(第三集)——函数帝国的崛起

2023-11-08 21:59

本文主要是介绍C语言大型连续剧(第三集)——函数帝国的崛起,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本节目总导演:rampant boy

本节目总编剧:rampant boy

本节目总策划:rampant boy

本集将重点介绍函数。下面进入正文:

文章目录

  • 什么是函数?
  • C语言中的函数
    • 库函数
      • 库函数的分类
      • 库函数的使用
    • 自定义函数
      • 函数组成
      • 函数的参数
        • 实际参数(实参)
        • 形式参数(形参)
      • 函数的调用
        • 传值调用
        • 传址调用
  • 函数的嵌套调用和链式访问
    • 嵌套调用
    • 链式访问
  • 函数的声明和定义
    • 函数声明
    • 函数定义
  • 函数递归
    • 递归的定义
    • 递归的两个必要条件
    • 递归的举例
      • 思路
      • 代码
      • 图解代码
  • 结尾

什么是函数?

在数学中,函数是指给定一个数集A,假设其中的元素为x,对A中的元素x施加对应法则f,记作f(x),得到另一数集B,假设B中的元素为y,则y与x之间的等量关系可以用y=f(x)表示。而在计算机中,函数是指一段可以直接被另一段程序或代码引用的程序或代码。也叫做子程序、(OOP中)方法。

C语言中的函数

库函数

库函数(Library function)是将函数封装入库,供用户使用的一种方式。方法是把一些常用到的函数编完放到一个文件里,供不同的人进行调用。那么,库函数存在的意义是什么呢?

  1. 我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上。

  2. 在编程的过程中我们会频繁的做一些字符串的拷贝工作。

  3. 在编程是我们也计算,总是会计算n的k次方这样的运算。

因此,库函数的使用,方便了程序员的开发。

库函数的分类

  • IO函数 例如:printf scanf getchar putchar
  • 字符串操作函数 例如:strcmp strlen
  • 字符操作函数 例如:toupper
  • 内存操作函数 例如:memcpy memcmp memset
  • 时间/日期函数 例如:time
  • 数学函数 例如:sqrt pow
  • 其他库函数

库函数的使用

我们在编程的过程中,难免会遇到不认识的函数。那么我们如何去了解这个函数并很好的使用呢?http://www.cplusplus.com/。这个网址,可以很好的帮助我们了解C语言的库函数。例如我们搜索strcpy,就会出现以下信息。

image-20210713081928140

基于这些信息,我们就可以使用strcpy这个函数

#include <stdio.h>
#include<string.h>int main()
{char arr1[20] = "abcdef";char arr2[] = "hello";strcpy(arr1, arr2);printf("%s", arr1);return 0;
}

那么结果为:

image-20210713082343909

注:%s——以字符串的格式打印

自定义函数

自定义函数和库函数一样,有函数名,返回值类型和函数参数。 但是不一样的是这些都是我们自己来设计。

函数组成

ret_type fun_name(para1, * )
{statement;//语句项
}
ret_type 返回类型
fun_name 函数名
para1    函数参数

例如我们构造一个函数,求两个整数的最大值,具体代码如下:

#include <stdio.h>int get_max(int x, int y)
{int z = 0;if (x > y)z = x;elsez = y;return z;
}int main()
{int a = 10;int b = 20;int max = get_max(a, b);printf("max=%d\n", max);return 0;
}

结果为:

image-20210713095815297

那么这个函数是怎样执行的呢?

x用来接收a的值,y用来接收b的值,函数最终返回z的值,z由max接收。

image-20210713100006081

函数的参数

实际参数(实参)

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

形式参数(形参)

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

上面这段代码中,a,b是实参,而x,y是形参。

函数的调用

传值调用

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

传址调用

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

这篇博客将带你更深入的了解传值调用和传址调用的区别。

函数的嵌套调用和链式访问

嵌套调用

#include <stdio.h>void test2()
{printf("hello world");
}void test1()
{test2();
}int main()
{test1();return 0;
}

例如这段代码,main函数中调用test1函数,test1函数中调用test2函数。这就是函数的嵌套调用。

链式访问

把一个函数的返回值作为另外一个函数的参数。

例如:

#include<stdio.h>
#include<string.h>int main()
{printf("%d",strlen("abcdef"));return 0;
}

函数的声明和定义

函数声明

  1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无关紧要。

  2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用

  3. 函数的声明一般要放在头文件中的。

我们可以看看下面这段代码:

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

执行这段代码的时候,会出现下面的警告:

image-20210714100153325

出现这个警告的原因是编译器从上到下扫描代码,当执行到int c = Add(a, b);时,编辑器并未发现Add函数,因为Add函数的定义是在这个语句的后面,所以就会报这个错误。所以要想解决这个警告,就需要声明一下Add函数。

#include <stdio.h>int main()
{int a = 20;int b = 30;int c = Add(a, b);int Add(int, int);//函数的声明printf("%d\n", c);return 0;
}//函数的定义
int Add(int x, int y)
{return x + y;
}

当再次执行的时候,就不会报警告。

image-20210714100903075

函数定义

函数的定义是指函数的具体实现,交待函数的功能实现。

上面代码中

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

这就是函数的定义。

函数递归

递归的定义

程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应

用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小

递归的两个必要条件

  1. 存在限制条件,当满足这个限制条件的时候,递归便不再继续。

  2. 每次递归调用之后越来越接近这个限制条件。

递归的举例

输入一个无符号的整型值,按照顺序打印它的每一位。例如输入1234,输出1 2 3 4

思路

我们自定义一个函数Print,用这个函数来打印每一位数字。如果要打印1 2 3 4。那么就是Print(1234),而Print(1234)可以看成Print(123)+4。以此类推,Print(1234)<==>Print(123)+4<==>Print(12)+3+4<==>Print(1)+2+3+4<==>1+2+3+4

于此,我们可以知道,如果Print函数的参数大于9,那么就需要将参数除以10。那么现在,思路就比较清晰了

代码

#include<stdio.h>void Print(int n)
{if (n > 9){Print(n / 10);}printf("%d ", n % 10);
}int main()
{unsigned int num = 0;scanf("%d", &num);Print(num);return 0;
}

图解代码

image-20210715091859325

结尾

C语言中的函数讲解将告一段落,但函数的相关知识的学习并未结束。之后关于C语言的函数内容,我会再次更新的。谢谢各位的观看

上一集:C语言大型连续剧(第二集)——当if姑娘碰上三位循环兄弟

下一集:C语言大型连续剧(第四集)——擦,数组

这篇关于C语言大型连续剧(第三集)——函数帝国的崛起的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/372779

相关文章

hdu1171(母函数或多重背包)

题意:把物品分成两份,使得价值最接近 可以用背包,或者是母函数来解,母函数(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v)(1 + x^v+x^2v+.....+x^num*v) 其中指数为价值,每一项的数目为(该物品数+1)个 代码如下: #include<iostream>#include<algorithm>

科研绘图系列:R语言扩展物种堆积图(Extended Stacked Barplot)

介绍 R语言的扩展物种堆积图是一种数据可视化工具,它不仅展示了物种的堆积结果,还整合了不同样本分组之间的差异性分析结果。这种图形表示方法能够直观地比较不同物种在各个分组中的显著性差异,为研究者提供了一种有效的数据解读方式。 加载R包 knitr::opts_chunk$set(warning = F, message = F)library(tidyverse)library(phyl

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

国产游戏崛起:技术革新与文化自信的双重推动

近年来,国产游戏行业发展迅猛,技术水平和作品质量均得到了显著提升。特别是以《黑神话:悟空》为代表的一系列优秀作品,成功打破了过去中国游戏市场以手游和网游为主的局限,向全球玩家展示了中国在单机游戏领域的实力与潜力。随着中国开发者在画面渲染、物理引擎、AI 技术和服务器架构等方面取得了显著进展,国产游戏正逐步赢得国际市场的认可。然而,面对全球游戏行业的激烈竞争,国产游戏技术依然面临诸多挑战,未来的

C++操作符重载实例(独立函数)

C++操作符重载实例,我们把坐标值CVector的加法进行重载,计算c3=c1+c2时,也就是计算x3=x1+x2,y3=y1+y2,今天我们以独立函数的方式重载操作符+(加号),以下是C++代码: c1802.cpp源代码: D:\YcjWork\CppTour>vim c1802.cpp #include <iostream>using namespace std;/*** 以独立函数

函数式编程思想

我们经常会用到各种各样的编程思想,例如面向过程、面向对象。不过笔者在该博客简单介绍一下函数式编程思想. 如果对函数式编程思想进行概括,就是f(x) = na(x) , y=uf(x)…至于其他的编程思想,可能是y=a(x)+b(x)+c(x)…,也有可能是y=f(x)=f(x)/a + f(x)/b+f(x)/c… 面向过程的指令式编程 面向过程,简单理解就是y=a(x)+b(x)+c(x)

C语言 | Leetcode C语言题解之第393题UTF-8编码验证

题目: 题解: static const int MASK1 = 1 << 7;static const int MASK2 = (1 << 7) + (1 << 6);bool isValid(int num) {return (num & MASK2) == MASK1;}int getBytes(int num) {if ((num & MASK1) == 0) {return

MiniGPT-3D, 首个高效的3D点云大语言模型,仅需一张RTX3090显卡,训练一天时间,已开源

项目主页:https://tangyuan96.github.io/minigpt_3d_project_page/ 代码:https://github.com/TangYuan96/MiniGPT-3D 论文:https://arxiv.org/pdf/2405.01413 MiniGPT-3D在多个任务上取得了SoTA,被ACM MM2024接收,只拥有47.8M的可训练参数,在一张RTX

如何确定 Go 语言中 HTTP 连接池的最佳参数?

确定 Go 语言中 HTTP 连接池的最佳参数可以通过以下几种方式: 一、分析应用场景和需求 并发请求量: 确定应用程序在特定时间段内可能同时发起的 HTTP 请求数量。如果并发请求量很高,需要设置较大的连接池参数以满足需求。例如,对于一个高并发的 Web 服务,可能同时有数百个请求在处理,此时需要较大的连接池大小。可以通过压力测试工具模拟高并发场景,观察系统在不同并发请求下的性能表现,从而

C语言:柔性数组

数组定义 柔性数组 err int arr[0] = {0}; // ERROR 柔性数组 // 常见struct Test{int len;char arr[1024];} // 柔性数组struct Test{int len;char arr[0];}struct Test *t;t = malloc(sizeof(Test) + 11);strcpy(t->arr,