函式(F u n c t i o n)
函式就像一個小工廠,你將原料給它,它就會將原料做處理,加工為各式不同的產品。
函式就是指具有特定工作的一段程式碼。
-----------------------------------------------------------------------------------------------------------------------------
變數型態:
一般而言變數有三種,區塊變數、區域變數和全域變數。
以生命週期來看,區塊變數 < 區域變數 < 全域變數。
同一程式中三種變數取相同名稱時,變數有效順序:區塊變數 > 區域變數 > 全域變數。
區塊變數:
被定義在某個區塊中,離開此區塊,就算是在同個函式中,也不能再存取此變數。
例如:
for(int i=0;i < 5 ;i++){ //區塊變數
}
區域變數:
在函式內所宣告的變數,離開此函式,此變數的生命週期即馬上結束,即不佔用記憶體。
例如:
int main(){
int i=10,j=20; //區域變數
char c; //區域變數
string str; //區域變數
.
.
.
}
全域變數:
一般痊癒變數都宣告在所有函式的最前面,它的生命週期是由程式開始執行到結束。
例如:
#include<iostream>
using namespace std;
int i = 50; //全域變數
int main(){
.
.
.
}
-----------------------------------------------------------------------------------------------------------------------------
函式可以定義在主程式段的前面(如下)或後面,如果定義在主程式後方,在主程式前要先宣告,以免編譯時找找不到自訂的函式,參考實作範例。
定義函式:
#include<iostream>
void funName(參數){
程式段
return 回傳值;
}
int main(){
.
funName(參數);
.
.
}
1. 函式中的return 可以是 int,char,string 等等...,若不回傳任何值,必須用void。
2. 參數可以是變數、陣列或物件等等...。
3. 函式中不可再定義另一個函式。
4. 函式若不傳回值,可以省略 return。執行途中若想離開函式,可使用return描述。
5. 主程式段中呼叫函式的兩個方式如下:
(1)變數 = 函式名稱(參數);
#include<iostream>
int square(int x){
int j;
j = x * x;
return j;
}
int main(){
int i = square(2);
.
.
}
結果: i = 4;
(2)函式名稱(參數);
呼叫執行函式,不將值指定給某個參數。
-----------------------------------------------------------------------------------------------------------------------------
//實作範例: 平均分割C l a s s - C網段
#include<iostream>
#include<string>
using namespace std;
string showip(char *C[20]);
int main(){
char *C[20];
string CIDR,ip;
int num,n,evy,Network,SubnetMask,BroadCast;
cout << "輸入要分割的*-C 網段位置(例:192.168.1.0/24): ";
cin.get(*C,21);
cout << "輸入要分割幾個子網路: ";
cin >> num;
cout << "輸入要查詢第幾個子網段: ";
cin >> n;
ip = showip(*C);
evy = 256/num;
switch(num){
case 2:
SubnetMask = 128;
CIDR = "/25";
break;
case 4:
SubnetMask = 192;
CIDR = "/26";
break;
case 8:
SubnetMask = 224;
CIDR = "/27";
break;
case 16:
SubnetMask = 240;
CIDR = "/28";
break;
case 32:
SubnetMask = 248;
CIDR = "/29";
break;
case 64:
SubnetMask = 252;
CIDR = "/30";
break;
}
n = n-1;
Network = evy*n;
BroadCast = Network + evy - 1;
cout << "Network: " << ip << Network << endl;
cout << "Subnet Mask: " << ip << SubnetMask << endl;
cout << "BroadCast: " << ip << BroadCast << endl;
cout << "Valid IP: " << ip << Network+1 << " ~ "<< ip << BroadCast-1 <<endl;
cout << "CIDR: " << CIDR << endl;
system("PAUSE");
return 0;
}
string showip(char *C[20]){
char showip[20];
char *ptr;
int count=0;
string ip;
ptr=NULL;
ptr = *C;
while(*ptr!="\0" && count <3){
ip = ip + *ptr;
if (*ptr == "."){
count++;
}
ptr++;
}
return ip;
}
-----------------------------------------------------------------------------------------------------------------------------
執行結果:
-----------------------------------------------------------------------------------------------------------------------------
請練習寫出查詢 C l a s s - A 與 C l a s s - B級平均子網段分割資訊。