6_1 函數的概述數組
函數是具備必定功能的一段程序,一個函數用來實現一個功能。函數
函數是程序的基本組成單元。code
【例6-1】 函數調用的簡單例子遞歸
#include<stdio.h> int main() { void printf_star(); void printf_message (); printf_star(); printf_message (); printf_star(); return 0; } void printf_star() { printf("**************************\n\n"); } void printf_message () { printf(" Hello world!\n\n"); }
(1)主函數main作用域
(2)庫函數input
(3)用戶自定義函數原型
①從用戶使用角度看,函數可分爲庫函數(又稱標準函數)和用戶自定義函數兩種。
②函數又分爲有返回值和無反回值函數兩種。
③從主調函數和被調函數之間數據傳送的角度來看,又可分爲有參函數和無參函數io
6_2 函數定義的通常形式class
_2.1 無參函數的定義變量
形式:類型名 函數名
{
函數體
} 如:
void hello() { printf (「Hello world!\n」) }
_2.2 有參函數的定義
形式:類型名 函數名(形式參數表列)
{
函數體
}
int max (int a,int b) { if (a>b) return a; else return b; }
_2.3 空函數
形式:類型名 函數名()
6_3 函數的參數與函數的值
_3.1 形式參數和實際參數
【例6-2】從鍵盤輸入兩個整數,要求用函數求出較大者,而後輸出。
#include<stdio.h> int main() { int max(int a,int b); int x,y,z; printf("Please input two numbers:"); scanf("%d,%d",&x,&y); z=max(x,y); printf("maxnum=%d\n",z); return 0; } int max(int a,int b) { int c; c=a>b?a:b; return (c); }
_3.2 函數的返回值
說明:(1)在函數中容許有多個return語句,但每次調用只能有一個return語句被執行,所以只能返回一個函數值
(2)函數值的類型和函數定義中函數的類型應保持一致。若是二者不一致,則以函數定義中函數的類型爲,自動進行類型轉換。
(3)對於不帶返回值的函數,應當定義函數爲void類型(或稱"空類型");若是retun語句中沒有指定的表達式(即return;),則此時返回一個不肯定的值。
6_4 函數的調用
_4.1 函數調用的通常形式:
函數名 (實參表列)
_4.2 函數調用的方式:
(1)做爲函數表達式的一部分
(2)做爲一個函數語句
(3)做爲函數的實參
_4.3 被調用函數的聲明和函數原型
例:對max函數的聲明:int max(int a,int b)
_4.4 函數的嵌套調用
【例6-4】輸入4個數,找出其中最大值。
#include<stdio.h> int main() { int max4(int a,int b,int c,int d); int a,b,c,d,max; printf("Please input 4 numbers(用逗號分隔):"); scanf("%d,%d,%d,%d",&a,&b,&c,&d); max=max4(a,b,c,d); printf("max=%d\n",max); return (0); } int max4(int a,int b,int c,int d) { int max2(int a,int b); int m; m=max2(a,b); m=max2(m,c); m=max2(m,d); return (m); } int max2(int a,int b) { if (a>=b) return a; else return b; }
_4.5 函數的遞歸調用
【例6-5】遞歸計算n!
#include<stdio.h> long fac(int n) { long f; if(n<0) printf("n<0,input error!"); else if (n==0||n==1) f=1; else f=fac(n-1)*n; return (f); } int main() { int n; long y; printf("\nPlease input a inteager number:"); scanf("%d",&n); y=fac(n); printf("%d!=%ld\n",n,y); return 0; }
【例6-6】漢諾塔問題。
#include<stdio.h> void move (int n,int x,int y,int z) { if (n==1) printf("%c-->%c\n",x,z); else { move (n-1,x,z,y); printf("%c-->%c\n",x,z); move (n-1,y,x,z); } } int main() { int h; printf("\ninput number:\n"); scanf("%d",&h); printf("the step to moving %2d diskes:\n",h); move(h,'a','b','c'); return 0; }
6_5 函數與數組
_5.1 數組函數做函數實參
【例6-7】判斷一整型數組各元素的值,若大於0則輸出該值,若小於等於0則輸出0值。
#include<stdio.h> void pd (int v) { if (v>0) printf("%5d",v); else printf("%5d",0); } int main() { int a[5],i; printf("Please input 5 numbers:"); for (i=0;i<5;i++) { scanf("%d",&a[i]); pd (a[i]); } printf("\n"); return 0; }
_5.2 數組名做函數實參
6_6 變量的做用域與生存期
_6.1 局部變量與全局變量
定義在花括號裏的局部變量的做用域僅限於花括號內
而花括號外的變量爲全局變量,做用域爲總體
_6.2 變量的存儲方式和生存期
(1)動態存儲方式和靜態存儲方式
變量:①動態的(auto);②靜態的(static);③寄存器的(register);④外部的(extern)。
(2)auto變量
(3)用static聲明局部變量
(4)register變量
(5)用extern聲明全局變量