C++等級考試資料二
考試內容:
- 選擇題:進位制轉換、冒泡與選擇排序、二分思想、連結串列與順序表、二維陣列初始化、函式閱讀
- 程式設計題:字串操作、質數判斷、排序、最小公倍數、最大公約數、百錢百雞問題
考試資料:
進位制轉換公式
1. 十進位制轉二進位制
整數部分:
- 不斷將十進位制數除以2,記錄餘數,直到商為0,然後將餘數逆序排列。
小數部分:
- 不斷將小數部分乘以2,記錄整數部分,直到小數部分為0或達到所需精度,然後將記錄的整數部分順序排列。
示例:
- 十進位制數 10.625 轉換為二進位制:
- 整數部分:10 -> 1010
- 小數部分:0.625 -> 0.101
- 結果:10.625 -> 1010.101
2. 二進位制轉十進位制
整數部分:
- 將二進位制數按位展開,每位乘以2的冪次方,然後求和。
小數部分:
- 將二進位制小數按位展開,每位乘以2的負冪次方,然後求和。
示例:
- 二進位制數 1010.101 轉換為十進位制:
- 整數部分:1010 -> 1*2^3 + 0*2^2 + 1*2^1 + 0*2^0 -> 8 + 0 + 2 + 0 -> 10
- 小數部分:0.101 -> 1*2^-1 + 0*2^-2 + 1*2^-3 -> 0.5 + 0 + 0.125 -> 0.625
- 結果:1010.101 -> 10.625
3. 十進位制轉十六進位制
整數部分:
- 不斷將十進位制數除以16,記錄餘數,直到商為0,然後將餘數逆序排列。
小數部分:
- 不斷將小數部分乘以16,記錄整數部分,直到小數部分為0或達到所需精度,然後將記錄的整數部分順序排列。
示例:
- 十進位制數 255.6875 轉換為十六進位制:
- 整數部分:255 -> FF
- 小數部分:0.6875 -> 0.B
- 結果:255.6875 -> FF.B
4. 十六進位制轉十進位制
整數部分:
- 將十六進位制數按位展開,每位乘以16的冪次方,然後求和。
小數部分:
- 將十六進位制小數按位展開,每位乘以16的負冪次方,然後求和。
示例:
- 十六進位制數 FF.B 轉換為十進位制:
- 整數部分:FF -> 15*16^1 + 15*16^0 -> 240 + 15 -> 255
- 小數部分:0.B -> 11*16^-1 -> 0.6875
- 結果:FF.B -> 255.6875
- 整數部分:不斷除以2,記錄餘數,逆序排列。
- 小數部分:不斷乘以2,記錄整數部分,順序排列。
- 整數部分:按位展開,每位乘以2的冪次方求和。
- 小數部分:按位展開,每位乘以2的負冪次方求和。
- 整數部分:不斷除以16,記錄餘數,逆序排列。
- 小數部分:不斷乘以16,記錄整數部分,順序排列。
- 整數部分:按位展開,每位乘以16的冪次方求和。
- 小數部分:按位展開,每位乘以16的負冪次方求和。
公式總結
十進位制轉二進位制
二進位制轉十進位制
十進位制轉十六進位制
十六進位制轉十進位制
氣泡排序和選擇排序
氣泡排序
介紹:氣泡排序是一種簡單的排序演算法。它重複地遍歷要排序的列表,比較相鄰的元素並交換它們的位置,如果它們的順序錯誤。這個過程會重複進行,直到沒有需要交換的元素為止。排序方式:1. 從列表的第一個元素開始,依次比較相鄰的兩個元素。
- 如果前一個元素大於後一個元素,則交換它們的位置。
3. 對每一對相鄰元素重複上述步驟,直到列表末尾。
- 重複步驟1-3,直到整個列表有序。
程式:
#include <iostream> using namespace std;
void bubbleSort(int arr[], int n) { for (int i = 0; i < n - 1; ++i) { for (int j = 0; j < n - i - 1; ++j) { if (arr[j] > arr[j + 1]) { // 交換 arr[j] 和 arr[j + 1] int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
int main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr) / sizeof(arr[0]); bubbleSort(arr, n); cout << "Sorted array: \n"; for (int i = 0; i < n; ++i) { cout << arr[i] << " "; } cout << endl; return 0; } |
選擇排序
介紹:選擇排序是一種簡單直觀的排序演算法。它的工作原理是每次從未排序部分中選出最小(或最大)的元素,放到已排序部分的末尾。
排序方式:
- 從列表中找到最小的元素,將其與列表的第一個元素交換位置
- 在剩下的未排序元素中繼續尋找最小的元素,將其與列表的第二個元素交換位置。
- 重複上述步驟,直到整個列表有序。
程式:
#include <iostream> using namespace std;
void selectionSort(int arr[], int n) { for (int i = 0; i < n - 1; ++i) { // 找到未排序部分的最小元素 int minIndex = i; for (int j = i + 1; j < n; ++j) { if (arr[j] < arr[minIndex]) { minIndex = j; } } // 交換最小元素和第i個元素 int temp = arr[minIndex]; arr[minIndex] = arr[i]; arr[i] = temp; } }
int main() { int arr[] = {64, 25, 12, 22, 11}; int n = sizeof(arr) / sizeof(arr[0]); selectionSort(arr, n); cout << "Sorted array: \n"; for (int i = 0; i < n; ++i) { cout << arr[i] << " "; } cout << endl; return 0; } |
總結
- 氣泡排序:透過重複地比較和交換相鄰元素來排序。每一輪比較後,最大的元素會“冒泡”到陣列的末尾。
- 選擇排序:透過反覆選擇未排序部分中的最小元素並將其放在已排序部分的末尾來排序。
連結串列和順序表
連結串列
介紹:連結串列是一種線性資料結構,由一系列節點組成,每個節點包含資料和指向下一個節點的指標。連結串列可以是單向連結串列、雙向連結串列或迴圈連結串列。
特點:
- 動態大小:連結串列的大小可以動態調整,不需要預先分配固定大小的記憶體。
- 插入和刪除操作高效:在連結串列中插入和刪除元素只需要修改指標,不需要移動其他元素。
- 順序訪問:連結串列中的元素只能按順序訪問,不能透過索引直接訪問。
順序表
介紹:順序表是一種線性資料結構,使用連續的記憶體空間儲存資料。順序表的元素可以透過索引直接訪問。
特點:
- 固定大小:順序表的大小在建立時確定,不能動態調整(除非使用動態陣列)。
- 插入和刪除操作低效:在順序表中插入和刪除元素需要移動其他元素。
- 隨機訪問:順序表中的元素可以透過索引直接訪問,訪問速度快。
區別:
特性 |
連結串列 |
順序表 |
記憶體分配 |
動態分配 |
連續記憶體分配 |
大小調整 |
動態調整 |
固定大小(除非使用動態陣列) |
插入和刪除操作 |
高效(只需修改指標) |
低效(需要移動其他元素) |
訪問方式 |
順序訪問(不能透過索引訪問) |
隨機訪問(可以透過索引訪問) |
記憶體利用率 |
可能有額外的指標開銷 |
記憶體利用率高 |
適用場景 |
頻繁插入和刪除操作 |
頻繁訪問和修改操作 |
總結
- 連結串列:適用於需要頻繁插入和刪除操作的場景,具有動態大小和高效的插入刪除操作,但訪問速度較慢。
- 順序表:適用於需要頻繁訪問和修改操作的場景,具有快速的隨機訪問能力,但插入和刪除操作較低效。
二維陣列
介紹
二維陣列是陣列的陣列,可以用來表示矩陣或表格資料。它是一個具有行和列的矩形資料結構,每個元素可以透過兩個索引(行索引和列索引)來訪問。
定義和初始化方式
1. 靜態初始化
定義:在宣告陣列時直接賦值。
示例:
#include <iostream> using namespace std;
int main() { // 定義並初始化一個3x4的二維陣列 int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} };
// 列印二維陣列 for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { cout << arr[i][j] << " "; } cout << endl; }
return 0; } |
2. 部分初始化
定義:只初始化部分元素,未初始化的元素會被預設初始化為0。
示例:
#include <iostream> using namespace std;
int main() { // 定義並部分初始化一個3x4的二維陣列 int arr[3][4] = { {1, 2}, {5, 6, 7} };
// 列印二維陣列 for (int i = 0; i < 3; ++i) { for (int j = 0; j < 4; ++j) { cout << arr[i][j] << " "; } cout << endl; }
return 0; } |