第四章:函數與數組

第一節:函數

第二節:數組是個大倉庫

數組的概念

根據前面的知識,基本展示並使了了如何使用變量,可是,單個的變量有什明顯的缺點,那就是它只能存儲少量的數據,比如一個數,或一個字符,那麼如果想要處理很多數據,那就需要很多的變量,然而變量一旦太多,便難以管理,因此就必需有一個更適宜的存儲方式。這就是數組。

數組的聲明與初始化

數組的本質也是變量,所以在數組使用前,也必須聲明數組。

1、數組的語法格式

數據類型 數組名[常量表達式];

注意:數組的類型、命名規則與變量相同,特徵是有 [ ] ,每個存在數組中的變量稱爲 數組元素 ,中括號內的常量表達式,指的是數組的大小

例:

// 聲明一個可以存放5個整型數據的數組
int a[5]
2、操作數組
  1. 數組元素的下標
    數組會給每個存儲在裏面的每個元素進行編號,這些號碼稱爲 下標 ,操作數組是可使用 數組名[下標] ,訪問對應的數組元素,數組的下標從0開始。
    例:
    在這裏插入圖片描述
  2. 將元素存入數組
    對數組的操作跟對變量在操作大同小異,也是通過賦值的形式,但要注意下標是否有效
    例:
   int array[5];
   // 對數組元素進行賦值 
   array[0] = 1;
   array[1] = 3;
   array[2] = 5;
   array[3] = 7;
   array[4] = 9;
   
   //訪問元素,並輸出
   cout << array[3] << endl; 
   cout << array[0] << endl; 

執行結果:
在這裏插入圖片描述

3、數組的初始化

在學習變量時,變量在聲明的同時可以進行初始化。同樣地,數組也可以在聲明時同時進行初始化。

格式:
數據類型 數組名[常量] = {元素0初始值,元素1初始值...}

注意:
大括號中值 的個數不能大於聲明數組的大小。
不能通過添加逗號的方式跳過
值的個數可以小於聲明數組的大小

例:

int a1[3] = { 0, 1, 2, }// 正確
int a2[3] = { 0, 1, 2, 3}// 錯誤,初始化值個數大於數組大小
int a3[3] = { 0, , 2, }// 錯誤,初始化值被跳過
int a4[3] = { 0, 1, }// 錯誤,最後一個不能在後面加逗號
int a5[3] = { 0, 1 }// 正確,初始化值少於數組大小是可以的

4、省略數組的大小

面對初始化一個數組,既要進行賦值,又要數元素的個數,這顯然非常不方便 ,因此省略數組的大小,也是一個方便的操作。

例:

// 正常初始化賦值
int a[4] = {0, 3, 6, 8};
// 省略數組大小賦值
int a[] = {0, 3, 6, 8};

省略數組大小的寫法便於在聲明數組元素時的插入或修改,不必再去考慮數組的大小變化,計算機會自動根據數組的元素定義大小。

字符數組在內存中的存儲

1、內存和地址

在計算機中,變量和數組者是放在內存裏的,內存裏就像有一個個的小房間,數據都存在這些房間裏面。然而每個房間都有唯一的房間號碼,因此計算機就是通過尋找這些房間號碼進行訪問和修改指定的數據。這些號碼就是 內存地址 ,通常這些內存地址都以一串16進制的數來表示。
一個小房間只能存儲一個字節的數據(即1B,一個漢字至少是2B), 因此不同的變量需要的房間大小都是不同的

2、數組在內存中的存儲

不同的變量存儲的內存大小是不同的,而數組在內存中則是由N個相鄰的元素按順序組成,聲明時若省略數組的大小,訪問時便很可能會越界。
sizeof(數組名或數據類型) ———— 求數組/ 數據內型的大小

例:

   int a[] = {3, 5, 6, 8, 7, 9} ;
   int s1 = sizeof(a);
   cout << "a所佔內存是:" << s1 << endl;
   int s2  = sizeof(int);
   cout <<  "a的數據類型所佔內存是:" << s2 << endl;
   int s3  = s1 / s2;
   cout << "數組的大小是:" << s3 << endl;

執行結果:
在這裏插入圖片描述

3、字符的儲存
  1. ASCII字符集

【什麼是字符集】
計算機記錄文本的方式是通過字符集序號來記錄的;
每一個字符的存儲,都是以其位於字符集中的序號來實現的,包括空格、換行符、標點等;
最早的字符集是ASCII,只包含包括大小寫字母、阿拉伯數字、一些基本符號;
隨着計算機在全球各國的普及,由於世界的語言衆多,就誕生了各種適應不同語種的字符集;
專門適應中文的字符集有GBK、GB2312等,例如Windows操作系統中文版所使用的就是GBK字符集;
但無論何種字符集,都默認將ASCII完整包含在前128位當中;
防止由於不同主機中使用的字符集不同,導致了嚴重的數據傳輸亂碼問題;
UTF-8字符集包含了世界各種不同語言中的常用字符,正逐漸成爲某種意義上的、心照不宣的業界標準;

【什麼是ASCII字符集】
美國標準信息交換碼(American Standard Code for Information Interchange);
包括最基本的128個字符,是最早也最基本的字符集;
內容包括大小寫字母、阿拉伯數字、以及一些常用符號;
序號和字符的互換可以使用chr(order)和ord(character)兩個系統內建函數;

在這裏插入圖片描述
例:

char t;
t = 33;
cout << t <<endl;

執行結果:
在這裏插入圖片描述
例:

char t;	
for(int i=32;i<=127;i++){
	t = i;
	cout << t << endl;
}

執行結果:
在這裏插入圖片描述
2) 字符與字符串

字符和字符串是不同的,字符中能是一個,而字符串是由若干個字符連接而成。例如:‘a’ 和"a".字符串在結尾處會默認加上一個看不見的結尾符’\0’.它也是個轉義字符。所以字符串"a"實際上的兩個字符:“a\0”,因此在聲明若按字符串初始化時要注意空間是否足夠

例:

char a[] = {"hello"};// 按字符串初始化 
char b[] = {'h','e','l','l','o'};// 按字符初始化
char c[] = {'h','e','l','l','o','\n'};// 按字符串初始化
cout << "數組a的大小是:" << sizeof(a) << endl;
cout << "數組b的大小是:" << sizeof(b) << endl;
cout << "數組c的大小是:" << sizeof(c) << endl;
cout << a << endl;
cout << b << endl;
cout << c << endl;

執行結果:
在這裏插入圖片描述

二維數組的聲明與初始化

1、什麼是二維數組

二維數組與一維數組的關係就像是線與面的關係,一條線,數學上用一條數軸來表示,而一個平面,數學上則是用平面座標系來表達。
數組中用下標來描述數組中的某個元素就像是描述一條線上的一點。如果使用兩個下標,就能形成一個平面。像表格一樣,有行和列,所有數據都能存在這些表格裏。

在這裏插入圖片描述

通常把二維數組的兩個下標分別稱爲行下標和列下標,在前面的是 行下標 ,在後面的是 列下標
用到二維數組一般有兩種情況,一種是描述一個二維的事物,比如1表示牆,0表示通路。還有一種是描述多個具有多項屬性的事物,比如有多個學生,每個學生有語、數、英的成績,這些成績就可以用於二維數組表示。

2、二維數組的聲明與初始化
  1. 聲明的結構
    數據類型 數組名[行數][列數]

  2. 聲名二維數組

二維數組的初始化分兩種,一種是順序初始化,另一種是按行初始化。

例:

	int a[3][2] = {4, 2, 5, 6};       //順序初始化 
	int b[3][2] = {{4,2}, {5}, {6}};  //按行初始化
	
	cout << "以下是數組a" << endl;
	for (int i=0;i<3;i++){
		for(int j=0;j<2;j++){
			cout <<setw(2) << a[i][j];
		}
		cout << endl;
	}
	
	cout << "以下是數組b" << endl;
	for (int k=0;k<3;k++){
		for(int l=0;l<2;l++){
			cout <<setw(2) << b[k][l];
		}
		cout << endl;
	}

執行結果:
在這裏插入圖片描述
3) 可省略的第一維

一維數組的大小可以省略,可是二維數組的元素個數是行數和列數的乘積,如果只有元素個數,計算機是無法知道在第幾行,第幾列的位置的,因些C++有規定,在聲明和初始化一個二維數組時,只有第一維(行數)可以省略。

例:

int array[2][3] = {1, 2, 3, 4, 5, 6};
//等同於
int array[][3] = {1, 2, 3, 4, 5, 6};

二維數組和一維數組的關係

1、二維數組可以轉化爲一維數組

有些時候用二維數組來描述某些事物非常方便 。例如用二維數組來畫一個地圖,那麼使用行下標和列下標就如同平面直解座標系一樣。可是在某些情況下,不能使用二維數組,或者難以製造一個二維數據。由於二維數組在內存中的存儲情況和一維數組是相同的,所以可以用一個一維數組來代替它

在這裏插入圖片描述
一個二維數組a[x][y]在一維數組b中的轉化關係爲:
a[x][y] = b[ x*列數 + y ]

向函數傳遞數組的方法

數組的空間很大,如果能夠把它作爲參數傳遞給函數,那麼就能發揮很大的作用,例如,普通的參數只能比較兩個或三個數的大小,如果能使用數組,便能比較一堆數中的最大的數,這大大提高了程序的效率。

例:

#include<iostream>
using namespace std;
int max(int a[],int size);
int main(){	
	int numb[] = {2,45,12,6,23,98,13,3};
	int mb = sizeof(numb)/sizeof(int);
	cout << "最大的數是:" << max(numb,mb)<<endl; 
	
	return 0;
}
int max(int a[],int size){
	int max = 0;
	for(int i=0;i<size;i++){
		if(a[i]>max){
			max = a[i];
		}
	}
	return max;
}

執行結果:
在這裏插入圖片描述

第二節:函數

函數的概念

什麼是函數

函數,是可以用來解決問題,得到想要的結果的工具。例如日常生活中,畫表格需要用到尺子、喫飯需要筷子、開瓶子需要開瓶器等。工具是現成的,而且是可以重複使用的,有了工具直接用就能得到我們想要的結果。函數也是同樣的道理。

源函數與調用函數

每個工具都有自己的使用說明書,函數也不例外,這份說明書就叫源函數,又可以稱爲函數的原形。

例:求最值函數

int max(int a,int b);

此函數的函數名爲max,一聽就知其意。運行該函數後會產生一個整數的結果。括號內表示需要填上兩個整形參數,這兩個參數規定了所填的類型、位置、序順,因此使用時需要一一對應

例:使用(調用)最值函數

int r=3,s=5,t;
t = max(r,s);
cout << "較大的數是:" << t <<endl; 

執行結果:
在這裏插入圖片描述
注:調用函數時放入括號內的變量名r和s與源函數裏a、b的名字是可以不一們的,a和b只是一個代表,只是形式參數,不是實際參數。調用函數後的結果可以任意賦值

例: 輸出函數

void output(char c);

函數名稱:output(見名知意,輸出的意思,方便記憶);
函數結果類形: void(即空類型,表示不會產生任何定量的結果)
函數參數個數:1個
參數的類型:char

常用的函數

前面的學習中,第一行往往是 #include xxxx 頭文件。其實在頭文件中就有不少系統已經爲你準備好的函數(工具),max()函數就是其中之一,它們叫做 標準庫函數。include一個頭文件,就相當於指定使用某個工具箱。所以使用系統定義好的函數,就要知道這些函數在哪個頭文件。
系統已經爲我們準備了很多函數,只要通過文件頭就能夠調用它們。(可以通過C++工具書查或使用IDE)

標準C++文件頭(部分)
在這裏插入圖片描述
在這裏插入圖片描述
例:使用標準庫退出程序的方法

#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
int main(){	
	// 定義一個圓周率常量
	const double PI = 3.141592654;
	// 定義一個度數 
	double a = 90;	
	cout << "sin(a) = "<< sin(a/360*2*PI) << endl;
	//調用退出程序的方法
	exit(1) ;
	cout << "能看到我嗎?"; 
	return 0;
}

執行結果:
在這裏插入圖片描述

函數的聲明和定義方法

系統給了我們標準庫函數,大大地方便了我們平時的操作,不必再一點一滴地寫代碼。然而,僅靠系統給出的標準庫函數是不夠用的,有時候要根據實際需求,自己做一個屬於自己的函數。

1、函數的聲明

告訴電腦我要創建一個新的函數,即聲明一個函數。其次,要告訴電腦如何運作,這是定義一個函數。函數產生的結果,叫函數的返回值

函數的結構:
返回值類型 函數名(參數1,參數2);

2、函數的定義

不解釋,一圖說完函數頭與函數體
在這裏插入圖片描述

3、函數的返回值

返回值和運行結果是兩種概念。返回值是函數反饋給調用函數處的信息,運行結果是程序通過屏幕反饋給用戶的信息。
return xxx 稱爲返回語句,retrun 是語句的關鍵字。

例:真假悟空

#include<iostream>
using namespace std;
string monkey();  //聲明函數
int main(){	
	string t;
	t = monkey();
	cout << t <<"纔是真的悟空!" <<endl; 	
	return 0;
}

string monkey(){
	cout << "有筋斗雲的猴子" <<endl; 
	return "有金箍棒的猴子";
}

運行結果:
在這裏插入圖片描述

主函數

主函數是一個特殊的函數,不管把它放在代碼的什麼位置 ,程序的運行都是從主函數開始的。所以,每個程序有且只能有一個主函數,否則計算機將不知道從何處開始運行。因爲主函數只有一個,因此就沒必要聲明主函數的存在了。
主函數也有返回值,就是0,一般地返回這個值是告訴系統運行了該程序,並且正常結束。一般地返回其他值則表示程序異常,只要類型正確,不影響運行。

【小提示】
C++有不同版本的編譯器,像Visual C++ 、Borland C++、GCC 等,美國國家標準機構和國際化標準組織規定C++語法和編譯器無關,並制定相關標準,目前最高標準是ISO/IEC 144882:2014 ,簡稱C++14
主函數除了可以使用int main外,還可以使用argc,char*argv[]等,有興趣可參考相關書籍

注意:在同一個函數裏,不能有相同的變量或參數,否則將導致報錯,而在兩個不同的函數中,可以有相同的變量或參數

例:

#include<iostream>
using namespace std;
int func1(int a,int b);
int func2(int a,int b);
int func3(int a,int b);
int main(){	
	int x=3,y=4,res1,res2,res3;
	res1 = func1(x,y);
	res2 = func2(x,y);
	res3 = func3(x,y);
	cout << res1 <<endl; 
	cout << res2 <<endl; 
	cout << res3 <<endl; 	
	return 0;
}

int func1(int a,int b){
	return (a+b);
}
int func2(int a,int b){
	return (a-b);
}
int func3(int a,int b){
	return 666;
}

執行結果:
在這裏插入圖片描述

函數重載

函數的默認參數

變量的引用

函數的遞歸

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章