函数
1、函数的原型和调用(函数在使用前必须定义或者声明)
#include<stdio.h>
int max(int a,int b); //函数声明
int main(void)
{
int a = 3;
int b = 21;
max_one = max(a,b);
printf("%d\n",max_one);
return 0;
}
int max(int a,int b)
{
int max;
if (a>b)
{
max = a;
}
else{
max = b;
}
return max;
}
2、函数的形参与实参
形参:定义函数时,函数名后的括号内就是“形式参数”,简称形参。
实参:在调用函数时,函数名后的括号中的变量或表达式称为“实际参数”,简称实参。
1、实参可以是变量、常量,也可以是表达式。
2、形参必须指定数据类型,实参和形参必须一一对应。
3、如果一个函数没有明确地标明函数的返回类型,那么函数的返回类型就是int。
4、如果一个函数没有返回值,那么函数的返回类型为void.
5、c语言中,实参形参的数据传递是‘值传递’,即单向传递,只能由实参传给形参,
而不能由形参传递给实参。
如果函数的形参是一个数组,那么可以通过形参修改实参的值。
如:void str(char s[])
{
s[0] = 'a';
s[1] = 'b';
}
int main(void)
{
char str1[100] = "hello world";
str(str1);
printf("%s\n",str1); //输出: abllo world
return 0;
}
3、函数的返回类型与返回值
1、返回值通过return获得,返回值为void时可不需要return语句。
如:void max(){
语句;
}
2、return 语句中的返回值数据类型应与函数定义时相同。
3、如果函数没有return语句,那么函数将返回一个不确定的值。
4、多个源代码文件程序的编译
1、头文件的使用
如果把main函数放在第一个文件中,而把自定义函数放在第二个文件中,
那么就需要在第一文件中声明函数原型。
如果把函数原型包含在一个头文件里,那么就不必每次使用函数的时候都声明其原型了,把函数声明放入头文件是好习惯。
2、#include与#define的意义
#include 就是简单的文件内容替换
#denfine就是简单的文本替换
3、#ifndef 和 endif
#ifndef __AH__//如果没有__AH__这个宏,那就编译#endif之间的代码,如果有的话,不再预编译
#define __A__H__//具体宏的名字是自定义的
在#ifndef中的宏,一定要大写和下划线,必要时加数字,避免和其他头文件中名字冲突。
#endif //防止多次include的同一个文件的时候,重复预编译头文件内容。
5、函数递归
递归给某些编程问题提供了最简单的方法。
缺点:有缺陷的递归会耗尽计算机资源,递归程序难以理解和维护。
#include<stdio.h>
void test(int j)
{
while(j>0)
{
j--;
printf("先序递归:%d\n",j);//先序递归,代码顺序执行
test(j); //自身调用自身
printf("后序递归:%d\n",j);//后序递归,代码逆序执行
}
}
实例1:一个队列,前一个人 总是比后一个人大2岁 ,求第n个人的年龄
实例1:求第n个人的年龄,前一个人 总是比后一个人大2岁
#include<stdio.h>
int age(int n);//函数声明
int main(void)
{
int n=5;
printf("age=%d\n",age(n));
return 0;
}
int age(int n)
{
if(n==1)
{
return 10;
}
else{
return age(n-1)+2; //前一个人 总是比后一个人大2岁
}
}
实例2:10进制转2进制
#include<stdio.h>
void bin(int j) //10进制转2进制 ,除2求余,倒序排列
{
int n = j%2;
if(j>0)
{
//printf("%d",n);//先序递归,顺序输出
bin(j/2);
printf("2进制:%d",n); //后序递归,逆序输出 1101
}
}
int main(void)
{
int i = 13;
bin(i);
return 0;
}
实例3:求fib数列和自然数的和
#include<stdio.h>
int fib(int n) //fib数列,1,1,2,3,5,8...
{
if(n==1||n==2){
return 1;
}
if(n>2)
{
return fib(n-2)+fib(n-1); //从第三个位置开始,等于前两个位置的数值和
}
}
int sum(int m) // 求自然数的和
{
if(m==1)
{
return 1;
}
else{
return sum(m-1)+m;
}
}
int main(void)
{
int i,res1,res2; //输入要求的第i个位置的数,res1和res2分别为fib函数和sum函数的返回值
scanf("%d",&i);
res1=fib(i) ;
res2=sum(i);
printf("你要求的位置的数是:%d\t%d",res1,res2);
return 0;
}
实例4:递归求字符串长度
#include<stdio.h>
int sum_str(char s[],int i)
{
if(s[i])
{
return sum_str(s,i+1);
}
else{
return i;
}
}
int main(void)
{
char a[100];
scanf("%s",a);
printf("%d\n",sum_str(a,0));
return 0;
}