初见函数
求素数的和
#include <stdio.h>int main()
{int m,n;int sum = 0;int cnt = 0;int i;scanf("%d %d", &m, &n);// m=10,n=31;if( m==1) m=2;for( i=m; i<=n; i++ ) {int isPrime = 1;int k;for ( k=2; k<i-1; k++ ) {if ( i%k == 0 ) {isPrime = 0;break;}}if ( isPrime ) {sum += i;cnt++;}}printf("%d %d\n", cnt, sum);return 0;
}
写自己的函数
#include <stdio.h>int isPrime(int i);
{int ret = 1;int k;for ( k=2; k<i-1; k++ ) {if ( i%k == 0 ) {ret = 0;break;}}return ret;
}int main()
{int m,n;int sum = 0;int cnt = 0;int i;scanf("%d %d", &m, &n);//m=10,n=31;if( m==1 )m=2;for ( i=m; i<=n; i++ ) {if ( isPrime(i) ) {sum += i;cnt++;}}
pritnf("%d %d\n", cnt, sum);return 0;
}
函数变得很简洁,而isPrime函数将来也可以用到其他地方
求和
求1~10、20~30和35~45的三个和
#include <stdio.h>int main()
{int i;int sum;for ( i=1,sum=0; i<=10; i++ ) {sum += i;}printf("%d到%d的和是%d\n", 1, 10, sum);for ( i=20,sum=0; i<=30; i++ ) {sum += i;}printf("%d到%d的和是%d\n", 20, 30, sum);for ( i=35,sum=0; i<=45; i++ ) {sum += i;}printf("%d到%d的和是%d\n", 35, 45, sum);reuturn 0;
}
发现,有三段几乎一样的代码,在程序中叫做”代码复制“
“代码复制”是程序质量不良的表现
将重复函数提取出来:
void sum(int begin, int end)
{
int i;
int sum = 0;
for ( i=begin; i<=end; i++ ) {
sum += i;
}
printf("%d到%d的和是%d\n", begin, end, sum);
}
int main()
{
sum(1,10);
sum(20,30);
sum(35,45);
return 0;
}
函数的定义和使用
什么是函数:
函数是一块代码,接受零个或多个参数,做一件事情,并返回零个或一个值
函数定义
void sum(int begin, int end)
{int i;int sum = 0;for ( i=begin; i<=end; i++ ) {sum += i;}printf("%d到%d的和是%d\n", begin, end, sum);
}
函数头:
void sum(int begin, int end)
void:返回类型(不返回任何结果的函数)
sum:函数名
int begin, int end:参数表
函数体: (一定要有)
int i;
int sum = 0;
for ( i=begin; i<=end; i++ ) {
sum += i;
}
printf("%d到%d的和是%d\n", begin, end, sum);
调用函数
格式:函数名(参数值);
()起到了表示函数调用的重要作用,即使没有参数也需要();如果有参数,则需要给出正确的数量和顺序,这些值会被按照顺序依次用来初始化函数中的参数
函数返回
函数知道每一次是哪里调用它,会返回到正确的地方
从函数中返回
- return:停止函数的执行,并送回一个值
- return的两种写法:
①return;
②return 表达式;
- 一个函数里可以出现多个return语句
int max(int a, int b)
{
int ret;
if ( a>b ) {
ret = a;
} else {
ret = b;
}
return ret;
}
>>
int max(int a, int b)
{
if ( a> b ) {
return a;
} else {
return b;
}
}
*但上述不是一种好的写法,不符合单一出口
从函数中返回值
- 可以赋值给变量
- 可以再传递给函数
- 甚至可以丢弃
没有返回值的函数
格式:void 函数名(参数表)
不能使用带值的return(可以没有return)
调用的时候不能做返回值的赋值
*如果函数有返回值,则必须使用带值的return