c語言之函數
函數
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歲
}
}
View Code
實例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;
}
View Code
實例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;
}
View Code
實例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;
}
View Code
c語言之函數