接著上一節的內容
數組:是若干相同類型的對象集合體,它具有一定的循序關聯性,在記憶體中佔有一組聯絡的記憶體位址。定義格式:資料類型 數組名[常量運算式];--常量運算式表示數組大小
int a[5];//a有5個元素的整型數組,不能整體輸入 cin>>a 或輸出 cout<<a
字元數組:用來存放字元量的數組
測試檔案Test.cpp,實現2個矩陣的乘法運算
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
/*
float x[5], sum = 0;// 輸入5個數求平均
cout<<"輸入5個數:";
for(int i=0; i<5; i++) cin >> x[i];
for(int i=0; i<5; i++) sum += x[i];
cout<<"平均值:" << sum/5 << endl;*/
//定義一個字元數組並輸出其內容
/*
char c[2][5] = {{'c', '+', '+'}, {'H', 'e', 'l', 'l', 'o'}} ;
for(int i=0; i<2; i++)
{
for(int j=0; j<5; j++) cout<< c[i][j];
cout<<endl;
}*/
// 利用字元數組操作字串
/*
char c[100];
cin >> c;
cout << c;// 控制台輸入輸出字元
char str[10];
memset(str, 0x00, sizeof(str)-1);// 將數組中所有元素設為空白值
memset(&str[9], '\0', 1);// 最後一位設定為0,否則字串無法定位結束位置
cout << str << endl;// 輸出字串
*/
/*
int m[3][4]={{1,2,3,4},{2,2,3,1},{5,4,2,3}}; //矩陣1,定義並初始化
int n[4][3]={{6,3,2},{2,8,1},{6,9,5},{2,4,6}}; //矩陣2,定義並初始化
int q[3][3]={{0}, {0}, {0}};// 結果矩陣
for(int i=0; i<3; i++)
for(int j=0; j<3; j++)
for(int k=0; k<4; k++)
q[i][j] += m[i][k] * n[k][j];// 將對應的行和列相應的元素相乘並累加
for(int i=0; i<3; i++)
{
for(int j=0; j<3; j++)
cout<<q[i][j]<<" ";// 輸出結果矩陣
cout<<endl;//換行
}
*/
return 0;
}
函數:C++的模組分為函數(function)和類(class).
本章主要理解函數的概念、使用、參數傳遞機制、範圍規則、內嵌函式、函數的嵌套和遞迴的使用。掌握函數模板的編寫方法
定義格式
傳回型別 函數名(形參)
{
....//語句序列
return 傳回型別的值;
}
函數原型:和變數的使用一樣,函數需要先聲明後使用,由函數的傳回型別、函數名和形參列表組成
文法格式:類型標識符 函數名(形參列表);//注意函數原型是一個語句要以分號結束
形參列表是一組由逗號分隔的參數類型和參數名稱組成,在函式宣告的時候,參數名可以被省略,但是在函數定義的時候,通常形參必須命名才能使用,形參列表可以為空白,但不能省略,在沒有任何參數的時候可以用空參數表或關鍵字void。
函數的調用:除main()函數外,任一函數都不能單獨的構成一個完整的程式,任一函數的調用都必須由main()函數直接或間接的去完成,可以使用函數名和一組逗號分隔開的實參來進行調用,調用的結果就是該函數傳回值的類型,調用格式:函數名(實參列表)
函數名中的參數是形參,main函數調用時,傳遞進來的是實參。函數參數的傳遞方式:值傳遞和應用方式傳遞
大多數下需要給main()函數傳遞實參,如:dos下 display 1.map命令 1.map就作為實參傳遞。當無法列舉函數所有形參的類型和數目是使用省略符號,編譯器會暫停類型檢測
類型標識符 函數名(...) 或 類型標識符 函數名(形參1,...) 可見只有調用函數時,形參才會被分配記憶體空間,調用結束後釋放
範圍:函數和類之外定義的變數具有全域的範圍,稱為全域變數。C++函數體一般包含在{}中即語句塊,形參也是局部變數。變數的生命週期從定義時開始,到退出範圍是銷毀。局部變數只能在局部範圍中使用,main()函數中的變數也是局部變數,只在主函數中有效,不能被其他函數使用。同樣主函數也不可以使用其他函數的局部變數,在相同的範圍中,變數不可以同名。在不同的範圍中,可以使用相同的變數名,它們使用不同的記憶體。
函數的引入可以實現代碼的共用、減少程式的代碼量,但是需要時間和空間的開銷.
內嵌函式:可以減少這方面的開銷
函數模板:是指建立一個通用的函數,其函數原型和形參類型不具體指定,而用一個虛擬類型代替。
文法:template <typename T>// T為虛擬類型名
template <class T>// template <class T1, typename T2>
寫了這麼多了,其實我也不想寫,但是為了加深理解,而不只是會寫代碼,就硬著頭皮寫了,對知識的掌握會有好處的。下面讓我們看個例子。
添加一個標頭檔testFunction.h 編寫幾個簡單的函數
#include <iostream>
using namespace std;
/*pragma once*/
int lcm(int, int);// 聲明計算最小公倍數的函數
int gcd(int, int);// 聲明計算最大公約數的函數
int countSum(int a, int b);// 聲明求和函數
int gcd (int m,int n) //計算最大公約數
{
if (m > n) swap(m,n);
while(n > 0)
{
int r = m % n;
m = n;
n = r;
}
return m;
}
int lcm (int m,int n)//計算最小公倍數
{
return (m*n / gcd(m,n));
}
int countSum(int a, int b)
{
return a + b;
}
測試檔案Test.cpp:
#include <iostream>
using namespace std;
#include "testFunction.h"
inline int sum(int a, int b);// 聲明內嵌函式
template <typename T>// 定義模板
T t_sum(T a, T b)// 返回T類型的函數
{
return a + b;
}
int main(int argc, char* argv[])
{
/*
int m,n;
cout << "請輸入兩個非負數: ";
cin >> m >> n;
cout << "gcd(" << m << "," << n << ") = " << gcd(m,n) <<endl;
cout << "lcm(" << m << "," << n << ") = " << lcm(m,n) <<endl;
cout << countSum(gcd(m, n), lcm(m, n))<<endl;
*/
/*
int a = 3, b = 2;
cout << "a = " << a << ", b = " << b <<endl;
cout << "交換後: " << endl;
swap(a, b);// 形參的改變不會影響到實參的,如果此次自訂個交換函數是不起作用的
cout << "a = " << a << ", b = " << b <<endl;
*/
//cout << sum(2, 3) <<endl;// 內嵌函式
int v1=10,v2=20;
float v3=2.5,v4=4.6;
cout<<"v1+v2="<<t_sum(v1,v2)<<endl; //調用模板函數,int型參數
cout<<"v3+v4="<<t_sum(v3,v4)<<endl; //調用模板函數,float型參數
return 0;
}
inline int sum(int a, int b)
{
return a + b;
}
案例:控制台輸入隨機數字作為數字大小,使用指標的方式賦值、並輸出
#include <iostream>
#include <time.h>
using namespace std;
int main(int argc, char *argv[])
{
long nCnt(0);
cout<<"輸入數值個數";
cin>>nCnt;
srand((unsigned)time(NULL));// 設定隨機產生種子
int *pnArray = new int[nCnt];
if(pnArray == NULL) exit(1);
memset((void *)pnArray, 0x00, sizeof(int)*nCnt);
for(long loop(0); loop<nCnt; loop++)
{
pnArray[loop] = rand();// 系統自動產生隨機數
//cout<<*(pnArray+loop)<<endl;// 輸出元素
cout<<pnArray[loop]<<endl;// 輸出元素
}
delete [] pnArray;
pnArray = NULL;
return 0;
}
案例:
#include <iostream>
#include <time.h>
using namespace std;
// 示範C風格數組的操作
int main(int argc, char *argv [])
{
long *plArray = NULL;
plArray = (long *)malloc(sizeof(long)*10);// 開闢動態數組空間
srand((unsigned)time(NULL));// 設定產生隨機隨種子
for(int nCnt(0); nCnt<10; nCnt++)
{
plArray[nCnt] = (long)rand();
cout<<*(plArray + nCnt)<<endl;// 輸出隨機隨元素
}
free(plArray);// 釋放記憶體
plArray = NULL;
return 0;
}