引子
请输入30个同学C语言的成绩,求平均分
main()
{ float stud_1,stud_2,stud_3,
stud_4…..stud_30,aver;
scanf(“%f”,&stud_1);
scanf(“%f”,&stud_2);
………..
scanf(“%f”,&stud_30)
aver=(stud_1+stud_2+stud_3….
+stud_30)/30;
}
main()
{float stud[30],aver=0;
for (i=0;i<30;i++)
scanf(“%f”,&stud[i]);
for (i=0;i<30;i++)
aver=aver+stud[i];
aver=aver/30;
}
要定义30个变量,很麻烦,如果学生数量有1000个呢?
数 组
6.1 一维数组的定义和引用
6.2 一维数组的初始化
6.3 多维数组的定义和使用
6.4 数组作为函数参数
§6.1 一维数组的定义和引用
一维数组的定义
定义:
类型标识符 数组名[元素个数];
如: int a[5];
它表示数组a可以存放5个整型数据
数组的定义要注意以下几个问题:
数组名的命名规则同变量名的命名,要符合C语言标识符的命名规则。
数组名后面的“[ ]”是数组的标志,不能用圆括号或其它符号代替。
数组元素的个数必须是一个固定的值,可以是整型常量、符号常量(第九讲中介绍)或者整型常量表达式。例如:int b[3*4];
一维数组的定义
数组的定义要注意以下几个问题:
定义数组时,系统将按照数组类型和个数分配一段连续的存储空间存储数组元素。例如,上述定义的a、b的存储空间为20和48个字节。
在定义数组要特别注意:绝对不能使用变量或者变量表达式来表示元素个数,大多数情况下不要省略元素个数(形参和数组初始化时除外)。例如错误的写法:int n=3 , c[n] , d[ ];
数组元素的个数表示数组最多可以存放的数据。在定义int a[5]时,数组a最多可以存放5个整型数据,分别放入a[0]、a[1]、a[2]、a[3]、a[4]中,其中0~4称作数组的下标。数组的下标从0开始,小于元素个数,所以当定义数组a含有5个元素时,使用数组元素a[5]是错误的。
引用:
数组必须先定义后使用。
在数组的使用时要注意:C语言规定只能逐个引用数组元素,而不能一次引用整个数组。
数组元素引用的一般形式是:
数组名[下标]
下标可以用整型常量、整型变量或者整型表达式,其范围从0开始,小于等于“元素个数-1”。
当定义 int n=1,a[5]; 以下用法是正确的
a[0]=0; a[n]=n; a[n+1]=n+1; a[2*2]=8;
由此可见,数组名后中括号内的内容在不同场合的含义是不同的:在定义时它代表数组元素的个数,其它情况则是下标(与数组名联合起来表示某一个特定的数组元素)。
数组元素存放是按照下标的顺序按次序存放的
例6.1 将数字0~4放入一个整型数组,并逆序输出数组
#include <stdio.h>
void main()
{ int i,a[5];
/*给数组中元素赋值*/
for (i=0;i<5;i++)
a[i]=i;
/*逆序输出数组中元素值*/
for (i=4;i>=0;i--)
printf (“%3d”,a[i]);
printf(“\n”);
}
运行结果 :4 3 2 1 0
一维数组的存储示意图
static char a[2]={‘A’,’B’};
static int b[2]={67,68};
static long c[2]={18,112};
数组元素的使用方法与同类型的变量的使用方法相同。数组常用循环语句来处理
例6.2 输入10个整数,输出最大数。
#include <stdio.h>
void main()
{ int i,array[10],big;
/*给数组中所有元素赋值 */
for(i=0;i<10;i++)
scanf(“%d”,&array[i]);
/*找出数组中最大的元素 */
big=array[0];
for(i=1;i<10;i++)
if(array[i]>big) big=array[i];
printf (“The biggest is %3d\n”,big);
}
举一反三 :
从键盘输入三个数放入一维数组a[3]中,然后按从小到大的顺序排序并输出。
§6.2 一维数组的初始化
一维数组的初始化:
数组的初始化的一般形式如下:
类型标识符 数组名[元素个数]={元素值表列};
例如:float x[3]={1.5,3.2,9};
等价于: float x[3];
x[0]=1.5 ; x[1]=3.2 ; x[2]=9;
说明:
元素值表列,可以是数组所有元素的初值,也可以是前面部分元素的初值。例如: int a[5]={1,2,3};
当数组为整型时,初始化未确定初值的元素,其值为0
当对全部数组元素赋初值时,元素个数可以省略。但 “[ ]”不能省。例如:char c[ ]={‘a’,’b’,’c’};
程序L6_3.C功能:一维数组初始化的几种形式。
#include <stdio.h>
void main()
{ int n;
int a[5]={0,1,2,3,4};
int b[5]={1,2};
float c[ ]={1,2,3,4,5};
for (n=0;n<5;n++) printf(“%5d”,a[n]);
printf(“\n”);
for (n=0;n<5;n++) printf(“%5d”,b[n]);
printf(“\n”);
for (n=0;n<5;n++) printf(“%5.1f”,c[n]);
printf(“\n”);}
运行结果 :0 1 2 3 4
1 2 0 0 0
1.0 2.0 3.0 4.0 5.0
注意:数组初始化的赋值方式只能用于数组的定义,定义之后再赋值只能一个元素一个元素地赋值。
例如下列赋值方式是错误的:
main()
{ int a[5];
a[5]={1,2,3,4,5};
………..
}
正确:
main()
{ int a[5]={1,2,3,4,5};
……….
}
用数组来处理Fibonacci数列问题
main()
{ int i;
int f[20]={1,1};
for (i=2;i<20;i++)
f[i] = f[i-2]+f[i-1];
for (i=0;i<20;i++)
{ if (i%6 ==0) printf(“\n”);
printf(“%8d”,f[i]);
}
}
例题
输入A,B,C,D,E五个班学生的C语言成绩,求平均分(设每班30人)
main()
{ float stud_a[30],stud_b[30],stud_c[30],
stud_d[30],stud_e[30],aver;
int i;
for (i=0;i<30;i++)
scanf(“%f”,&stud_a[i])
for (i=0;i<30;i++)
scanf(“%f”,&stud_b[i])
…………..}
main()
{ float stud[5][30];
int i,j;
for (i=0;i<5;i++)
for (j=0;j<30;j++)
scanf(“%f”,&stud[i][j]);
………….
}
§6.3 多维数组的定义和使用
二维数组的定义形式为
类型标识符 数组名[元素个数1][元素个数2];
例如:
int a[2][3],b[30][5];
数组a为2行3列6个元素,数组b为30行5列150个元素
C语言把二维数组看作是一维数组的集合,即二维数组是这样一个特殊的一维数组:它的元素是一个一维数组。例如二维数组a[2][3],可以看作由2个一维数组a[0]、a[1]组成,这两个数组元素是包含3个整型数组元素。如图所示。
二维数组的定义
由于a[0]、a[1]相当于一个一维数组名,按照一维数组的引用方式,a[0][0]、a[1][0]则分别是一维数组a[0]和a[1]的第1个元素。
二维数组中元素的存放顺序是按行存放的,即先按顺序存放第一行的数组元素,再放第二行的数组元素。例如上例数组a的存放顺序为:
二维数组的定义
假设数组a的首地址是1000,数组a的起始地址存放a[0],所以a、a[0]都等于二维数组的首地址,即一维数组a[0]的第一个元素为a[0][0]的地址,a=a[0]=&a[0][0]。
二维数组的定义
多维数组的定义方式可以按照二维数组的定义:
类型标识符 n维数组名[元素个数1][元素个数2]…[元素个数n];
n维数组就有n个“[元素个数]”。例如,定义一个三维数组 float x[2][3][4];
多维数组的存储顺序为:最左边的下标变化最慢,越往右变化越快,最右边的下标变化最快。
二维数组的引用
二维数组中元素的表示形式为
数组名[下标1][下标2]
同一维数组一样,二维数组的下标可以是整型常量、整型变量或者整型表达式。为了便于理解二维数组下标的含义,我们可以将二维数组看作一个行列式或矩阵,则下标1用来确定元素的行号(从0开始,小于等于“元素个数1”减1),下标2用来确定元素的列号(从0开始,小于等于“元素个数2”减1)。下面我们举例说明:
程序L6_4.C功能:二维数组的下标意义。
#include <stdio.h>
void main()
{ int i,j,a[2][3],b[2][3];
for (i=0;i<2;i++)
for (j=0;j<3;j++)
a[i][j]=i;
for (i=0;i<2;i++)
for (j=0;j<3;j++)
b[i][j]=j;
printf(“array a:\n”);
for (i=0;i<2;i++)
{ for (j=0;j<3;j++)
printf(“%3d”,a[i][j]);
printf(“\n”);
}
printf(“array b:\n”);
for (i=0;i<2;i++)
{ for (j=0;j<3;j++)
printf(“%3d”,b[i][j]);
printf(“\n”);
}
}
二维数组的初始化
按行对二维数组初始化。例如
int a[2][3]={{1,2,3},{4,5,6}};
按照数组的存储顺序赋初值。例如
int a[2][3]={1,2,3,4,5,6};
只对部分元素赋值。例如
int a[2][3]={{1,2},{3}};
int a[4][4]={{1},{0,1},{,,1},{,,,1}};
int b[2][3]={{},{,2}};
如果对数组元素全部赋初值,定义数组时元素个数1(最左边的元素个数)可以省略,元素个数2不能省略。例如
int a[ ][3]={1,2,3,4,5,6};
int a[ ][3]={{1,2,3},{},{4,5}};
§6.4 数组作为函数参数
一维数组元素作为函数参数
一维数组中元素作为函数的实参,与同类型的简单变量作为实参一样,是单向的值传递,即数组元素的值传给形参,形参的改变不影响实参。
程序L6_5.C :输入两个数,输出其中最大数
#include <stdio.h>
float max(float x, float y)
{float z;
if (x>y) z=x;
else z=y;
return z; }
void main( )
{float a[2],c;
scanf("%f,%f",&a[0],&a[1]);
c=max(a[0],a[1]);
printf("%f,%f,the max is %f\n",a[0],a[1],c); }
修改程序例6_2.C,用数组元素替换实参x、y,验证数组元素作函数参数同样符合形参改变不影响实参。
数组名作为函数参数
数组名作为函数参数,此时形参和实参都是数组名(或者是表示地址的指针变量,见第十讲),传递的是整个数组,即形参数组和实参数组完全等同,是存放在同一空间的同一个数组。这样形参数组修改时,实参数组也同时被修改了。
#include <stdio.h>
void change(int x[2])
{ int t;
printf (“x[0]=%d,x[1]=%d\n”,x[0],x[1]);
t=x[0]; x[0]=x[1]; x[1]=t;
printf (“x[0]=%d,x[1]=%d\n”,x[0],x[1]);}
void main()
{ int a[2]={3,4};
printf (“a[0]=%d,a[1]=%d\n”,a[0],a[1]);
change(a);
printf (“a[0]=%d,a[1]=%d\n”,a[0],a[1]);}
数组名作为函数参数
数组名作函数参数时要注意:形参中的数组要定义,并且要求与实参数组类型一致,但是形参数组的大小(即元素个数)可以小于等于实参数组的元素个数,甚至形参数组的元素个数可以省略,而由一个专门的参数传递元素个数。例如
L6_7.C:已知一个一维数组,求其中前n个数的和。n由键盘输入
#include <stdio.h>
int sum(int array[ ],int n)
{ int i,s=0;
for (i=0;i<n;i++)
s+=array[i];
return s;}
void main()
{ int num a[10]={1,2,3,4,5,6,7,8,9,10};
scanf (“%d”,&num);
printf("%d\n",sum(a,num)); }
/*----------------------------------------------
程序L6_10.C功能:用选择法对10个整数排序。
--------------------------------------*/
#include <stdio.h>
void sort(int array[ ],int n)
{
int i,j,k,t;
for (i=0;i<n-1;i++)
/*进行n-1轮选择最小数的操作*/
{ k=i; /*k用来存放第i轮最小数的下标*/
for (j=i+1;j<n;j++)
if (array[j]<array[k]) k=j;
t=array[k];array[k]=array[i];array[i]=t;
/*最小数a[k]与a[i]互换*/
}
}
void main()
{
int a[10],i;
for (i=0;i<10;i++)
scanf ("%d",&a[i]);
sort(a,10);
for (i=0;i<10;i++)
printf("%4d",a[i]);
printf("\n");
}
练习:求一个3×3矩阵对角线元素之和
练习:打印出以下的杨辉三角形
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
课后练习
1.已知一个数组a[5]={1,2,3,4,5}、b[5]={11,4,2,7,9}
数组c[5]等于数组a、b对应元素之和。输出数组
c中个元素的值。
2. 写一个函数void change(int array[],int n),可以
将数组array中的n个元素逆序存放。即array[0]
与a[n-1]互换,array[1]与array[n-2]互换……。
3. 求两个矩阵的乘积c。已知矩阵a、b的值:
- 4.应用数组实现输入年year、月month、日date,计算该日期是这年的第几天。方法:定义二维数组days_of_month[2][12],令该数组第一行由非闰年的12个月的天数组成,第二行由闰年12个月的天数组成,则根据年判断:闰年时i为1、非闰年时i为0,累计days_of_month[i][0]到days_of_month[i][month-1]的天数,再加上date,得到总天数。
5. 根据例6.10的算法,修改例6.8,要求按照平均成绩从高到低的顺序输出学号和平均分。提示:对平均分aver排序,当aver元素互换时,学号num元素对应互换。
6. 如果选择1,调用例6.9的输入函数input();选择2,调用void search(long num[],float aver[],int n),该函数可以根据输入的学号输出该学生的各课成绩和平均分;选择3,调用例6.9的输出函数output();选择0,显示“谢谢使用”;选择其它则显示“输入错误,请重新输入”。
该程序只有当输入选择为“0”时结束,否则返回主菜单
ps:此教程配套ppt下载地址如下,如果需要可以下一下,不过其实也无所谓,这篇文章就是全部文本。
06-数组-自己使用的C语言教程PPT-适合老师备课或者自学.pptx-C文档类资源-CSDN下载
全部课程的PPT已经整理好了,需要的童鞋可以点击下载
总-自己使用的C语言教程PPT-适合老师备课或者自学-15篇PPT合集.zip-C文档类资源-CSDN下载