目錄
子產品化設計思想
函數
函數的定義
函數的調用
預處理
一、子產品化設計思想
在進行程式設計時,把一個大的程式按功能劃分為若幹小的程式,每個小程式完成一個特定的功能,把這些小程式之間建立必要的聯系即可以完成整個程式的功能,這些小的程式就是子產品。
通正常定子產品隻有一個入口和出口,使用子產品的限制條件使入口參數和出口參數。
二、函數
2.1 函數的定義
1.庫函數(系統定義的标準函數比如printf() scanf()...)
庫函數的函數說明或聲明一般放在系統的include目錄下以.h為字尾的頭檔案中,比如stdio.h等,
如果程式要調用到某個庫函數則用#include<頭檔案名>将庫函數資訊包含進本程式即可。
2.使用者自定義函數
函數定義不能嵌套
//函數定義的一般形式
函數傳回值類型 函數名(形參表)
{
變量聲明;
語句;
return 表達式;
}
//一個例子:高斯級數累加
int GaussSum(int a,int e)
{
int nSum=0;
for(i=a;i<e;i++)
nSum+=1;
return nSum;
}
函數傳回值:函數傳回值類型指函數體執行完畢之後傳回給主調函數值的類型,它可以是數組以外的任意類型。如果函數沒有傳回值則用void來定義函數類型。
形參:形參在被調用之前,系統不會給它配置設定記憶體空間。形參不是函數定義所必需的,當函數設計不需要參數時,用void表示。
return語句:将函數中的一個确定之帶回調用它的函數中去,在一個函數裡可以有多個return,也可以沒有return(沒有傳回值的情況),如果return表達式值的類型和函數傳回值類型不比對則以函數傳回值的類型為準進行強制轉換。
//多個return的情況
int Min(int a,int b)
{
if(a>b)
return a;
else
return b;
}
2.2函數的調用
//以前面的高斯級數累加函數為例調用
void fun() //fun()為GaussSum()的主調函數
{
int start=5,end=10,nRet;
int GaussSum(int a,int e);//函數聲明
nRet=GaussSum(start,end);//函數調用
}
函數聲明不是必須的(被調函數在主調函數定義之後才定義且傳回值不是整型則必須進行函數聲明,函數聲明可以在函數調用前的任意位置)
可以省去函數聲明的情況:
- 被調用函數的定義在主調函數之前
- 所有函數定義之前,在函數外部(可以在頭檔案中也可以在程式開始處)預先對各個函數進行聲明
- 傳回值為整型,因為如果再調用之前沒有做聲明,那麼系統會把第一次遇到的該函數形式作為函數聲明,并将函數類型預設為int型。
函數調用:
函數名(實參表);
函數調用存在一個指派過程,實參會把數值指派給形參,然後系統為形參配置設定空間,之後無論形參怎樣改變都不會影響實參。
三、預處理
C語言中“#”開頭的都是預處理指令
3.1檔案包含
//兩種形式
#include"檔案名"
#include<檔案名> //一個include隻能包含一個檔案,多個檔案需要有多個include
功能:把指定檔案插入到該指令行所在位置,替換該指令行,把指定檔案和目前源程式檔案連成一個源檔案。
檔案包含允許嵌套:比如檔案1包含檔案2,而檔案2需要用到檔案3則可以寫成如下形式
//檔案嵌套
#include<file3.h>
#include<file2.h> //檔案3必須出現在檔案2之前
3.2宏定義
1.不帶參數的宏定義
#define 辨別符字元串
#define M (a*a+3*b)
void main()
{
int nSum;
nSum=3*M;//等效為3*(a*a+3*b)
}
#define M a*a+3*b
void main()
{
int nSum;
nSum=3*M;//等效為3*a*a+3*b
}
特點:
- 編譯時以字元串代替宏名隻是簡單的替換,不會有其它判斷,上述兩個例子可以很好的展現也一點,宏展開也叫做無腦替換。
- 宏定義末尾不用加分号,否則連同分号一起替換
- 宏定義必須寫在函數之外,作用域為本源程式結束,如果要終止其作用域可以使用#undef
- 源程式中如果宏名在“ ”裡,則不進行宏展開,将宏名當作字元串處理
#define M int main() { printf("M");//運作結果為M }
2.帶參數的宏定義
#define 宏名(形參表) 字元串
#define M(y) (y*y+3*y)
void main()
{
int a=2;
int nNum;
nNum=M(a);
}
注意:宏定義的形參不必做類型說明,因為調用時會用實參代替形參,而函數中是将實參的值賦給形參,是以形參也要進行類型聲明。