在数学中我们学习过函数,而在C语言中其有着与数学不同的概念:
在C语言中,函数是指一组执行特定任务的语句,这些语句可以重复使用,并且可以在程序的不同部分调用。通过使用函数,程序员可以将程序分解成小而独立的部分,从而使代码更加清晰、易于维护和修改。
举例:
double sqrt (double x);
//sqrt 是函数名
//x 是函数的参数,表?调?sqrt函数需要传递?个double类型的值
//double 是返回值类型 - 表?函数计算的结果是double类型的值
对其具体展开介绍:
? 求16的平方根
? 代码示例:
#include <stdio.h>
#include <math.h>
int main()
{
double d = 16.0;
double r = sqrt(d);
printf("%lf\n", r);
return 0;
}
? 运行结果:
ret_type fun_name(形式参数)
{
}
//? ret_type 是函数返回类型
//? fun_name 是函数名
//? 括号中放的是形式参数
//? {}括起来的是函数体
下面形象具体的介绍一下:
#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;
}
运行结果:
函数在使用的过程中,把函数的参数分为实参和形参。
结合上述代码,简单介绍下。
定义好add函数后,进行调用,此时传递给函数的参数a和b称为实际参数,简称实参。
实际参数就是真实传递给函数的参数。
实参可能是变量,也可能是常量,也可能是宏,也可能是指针。
定义函数add时,在函数名add后括号中写的x和y称为形式参数,简称形参。
题目举例:写?个函数对将?个整型数组的内容,全部置换为-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,需遍历数组,需要知道数组元素个数,也作为参数。定义函数对数组进行置换打印,完成操作。
另外需要注意的是:函数传参时
题目举例:计算某年某?有多少天
代码示例:
#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进一步扩展,在其基础上运用了函数和数组的知识。
#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;
}
运行结果:
代码举例:
#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;
}
声明函数只要交代清楚:函数名,函数的返回类型和函数的参数
//函数的定义.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. 适当隐藏代码
本篇文章就到这里了,如果对你学习函数有帮助的话,不要忘记点赞哦,后续将会有更多内容呈现。