1 / 22

第五讲 数组

第五讲 数组. 内容提要. 一维数组 二维数组 数组作为函数参数. 数组. 数组: 具有一定顺序关系的若干相同类型变量的集合体. 一维数组的声明. 类型标识符 变量名 [n]. 声明一个长度为 n 的数组(向量) 类型标识符:数组元素的数据类型; n :数组的长度,即元素的个数;. 例:. int x[5] // 声明一个长度为 5 的一维数组. 一维数组的引用. 变量名 [k] // 注:下标 k 的取值为 0 到 n-1. 一维数组举例. #include<iostream>

libra
Download Presentation

第五讲 数组

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第五讲 数组

  2. 内容提要 • 一维数组 • 二维数组 • 数组作为函数参数

  3. 数组 数组:具有一定顺序关系的若干相同类型变量的集合体 • 一维数组的声明 类型标识符 变量名[n] • 声明一个长度为 n 的数组(向量) • 类型标识符:数组元素的数据类型; • n:数组的长度,即元素的个数; 例: int x[5] // 声明一个长度为 5 的一维数组 • 一维数组的引用 变量名[k] // 注:下标 k 的取值为 0 到 n-1

  4. 一维数组举例 #include<iostream> using namespace std; int main() { int i, x[5]; for (i=0; i<5; i++) x[i] = 2*i; for (i=0; i<5; i++) cout << "x[" << i << "]=" << x[i] << endl; } ex05_array_01.cpp 注意:数组的下标不能越界,否则会引起严重的后果!

  5. 一维数组 • 几点注意: 类型标识符 变量名[n] • n 必须是一个确定的正整数; • n 可以用表达式代替,但表达式的值必须是正整数 例: int n=5; int x[n]; int m=2, n=3; int x[m*n+2]; • 只能逐个引用数组元素,而不能一次引用整个数组 • 数组元素在内存中顺序存放,它们的地址是连续的 • 数组名代表数组存放在内存中的首地址 例:x[10] 在内存中的存放顺序是 x[0] x[1] x[2] x[3] x[4] x[5] x[6] x[7] x[8] x[9]

  6. 一维数组 • 一维数组的初始化 :在声明时可以同时赋初值 例: int x[5]={0,2,4,6,8}; • 也可以只给部分元素赋初值 例: int x[5]={0,2,4}; // 只能依次赋初值 • 全部元素赋初值时可以不指定数组长度 例: int x[]={0,2,4,6,8}; 注意:只能对数组元素赋值,不能对数组名赋值! 例: int x[5]; x=6; // ERROR!

  7. 一维数组 声明数组时,若长度为一个表达式,且含有变量,则不能初始化! 例: int n = 5; int x[n] = {0,2,4,6,8}; // ERROR! const int n = 5; // n是常量! int x[n] = {0,2,4,6,8}; // OK! ex05_array_02.cpp • 若数组元素没有赋值,则其值是不确定的(静态数据类型除外); • 若数组声明时进行了部分初始化,则没有初始化的元素自动赋值为 0 注意:① 数组声明与数组引用的区别;② 初始化与赋值。

  8. 内容提要 • 一维数组 • 二维数组 • 数组作为函数参数

  9. 二维数组 • 二维数组的声明 : 类型标识符 变量名[m][n] • 声明一个 m X n 的二维数组(矩阵) • 二维数组的引用: 变量名[i][j] // 注意下标的取值范围,不要越界! 例: int x[2][3]; x[0][0] = 1; x[0][1] = 3; x[0][2] = 5; for (j=0; j<3; j++) x[1][j] = 2*x[0][j];

  10. 二维数组 • 二维数组的存储:按行存储 例:x[2][3] 在内存中的存放顺序是 x[0][0] x[0][1] x[0][2] x[1][0] x[1][1] x[1][2] x[0] x[1] x 在 C++ 中,二维数组被看成是一维数组的数组

  11. 二维数组 • 二维数组的初始化 • 全部初始化 例: int x[2][3]={1,3,5,2,6,10}; int x[][3]={1,3,5,2,6,10}; // 注:只能省第一维的下标! • 分组初始化 例: int x[2][3]={{1,3,5}, {2,6,10}}; • 部分初始化 例: int x[2][3]={{1}, {2,6}};

  12. 二维数组举例 例:计算 n阶 Hilbert矩阵与全是 1 的 向量的乘积 ex05_array_hilb.cpp

  13. 多维数组 • 多维数组的声明 : 类型标识符 变量名[n1][n2][n3]... 多维数组的赋值、引用、初始化与二维数组类似

  14. 内容提要 • 一维数组 • 二维数组 • 数组作为函数参数 • 数组中的单个元素作实参(值传递) • 数组名作为参数(地址传递)

  15. 数组元素作为参数 • 数组中的单个元素作实参 与单个变量一样(值传递) 例: void my_swap(int a, int b) { int t; t = a; a = b; b = t; } int main() { int x[2]={1,3}; my_swap(x[0], x[1]); cout <<"x[0]="<<x[0]<<", x[1]="<<x[1]<<endl; }

  16. 数组名作为参数 • 数组名作参数 • 形参和实参都应该是数组名,类型要一样 • 形参后面要加中括号 • 传递的是数组首地址,也可以看作是传递数组的引用 在函数中对形参数组元素的改变会直接影响到实参数组,即实参与形参代表的是同一个数组!

  17. 数组作为函数的参数 例: void my_swap(int a[], int b[], int n) { int t, i; for (i=0; i<n; i++) { t=a[i]; a[i]=b[i]; b[i]=t; } } int main() { const int n=3; int i, x[n]={1,2,3}, y[n]={2,4,6}; my_swap(x,y,n); } 用数组作形参,一定要加中括号! 但可以不指定第一维的大小 ex05_array_swap.cpp • 数组作为形参时一般不指定大小(长度),此时通常需要加一个参数,用来传递实参数组的大小,这样函数才能知道实参数组有多少个元素

  18. 数组举例 例:计算矩阵各列的和 #include <iostream> using namespace std; const int m=3, n=4; // 常量,矩阵维数 void sum_col(double A[][n], double s[]) { int i, j; for(j=0; j<n; j++) s[j]=0.0; // 赋初值 for(j=0; j<n; j++) for(i=0; i<m; i++) s[j] = s[j] + A[i][j]; } int main() { double H[m][n], s[n]; for(int i=0; i<m; i++) for(int j=0; j<n; j++) H[i][j]=1.0/(i+j+1); sum_col(H, s); cout <<"s[0]="<<s[0]<<", s[n-1]="<<s[n-1]<<endl; system("pause"); return 0; } ex05_array_fun.cpp 只能省略第一维的大小

  19. 数组作为函数的参数 • 形参中含数组名的函数定义与调用注意事项 • 在定义函数时,须指定数组的大小(常量表达式) void sum_col(double A[10][10], double s[10]) • 可以省略第 1 维的大小 void sum_col(double A[][10], double s[]) • 若数组的大小中含有变量,则必须是常量(全局)! const int n=10; void sum_col(double A[][n], double s[]) • 函数调用时,只需输入数组名即可 sum_col(A, s)

  20. 课后练习 • 课后练习(自己练习) 教材第 166 页: 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.9, 6.10, 6.11, 6.19, 6.20, 6.21

  21. 上机作业 1) 教材第140页,5.22,程序取名为 hw05_01.cpp 要求:先编写两个函数:mean 和 deviation,分别计算一个数组的平均值和标准偏差;在主函数中生成一个随机数组(0~1000的随机双精度数),通过调用上面两个函数来计算平均值和标准偏差。 double mean(double x[], int n); double deviation(double x[], int n); 2) 教材第167页,6.7,程序取名为 hw05_02.cpp 随机生成100个0~9之间的整数,输出每个数的出现次数。 3) 教材第167页,6.12,程序取名为 hw05_03.cpp 编写一个函数,反转一个数组。 void reverse(int x[], int n);

  22. 上机作业 4) 教材第169页,6.22,程序取名为 hw05_04.cpp 编写函数,计算两个 5 阶矩阵的乘积 Z=X*Y。 const int N=5; void matrix_prod(double X[N][N], double Y[N][N], double Z[N][N]); 5) 教材第170页,6.27,存物柜问题。程序取名为 hw05_05.cpp

More Related