前情回顾:在6级的时候,我们学习了:break的使用、continue的使用
目录
概念
函数是什么?
答:函数可以被多次调用,完成特定的任务,避免了代码的重复编写。C语言中的函数可以分为两类:标准库函数、用户自定义函数。
标准库函数
C语言提供了大量的标准库函数,这些函数是预先定义好的,可以直接在程序中使用。例如,printf()
用于输出,scanf()
用于输入,sqrt()
用于计算平方根......
学库函数
库函数无需全部掌握,要用到时再去查手册,以下是菜鸟教程的网址:
例如:我们要计算某个数的立方是多少,就用到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;
}
在该系列中,文章的前部分采用简短的白话文讲解用法,而后部分采用更深入的角度讲解原理。思考是人类的结晶~如果你觉得有用,给我个点赞、收藏+关注哦~持续更新