null数组的概念及应用数组的概念及应用数组的概念
——概念引入数组的概念
——概念引入用基本数据类型可以解决所有问题吗?
例如:对某班学生的成绩按由高到底的次序进行排序。
3 名? 30 名?数组的概念数组的概念数组是具有一定顺序关系的若干相同 类型变量的集合体,组成数组的变量称为 该数组的元素。
数组属于构造类型。 一维数组
一维数组
一维数组的定义
存储类型 类型说明符 数组名[ 常量
达式 ];
例如:int a[10] , b[‘a’+1]; 无a[10]表示 a 为整型数组,有10个元素:a[0] ... a[9]
下标是从0开始! 一维数组
一维数组
一维数组的存储顺序
例如:int a[10] ;系统会在内存分配地址连续的10个int 空间给此数组
数组名是一个地址常量,不能被赋值…数组一旦定义,不能改变大小
数组大小最好用宏来定义,以适应未来可能的变化 #define SIZE 10
int a[SIZE]; Static int a[3][4]; 与 int a[3][4];有区别? 一维数组
一维数组
一维数组的引用
不能把整个数组作为一个整体输入/出或赋值,只能逐个引用数组元素
必须先定义,后引用。
元素引用格式: 数组名 [下标];
下标既可以是常量,也可以是整型表达式,允许快速地随机访问,如a[i]
下标越界是大忌! 编译程序不检查是否越界,下标越界,将访问数组以外的空间, 可能带来严重后果
元素被引用后使用
与一般变量相同 例如:a[0]=a[5]+a[7]-a[2*3]如何使两个一维数组的值相等如何使两个一维数组的值相等main()
{
int a[4] = {1,2,3,4}, b[4];
b = a;
}解决方法
法1:逐个元素赋值
b[0]=a[0];
b[1]=a[1];
b[2]=a[2];
b[3]=a[3];
法2:通过循环赋值
int i;
for (i=0;i<4;i++)
{
b[i] = a[i];
}原因:
数组名表示数组的首地址,其值不可改变!null一维数组输入方法:int a[10],i;输入第i个数组元素:scanf("%d",&a[i]);输入整个数组元素:for (i=0;i<10;i++)
scanf("%d",&a[i]);输出方法:输出第i个数组元素:printf("%d",a[i]);输出整个数组元素:for (i=0;i<10;i++)
printf("%d",a[i]);一维数组的输入和输出只能逐个对数组元素进行操作(字符数组例外) 一维数组
——初始化 一维数组
——初始化数组元素初始化:
在定义数组时对数组元素赋以初值。 例如: int a[10]={0,1,2,3,4,5,6,7,8,9};
可以只给一部分元素赋初值 例如: int a[10]={ 0,1,2,3}; 所赋初值元素从数组第0个
元素开始,无初值元素均为0
对多维数组如此.{0,1,2,3,0,0,0,0,0,0}可以不指定数组长度,系统自动确定 例如:int a[]={1,2,3,4,5} 即 a[5]
一维数组举例一维数组举例void main()
{ int i; static int f[20]={1,1};/*初始化第0、1个数*/ for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1]; /*求第2~19个数*/ for(i=0;i<20;i++) /*输出,每行5个数*/ { if(i%5==0) printf(“\n”); printf("%d", f[i]); }
}运行结果:
1 1 2 3 5
8 13 21 34 55
89 144 233 377 610
987 1597 2584 4181 67651.求Fibonacci数列问题null......
main()
{
......
for (i=0; i
maxScore)
{
maxScore = score[i];
}
}
printf("maxScore = %.0f\n", maxScore);
}例2: 从键盘输入学生人数n
输入所有学生的学号和成绩
求最高分。若还需打印最高分学生学号呢?null例初始: [ 49 38 65 97 76 13 27 ]i=01349一趟: 13 [38 65 97 76 49 27 ]i=12738六趟: 13 27 38 49 65 76 [97 ]从小到大排序例3.
选择法排序 二维数组
——定义及引用二维数组
——定义及引用二维数组的定义
类型说明符 数组名[常量表达式][常量表达式]
例如:float a[3][4];引用
例如:b[1][2]=a[2][3]/2 下标不要越界二维数组的存储结构二维数组的存储结构short int a[2][3];a[1][0]a[1][1]a[1][2]a[0][0]a[0][1]a[0][2]存放顺序:按行存放
需要知道数组的每一行有多少列,这样从起始地址开始,才能正确的读出数组的元素二维数组
——初始化二维数组
——初始化分行给二维数组赋初值
例如: int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
所有数据写在一个{ }内,按存储顺序依次赋值
例如:int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
可以对部分元素赋初值 例如:int a[3][4]={{1},{0,6},{0,0,11}};
根据给定初值,系统自动定行数 例如:int a[ ][3]={{1},{2},{3,4,5}}; 即 a[3][3]1 0 0 0
0 6 0 0 0 0 11 0 二维数组的初始化示例【例一】以下程序的运行结果是什么?
main()
{
int a[][3]={{1,2,3},{4,5},{6},{0}};
printf("%d,%d,%d\n",a[1][1],a[2][1],a[3][1]);
}1 2 3
4 5 0
6 0 0
0 0 0结果:5, 0, 0【例二】若int a[ ][3]={1, 2, 3, 4, 5, 6, 7},
则a数组的第一维大小是多少? 1 2 3
4 5 6
7 0 0二维数组的初始化示例如何使两个二维数组的值相等?如何使两个二维数组的值相等?通过双重循环赋值
int a[4][2]={1,2,3,4,5,6,7,8};
int b[4][2];
int i,j;
for (i=0; i<4; i++)
{
for (j=0; j<2; j++)
{
b[i][j] = a[i][j];
}
}二维数组的输入和输出二维数组的输入和输出使用双重循环
int a[4][2];
int i,j;
for (i=0; i<4; i++)
{
for (j=0; j<2; j++)
{
scanf("%d", &a[i][j]);
}
}null【例4-5 】有一3×4矩阵,编程求其元素最大值并 输出其行、列号。main()
{
int i,j,x,y,max;
int a[][4]={3,5,8,1,6,9,7,12,-6};
max=a[0][0];
for (i=0;i<3;i++)
for (j=0;j<4;j++)
if (a[i][j]>max)
{
max=a[i][j];
x=i;
y=j;
}
printf("max is a[%d][%d]=%d\n",x,y,max);
} 3 5 8 1
6 9 7 12
-6 0 0 0要点:用两重循环遍历所有元素。【讨论】
如果求最小值? 数组作为函数参数1、传值方式
2、传址方式回顾:函数参数传递的两种方式数组作为函数参数null传值方式举例:main()
{ …….
int a=10,b=20;
swap(a,b);
printf("%d,%d\n",a,b);
……..
} swap( int x, int y)
{ int t;
t=x;
x=y;
y=t;
printf("%d,%d\n",x,y);
}数组作为函数参数数组作为函数参数1.数组元素作函数参数 传值方式
2.数组名作函数参数数 传址方式
【例4-7】 数组元素作为函数的参数【例4-7】 数组元素作为函数的参数void main(void)
{ int gcd(int ,int );
int a[8]={26,1007,956,705,574,371,416,517};
int b[8]={994,631,772,201,262,763,1000,781};
int c[8],i;
for(i=0;i<8;i++)
c[i]=gcd(a[i],b[i]);
/*求数组a,b对应元素的最大公约数 */
for(i=0;i<8;i++)
printf("%d\t",c[i]);
printf("\n");
}2 1 4 3 2 7 8 11求最大公约数的函数 求最大公约数的函数 /********************************************
算法:求两个整数a和b的最大公约数
返回值:返回a和b的最大公约数
*********************************************/
int gcd(int a,int b)
{ int r,t;
if(a
float average(int stu[10], int n);
main()
{ int score[10], i;
float av;
printf("Input 10 scores:\n");
for( i=0; i<10; i++ )
scanf("%d", &score[i]);
av=average(score , 10);
printf("Average is:%.2f", av);
}float average(int stu[ ], int n)
{ int i;
float av,total=0;
for( i=0; i