向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。

Slides:



Advertisements
Similar presentations
第一單元 建立java 程式.
Advertisements

計算機程式語言實習課.
程序设计实习 3月份练习解答
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
File Access 井民全製作.
C++程序设计 王希 图书馆三楼办公室.
struct 可以在同一個名稱下擁有多種資料型態。使用struct能讓資料的存取和處理更為靈活。
簡易C++除錯技巧 長庚大學機械系
資料大樓 --談指標與陣列 綠園.
函數(一) 自訂函數、遞迴函數 綠園.
資料結構設計與C++程式應用 Fundamentals of Data Structures and Their Applications Using C++ 第3章 佇列 資料結構設計與C++程式應用.
Chap 18 類別與物件 夫有土者,有大物也。有大物者,不可以物。 物而不物,故能物物。 明乎物物者之非物也,豈獨治天下百姓而已哉!
Scope & Lifetime 前言 Local Scope Global Functions & Objects
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
第一章 程序的基本结构. 第一章 程序的基本结构 教材及授课结构 本章目标 基本内容 扩展阅读 上机指导 应用举例 习题.
C++语言程序设计 C++语言程序设计 第四章 数组及自定义数据类型 C++语言程序设计.
Object-Oriented Programming in C++ 第一章 C++的初步知识
前處理指令可以要求前處理器 (preprocessor) 在程式編譯之前,先進行加入其它檔案的內容、文字取代以及選擇性編譯等工作。
2 C++ 的基本語法和使用環境 親自撰寫和執行程式是學好程式語言的不二法門。本章藉由兩個簡單的程式,介紹C++ 程式的基本結構和開發環境,讓初學者能逐漸建立使用C++ 的信心。
计算机网络讲义 第5章 批量数据处理—数组 一维数组 排序和查找 二维数组 字符串.
第3讲 C++程序控制结构 3.1 顺序结构 3.2 分支结构 3.3 循环结构 3.4 转向控制 3.5 综合案例分析.
C++程序设计 string(字符串类) vector(容器类).
Java 程式設計 講師:FrankLin.
C++语言程序设计 第二章 C++简单程序设计.
JAVA 程式設計與資料結構 第四章 陣列、字串與數學物件.
程序的三种基本结构 if条件分支语句 switch多路开关语句 循环语句 循环嵌套 break,continue和goto语句
C++语言程序设计 第十一章 流类库与输入/输出.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
切換Dev c++顯示語言 工具->環境選項(V)->介面->language (Chinese TW)
第一單元 建立java 程式.
選擇性結構 if-else… switch-case 重複性結構 while… do-while… for…
C++大学基础教程 第5章 数组 北京科技大学 信息基础科学系.
C++ 程式設計 基礎篇 張啟中 Chang Chi-Chung.
六、函数 教学目标: 函数的概念、定义、调用和返回 带自定义函数的程序设计 递推算法 递归思想及算法实现 函数的参数传递方式 C语言程序设计.
C++大学基础教程 第3章 C++控制语句 北京科技大学 信息基础科学系.
第三章 链表 单链表 循环链表 多项式及其相加 双向链表 稀疏矩阵.
開始使用Visual C++.
第二章 基本数据类型及运算 C数据类型概述 基本数据类型 运算符和表达式 混合运算与类型转换 数据的输入输出 顺序程序设计举例.
Chapter 2 & Chapter 3.
C#程序设计基础 $3 成员、变量和常量.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
第三章 C++的语句和简单的程序设计 主要内容:
C++语言程序设计 C++语言程序设计 第九章 类的特殊成员 第十一组 C++语言程序设计.
C++语言程序设计 C++语言程序设计 第三章 控制语句 第十一组 C++语言程序设计.
Oop8 function函式.
物件導向程式設計 CH2.
7.1 C程序的结构 7.2 作用域和作用域规则 7.3 存储属性和生存期 7.4 变量的初始化
第11章 從C到C++語言 11-1 C++語言的基礎 11-2 C++語言的資料型態與運算子 11-3 C++語言的輸出與輸入
C qsort.
C++程式設計入門 變數與運算子 作者:黃建庭.
C/C++基礎程式設計班 C++: 物件的使用、參考、重載函式 講師:林業峻 CSIE, NTU 3/28, 2015.
挑戰C++程式語言 ──第9章 函數.
#include <iostream.h>
指標 (pointer) 是一種特別的資料型態,用來儲存某一資料在記憶體內的位址。
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
選擇性結構 if-else… switch-case 重複性結構 while… do-while… for…
C++语言程序设计 第十章 C++标准模板库 成都信息工程学院计算机系.
C++语言程序设计 C++语言程序设计 第十章 多态 第十一组 C++语言程序设计.
《数据结构与算法设计》第一部分 面向对象的C++程序设计基础.
Chap 6 函數 故用兵之法,十則圍之,五則攻之,倍則分之, 敵則能戰之,少則能逃之,不若則能避之。 故小敵之堅,大敵之擒也。
第四章 陣列、指標與參考 4-1 物件陣列 4-2 使用物件指標 4-3 this指標 4-4 new 與 delete
Chap 7 数 组 7.1 排序问题 7.2 找出矩阵中最大值所在的位置 7.3 进制转换.
C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计.
變數與資料型態  綠園.
Array(陣列) Anny
資料!你家住哪裏? --談指標 綠園.
C語言程式設計 老師:謝孟諺 助教:楊斯竣.
方法(Method) 函數.
C++语言程序设计 C++语言程序设计 第二章 基本数据类型与表达式 第十一组 C++语言程序设计.
Presentation transcript:

向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。 7 陣列 向量 (vector) 就是典型的一維陣列,而更高維的矩陣,例如矩陣 (matrix) 和張量 (tensor) 則分別是二維和三維的陣列。

陣列 7.1 一維陣列 7.2 將陣列當成函數的參數 7.3 二維陣列 7.4 將二維陣列當成函數的參數

一維陣列 我們常把陣列長度以整數常數 (const int) 的型式另外宣告: double Temperature [600]; int Record [52]; char Name [15]; 我們常把陣列長度以整數常數 (const int) 的型式另外宣告: const int RecordSize = 600; double Temp [RecordSize]; 注意上述陣列長度必需為const int,不能是int,因為陣列長度在編譯時必需確定。

一維陣列: 宣告的時候可以同時完成初始化的動作 double Temp[5] = {48.4, 39.8, 40.5, 42.6, 41.2}; int Scope[] = {82, 78, 62, 69}; char Name[] = {'L','u','l','u'};

一維陣列各元素在記憶體內的配置情況 const int Size = 5; double Pressure[Size]; P[3] = P[0]*2.0;

陣列元件的下標表示法配合 for 迴圈 const int Size = 5; double Average, Sum = 0; for (int i = 0; i < Size; i++) Sum += P[i]; Average = Sum / double(Size);

陣列元件的下標表示法配合 for 迴圈計算其最大的元素值 double Max; Max = P[0]; for (int i = 1; i < Size; i++ ) if (Max < P[i]) Max = P[i];

將陣列當成函數的參數 cout << Average(P, Size) << endl; cout << MaxElem(P, Size) << endl; 其中Size為先前宣告過的const int,代表陣列的長度。 函數的原型則寫成: double Average(double [], int); double MaxElem(double [], int); 相當於是傳位址 (pass by address,或稱為call by address,「以位址呼叫」的意思),而不是傳值 (pass by value),在函數中對陣列的任何更動都直接作用在原陣列上。

範例程式 ArrayFnc.cpp 使用陣列名稱當成函數參數來傳遞 #include <iostream> using namespace std; double Average(double [], int); // 函數 Average() 的宣告 double MaxElem(double [], int); // 函數 MaxElem() 的宣告 // -------- 主程式 -------------------------------- int main() { const int Size = 5; double P[Size] = {48.4, 39.8, 40.5, 42.6, 41.2}; P[0] = 3.2; P[3] = P[0]*2.0;

cout << "陣列 P 的平均值是: " << Average(P, Size) << endl; cout << "陣列 P 的最大值是: " << MaxElem(P, Size) << endl; } // ------函數 Average() 的定義 --------------- double Average(double X[], int M) { double Sum = 0; for (int i = 0; i < M; i++) Sum += X[i]; return Sum/double(M);

// ------函數 MaxElem() 的定義 --------------- double MaxElem(double Y[], int N) { double MaxE; MaxE = Y[0]; for (int i = 1; i < N; i++ ) if (MaxE < Y[i]) MaxE = Y[i]; return MaxE; }

操作結果 陣列 P 的平均值是: 26.22 陣列 P 的最大值是: 41.2

Fibonacci 數列 它所產生的是以下的固定數列: 1 1 2 3 5 8 13 21 .................

範例程式 Fibo.cpp : 產生Fibonacci 數列 使用 static局 部變數的特性來避免重複計算相同的陣列元素 // Fibo.cpp #include <iostream> using namespace std; // --- 函數 Fibonacci() 的宣告 ------------- int Fibonacci(int n); // ------ 主程式 -------------------------- int main() { int InputN, i; const int MaxSize = 100; cout << "請輸入Fibonacci 數列的長度:"; cin >> InputN; if (InputN > MaxSize)

cout << "下列是您所指定長度為 " << InputN { cerr << "Maximun size exceeded!"; return 0; } cout << "下列是您所指定長度為 " << InputN << " 的 Fibonacci 數列:\n"; for (i=0; i < InputN; i++) cout << Fibonacci(i) << " "; } // --- 函數 Fibonacci() 的定義 ------------- int Fibonacci(int N) { int i; static int Fib[MaxSize]; Fib[0] = Fib[1] = 1; for(i = 0; i < MaxSize; i++) if(Fib[i] == 0) break; while(i <= N) { Fib[i] = Fib[i-1] + Fib[i-2]; i++; } return Fib[N];

程式 Fibo.cpp 操作結果 請輸入 Fibonacci 數列的長度: 12 下列是您所指定長度為 12 的 Fibonacci 數列: 1 1 2 3 5 8 13 21 34 55 89 144

二維陣列 亦稱為矩陣 (matrix) 或是表 (table)。例如 在C++ 中宣告成: 如果加上初始化數據,則可以寫做: double M[2][3]; 如果加上初始化數據,則可以寫做: double M[2][3] = { {1.8, 4.9, 6.8},{6.2, 2.1, 3.4}}; double M[2][3] = { 1.8, 4.9, 6.8,6.2, 2.1, 3.4}; double M[][3] = { 1.8, 4.9, 6.8, 6.2, 2.1, 3.4};

二維陣列各元素在記憶體內的配置情況 在電腦內部這些資料是以「列」的次序儲存:

偏移量 對於一個m×n大小的矩陣M而言,M[i][j] 所在的位址相當於從 M[0][0] 算起,偏移量 (offset) 為 (i × n + j ) 個單位 的地方。

使用迴圈計算二維陣列平均值 給定初始值後,可以使用下列迴圈計算其平均值: const int Row = 2; const int Col = 3; double A[Row][Col]; 給定初始值後,可以使用下列迴圈計算其平均值: double Sum = 0, Average; for (int i = 0; i < Row; i++) for (int j = 0; j < Col; j++) Sum += A[i][j]; Average = Sum / double(Row*Col);

矩陣元素的兩個下標與迥圈的關係 外圍迴圈是以逐列 (row) 的次序運作,而內圈以逐行 (column) 的次序演算。

將二維陣列當成函數的參數 例如,函數的原型 (prototype) 是 或是 而函數的呼叫則使用下列敘述: double MatrixAvg(double [ ][Col]); 或是 double MatrixAvg(double A[ ][Col]); 而函數的呼叫則使用下列敘述: cout << MatrixAvg(A);

範例程式 Array2Fnc.cpp // Array2Fnc.cpp #include <iomanip> #include <iostream> using namespace std; // ---函數的宣告 -------------------- void ShowMatrix(double B[][Col]); double MatrixAvg(double [ ][Col]); // ------ 主程式 -------------------- int main() { const int Row = 2; const int Col = 3; double A[Row][Col]={ 1.8, 4.9, 6.8, 6.2, 2.1, 3.4};

cout << "陣列 A 是: " << endl; ShowMatrix(A); cout << "陣列 A 的平均值是: " << MatrixAvg(A) << endl; cout << "直接將 A 輸出的結果是: " << A << endl; } // ---函數 ShowMatrix() 的定義 ------ void ShowMatrix(double B[][Col]) { for (int i=0; i < Row; i++) for (int j=0; j < Col; j++) cout << setw(5) << B[i][j]; cout << endl; return;

// ---函數 MatrixAvg() 的定義 ------ double MatrixAvg(double M[ ][Col]) { double Sum = 0; int i, j; for (i=0; i < Row; i++) for (j=0; j < Col; j++) Sum += M[i][j]; return Sum / double(Row*Col); }

操作結果 陣列 A 是: 1.8 4.9 6.8 6.2 2.1 3.4 陣列 A 的平均值是: 4.2 直接將 A 輸出的結果是: 0065FDEC

三維陣列(tensor) 對於一個m×n×p大小的張量T而言,元素T[i][j][k] 所在的位址相當於從T[0][0][0] 算起,偏移量 (offset) 為 (i × n × p + j × p + k ) 個單位的地方。