我们将常用的代码以固定的格式封装(包装)成一个独立的模块,只要知道这个模块的名字就可以重复使用它,这个模块就叫做函数(Function)。
用比较字符串大小的函数讲解函数的封装以及一些注意事项。
库函数和自定义函数
C语言自带的函数称为库函数(Library Function)。库(Library)是编程中的一个基本概念,可以简单地认为它是一系列函数的集合,在磁盘上往往是一个文件夹。C语言自带的库称为标准库(Standard Library),其他公司或个人开发的库称为第三方库(Third-Party Library)。
除了库函数,我们还可以编写自己的函数,拓展程序的功能。自己编写的函数称为自定义函数。自定义函数和库函数在编写和使用方式上完全相同,只是由不同的机构来编写。
参数
参数是函数需要处理的数据,函数名后括号中包含的数据或变量
例如:
strlen(str1)用来计算字符串的长度,str1就是参数。
形参和实参的功能是传递数据,发生函数调用时,实参的值会传递给形参。
形参变量只有在函数被调用时才会分配内存,调用结束后,立刻释放内存,所以形参变量只有在函数内部有效,不能在函数外部使用 。(函数外部???)
函数调用中发生的数据传递是单向的,只能把实参的值传递给形参,而不能把形参的值反向地传递给实参;换句话说,一旦完成数据的传递,实参和形参就再也没有瓜葛了,所以,在函数调用过程中,形参的值发生改变并不会影响实参。
形参和实参虽然可以同名,但它们之间是相互独立的,互不影响,因为实参在函数外部有效,而形参在函数内部有效。
#include
//计算从m加到n的值
int sum(int m, int n) {
int i;
for (i = m + 1; i <= n; ++i) {
m += i;
}
return m;
}
int main() {
int m, n, total;
printf("Input two numbers: ");
scanf("%d %d", &m, &n);
total = sum(m, n);
printf("m=%d, n=%d\n", m, n);
printf("total=%d\n", total);
return 0;
}
运行结果:
Input two numbers: 1 100
m=1, n=100
total=5050
返回值
返回值就是函数的执行结果
例如:
char str1[ ] = “C Language”;
int len = strlen(str1);
strlen() 的处理结果是字符串 str1 的长度,是一个整数,我们通过 len 变量来接收。
函数返回值有固定的数据类型(int、char、float等),用来接收返回值的变量类型要一致。
return 语句可以有多个,可以出现在函数体的任意位置,但是每次调用函数只能有一个 return 语句被执行,所以只有一个返回值
//返回两个整数中较大的一个
int max(int a, int b){
if(a > b){
return a;
}else{
return b;
}
}
判断是否为素数
自己的写法
#include
int isPrime(int);
int main()
{
int m,i,k;
while(scanf("%d",&m)==1)
{
if(isPrime(m))
printf("prime\n");
else
printf("composite\n");
}
return 0;
}
int isPrime(int n)
{
int i,k=1;
for(i=2;i<=n-1;i++)
{
if(n%i==0) k=0;
}
if(k>0) return 1;
else return 0;
}
网站解法
#include
int prime(int n){
int is_prime = 1, i;
//n一旦小于0就不符合条件,就没必要执行后面的代码了,所以提前结束函数
if(n < 0){
return -1; }
for(i=2; i<n; i++) //注意i的取值范围
{
if(n % i == 0)
{
is_prime = 0;//满足上面条件的不是素数
break; //提前终止循环
}
}
return is_prime;
}
int main(){
int num, is_prime;
scanf("%d", &num);
is_prime = prime(num);
if(is_prime < 0){
printf("%d is a illegal number.\n", num);
}else if(is_prime > 0){
printf("%d is a prime number.\n", num);
}else{
printf("%d is not a prime number.\n", num);
}
return 0;
}
函数一旦遇到 return 语句就立即返回,后面的所有语句都不会被执行到了。从这个角度看,return 语句还有强制结束函数执行的作用。
更改上面的代码,使得 return 后面不跟任何数据:
#include
void prime(int n){
int is_prime = 1, i;
if(n < 0){
printf("%d is a illegal number.\n", n);
return; //return后面不带任何数据
}
for(i=2; i<n; i++){
if(n % i == 0){
is_prime = 0;