7级-函数

前情回顾:在6级的时候,我们学习了:break的使用、continue的使用


目录

概念

函数是什么?

标准库函数

学库函数

用户自定义函数

函数的定义

有返回有形参(常用)

无返回有形参

有返回无形参

无返回无形参

函数的嵌套和递归

嵌套

递归

注意事项


 

概念

 

函数是什么?

答:函数可以被多次调用,完成特定的任务,避免了代码的重复编写。C语言中的函数可以分为两类:标准库函数、用户自定义函数。


标准库函数

C语言提供了大量的标准库函数,这些函数是预先定义好的,可以直接在程序中使用。例如,printf()用于输出,scanf()用于输入,sqrt()用于计算平方根......

学库函数

库函数无需全部掌握,要用到时再去查手册,以下是菜鸟教程的网址:

C 语言教程 | 菜鸟教程

例如:我们要计算某个数的立方是多少,就用到pow()这个函数,直接在右上方进行搜索。

以下有关于pow的详细讲解,pow是在<math.h>的标准头文件中的,所以使用时要引入该头文件:#include <math.h>

并且在页面的下方,还有关于该库函数用法: 

除了搜索功能,也可以在该网站上看到其他头文件,并能查看该头文件中有哪些作用,有哪些函数.......


用户自定义函数

        当库函数无法满足需求时,就需要自己定义一个函数,执行相应的任务。接下来,学习怎么自定义函数。

函数的定义

返回类型 函数名(形参)

{

        函数体

}

解析:

返回类型:执行完该函数后,返回值的数据类型(如int、float、double、char、指针等),并且函数内必须要有return返回。如果不需要返回则为void

 

函数名:该函数的名字(自定义命名,规范与变量命名差不多),如主函数的名字就是main,只有知道名字才能调用,还有函数名是唯一的(如果有学习过Java的,里面函数名可以是一样的,也就是重载,但C语言中不行)

 

形参:传入这个函数的数据,数量自定义。例如我要写一个函数负责计算两个数相加的值,那么你要传给该函数是哪两个数,也就是形参1和形参2。形参的格式:数据类型 形参名。无形参则为void。

有返回有形参(常用)

特点:接受输入参数并返回一个值
应用场景:适用于需要根据输入计算并返回结果的场景,如数学运算、数据转换、条件判断等。

接下来,是一段示例程序。

目的:编写一个函数,输入两个数,返回两个数的最大公约数

代码:

#include <stdio.h>

// 计算两个数的最大公约数
int gcd(int a, int b) {
    while (b != 0) {
        int temp = b;
        b = a % b;
        a = temp;
    }
    return a;
}

int main() {
    int num1 = 56, num2 = 98;
    int result = gcd(num1, num2);
    printf("%d和%d的最大公约数是%d\n", num1, num2, result);
    return 0;
}

结果:

 

无返回有形参

特点:接受输入参数但不返回值
应用场景:适用于执行某种操作或任务而不需要返回结果的场景,如打印输出、修改全局变量、文件操作等。 

接下来,是一段示例程序。

目的:编写一个函数,输入文本内容和打印次数,无返回

代码:

#include <stdio.h>

// 打印指定次数的问候语
void greet(char *name, int times) {
    for (int i = 0; i < times; i++) {
        printf("你好, %s!\n", name);
    }
}

int main() {
    greet("张三", 3);
    return 0;
}

结果:

 

有返回无形参

特点:不接受参数但返回一个值
应用场景:适用于获取某些固定信息或状态的场景,如获取当前时间、读取配置、生成随机数等。

接下来,是一段示例程序。

目的:编写一个函数,返回当前系统时间

代码:

#include <stdio.h>
#include <time.h>

// 获取当前小时数
int get_current_hour() {
    time_t now;
    struct tm *timeinfo;
    time(&now);
    timeinfo = localtime(&now);
    return timeinfo->tm_hour;
}

int main() {
    int hour = get_current_hour();
    printf("当前时间是%d点\n", hour);
    return 0;
}

结果:

 

无返回无形参

特点:既不接受参数也不返回值
应用场景:适用于执行固定操作的场景,如显示菜单、初始化系统、清理资源等。

接下来,是一段示例程序。

目的:编写一个函数,打印菜单

代码:

#include <stdio.h>

// 显示程序菜单
void show_menu() {
    printf("========== 主菜单 ==========\n");
    printf("1. 添加记录\n");
    printf("2. 删除记录\n");
    printf("3. 查询记录\n");
    printf("4. 退出程序\n");
    printf("============================\n");
}

int main() {
    show_menu();
    return 0;
}

结果:


函数的嵌套和递归

嵌套

函数嵌套指的是在一个函数内部调用另一个函数。C语言允许函数的嵌套调用,但不允许函数的嵌套定义(即不能在函数内部定义另一个函数)。接下来,写一段示例程序代码。

目的:编写两个函数,函数1负责计算数的平方,函数2调用函数1实现计算两个数的平方和

代码:

#include <stdio.h>

// 计算平方
int square(int x) {
    return x * x;
}

// 计算平方和(嵌套调用square函数)
int sum(int a, int b) {
    return square(a) + square(b);
}

//主函数 
int main() {
    int num1 = 5, num2 = 3;
    int result = sum(num1, num2);
    printf("%d和%d的平方和是%d\n", num1, num2, result);
    return 0;
}

结果:

 

递归

递归是指函数直接或间接调用自身的过程。递归函数必须包含递归终止条件(防止死循环)接下来,写一段示例程序。

目的:采用递归,实现斐波那契数列

#include <stdio.h>

// 递归计算斐波那契数列
int fibonacci(int n) {
	// 终止条件 
    if (n == 0) return 0;
    if (n == 1) return 1;
    // 递归调用
    return fibonacci(n - 1) + fibonacci(n - 2);
}

//主函数 
int main() {
    int n = 10;
    printf("斐波那契数列第%d项是%d\n", n, fibonacci(n));
    return 0;
}

结果:


注意事项

        在整个代码中,当函数定义在被调用处之下,则需在调用之前进行函数的声明。因为在C语言中,当你调用一个函数时,编译器需要知道该函数的声明(包括返回类型、参数列表等)。如果你在调用函数之前没有函数的声明或定义,编译器会默认该函数返回 int 类型,并接受任意数量和类型的参数。而实际的函数实现可能与编译器的假设不一致。

#include <stdio.h>

//主函数 
int main() {
	int a = 5,b = 6,c;
	
	c = function(a, b);
	
	printf("%d和%d的商=%d", a, b, c);
	
    return 0;
}


//计算两个数的商,并返回 
int function(int x,int y)
{
	return x*y;	
}     

编译后,出现的警告:

[Warning] implicit declaration of function 'function' [-Wimplicit-function-declaration]:

解析:表示你试图调用一个名为function的函数,但编译器在调用点之前没有看到该函数的声明或定义。

解决方法:

#include <stdio.h>


//函数的声明
int function(int x,int y);

//主函数 
int main() {
	int a = 5,b = 6,c;
	
	c = function(a, b);
	
	printf("%d和%d的商=%d", a, b, c);
	
    return 0;
}


//计算两个数的商,并返回 
int function(int x,int y)
{
	return x*y;	
}     

        在该系列中,文章的前部分采用简短的白话文讲解用法,而后部分采用更深入的角度讲解原理。思考是人类的结晶~如果你觉得有用,给我个点赞、收藏+关注哦~持续更新         

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值