數組及常用算法
- 1.數組基本概念
- 2.一維數組
- 2.1數組的定義
- 2.2數組初始化
- 2.3一維數組動態賦初值
- 2.4一維數組應用實例
- 2.5一維數組的排序算法
- 2.6 一維數組元素的刪除和插入
- array
- 3.二維數組
- 3.1數組定義
- 3.2二維數組的動態賦值
《老九學堂C++課程》《C++ primer》學習筆記。《老九學堂C++課程》詳情請到B站搜索《老九零基礎學編程C++入門》
-------------簡單的事情重復做,重復的事情用心做,用心的事情堅持做(老九君)---------------
1.數組基本概念
什么是數組:數組是一個變量,由數據類型相同的一組元素組成,在內存占一串連續的內存空間。
數組是一個類型:比如int 型的數組,類型就是int []
C++中數組元素必須擁有相同的數據類型加粗樣式
數組基本要素:
1.表示符:數組的名稱,用于區分不同的數組(用來表示數組的變量名)
2.數組元素:向數組中存放的數據
3.元素下標:對數組元素進行編號,表明元素在數組中的位置。從0開始,可以通過下標來訪問數組
4.元素類型:數組中元素的數據類型
數組長度固定, 避免數組越界
使用數組的優點: 方便管理需要相同操作的數據
demo1:可以構成數組的一組元素?
在C/C++中可以構成一個數組,在java中不行
198, 98, ‘c’, 230 // 字符在C++中是整形存的
1, 0, true, false, 38, -1 // c++中布爾類型實際是整形
2.一維數組
可以存成數組的情況:學生單門學科的成績,某類商品的單價,某人N個月的工資
2.1數組的定義
定義語法:
datatype arrayName[size];
demo:
int nums[25];
char array_of_name[30];
double curr_salary[35];
const int N = 5;
int nums[N];
nums[0] = 9527;
const int N = 5;
int nums[N];
nums[0] = 9527;
注意:C++中數組的大小可以定義變量,C中不可以可以定義成變量
2.2數組初始化
用大括號初始化元素內容
int years[6] = {2012,2013,2014,2015,2016,2017}; //可以少給元素,但是不能多給
int months[12] = {1, 3, 5, 7}; // 未初始化的元素默認值未0
int days[] = {1,15}; // 不設定數組大小,編譯器自動計算數組大小
int array[] = {} // ?,未知元素個數是不可以的
c++ 11中新的改動:
a.初始化是可以不用等于號;
b.大括號可以為空,默認為所有元素執行置0操作
int days[] {};
float m[100] {};
2.3一維數組動態賦初值
動態從鍵盤錄入信息,賦值給數組
int main(){int N = 5;double scores[N];//for(int i = 0; i < N; i++){for(int i = 0; i < sizeof(scores) / sizeof(double); i++){cout << "請輸入第" << i + 1 << "課程的成績:" ;cin >> scores[i];}for(int i = 0; i < N; i++){cout << scores[i] << endl;}return 0;
}
注意C++中數組沒有.len()的屬性,沒法直接獲得數組的長度。
2.4一維數組應用實例
demo1:一維數組求和,求平均
int main(){
int main(){int nums[7] = {8, 4, 2, 1, 23, 344, 12};int nums_len = sizeof(nums) / sizeof(nums[0]);int sum = 0;double average = 0;for(int i = 0; i < nums_len; i++){cout << nums[i] << " ";sum += nums[i];}average = sum / nums_len;cout << "和為:" << sum << ", 均值為:" << average << endl;return 0;
}
demo2: 找出數組的最大值,最小值
// 求數組的最大值最小值int min_val = nums[0], max_val = nums[0]; //假設第一個元素為最小值/最大值,其后的元素依次和最大最小比,然后更新最大值/最小值int min_index = 0, max_index = 0;for(int i = 1; i < nums_len; i ++){if(nums[i] < min_val){min_val = nums[i];min_index = i;}if(nums[i] > max_val){max_val = nums[i];max_index = i;}}cout << "最小值為:" << min_val << ", 對應的下標為:" << min_index << endl;cout << "最大值為:" << max_val << ", 對應的下標為:" << max_index << endl;
demo3:定義一個整形數組,找出奇數/偶數元素的個數
// 定義一個整形數組,找出奇數/偶數元素的個數int odd_count = 0, even_count = 0;for(int i = 0; i < nums_len; i++){if(nums[i] % 2 == 0){even_count += 1;}else{odd_count += 1;}}cout << "偶數有:" << even_count << "個, 奇數有:" << odd_count << "個" <<endl;
demo4:查找數組中是否存在某個元素,如果存在返回元素在數組中的下標,不存在返回-1
//查找數組中是否存在某個元素,如果存在返回元素在數組中的下標,不存在返回-1int searchNum;int searchIndex = -1; //初值值是一個不可能達到的值,如果最后他還是這個不可能達到的值,那么就沒找到cout << "請輸出要查找的數字" << endl;cin >> searchNum;for(int i = 0; i < nums_len; i++){if (nums[i] == searchNum){searchIndex = i;break;}}if(searchIndex == -1){cout << "沒有查到要找的數字" << endl;}else{cout << "要查找的數字在數組中的下標為:" << searchIndex << endl;}
2.5一維數組的排序算法
1.冒泡排序
每次相鄰的元素比較,將較大或者較小的元素放著后面,依次比較,較小/較大的數字就會冒到最后面 。
int main(){// 循環輸入5個整形數字,進行降序排列后輸出結果int n = 5;int nums[5] = {};for(int i = 0; i < n; i++){cout << "請輸入數字" << endl;cin >> nums[i];}// 選擇排序法// 每次找剩下元素的最大值/最小(和老師講的有點不一樣,但實質是一樣的)for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(nums[i] < nums[j]){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}}for(int i = 0; i < n; i++){cout << nums[i] << endl;}
2.選擇排序
int main(){// 循環輸入5個整形數字,進行降序排列后輸出結果int n = 5;int nums[5] = {};for(int i = 0; i < n; i++){cout << "請輸入數字" << endl;cin >> nums[i];}// 選擇排序法// 每次找剩下元素的最大值/最小(和老師講的有點不一樣,但實質是一樣的)for(int i = 0; i < n; i++){for(int j = i+1; j < n; j++){if(nums[i] < nums[j]){int tmp = nums[i];nums[i] = nums[j];nums[j] = tmp;}}}for(int i = 0; i < n; i++){cout << nums[i] << endl;}return 0;
}
2.6 一維數組元素的刪除和插入
數組的大小一旦確定了,就無法改變。
int main(){// 有序數組的插入和刪除//數組的刪除和插入(數組一旦定義,大小不能改變,所以本例子說的是數組的長度遠大于有效存儲元素的個數)double power[99];int powerCount = 0; // 當前數組中元素的個數power[powerCount++] = 45760;power[powerCount++] = 45770;power[powerCount++] = 45772;power[powerCount++] = 45773;double tmp;for(int i = 0; i < powerCount; i++){for(int j = 1; j < powerCount - i; j ++){if(power[j] < power[j-1]){tmp = power[j];power[j] = power[j-1];power[j-1] = tmp;}}}cout << "排序后的數組為:" << endl;for(int i = 0; i < powerCount; i++){cout << power[i] << "\t";}cout << endl;}
//插入數字,插入新數字之后數組依舊有序cout << "請輸入要插入的數字" << endl;double insert_power;cin >> insert_power; // 1. 放在末尾,再排序// 2. 找到第一個比插入數大的元素位置,其后的元素一次往后移動一位int insert_index = powerCount;for(int i = 0; i < powerCount; i++){if(power[i] > insert_power){cout << power[i] << insert_power;insert_index = i;break;}}for(int i = powerCount-1; i >= insert_index; i--){power[i+1] = power[i];}power[insert_index] = insert_power;powerCount+=1;cout << "插入元素后的數組為"<< endl;for(int i = 0; i < powerCount; i++){cout << power[i] << "\t";}
// 刪除元素,找到要刪除的元素位置,將其后的元素往前移動一位// 沒有判斷相同元素double delete_power;int delete_index = -1;cout << "請輸出要刪除的元素" << endl;cin >> delete_power;for(int i = 0; i < powerCount; i++){if(power[i] == delete_power){delete_index = i;break;}}if(delete_index == -1){cout << "沒有找到要刪除的元素" << endl;}else{for(int i = delete_index; i < powerCount; i++){power[i] = power[i+1];}powerCount-=1;cout << "刪除元素后的數組為"<< endl;for(int i = 0; i < powerCount; i++){cout << power[i] << "\t";}}return 0;
//}
array
用array定義數組與原來的方式定義數組效果是一樣的
#include <array>
int value1[5];
array<int 5> value2; //至少是c++11才支持
3.二維數組
3.1數組定義
datatype name[rowSize][colSize];
double score[5][3]
int prices[4][4]
3.2二維數組的動態賦值
demo:輸入學生各門課程的成績
在這里插入代碼片int main(){string stu_names[] = {"劉備","關羽", "張飛"};string course_names[] = {"數學", "語文", "英語"};const int ROW = 3; // sizeof(stu_names) / sizeof(stu_names[0]) 雙字名字下可以這么寫,其他情況下不行const int COL = 3;double scores[ROW][COL];for(int i = 0; i < ROW; i++){for(int j = 0; j < COL; j++){cout << stu_names[i] << "的" << course_names[j] << "成績為:";cin >> scores[i][j];}}cout << "\t";for(int i = 0; i < COL; i++){cout << course_names[i] << "\t";}cout << endl;for(int i = 0; i < ROW; i++){cout << stu_names[i] << "\t";for(int j = 0; j < COL; j++){cout << scores[i][j] << "\t";}cout << endl;}return 0;
}
數學 語文 英語
劉備 1 2 3
關羽 4 5 6
張飛 7 8 9