1. 函数的概念
在数学中我们学习过函数,而在C语言中其有着与数学不同的概念:
在C语言中,函数是指一组执行特定任务的语句,这些语句可以重复使用,并且可以在程序的不同部分调用。通过使用函数,程序员可以将程序分解成小而独立的部分,从而使代码更加清晰、易于维护和修改。
2. 库函数
2.1 标准库和头文件
2.2 库函数的使用方法
举例:
double sqrt (double x);
//sqrt 是函数名
//x 是函数的参数,表⽰调⽤sqrt函数需要传递⼀个double类型的值
//double 是返回值类型 - 表⽰函数计算的结果是double类型的值
对其具体展开介绍:
2.2.1 sqrt的功能
2.2.2 头文件包含
![](https://i-blog.csdnimg.cn/blog_migrate/888ec0f4cfef7a38fe243b87e7bb2ef6.png)
2.2.3 sqrt实践
求16的平方根
代码示例:
#include <stdio.h>
#include <math.h>
int main()
{
double d = 16.0;
double r = sqrt(d);
printf("%lf\n", r);
return 0;
}
运行结果:
2.2.4 库函数文档的一般格式
3. 自定义函数
3.1 函数语法形式
ret_type fun_name(形式参数)
{
}
//• ret_type 是函数返回类型
//• fun_name 是函数名
//• 括号中放的是形式参数
//• {}括起来的是函数体
下面形象具体的介绍一下:
3.2 函数举例
#include<stdio.h>
int add(int x, int y)//自定义加法函数
{
int z = x + y;//函数体
return z;//返回值
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
int r = add(a, b);//函数调用
printf("%d\n", r);
return 0;
}
运行结果:
4. 函数中的参数
函数在使用的过程中,把函数的参数分为实参和形参。
结合上述代码,简单介绍下。
4. 1 实参
定义好add函数后,进行调用,此时传递给函数的参数a和b称为实际参数,简称实参。
实际参数就是真实传递给函数的参数。
实参可能是变量,也可能是常量,也可能是宏,也可能是指针。
4.2 形参
定义函数add时,在函数名add后括号中写的x和y称为形式参数,简称形参。
4.3 实参和形参的关系
5. return语句
6. 数组做函数参数
题目举例:写⼀个函数对将⼀个整型数组的内容,全部置换为-1,再写⼀个函数打印数组的内容。
代码示例:
#include<stdio.h>
int zh(int arr[],int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
arr[i] = -1;
}
return 0;
}
int print(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
int main()
{
int arr[5] = { 1,2,3,4,5 };
int sz = sizeof(arr) / sizeof(arr[0]);
zh(arr, sz);
print(arr, sz);
return 0;
}
运行结果:
上述代码中有两个参数:数组和数组的元素个数,对数组的内容进行置换,需把数组作为参数传递给函数,将每个元素置换为-1,需遍历数组,需要知道数组元素个数,也作为参数。定义函数对数组进行置换打印,完成操作。
另外需要注意的是:函数传参时
7. 嵌套调用和链式访问
7.1 嵌套调用
题目举例:计算某年某⽉有多少天
代码示例:
#include<stdio.h>
int rbr(int year)//定义判断闰年的函数rbr
{
if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0))
return 1;//闰年,返回1,真。
else
return 0;//不是闰年,返回0,假。
}
int md(int year, int month)//定义判断天数的函数md
{
int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };//正常年份每月天数
int day = days[month];//下标month,多加一个0是为了使month对应相应月份。
if (rbr(year) && month == 2)//特殊情况,闰年的2月份为29天。
day += 1;
return day;
}
int main()
{
int year = 0;
int month = 0;
scanf("%d%d", &year, &month);
int day = md(year, month);
printf("%d\n", day);
return 0;
}
运行结果:
这道题目是对之前牛刀小试---闰年的判断http://t.csdnimg.cn/NqBAZ进一步扩展,在其基础上运用了函数和数组的知识。
7.2 链式访问
#include <stdio.h>
int main()
{
printf("%d\n", strlen("abcdef"));//链式访问
return 0;
}
将strlen函数的返回值作为库函数printf的参数
上述代码可以拆分为:
#include <stdio.h>
int main()
{
int len = strlen("abcdef");//1.strlen求⼀个字符串的⻓度
printf("%d\n", len);//2.打印⻓度
return 0;
}
下面再看一个链式访问的代码,猜一猜代码运行的结果:
#include <stdio.h>
int main()
{
printf("%d", printf("%d", printf("%d", 43)));
return 0;
}
运行结果:
8. 函数的声明和定义
8.1 单个文件
代码举例:
#include <stido.h>
//判断⼀年是不是闰年
int is_leap_year(int y)//函数的定义
{
if(((y%4==0)&&(y%100!=0)) || (y%400==0))
return 1;
else
return 0;
}
int main()
{
int y = 0;
scanf("%d", &y);
int r = is_leap_year(y);//函数的调用
if(r == 1)
printf("闰年\n");
else
printf("⾮闰年\n");
return 0;
}
先定义后调用,定义在调用之前。另外定义在调用之后也是可以的,但需进行函数的声明:
#include<stdio.h>
int is_leap_year(int y);//函数声明
int main()
{
int y = 0;
scanf("%d", &y);
int r = is_leap_year(y);
if (r == 1)
printf("闰年\n");
else
printf("⾮闰年\n");
return 0;
}
//判断⼀年是不是闰年
int is_leap_year(int y)
{
if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))
return 1;
else
return 0;
}
声明函数只要交代清楚:函数名,函数的返回类型和函数的参数
8.2 多个文件
//函数的定义.c
int Add(int x, int y)
{
return x+y;
}
//函数的声明.h
int Add(int x, int y);
//函数的调用.c
#include <stdio.h>
#include "函数的声明.h"
int main()
{
int a = 10;
int b = 20;
//函数调⽤
int c = Add(a, b);
printf("%d\n", c);
return 0;
}
这样写有着一定的好处:
1. 逻辑清晰
2. 方便多人协同
3. 适当隐藏代码
本篇文章就到这里了,如果对你学习函数有帮助的话,不要忘记点赞哦,后续将会有更多内容呈现。