5 陣列
5.1 概述
所謂陣列,就是一個集合,里面存放相同型別的資料元素
- 特點1:陣列中的每個資料元素都是相同的資料型別
- 特點2:陣列是由連續的記憶體位置組成的
5.2 一維陣列
5.2.1 一維陣列定義方式
一維陣列定義的三種方式:
資料型別 陣列名[陣列長度];資料型別 陣列[陣列長度]={值1,值2,...};資料型別 陣列名[] = {值1,值2,...};
陣列特點:
- 放在一塊連續的記憶體空間中
- 陣列中每個元素都是相同資料型別
示例
#include<iostream>
using namespace std;
int main()
{
//1、資料型別 陣列名[陣列長度]
int arr[5];
//給陣列中的元素進行賦值
arr[0] = 10;
arr[1] = 20;
arr[2] = 30;
//訪問資料元素
cout << arr[0] << endl;
//2、資料型別 陣列名[陣列長度] = {值1,值2...}
//如果在初始化資料時候,沒有全部填寫完,會用0來填補剩余的資料
// int arr2[5] = {1,2,3}
int arr2[5] = { 10,20,30,40,50 };
cout << arr2[3] << endl;
//利用回圈的方式 輸出陣列中的元素
for (int i = 0; i < 5; i++)
{
cout << arr2[i] << endl;
}
//3、資料型別 陣列名[] = {值1,值2...}
//定義陣列的時候,必須有初始的長度
int arr3[] = {90,80,70,60,30,20,10,1,2,3,4};
for (int j = 0; j < 9; j++)
{
cout << arr3[j] << endl;
}
system("pause");
return 0;
}
總結1:陣列名的命名規范與變數名規范一致,不要出現變數重名
總結2:數下標是從0開始索引的
5.2.2 一維陣列陣列名
一維陣列名稱的用途:
- 可以統計整個陣列在記憶體中的長度
- 可以獲取陣列在記憶體中的首地址
示例
#include<iostream>
using namespace std;
int main()
{
//陣列名用途
//1、可以通過陣列名統計整個陣列占用記憶體大小
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "整個陣列占用記憶體空間為:" << sizeof(arr) << endl;
cout << "每個元素占用記憶體空間為:" << sizeof(arr[0]) << endl;
cout << "陣列中元素個數為:" << sizeof(arr) / sizeof(arr[0]) << endl;
//2、可以通過陣列名查看陣列首地址
cout << "陣列首地址為:" << (int)arr << endl;
cout << "陣列中第一個元素地址為:" << (int)&arr[0] << endl;
cout << "陣列中第二個元素地址為:" << (int)&arr[1] << endl;
system("pause");
return 0;
}
5.2.3 練習案例1:五只小豬稱體重
案例描述:在一組陣列中記錄了五只小豬的體重,如:int arr[5]={300,350,400,200,250};,找出并列印最重的小豬體重,
解題思路:找到陣列中的最大值,訪問陣列中每個元素,如果這個元素比我認定的最大值要大,更新最大值,
解題程式:
#include<iostream>
using namespace std;
int main()
{
//1、創建5只小豬體重的陣列
int arr[5] = { 300,350,200,400,250 };
//2、從數值中找到最大的值
int max = 0;
for (int i = 0; i < 5; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
//3、列印最大的值
cout << "max = " << max << endl;
system("pause");
return 0;
}
5.2.4 練習案例2:陣列元素逆置
案例描述:請宣告一個5個元素的陣列,并且將元素逆置,
(如原陣列元素為:1,3,2,5,4;逆置輸出結果為:4,5,2,3,1)
解題思路:找到起始位置元素下標和末尾元素位置下標互換,需要一個中間temp用來互換
示例:
#include<iostream>
using namespace std;
int main()
{
//1、創建陣列
int arr[5] = { 1,3,2,5,4 };
cout << "陣列逆置前" << endl;
for (int i = 0; i < 5; i++)
{
cout << arr[i] << endl;
}
//2、實作逆置
//2.1記錄起始下標位置
//2.2記錄結束下標位置
//2.3起始下表與結束下標的元素互換
//2.4起始位置++,結束位置--
//2.5回圈執行2.1操作,起止位置 >=結束位置
int start = 0;
int end = sizeof(arr) / sizeof(arr[0]) - 1;
while (start < end)
{
//實作元素互換
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;
//下標更新
start++;
end--;
}
//3、陣列元素逆置后
cout << "陣列元素逆置后:" << endl;
for (int i = 0; i < 5; i++)
{
cout << arr[i] << endl;
}
}
5.2.5 冒泡排序
作用:最常用的排序演算法,對陣列內元素進行排序
- 比較相鄰的元素,如果第一個比第二個大,就交換他們兩個,
- 對每一個相鄰元素做同樣的作業,執行完畢后,找到第一個最大值,
- 重復以上的步驟,每次比較次數-1,直到不需要比較
解答:
#include<iostream>
using namespace std;
int main()
{
//利用冒泡排序實作升序序列
int arr[9] = { 4,2,8,0,5,7,1,3,9};
for (int i = 0; i < 9; i++)
{
cout << arr[i] << " ";
}
cout << endl;
//開始冒泡排序
//總過排序輪數為元素個數-1
for (int i = 0; i < 9 - 1; i++)
{
//內層回圈對比次數 = 元素個數-當前輪數-1
for (int j = 0; j < 9 - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
for (int i = 0; i < 9; i++)
{
cout << arr[i] << " ";
}
cout << endl;
system("pause");
return 0;
}
5.3 二維陣列
二維陣列就是在一維陣列上,多加了一個維度,
5.3.1 二維陣列定義方式
二維陣列定義的四種方式:
陣列型別 陣列名[ 行數 ][ 列數 ];陣列型別 陣列名[ 行數 ][ 列數 ] = {{資料1, 資料2}, {資料3, 資料4}};陣列型別 陣列名[ 行數 ][ 列數 ] = {資料1, 資料2, 資料3, 資料4};陣列型別 陣列名[ ][ 列數 ] = {資料1, 資料2, 資料3, 資料4};
建議:以上四種定義方式,利用第二種更加直觀,提高代碼的可讀性
示例:
#include<iostream>
using namespace std;
int main()
{
//二維陣列
/*
1. `陣列型別 陣列名[ 行數 ][ 列數 ];`
2. `陣列型別 陣列名[ 行數 ][ 列數 ] = {{資料1, 資料2}, {資料3, 資料4}};`
3. `陣列型別 陣列名[ 行數 ][ 列數 ] = {資料1, 資料2, 資料3, 資料4};`
4. `陣列型別 陣列名[ ][ 列數 ] = {資料1, 資料2, 資料3, 資料4};`
*/
//1、資料型別 陣列名[行數][列數];
int arr1[2][3];
arr1[0][0] = 1;
arr1[0][1] = 2;
arr1[0][2] = 3;
arr1[1][0] = 4;
arr1[1][1] = 5;
arr1[1][2] = 6;
//外層回圈列印行數,記憶體行數列印列數
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr1[i][j] << " ";
}
cout << endl;
}
//2. `陣列型別 陣列名[ 行數 ][ 列數 ] = {{資料1, 資料2}, {資料3, 資料4}};`
int arr2[2][3] =
{
{1,2,3},
{4,5,6}
};
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr2[i][j] << " ";
}
cout << endl;
}
//3. `陣列型別 陣列名[ 行數 ][ 列數 ] = {資料1, 資料2, 資料3, 資料4};`
int arr3[2][3] = { 1,2,3,4,5,6 };
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr3[i][j] << " ";
}
cout << endl;
}
//4. `陣列型別 陣列名[ ][ 列數 ] = {資料1, 資料2, 資料3, 資料4};`
int arr4[][3] = { 1,2,3,4,5,6 };
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 3; j++)
{
cout << arr3[i][j] << " ";
}
cout << endl;
}
system("pause");
return 0;
}
5.3.2 二維陣列陣列名
- 查看二維陣列所占記憶體空間
- 獲取二維陣列首地址
示例:
#include<iostream>
using namespace std;
int main()
{
//二維陣列陣列名稱用途
//1、可以查看占用記憶體空間大小
int arr[2][3] =
{
{1,2,3},
{4,5,6}
};
cout << "二維陣列數占用記憶體空間大小:" << sizeof(arr) << endl;
cout << "二維陣列第一行占用的記憶體空間為:" << sizeof(arr[0]) << endl;
cout << "二維陣列第一個元素占用記憶體為:" << sizeof(arr[0][0]) << endl;
cout << "二維陣列行數為:" << sizeof(arr) / sizeof(arr[0]) << endl;
cout << "二維陣列列數為:" << sizeof(arr[0]) / sizeof(arr[0][0]) << endl;
//2、查看二維陣列的首地址
cout << "二位數字的首地址為:" << (int)arr << endl;
cout << "二維陣列第一行首地址為:" << (int)arr[0] << endl;
cout << "二維陣列第二行首地址為:" << (int)arr[1] << endl;
cout << "二維陣列第一個元素首地址:" << (int)&arr[0][0] << endl;
system("pause");
return 0;
}
5.3.3 二維陣列應用案例
考試成績統計:
案例描述:有三個同學(張三,李四,王五),在一次考試中的成績分別如下表,請分別輸出三名同學的總成績
| 語文 | 數學 | 英語 | |
|---|---|---|---|
| 張三 | 100 | 100 | 100 |
| 李四 | 90 | 50 | 100 |
| 王五 | 60 | 70 | 80 |
思路:
- 創建二維陣列,3行3列
- 統計考試成績,讓每行的3列相加,統計出總和
參考答案:
#include<iostream>
#include<string>
using namespace std;
int main()
{
//二維陣列案例-考試成績統計
//1、創建二維陣列
int scores[3][3] =
{
{100,100,100},
{90,50,100},
{60,70,80}
};
string names[3] = {"張三","李四","王五"};
for (int i = 0; i < 3; i++)
{
int sum = 0;//統計分數總和的變數
for (int j = 0; j < 3; j++)
{
sum += scores[i][j];
//cout << scores[i][j] << " ";
}
cout << names[i] << "的總分為:" << sum << endl;
//cout << "sum = " << sum << endl;
}
system("pause");
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/476451.html
標籤:C++
