第一部分 函数
一、函数的作用
添加一个常用的新功能,有需要的时候就可以直接调用。
二、函数的定义
(1)格式
返回值类型 函数名 (形式参数列表)
{
函数体
}
int average(int num1, int num2)
{
return (num1 + num2) / 2;
}
(2)步骤
1> 根据函数的作用,起一个有意义的名字。
2> 明确函数的形式参数。
3> 明确函数是否需要返回值。
2> 明确函数的形式参数。
3> 明确函数是否需要返回值。
(3)函数调用
int main(void)
{
int a = 10;
int b = 9;
int c = average(a, b);
printf("c is %d\n", c);
return 0;
}
三、形式参数和实际参数
(1)形式参数:定义函数时函数名后面括号中的参数,简称形参。
int average(int num1, int num2) //num1和num2就是形参
(2)实际参数:调用函数时传入的具体数值,简称实参。
int c = average(a, b); // a、b就是实参
(3)注意点
1> 实参和形参的个数必须相等。
2> 函数体内部不能定义和形参一样名字的变量。
3> 如果是基本数据类型作为函数形参,是值传递,修改函数内部形参的值并不会影响外面实参的值。
4> 一个函数可以没有形参,也可以有无数个形参。
四、return
2> 函数体内部不能定义和形参一样名字的变量。
3> 如果是基本数据类型作为函数形参,是值传递,修改函数内部形参的值并不会影响外面实参的值。
4> 一个函数可以没有形参,也可以有无数个形参。
四、return
(1)作用
1> 退出函数
2> 返回一个具体值给函数调用者
2> 返回一个具体值给函数调用者
(2)注意点
1> 如果返回值类型写的是void,说明函数没有返回值,return可写可不写,如果写的画,后面不能写数值
2> 如果没有明确写出返回值类型,默认是int型
3> 就算明确声明了返回值类型,也可以不返回任何值
五、函数注意点
2> 如果没有明确写出返回值类型,默认是int型
3> 就算明确声明了返回值类型,也可以不返回任何值
五、函数注意点
1、默认情况下,C语言不允许两个函数的名称一样
2、函数不能嵌套定义
3、函数不能重复定义,但是可以重复声明,函数声明只要在调用函数之前就好,函声明的位置不固定。
4、如果有函数的声明,没有函数的定义
1> 编译可以通过,因为编译器只会检测语法合不合理
2> 链接报错,因为链接的时候会检测函数是否定义
2、函数不能嵌套定义
3、函数不能重复定义,但是可以重复声明,函数声明只要在调用函数之前就好,函声明的位置不固定。
4、如果有函数的声明,没有函数的定义
1> 编译可以通过,因为编译器只会检测语法合不合理
2> 链接报错,因为链接的时候会检测函数是否定义
六、课后练习
/*
编写一个函数int pows(int base, int n)返回base的n次方
*/
#include <stdio.h>
int pows(int base, int n);
int main(void)
{
// 1.定义变量保存要计算的整数,和要计算的整数次方
int a;
int b;
// 2.提示用户输入
printf("请输入要计算的数值,以及乘方数:\n");
// 3.接收输入
scanf("%d %d", &a, &b);
// 4.计算
int c = pows(a, b);
printf("%d的%d次方是%d\n", a, b, c);
return 0;
}
int pows(int base, int n)
{
if (0 == n)
{
return 1;
}
//定义变量保存结果
int result = 1;
for (int i = 0; i < n; i++)
{
result *= base;
}
return result;
}
/*
题目:
编写一个函数int pieAdd(int n),计算1!+2!+3!+……+n!的值(n>=1)。
比如pieAdd(3)的返回值是1! + 2! + 3! = 1 + 1*2 + 1*2*3 = 9
*/
#include <stdio.h>
//函数声明
int pieAdd (int n);
int main (void)
{
// 1.定义一个变量保存用户输入
int num = 0;
// 2.检查输入是否正确,负数没有阶乘
while (num < 1)
{
// 2.1提示用户输入一个大于等于零的整数
printf ("请用户输入一个大于等于零的整数:\n");
// 2.2接收输入
scanf ("%d", &num);
}
// 3.定义一个变量保存最终结果
int result = pieAdd (num);
printf ("结果是%d\n", result);
return 0;
}
//函数定义
int pieAdd (int n)
{
// 先计算阶乘,再相加
int jiecheng = 1;
int sum = 0;
//当下乘的值
int number = 1;
for (int i = 0; i < n; i++)
{
//计算阶乘
jiecheng *= number;
//当下乘的值+1
number++;
//相加
sum += jiecheng;
}
return sum;
}
第二部分 多文件开发
一、开发原则
(1)函数的定义放.c文件,函数的声明放.h文件
(2)如果要使用某个.c文件中定义的函数,只需要#include这个.c文件对应的.h文件
(3).h头文件的作用:被别人拷贝,编译链接的时候不需要管.h文件
二、实例
(2)如果要使用某个.c文件中定义的函数,只需要#include这个.c文件对应的.h文件
(3).h头文件的作用:被别人拷贝,编译链接的时候不需要管.h文件
(1)公司有个项目,是做基本运算。现分配任务,张三负责编写main函数,李四负责编写运算。
/*
张三 zhangsan.c
编写main函数
*/
#include <stdio.h>
#include "李四.h"
int main()
{
int score1 = 100;
int score2 = 70;
int c = average(score1, score2);
int d = sum(score1, score2);
printf("平均分是%d\n", c);
printf("总分是%d\n", d);
return 0;
}
/*
李四 lisi.c
负责编写基本运算函数
*/
int average(int a, int b)
{
return (a + b)/2;
}
int sum(int a, int b)
{
return a + b;
}
/*
李四 lisi.h
编写函数的声明
*/
int average(int a, int b);
int sum(int a, int b);
(2)执行过程
1> 各自生成目标文件
cc -c zhangsan.c //生成zhangsan.o目标文件<span style="white-space:pre"> </span>
cc -c lisi.c //生成lisi.o目标文件
2> 链接:
把项目中所有相关联的.o目标文件、C语言函数库合并在一起,生成可执行文件a.out
cc zhangsan.o lisi.o
3> 运行
./a.out