一文搞定C语言函数和函数递归(和bug郭一起学C系列)(1)

简介: 一文搞定C语言函数和函数递归(和bug郭一起学C系列)(1)

函数的概念

什么是函数呢?

是和数学里学的函数一样吗?


数学里的函数,具有对应关系和某种功能!


你了解C语言函数吗?维基百科中,C语言函数又叫做:子程序!


在计算机科学中,子程序(英语:Subroutine, procedure, function, routine, method,

subprogram, callable unit),是一个大型程序中的某部分代码, 由一个或多个语句块组

成。它负责完成某项特定任务,而且相较于其他代 码,具备相对的独立性。

一般会有输入参数并有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软

件库。

函数在面向过程的语言中已经出现。是结构(Struct)和类(Class)的前身。本身就是对具有相关性语句的归类和对某过程的抽象。

让我们来看看我们最熟悉的主函数!


int main()
    {
       //里面多条语句块组成!
       //具有独立性!
    }

还有函数的其他特性,我们学完这一章节再来总结一下!


C语言函数的分类


库函数

库函数就是我们直接可以使用的函数,像printf,scanf,strlen ....等等,C语言函数库里已经实现好了,且具有某些功能的函数!我们直接拿来用就好了,但是前提我们得引该函数所在函数库的头文件,也就是我们之前比喻的:用别人的东西,我们要打招呼!我们包含一下这个头文件就可以使用该函数了!

 

#include<stdio.h>
    int main()
    {
     printf("hhh");
     //该函数的使用要引头文件<stdio.h>
    }

自定义函数

自定义函数,顾名思义就是自己定义函数!

当我们要实现某种功能时,函数库中没有相应函数能够具有这种功能,那我们只能自己写一个具有该功能的函数了。

int Add(int a,int b)
{
  return a+b;
}
  int main()
  {
      int a=1,b=3;
      int c=Add();  //自定义加法功能的函数!
  }

该函数的细节,我们稍后学习,我们只要知道,这就是自定义函数就OK!


库函数

为什么会有库函数?


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

#include<stdio.h>
int main()
{
 printf("搞定C语言函数和函数递归");
 return 0;
}

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

#include<string.h>
    int main()
    {
     char arr1[]="abcdefg";
     char arr2[]="xxx";
     strcpy(arr1,arr2);
     //将arr2拷贝到arr1中!
    }

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

#include<math.h> 
int main()
{ 
   int n=2;
   int k=3;
   int x=pow(n,k);
   //计算n的k次方!
  return 0;
}

像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到,为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。

不同函数可能写在不同的函数库中,我们需要引用不同的函数库!

那我们该怎么学习库函数呢?

这里我给大家推荐一个学习和查阅函数库的网站:www.cplusplus.com建议收藏!


让我们一起来看看吧!

image.png

C library就是C语言函数库!

image.png

注:C语言函数库,如果要在C++代码中引用,就将函数库名加个C

这就是函数库的目录!点击就可以打开该函数库进行该函数库中函数学习和查阅!

image.png

也可以点击搜索,输入函数名,查阅学习!


简单的总结,C语言常用的库函数都有:


IO函数

字符串操作函数

字符操作函数

内存操作函数

时间/日期函数

数学函数

其他库函数

我们参照网站文档,学习几个库函数


memset

image.png



我们学习一个函数,首先我们应该知道,该函数的作用

Fill block of memory

Sets the first num bytes of the block of memory pointed by ptr to the specified value (interpreted as an unsigned char).

这就是memseth函数的作用,将ptr指针地址的空间,num个字节,初始化为value值!


然后我们在看看f返回值,每个参数的细节,还有所在库函数!

void * memset ( void * ptr, int value, size_t num ); <string.h>

可以知道该函数的返回值是void(空)。

ptr是一个void类型的指针。

value是int 类型的值,

num是字节个数。

还有一些相关细节描述,就可以参考文档学了。

我们就可以使用该函数了!

image.png

库函数的学习就介绍到这里,可以利用网站文档自行学习!http://www.cplusplus.com/


自定义函数

如果库函数能干所有的事情,那还要程序员干什么?

所有更加重要的是自定义函数。

自定义函数和库函数一样,有函数名,返回值类型和函数参数。 但是不一样的是这些都是我们自己来设计。这给程序员一个很大的发挥空间。

函数的组成:


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

我们举个例子,大家就懂了怎么自定义函数了!


写一个函数求两个数中的较小值!


int Min(int x,int y)   //函数的定义
 {
    if(x<y)
    return x;
    else
    return y;
 }
int main()
{
   int x=2;
   int y=5;
  int c = Min(x,y); //函数的调用
  return 0;
}

在Min调用函数中,函数的参数是x,y叫做实际参数,我们将x,y传给函数,然后,函数就会接收,创建了int x,int y来接收实际参数,(int x,int y)是形式参数!是x,y的临时拷贝!而int c= Min(x,y);就是将函数返回值,我们要求的最小值接收。而且类型要一致!


我们再来写个函数!


交换两数


void Exchange1(int a,int b) //函数的定义
{
    int c=0;
    c=a;
    a=b;
    b=c;
}
 int main()
 {
   int a=2;
   int b=3;
   printf("a=%d b=%d\n",a,b);
   Exchange1(a,b);//函数的调用
   printf("a=%d b=%d",a,b);
 }

image.png

我们看运行结果,并没有实现两数的交换为啥会这样呢?你可以调试一下!

我们再用另一种方式写这个代码!


void Exchange2(int* a,int* b) //函数的定义
{
    int c = 0;
    c = *a;
   *a = *b;
   *b = c;
}
 int main()
 {
   int a=2;
   int b=3;
   printf("a=%d b=%d\n",a,b);
   Exchange2(&a,&b);//函数的调用
   printf("a=%d b=%d",a,b);
 }

image.png

为啥将实际参数a,b改成&a,&b指针就能实现两数的交换!

我们学习函数的参数就知道了!

目录
相关文章
|
4月前
|
存储 C语言
`scanf`是C语言中用于按格式读取标准输入的函数
`scanf`是C语言中用于按格式读取标准输入的函数,通过格式字符串解析输入并存入指定变量。需注意输入格式严格匹配,并建议检查返回值以确保读取成功,提升程序健壮性。
1076 0
|
存储 算法 C语言
【C语言程序设计——函数】素数判定(头歌实践教学平台习题)【合集】
本内容介绍了编写一个判断素数的子函数的任务,涵盖循环控制与跳转语句、算术运算符(%)、以及素数的概念。任务要求在主函数中输入整数并输出是否为素数的信息。相关知识包括 `for` 和 `while` 循环、`break` 和 `continue` 语句、取余运算符 `%` 的使用及素数定义、分布规律和应用场景。编程要求根据提示补充代码,测试说明提供了输入输出示例,最后给出通关代码和测试结果。 任务核心:编写判断素数的子函数并在主函数中调用,涉及循环结构和条件判断。
749 23
|
6月前
|
安全 C语言
C语言中的字符、字符串及内存操作函数详细讲解
通过这些函数的正确使用,可以有效管理字符串和内存操作,它们是C语言编程中不可或缺的工具。
350 15
|
11月前
|
人工智能 Java 程序员
一文彻底搞清楚C语言的函数
本文介绍C语言函数:函数是程序模块化的工具,由函数头和函数体组成,涵盖定义、调用、参数传递及声明等内容。值传递确保实参不受影响,函数声明增强代码可读性。君志所向,一往无前!
476 1
一文彻底搞清楚C语言的函数
|
C语言
【C语言程序设计——函数】亲密数判定(头歌实践教学平台习题)【合集】
本文介绍了通过编程实现打印3000以内的全部亲密数的任务。主要内容包括: 1. **任务描述**:实现函数打印3000以内的全部亲密数。 2. **相关知识**: - 循环控制和跳转语句(for、while循环,break、continue语句)的使用。 - 亲密数的概念及历史背景。 - 判断亲密数的方法:计算数A的因子和存于B,再计算B的因子和存于sum,最后比较sum与A是否相等。 3. **编程要求**:根据提示在指定区域内补充代码。 4. **测试说明**:平台对代码进行测试,预期输出如220和284是一组亲密数。 5. **通关代码**:提供了完整的C语言代码实现
276 24
|
12月前
|
存储 C语言
【C语言程序设计——函数】递归求斐波那契数列的前n项(头歌实践教学平台习题)【合集】
本关任务是编写递归函数求斐波那契数列的前n项。主要内容包括: 1. **递归的概念**:递归是一种函数直接或间接调用自身的编程技巧,通过“俄罗斯套娃”的方式解决问题。 2. **边界条件的确定**:边界条件是递归停止的条件,确保递归不会无限进行。例如,计算阶乘时,当n为0或1时返回1。 3. **循环控制与跳转语句**:介绍`for`、`while`循环及`break`、`continue`语句的使用方法。 编程要求是在右侧编辑器Begin--End之间补充代码,测试输入分别为3和5,预期输出为斐波那契数列的前几项。通关代码已给出,需确保正确实现递归逻辑并处理好边界条件,以避免栈溢出或结果
686 16
|
12月前
|
存储 编译器 C语言
【C语言程序设计——函数】分数数列求和2(头歌实践教学平台习题)【合集】
函数首部:按照 C 语言语法,函数的定义首部表明这是一个自定义函数,函数名为fun,它接收一个整型参数n,用于指定要求阶乘的那个数,并且函数的返回值类型为float(在实际中如果阶乘结果数值较大,用float可能会有精度损失,也可以考虑使用double等更合适的数据类型,这里以float为例)。例如:// 函数体代码将放在这里函数体内部变量定义:在函数体中,首先需要定义一些变量来辅助完成阶乘的计算。比如需要定义一个变量(通常为float或double类型,这里假设用float。
560 3
|
12月前
|
存储 算法 安全
【C语言程序设计——函数】分数数列求和1(头歌实践教学平台习题)【合集】
if 语句是最基础的形式,当条件为真时执行其内部的语句块;switch 语句则适用于针对一个表达式的多个固定值进行判断,根据表达式的值与各个 case 后的常量值匹配情况,执行相应 case 分支下的语句,直到遇到 break 语句跳出 switch 结构,若没有匹配值则执行 default 分支(可选)。例如,在判断一个数是否大于 10 的场景中,条件表达式为 “num> 10”,这里的 “num” 是程序中的变量,通过比较其值与 10 的大小关系来确定条件的真假。常量的值必须是唯一的,且在同一个。
428 2
|
存储 编译器 C语言
【C语言程序设计——函数】回文数判定(头歌实践教学平台习题)【合集】
算术运算于 C 语言仿若精密 “齿轮组”,驱动着数值处理流程。编写函数求区间[100,500]中所有的回文数,要求每行打印10个数。根据提示在右侧编辑器Begin--End之间的区域内补充必要的代码。如果操作数是浮点数,在 C 语言中是不允许直接进行。的结果是 -1,因为 -7 除以 3 商为 -2,余数为 -1;注意:每一个数据输出格式为 printf("%4d", i);的结果是 1,因为 7 除以 -3 商为 -2,余数为 1。取余运算要求两个操作数必须是整数类型,包括。开始你的任务吧,祝你成功!
225 1
|
C语言
《C语言及程序设计》实践项目——发现Bug
返回:贺老师课程教学链接 【项目1-sin泰勒展式中的错误】 下面是sin函数的泰勒展式:(注:x取弧度值,而非角度值)编写了double mysin(double x)用于求sin值,却“死”在了123°上。剧透一下,循环没有问题(当然问题会表现在循环中)。试着用调试工具找出问题出现在哪里,然后给出解决问题的方案。 #include&lt;stdio.h&gt; #define pi 3
1235 0