C語言-第六章、用函數實現模塊化程序設計

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聲明全局變量  

相關文章
相關標籤/搜索