函數
1.實現某種特定功能的指令序列
2.作用:
a)模塊化的設計
b)代碼的複用 printf/gets
3.函數的設計
需求分析:
a)明確實現的功能
b)需要的資源
c)算法思路
d)完成情況的結果
ex.求整型數組中的最大值 ex1.統計字符串中有幾個字母?
資源:數組、數組長度 資源:字符串、字符串的長度
思路:max 思路:('a'<=a[i]&&a[i]<='z')||('A'<=a[i]&&a[i]<='A')
結果:max 結果:幾個字母
4.函數實現
4.1格式:
返回值類型 函數名(參數列表)
{
聲明語句;
實現語句;
return;
}
“返回值類型”:必須單值類型,可以返回指針類型
“函數名” :只要是合法的標識符即可
“參數列表” :(數據類型1 變量名1,數據類型2 變量名2)
return 返回值:
1.結束函數
2.返回一個與返回值類型一致的值(假設返回值類型是void ,直接用return;)
/* /*
功能:求數組的最大值 ex.寫一個函數,求2個數的最大值
*/ */
int maxFun(int a[],int length)
{
int max=a[0];
int i;
for(i=0;i<length;i++)
{
if(max<a[i])
{
max=a[i];
}
}
return max;
}
4.2函數的調用
1.直接調用,作爲一個單獨的語句調用
函數名(參數列表);
"函數名":調用的函數名字
"參數列表":(變量名1,變量名2):變量名的類型與函數定義的類型一致
參數列表:裏面可以是常量,變量,表達式,只要類型一致即可
maxFun(a,b);
2.作爲一個表達式出現在另一個表達式中
int c=maxFun(a,10);
3.作爲另一個函數的實參調用
maxFun(maxFun(a,b),10);
4.3基礎概念
主調函數:主動調用別的函數的函數
被調函數:被別的函數調用的函數
形 參:定義函數時參數列表的參數
實 參:調用函數時傳入的參數
☆4.4函數的調用過程
.函數只有在被調用的時候纔會分配空間。
1.把實參的值賦值給形參
2.執行函數體內的內容
3.使用return返回,函數執行結束,所有形參以函數裏定義的變量都會被釋放
4.最後把返回值返回給主調調函數。
4.5
主調函數--->被調函數 通過實參
被調函數--->主調函數 通過返回值
主調函數<---->被調函數 全局變量
ex1.寫一個函數求3個數的和,在main中調用。
main中輸入數據
main中輸出結果
ps:1)函數名不能與變量名相同
2)函數名不能使用關鍵字(int double long if/while static extern)
5.遞歸函數
函數自己直接或者間接的調用自己
a)問題模型要符合遞推
b)問題模型的解到一定層次是顯而易見的
c)明確功能與需求的關係
ex.要用遞歸來實現菲波那切數列
功能:求菲波那切數列的第n項的值
參數:
結果:第n項的值
ex1.
a1=10
An=A(n-1)+2
a)使用遞歸求第n項的值。
功 能:求第n項的值
輸入參數:n項
結 果:第n項的值
int A(int n)
{
if(n==1)
{
return 20;
}
else
{
return A(n-1)+2;
}
}
b)求前n項的和
s1=10;
S(n)=S(n-1)+A(n);
hanoi問題:
有ABC三座塔,有64從小到大個盤子放在塔A上,要把塔A上的盤子移到塔C上
1.每一次只能移到一個盤子
2.盤子只能按照上面是小的下面是大來放置。
5.變量的存儲類別
1.從作用範圍內來講
1.全局變量
在函數外定義,一開始就會分配內存空間,並在整個程序/或者說整個工程內都有效
extern int a;//告訴編譯器,我文件後面定義了一個變量
static修飾全局變量:該全局變量僅能在定義它的文件中使用
2.局部變量
在函數體內部定義,它的作用範圍從定義開始,到第一個{}結束
static 局部變量:一直存在,並且初始化只執行一次
1.同名問題:只要作用域不同,就可以同名,名字相同,就近原則輸出
2.static作用:
static修飾全局變量,函數:只能在當前文件中使用
static修飾局部變量:只初始化一次,並且變量一致存在
3.生存期:從定義開始到最後被釋放(消失)
全局變量:從定義開始,整個工程;
局部變量:從定義開始,到第一個{}
static修飾的局部變量:程序運行開始就存在,直到程序結束。