C程序設計導引(4)
第5章 函數
5.1 函數的概念和結構
先來比較兩個概念:過程(procedure)、函數(function)。
過程與函數都是一組封裝在一起的語句,能實現特定的功能。區別在於過程只進行某種操作,而函數會產生一個返回值。在C語言中,過程與函數的語法結構類似(在某些語言中是定義語句是不同的)。因此,C語言中的“過程”可以簡單理解為沒有返回值的函數。
過程語法結構如下:
void <函數名>(<參數>)
{
<語句>
return;
}
函數語法結構如下:
返回值類型 <函數名>(<參數>)
{
<語句>
return (開頭定義的返回值類型的常量或變量);//例如:return 0;或return x;
}
下面的過程可以實現小車右轉:
void littleright(double number1, double number2)
{
digitalWrite(11,1); analogWrite(10,number1);
digitalWrite(8,0); analogWrite(9,number1);
_delay((number2) * (0.1));
return;
}
顯然,筆者並不希望“右轉”這個動作有什麽返回值。而在上述過程中,筆者使用了其他過程如digitalWrite()
函數的意義在於方便。首先方便了我們實現某種操作。比如一個小車程序中可能需要多次右轉,有了函數則只需調用相應次數並在使用的時候修改參數。而如果復制代碼然後修改相應變量,工作量大到難以忍受。其次是方便我們修改。更重要的其實是……好看。可讀性是大規模程序需要著重註意的點。
5.2 函數的使用
使用函數時,我們必須知道它的參數個數,類型,參數的順序,以及返回值的類型。
例如:z=pow(x,y);
上面的語句運行之後,z這個變量中儲存的就是x的y次方的值。z,x,y
我們自己定義的過程和函數與頭文件中包含的函數在調用的時候沒有不同。
5.3 局部變量和全局變量
這個內容應該早點說的。簡單點說,定義在某對{}裏的變量,可以在這對{}中的{}中的語句中使用。全局變量直接定義在函數體外,不在任何一對{}之內,所以全局變量可以在任何語句中使用。例如:
#include<iostream>
#include<cstdio>
using namespace std;
int f[40001];
struct node{
int x,y,v;
}e[20001];
bool cmp(node a,node b) { return a.v>b.v; }
int find(int x) { return f[x]==x?x:f[x]=find(f[x]); }
int main()
{
int n,m;
cin >> n >> m;
for (int i=1; i<=m; i++) cin >> e[i].x >> e[i].y >> e[i].v;
for (int i=1; i<=2*n; i++) f[i]=i;
sort(e+1,e+m+1,cmp);
for (int i=1; i<=m; i++)
{
int xx=find(e[i].x);
int yy=find(e[i].y);
if (xx==yy) { cout << e[i].v << endl; system("pause"); return 0;}
f[xx]=find(e[i].y);
f[yy]=find(e[i].x);
}
cout << 0; return 0;
}
全局變量為數組f和數組e(數組的知識在下一章,總之也是一種數據結構)。在main函數中定義了變量n,m。在循環語句中定義了變量i。那麽i就只能在那一個循環語句中用。在後面的語句中我重復定義了很多次i。n,m則可以在整個main函數中用。至於f和e數組,可以在程序的任意一個函數中用。
需要註意的是,有的編譯器要求變量必須在函數語句的第一行(或者說任何語句的前面)定義完成,而不允許在執行語句中穿插。同時,浮點型和整型全局變量的初始值默認為0。
C程序設計導引(4)