C语言——函数
1、为什么使用函数:
-
避免重复性操作
-
有利于程序的模块化(逐一分解)
#include <stdio.h>
void max(int i, int j) //设计一个名字为max的函数,添加形参i,j ;功能是取出最大值
{ //void表示没有返回值
if(i>j)
printf("%d\n" ,i);
else
printf("%d\n" ,j);
}
int main(void) //从main先进入,再从main退出
{
int a, b, c, d, e, f;
a=1, b=4, c=0, d=9, e=90, f=78;
max(a,b); //加入实参 ,调用max函数;
max(c,d);
max(d,f);
return 0;
}
2、什么叫函数
-
逻辑上:够完成特定功能的代码块;
-
物理上:能够接收数据【当然也可以不接受】
能够对接受的数据进行处理
能够将数据处理的结果返回【也可以不返回任何值】
-
总结:1.函数是一种工具,他是为了解决大量类似的问题而设计的
2.函数可以当作一个黑匣子
# include <stdio.h>
int f(void) //f()不接收数据
{
return 10;//向主函数返回10;
}
void g(void) //该函数既没有返回值
{
//return 10;error该函数没有返回值
}
int main(void)
{
int j = 88;
j = f();
printf("%d\n", j);//输出10
//j = g(); error因为g函数没有返回值
return 0;
}
3、如何定义函数
- 格式:
函数返回值 函数名(函数形参列表)
{
函数函数执行体
}
- 本质:详细描述函数之所以能够实现某个特定功能的具体实现方法;
- 函数返回值的类型也称为函数的类型,也就是函数类型与返回值的类型要一样。
- return 表达式;的含义:
- 终止被调函数,向主函数返回表达式的值;
- 如果表达式为空,则函数终止并且不向主调函数返回任何值;
- break是用来终止for循环和switch的,return是用来终止函数的
# include <stdio.h>
void f(void)
{
int i;
for (i=0; i<5; i++)
{
printf("大家辛苦了!\n");
// break; //执行后for循环被终止,for循环以外的代码继续执行
return ;//执行后函数f()被终止
}
printf("同志们好!\n");
}
int main(void)
{
f();
}
//如果是break则输出:同志们好! 大家辛苦了!
//如果是return则输出:大家辛苦了!
4、函数的分类
-
有参函数 和 无参函数
-
有返回值函数 和 无返回值函数
-
库函数 和 用户自定义函数
-
值传递函数 和 地址传递函数
-
普通函数 和 主函数(main)
注:一个程序必须有且只有一个主函数;主函数调用普通函数,普通函数可以互相调用;主函数是程序的入口,也是函数的出口。
例子:
/*
*判断输入的一个数是否是素数
*/
#include <stdio.h>
int main(void)
{
int val;//设置输入一个数
int i;//设置一个用来除的值
printf("请输入一个整数:");
scanf("%d",&val);
for (i=2; i<val; i++) //带入具体的值去理解
{
if(val%i == 0)
break;
}
if(i == val)
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
=========================================================
/*
*编写函数判断输入的数是否是素数
*/
#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;
printf("请输入一个整数:");
scanf("%d", &m);
if( IsPrime(m) )
printf("Yes!\n");
else
printf("No!\n");
return 0;
}
5、函数的声明
- 注意:运行时是从上到下的,所以当函数不声明,又放在主函数后面时,程序会报错。声明时记得加分号。
- 库函数(printf这类)不需要再声明,因为他通过 # include <库函数所在的文件名字.h>来实现。
#include <stdio.h>
void f(void); //声明时,分号不能忘掉
int main(void)
{
f(); //如果前面不声明,则会出错
return 0;
}
//将函数f放在main后面
void f(void)
{
printf("test!\n");
}
6、如何在软件开发中合理的设计函数来解决实际问题
- 一个函数的功能应该尽量独立,单一;多学习和模仿牛人的代码。
/*
输出从1~val之间所有素数 例1
*/
#include <stdio.h>
int main(void)
{
int val;
int i;
int j;
scanf("%d", &val);
for(i=2; i<=val; i++)//带入具体值去理解
{
for(j=2; j<i; j++)
{
if(0 == i%j)
break; //多重for循环,break只终止里面那个
}
if(j == i)
printf("%d\n", i);
}
return 0;
}
===========================进阶========================================
/*
用两个函数来实现求1到某个数字之间所有的素数,并将其输出
例2进阶
*/
# 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;
}