一、数组的概念在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。在C语言中,数组属于构造数据类型。一个数组可以
一、 数组的概念 在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。这些按序排列的同类数据元素的集合称为数组。
在 C 语言中,数组属于构造数据类型。一个数组可以行解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。 因此按数组元煮的类型不同,数组又可为数值数组、字符数组、指针数组、结构数组等名种类别。
具有相同类型的数据组成的序列,是有序集合(是指元素之间存储位置有序)。
数组中的每一个数据称为数组元素和下标变量
数据元素 由其所在位置序号(称数组元素的下标)来区分
用数组名和下标:可以统一的方式来处理数组中所有的元素,从而方便的实现处理一批具有相同性质数据的问题
二、 一维数组 1.定义方式 在数组中想要使用数组必须先定义,其定义方式为:
类型说明符 数组名 [ 常量表达式]
例如:
int a[ 10 ]
2. 注意点 类型说明符是任一种基本数据类型或构造数据类型。对于同一个数组,其所有元素的数据类型都是相同的。
数组名是用户定义的数组标识。书写规则应符合标识符的书写规定。
方括号中的常量表达式表示数据元素的个数,也称为数组的长度。
允许在同一个类型说明中,说明多个数组和多个变量。
数组下标永远是从0开始的
C语言中不允许对数组的大小做动态定义,即数组的大小,不依赖于程序过程中变量的值
三、 一维数组在内存中的存放位置 如 int mark[100] 每个数据元素占用的字节数,就是基类型的字节数,一个元素占4个字节
四、 一维数组元素的引用 数组元素是组成数组的基本单元。数组元素也是一种变量,其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。 数组元素的一般形式为:
数组名 [ 下标] (下标可以是整型常量或整型表达式)
例如:
a[ 0 ] = a[ 5 ] + a[ 7 ] - a[ 2 * 3 ]
注意事项:
int a[ 10 ] ; for ( int i &#61; 0 ; i < 10 ; i&#43;&#43; ) { printf ( "%d" , a[ i] ) ; }
五、 一维数组的初始化 1. 数组初始化赋值 指在数组定义时给数组元素赋予初值。数组初始化时在编译阶段进行的。这样将介绍运行见&#xff0c;提高效率。
类型说明符 数组名[ 常量表达式] &#61; { 值1&#xff0c;值2&#xff0c;值3……值}
例如
int a[ 10 ] &#61; { 0 , 1 , 2 , 3 , 4 …}
可以只给一部分元素赋值 例如&#xff1a;int a[10]&#61;{0,1,2,3,4}
定义a数组有10个&#xff0c;前面五个会有值&#xff0c;后面数会全部变为0
在对全部数组元素赋初值时&#xff0c;由于数据的个数已经确定&#xff0c;因此可以不指定数组长度 例如&#xff1a;int a[5] &#61;{1,2,3,4,5}
也可以写成&#xff1a;int a[ ] &#61;{1,2,3,4,5}
2. 动态赋值方法 for循环遍历&#xff0c;用scanf 用用户自己输入值
void main ( ) { int i, max, a[ 10 ] ; printf ( "输入十个数字&#xff1a;" ) ; for ( int i &#61; 0 ; i < 10 ; i&#43;&#43; ) { scanf ( "%d" , & a[ i] ) ; max &#61; a[ 0 ] ; } for ( int i &#61; 0 ; i < 10 ; i&#43;&#43; ) { if ( a[ i] > max) max &#61; a[ i] ; } printf ( "maxmun&#61;%d\n" , max) ; }
六、 例题&#xff1a;利用数组计算斐波那契数列 void main ( ) { int i; int a[ 20 ] &#61; { 1 , 1 } ; for ( int i &#61; 2 ; i < 20 ; i&#43;&#43; ) { a[ i] &#61; a[ i - 2 ] &#43; a[ i - 1 ] ; } for ( int i &#61; 0 ; i < 20 ; i&#43;&#43; ) { if ( 0 &#61;&#61; i % 5 ) { printf ( "\n" ) ; } printf ( "%12d" , a[ i] ) ; } printf ( "\n" ) ; }
七、 例题&#xff1a;冒泡排序 void main ( ) { int a[ 10 ] &#61; { 0 , 2345 , 12 , 344 , 16 , 125 , 456 , 90709 , 456 , 767689 } ; for ( int i &#61; 0 ; i < 9 ; i&#43;&#43; ) { for ( int j &#61; 0 ; j < 9 - i; j&#43;&#43; ) { if ( a[ j] > a[ j&#43; 1 ] ) { int temp &#61; a[ j] ; a[ j] &#61; a[ j &#43; 1 ] ; a[ j &#43; 1 ] &#61; temp; } } } for ( int i &#61; 0 ; i < 10 ; i&#43;&#43; ) { printf ( "%d\n" , a[ i] ) ; } }
八、 二维数组的定义 类型说明符 [ 常量表达式] [ 常量表达式]
例如
float a[ 3] [ 4] 定义a为3*4的数组
二维数组是一种特殊的一维数组&#xff1a;它的元素是为一维数组 | ——a[ 0] ——a[ 00] a[ 01] a----| ——a[ 1] ——a[ 10] a[ 11] | ——a[ 2] ——a[ 20] a{ 21}
九、 多维数组的定义 其一般形式为
类型说明符 [ 常量表达式] [ 常量表达式] [ 常量表达式] …
例如
float a[ 2] [ 3] [ 4] 定义a为3*4的数组
十、 二维数组的引用和初始化 有四种方法对二维数组进行初始化。一般形式为&#xff1a;
数据类型 数组名[ 常量表达式1] [ 常量表达式2] [ 常量表达式3]
1. 直接分行给二维数组赋初值。如
int a[ 3 ] [ 4 ] &#61; { { 1 , 2 , 3 , 4 } , { 5 , 6 , 7 , 8 } , { 9 , 10 , 11 , 12 } } ;
2. 可以将所有数据写在一个花括号内&#xff0c;按数组排列的顺序对各元素赋初值。如
int a[ 3 ] [ 4 ] &#61; { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 } ;
3, 可以对部分元素赋初值。如
int a[ 3 ] [ 4 ] &#61; { { 1 } , { 5 } , { 9 } } ;
4.如果对全部元素都赋初值&#xff0c;则定义数组时对第一维长度可以不指定&#xff0c;但第二维度不能省,如
int a[ 3 ] [ 4 ] &#61; { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 }
等价于
int a[ ] [ 4 ] &#61; { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 , 11 , 12 }
十一、二维数组习题 1. 将一个二维数组和列元素互换&#xff0c;存到另一个二维数组中 void main ( ) { int a[ 2 ] [ 3 ] &#61; { { 1 , 2 , 3 } , { 4 , 5 , 6 } } ; int b[ 3 ] [ 2 ] , i, j; for ( i &#61; 0 ; i <&#61; 1 ; i&#43;&#43; ) { for ( j &#61; 0 ; j <&#61; 2 ; j&#43;&#43; ) { printf ( "%5d" , a[ i] [ j] ) ; b[ j] [ i] &#61; a[ i] [ j] ; } printf ( "\n" ) ; } printf ( "\n" ) ; for ( i &#61; 0 ; i <&#61; 2 ; i&#43;&#43; ) { for ( j &#61; 0 ; j <&#61; 1 ; j&#43;&#43; ) { printf ( "%5d" , b[ i] [ j] ) ; } printf ( "\n" ) ; } }
2. 一个3X4的矩阵&#xff0c;找出当中最大值&#xff0c;并打印其行数和列数 void main ( ) { int i, j, row &#61; 0 , column&#61; 0 , max; int a[ 3 ] [ 4 ] &#61; { { 1 , 2 , 3 , 4 } , { 9 , 8 , 7 , 6 } , { - 10 , 10 , - 5 , 2 } } ; max &#61; a[ 0 ] [ 0 ] ; for ( i &#61; 0 ; i <&#61; 2 ; i&#43;&#43; ) { for ( j &#61; 0 ; j <&#61; 3 ; j&#43;&#43; ) { if ( a[ i] [ j] > max) { max &#61; a[ i] [ j] ; row &#61; i; column &#61; j; } } } printf ( "max&#61;%d,row&#61;%d,column&#61;%d" , max, i, j) ; }
十二、 二分法 void main ( ) { static int a[ M] &#61; { - 12 , 0 , 6 , 16 , 23 , 56 , 80 , 100 , 110 , 155 } ; int n, low, mid, high, found; low &#61; 0 ; high &#61; M - 1 ; found &#61; 0 ; printf ( "请输入一个数" ) ; scanf ( "%d" , & n) ; while ( low<&#61; high) { mid &#61; ( low &#43; high) / 2 ; if ( n&#61;&#61; a[ mid] ) { found &#61; 1 ; break ; } else if ( n> a[ mid] ) { low &#61; mid &#43; 1 ; } else { high &#61; mid - 1 ; } } if ( found &#61;&#61; 1 ) { printf ( "已经找到&#xff0c;下标为%d" , mid) ; } else { printf ( "没找到" ) ; } }