函数的概述
- 函数:实现一定功能的,独立的代码模块,我们的函数一定是先定义后使用
- 使用函数的优势
- 可以通过函数提供功能给别人使用,当然我们也可以使用别人提供的函数,减少代码量
- 借助函数可以减少重复性代码。
- 实现结构化(模块化)程序设计思想
结构化程序设计思想:将大型的任务功能,划分为相互独立的小型的任务模块来设计
3.函数是c语言程序的基本组成单元:
C语言程序是由一个(必然是main函数)或多个函数组成。
函数的分类
从函数实现的角度
- 库函数:C语言标准库实现并提供使用的函数;比如:printf(),scanf()
- 用户自定函数:需要程序员自行实现,开发中大部分都是这样的函数
从函数的形式的角度
- 无参函数:函数调用时,无需传参,可配可不配返回值
- 有参函数:函数调用时,需要参数传递数据,经常需要配套返回值使用
相关概念
- 主调函数:主动去调用其他函数的函数
- 被调函数:被调用的函数
// 此时main是主调函数,需要注意的是,main只能作为主调函数 int main() { // 此时printf()是被调函数 printf("hello world!"); return 0; }
很多时候,一个函数既可以是主调函数也可以是被调函数,这种情况一般出自自定义函数
int fun_b()
{
printf("执行B\n");
}
int fun_a()
{
printf("执行A\n");
fun_b();
}
int main()
{
fun_a();
}
函数的定义
语法:
返回类型 函数名(形参列表) -- 函数头 | 函数首部
{
函数体语句;(函数体) -- 函数体,整个{}包裹的内容包括返回值都属于函数体 }
函数首部:
- 返回类型:函数返回值的类型
- 函数名:函数的名称,遵循标识符命名(使用英文字母、数字、_、$,不能以数字开头,建议小写+下划线命名法)
- 形参列表:用于接收主调函数传递的数据,如果有多个用逗号分隔,且每一个形参都需要指定类型
void fun1(int a,int b)
{
}
main() // 问main的返回类型是?int 如果省略类型标识符,则默认返回int
{
}
注意:
- 函数类型标识符变量类型说明符相同,它表示返回的函数值的类型。
- 在C语言中还可以定义无类型(即void类型)的函数,这种函数不返回函数值,只是完成某种功能
- 如果省略函数的类型标识符,则默认为是int型。
- 函数中返回语句的形式为 return(表达式);或 return 表达式;其作用是将表达式的值作为函数值返回给调用函数。其中表达式的类型应与函数类型一致。
- 如果形参列表中有多个形式参数,则它们之间要用逗号分隔
- 如果形参列表中有多个形式参数,即使他们的类型是相同的,在形参列表中也只能逐个说明
- 一个完整C程序中的所有函数可以放在一个文件中,也可以放在 多个文件中。
案例
案例1.
/*
* 需求:计算1到5之间个自然数的阶乘值
*/
#include <stdio.h>
// 定义一个函数,用来实现阶乘
int p(int n)
{
int k,s;// k:循环变量,s:阶乘结果
s = 1;
for(k = 1;k <= n;k++) s *= k;
return s;
}
int main()
{
int m;// 来管理参与计算的自然数
int n = 5;// 定义范围
int s = p(n);
printf("1~5之间自然数的阶乘值是%d\n",s);
}
案例2
/**
* 需求:计算并输出一个圆台两底面积之和。
*/
#include <stdio.h>
// 定义PI
#define PI 3.1415926
/**
* 定义一个函数,实现圆的面积的计算
* @param r 圆的半径
* @return 圆的面积
*/
double circleArea(double r)
{
// 圆的面积 = PI * r * r
return PI * r * r;
}
/**
* main函数以后只做输入输出
*/
int main()
{
// 定义两个半径,两个面积
double r1,r2,area1,area2;
printf("请输入两个圆的半径:\n");
scanf("%lf,%lf",&r1,&r2);
// 调用函数计算两个圆的面积
area1 = circleArea(r1);
area2 = circleArea(r2);
printf("一个圆台两底面积之和是:%lf\n",area1 + area2);
return 0;
}