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 头文件包含
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,真。elsereturn 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;elsereturn 0;
}
int main()
{int y = 0;scanf("%d", &y);int r = is_leap_year(y);//函数的调用if(r == 1)printf("闰年\n");elseprintf("⾮闰年\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");elseprintf("⾮闰年\n");return 0;
}
//判断⼀年是不是闰年
int is_leap_year(int y)
{if (((y % 4 == 0) && (y % 100 != 0)) || (y % 400 == 0))return 1;elsereturn 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. 适当隐藏代码
本篇文章就到这里了,如果对你学习函数有帮助的话,不要忘记点赞哦,后续将会有更多内容呈现。