1.函数存在的意义
- 避免了重复性操作。
- 有利于程序的模块化。
# include <stdio.h>
//max是函数的名字, i和j是形式参数,简称形参 void表示函数没有返回值
void max(int i, int j)
{
if (i > j)
printf("%d\n", i);
else
printf("%d\n", j);
}
int main(void)
{
int a, b, c, d, e, f;
a = 1, b = 2; c = 3, d = 9, e = -5, f = 100;
max(a, b);
max(c, d);
max(e, f);
2-1 什么是函数
1.逻辑上:能够完成特定功能的独立的代码块。
2.物理上:能够接收数据【也可以不接收数据】,能够对接收的数据进行处理【也可以不对数据进行处理】,能够将数据处理的结果返【也可以没有返回值】。
2-2 如何定义函数
函数的返回值,函数的名字(函数的形参列表)
{
函数的执行体
}- 函数定义的本质:详细描述函数之所以能够实现某个特定功能的具体方法。
函数中的变量叫做形参;数组中的变量叫元素。一旦函数执行完毕,其内部的形参所占空间就被收回。
return 表达式含义
- return是终止被调函数,向主调函数返回表达式的值,如果表达式为空,则只终止函数,不向被主函数返回任何值。
代码显示
# include <stdio.h>
int f()
{
return 10.5; //因为函数的返回值类型是int 所以最终f返回的是10而不是10.5
}
int main(void)
{
int i = 99;
double x = 6.6;
x = f();
printf("%lf\n", x);
return 0;
}
Break是用来终止(就近的)循环和switch语句。而return是用来终止被调函数的。
# include <stdio.h>
void f(void)
{
int i;
for (i=0; i<5; ++i)
{
printf("大家辛苦了!\n");
return; //return是终止函数的
}
printf("同志们好!\n");
}
int main(void)
{
f();
return 0;
}
3 函数的分类
1.有参函数和无参函数。
2.有返回值和无返回值。
3.库函数和用户自定义函数。
4.普通函数和主函数(main函数)
4 注意事项
1.一个程序有且只有一个主函数。
2.主函数可以调用普通函数,普通不能调用主函数。
3.普通函数可以相互调用。
4.主函数是程序的入口,也是函数的出口。
值传递函数和地址传递函数。
# include <stdio.h>
//max是函数的名字, i和j是形式参数,简称形参 void表示函数没有返回值
void max1(int i, int j)
{
if (i > j)
printf("%d\n", i);
else
printf("%d\n", j);
}
int max2(int i, int j)
{
if (i > j)
return i;
else
return j;
}
int main(void)
{
int a, b, c, d, e, f;
a = 1, b = 2; c = 3, d = 9, e = -5, f = 100;
printf("%d\n", max2(a, b));
printf("%d\n", max2(c, d));
printf("%d\n", max2(e, f));
}
代码实现
//判断一个数是否素数,该数只能被1和本身整除
# include <stdio.h>
bool IsPrime(int val)
{
int i;
for (i=2; i<val; ++i)
{
if (val%i == 0)
break;
}
if (i == val)
return true;
else
return false;
}
int main(void)
{
int m;
scanf("%d", &m);
if ( IsPrime(m) )
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
代码实现
//void f(int i) 则是return不需要返回任何数据类型
int f(int i)
//void f(void) 表示f里面不需要参数
{
return 10.8;
}
int main(void)
{
float i = 99.9;
printf("%f\n", i);
i = f(5);
printf("%f\n", i);
return 0;
}
4 函数的声明
# include <stdio.h>
void f(void); //函数声明, 分号不能丢掉
int main(void)
{
f();
return 0;
}
void f(void)
{
printf("哈哈!\n");
}
---------------------------------------------------------------
# include <stdio.h>
//void f(void); //9行
void g(void)
{
f(); //因为函数f的定义放在了调用f语句的后面,所有语法出错
}
void f(void)
{
printf("哈哈!\n");
}
int main(void)
{
g();
return 0;
}
当函数没有返回值时,那么规范的写法是要在函数中写明void的。如果函数调用写在了函数定义的前面,则必须加函数前置声明。
5 形参和实参的关系
1:形参和实参个数是一一对应的。
2:形参和实参的位置也是一一对应的。
3: 形参和实参的数据类型需要相互兼容。
# include <stdio.h>
void f(int i, float x) //形参
{
printf("%d\n", i);
}
int main(void)
{
f(9.9, 6.6); //实际参数
return 0;
}
6 如何合理的设计函数
//判断一个数是否是素数
# include <stdio.h>
int main(void)
{
int val;
int i;
scanf("%d", &val);
for (i=2; i<val; ++i)
{
if (0 == val%i)
break;
}
if (i == val)
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
------------------------------------------------------------
**代码2**
# include <stdio.h>
bool IsPrime(int val)
{
int i;
for (i=2; i<val; ++i)
{
if (0 == val%i)
break;
}
if (i == val)
return true;
else
return false;
}
int main(void)
{
int val;
int i;
scanf("%d", &val);
if ( IsPrime(val) )
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
-------------------------------------------------------------
**代码3:**
/*
求1到某个数字之间(包括该数字)所有的素数,并将其输出
只用main函数实现,有局限性:
1. 代码的重用性不高
2. 代码不容易理解
*/
# include <stdio.h>
int main(void)
{
int val;
int i;
int j;
scanf("%d", &val);
for (i=2; i<=val; ++i)
{
//判断i是否是素数,是输出,不是不输出
for (j=2; j<i; ++j)
{
if (0 == i%j)
break;
}
if (j == i)
printf("%d\n", i);
}
return 0;
}
-------------------------------------------------------------
** 代码4**
/*
求1到某个数字之间(包括该数字)所有的素数,并将其输出
用1个函数来判断一个数字是否是素数 */
# include <stdio.h>
bool IsPrime(int m)
{
int i;
for (i=2; i<m; ++i)
{
if (0 == m%i)
break;
}
if (i == m)
return true;
else
return false;
}
int main(void)
{
int val;
int i;
scanf("%d", &val);
for (i=2; i<=val; ++i)
{
if ( IsPrime(i) )
printf("%d\n", i);
}
return 0;
}
---------------------------------------------------------------
**代码5**
/*
用两个函数来实现求1到某个数字之间所有的素数,并将其输出
本程序 和 如何合理设计函数
*/
# include <stdio.h>
//本函数的功能是: 判断m是否是素数,是返回true,不是返回false
bool IsPrime(int m)
{
int i;
for (i=2; i<m; ++i)
{
if (0 == m%i)
break;
}
if (i == m)
return true;
else
return false;
}
//本函数的功能是把1到n之间所有的素数在显示器上输出
void TraverseVal(int n)
{
int i;
for (i=2; i<=n; ++i)
{
if ( IsPrime(i) )
printf("%d\n", i);
}
}
int main(void)
{
int val;
scanf("%d", &val);
TraverseVal(val);
return 0;
}
7 变量的作用域和存储方式
1、局部变量
局部变量的使用范围只能在本函数内部使用
2.全局变量
/*
一定要明白该程序为什么是错的,
也要明白把9到12行代码放在14行后面,为什么程序就OK了
*/
# include <stdio.h>
void g() //9
{
printf("k = %d\n", k);
} //12
int k = 1000; //14行
void f(void)
{
g();
printf("k = %d\n", k);
}
int main(void)
{
f();
return 0;
}
3、局变量和局部变量命名冲突的问题
#### 代码显示
# include <stdio.h>
//在一个函数内部,如果定义的局部函数的名字和全局变量名一样时,局部变量会屏蔽掉全局变量,上例中最终的输出结果是8,因为局部变量把全局变量给屏蔽掉了。
int i = 99;
void f(int i)
{
printf("i = %d\n", i);
}
int main(void)
{
f(8);
return 0;
}