printf("max=%d",max);/*输出最大值*/
getch();}
【相关知识】
1.一维数组的初始化
数组的初始化是指在定义数组时给全部数组元素或部分数组元素赋值。
一维数组初始化的形式为:
存储类型数据类型数组名[数组长度]={初值列表};
{}内的各个初值之间用逗号分隔,数值类型必须与数组类型一致。
系统将按初值的排列顺序,顺次给数组元素赋值。
如下面定义语句:
inta[10]={78,98,67,87,-56,-67,67,0,-98,67};
charc[5]={'c','h','i','n','a'};
当{}中所列初值的数量必须小于等于数组长度。
当初值数量小于数组长度时,数值型数组的后面没有初值的元素由系统自动赋值为0。
例如:
对a数组中所有元素赋初值0。
可以写为inta[10]={0};
又如:
对数值元素a[0]赋初值0,对a[1]赋初值1,其他元素均赋初值0。
可以写为
inta[10]={0,1}
再如:
charc[5]={'0'};
等价于
charc[5]={'0','0','0','0','0'};
2.数组大小的指定
可以通过赋初值定义数组的大小。
在对全部数组元素赋初值时,可以不指定数组的长度,系统会自动计算长度。
例如:
inta[]={1,2,3,4,5};等价于inta[5]={1,2,3,4,5};
又如:
inta[]={0,0,0,0,0};等价于inta[5]={0};
【课堂精练】
1.从键盘上输入10个整型数据,将其逆序输出。
运行结果如图6-4所示。
图6-4程序运行结果
根据程序运行结果,请将下面程序补充完整并调试。
#include"stdio.h"
main()
{inti,a[10];
printf("请输入10个整数:
\n");
for(i=0;i<=9;i++)
scanf("%d",&a[i]);/*输入时引用数组元素的地址*/
printf("请输出10个整数:
\n");
for(i=9;i>=0;i--)
________________________________/*引用数组元素输出*/
printf("\n");
getch();}
2.请输入10个数,找出最大值和最小值所在的位置,并把两者对调,然后输出调整后的10个数。
程序的运行结果如图6-5所示。
图6-5程序运行结果
根据程序的运行结果,将下面程序补充完整。
#include"stdio.h"
main()
{inta[10],max,min,i,j,k;
printf("请输入各个数组元素的值:
");
for(i=0;i<10;i++)
scanf("%d",&a[i]);
printf("互换前的各数组元素的值为:
\n");
for(i=0;i<10;i++)
printf("%5d",a[i]);
max=min=a[0];
/*先假设a[0]是最大值,也是最小值,后面验证可能会推翻假设*/
for(i=0;i<10;i++)
{if(a[i]{min=a[i];k=i;}/*变量k记录最小值的下标号*/
_________________________________
{max=a[i];j=i;}/*j记录最大值的下标号*/
}
a[j]=min;/*最大值和最小值互换*/
_______________________________________
printf("\n互换后的各数组元素的值为:
\n");
for(i=0;i<10;i++)
printf("%5d",a[i]);
getch();}
6.2二维数组
【学习目标】
(1)掌握二维数组的定义和数组元素的引用方法
(2)掌握二维数组的初始化方法
实例21二维数组的定义与引用-----统计总成绩及平均成绩
【实例任务】
从键盘上任意输入某班n个学生的三门课程的成绩,计算每个学生的平均成绩、计算每门课程的平均成绩,并且打印成绩单,输出三门课程成绩的平均分及课程的平均分。
运行结果如图6-6所示。
图6-6程序运行结果
【程序代码】
#include"stdio.h"
#defineN40
main()
{floatave[3],score[N][4],sum;
inti,j,n;
printf("请输入学生的人数:
");
scanf("%d",&n);
printf("请输入这些学生的三门成绩:
");
for(i=0;i{printf("请输入第%d个学生的3门成绩:
",i+1);
for(j=0;j<3;j++)
scanf("%f",&score[i][j]);}
for(i=0;i{sum=0;
for(j=0;j<3;j++)
sum=sum+score[i][j];
score[i][3]=sum/3;}
for(j=0;j<3;j++)/*计算每门课的平均成绩*/
{sum=0;
for(i=0;isum=sum+score[i][j];
ave[j]=sum/n;}
/*打印成绩单*/
printf("序号课程1课程2课程3平均成绩\n");/*输出表头*/
for(i=0;i{printf("%-10d",i+1);/*左对齐,输出学生编号*/
/*输出3科成绩平均分*/
for(j=0;j<4;j++)
printf("%-9.1f",score[i][j]);/*左对齐输出*/
printf("\n");}
/*输出课程平均分*/
printf("平均成绩");/*一个汉字占两个字符的位置,后面添加2个空格*/
for(j=0;j<3;j++)
printf("%-9.1f",ave[j]);/*左对齐输出*/
getch();}
【相关知识】
1.二维数组的定义
定义二维数组的一般格式为:
类型标识符数组名[常量表达式1][常量表达式2];
在二维数组的定义中,数组名后面紧跟两个方括号括起来两个下标。
常量表达式1的值指明了二维数组的行数,常量表达式2的值指明了二维数组的列数。
行下标值和列下标值的乘积,是数组元素的个数。
例如:
floatscore[40][4];
定义了一个实型二维数组score,共有40*4=160个元素,可以称为40行4列的数组。
对于以上定义的数组有以下几点说明,这些说明同样适合其他二维数组。
(1)二维数组中每个数组元素必须有两个下标,常量表达式的值即为下标的值,与一维数组要求一样,其下标只能是正整数,并且从0开始。
(2)二维数组可看作是一种特殊的一维数组。
可以将二维数组元素排列成一个矩阵,用二维数组的第1个下标表示数组元素所在的行,第2个下标表示所在的列,二维数组只是在逻辑上是二维的,从存储上看,二维数组仍是一维线性空间。
C语言中,按照行优先方式存储二维数组,即先存放第0行的元素,再存放第1行的元素……;同一行中再按列顺序存放。
例如:
floatscore[40][4];可以把score数组看作是包含二个元素的一维数组,每个元素又是一个含有四个元素一维数组。
按行形式排列数组元素的表示如下:
第0列第1列第2列第3列
score[0]score[0][0]score[0][1]score[0][2]score[0][3]
score[1]score[1][0]score[1][1]score[1][2]score[1][3]
score[2]score[2][0]score[2][1]score[2][2]score[2][3]
…………
score[39]score[39][0]score[39][1]score[39][2]score[39][3]
2.二维数组元素的引用
C语言规定,不能引用整个数组,只能逐个引用元素。
二维数组中各个元素可看作具有相同数据类型的一组变量。
因此,对变量的引用及一切操作,同样适用于二维数组元素。
二维数组元素引用的格式为:
数组名[行下标表达式][列下标表达式]
说明:
(1)下标可以是整型常量或整型表达式。
第一维下标的取值范围是[0,第一维长度-1],第二维下标的取值范围是[0,第二维长度-1]。
(2)二维数组的引用和一维数组的引用类似,要注意下标取值不要超过数组的范围。
例如,下面的语句均是正确的二维数组引用格式。
inta[3][4];
a[0][0]=3;
a[0][1]=a[0][0]+10;
a[i-1][i]=i+j;
a[0][1]=a[0][0];
a[0][2]=a[0][1]%(int)(x);
a[2][0]++;
scanf("%d",&[2][1]);
printf("%d",a[2][1]);
而下面两种引用是错误的。
a[3][4]=3;/*下标越界*/
a[1,2]=1;/*应写成a[1][2]=1;*/
实例22二维数组的初始化与引用——求矩阵的乘积
【实例任务】
编写程序求一个M行N列的矩阵和一个N行W列的矩阵的乘积。
运行结果如图6-7所示。
图6-7程序运行结果
【程序代码】
#include"stdio.h"
#defineM4
#defineN5
#defineW4
main()
{inta[M][N],b[N][W],c[M][W],i,j,k;
printf("pleaseenterarraya(%d*%d):
\n",M,N);
for(i=0;ifor(j=0;jscanf("%d",&a[i][j]);
printf("pleaseenterarrayb(%d*%d):
\n",N,W);
for(i=0;ifor(j=0;jscanf("%d",&b[i][j]);
for(i=0;ifor(j=0;j{c[i][j]=0;
for(k=0;kc[i][j]+=a[i][k]*b[k][j];}
printf("c=a*b:
\n");
for(i=0;i{for(j=0;jprintf("%6d",c[i][j]);/*按行输出乘积矩阵*/
printf("\n");}
getch();}
【相关知识】
1.二维数组的初始化
定义之后进行数组的初始化操作,则只能对每个数组元素一一赋值。
intarr[4][10],i,j;
for(i=0;i<4;i++)
for(j=0;j<10;j++)
arr[i][j]=0;
2.赋值格式
如果在定义数组时完成数组的初始化操作,赋值格式有三种。
(1)将数组元素的初值依次放在一对{}中并用赋值号与数组连接。
具体格式为:
存储类型数据类型数组名[数组长度]={初值列表};
例如inta[2][3]={1,2,3,4,5,6};
(2){}内各个初值之间用逗号分隔,初值类型必须与数组类型一致。
系统自动按数组元素在内存的顺序将初值依次赋给相应的元素。
若数值型数组的初值数量不足时,将0赋给其余数组元素,有定义如下:
intx[2][3]={1,2,3,4,5};
运行后,x[0][0]=1、x[0][1]=2、x[0][2]=3、x[1][0]=4、x[1][1]=5,其余元素被自动赋值为0。
(3)赋初值时,每一行的初值放在一对{}中,所有行的初值再放在一对{}中。
系统将第一对{}内数据依次赋值给数组的第0行,将第二对{}内数据依次赋值给数组的第1行,依次类推。
具体格式为:
存储类型数据类型数组名[数组长度]={{第0行初值列表},{第1行初值列表},…};
有定义如下:
intx[4][4]={{1,2,3,4},{4,5,6},{},{7}};
系统将1、2、3、4依次赋给第0行的x[0][0]、x[0][1]、x[0][2]和x[0][3];4、5、6依次赋给第1行的x[1][0]、x[1][1]和x[1][2],x[0][3]的初值,系统自动赋0;系统给第2行的x[2][0]、x[2][1]、x[2][2]和x[2][3]均赋值0;第3行对应{7},则系统将7赋值给x[3][0],余下的x[3][1]、x[3][2]和x[3][3]均被系统赋值为0。
(4)数组初始化时,行长度可省,列长度不能省。
编译系统会根据赋初值的情况,自动得到第一维的长度。
所给初值的个数也不能多于数组元素的个数。
例如:
inta[][3]={1,2,3,4,5,6,7};/*隐含指明行下标为3*/
intb[][4]={{1},{4,5}};/*隐含指明行下标为2*/
下面对二维数组的初始化都是错误的:
inta[][],b[][2],c[3][];/*数组初始化时,行长度和列长度不正确*/
floatx[3][]={1.0,2.0,3.0,4.0,5.0,6.0};/*列长度不能省*/
intm[2][4]={1,2,3,4,5,6,7,8,9}/*编译出错,初值个数多于数组元素的个数*/
3.二维数组元素的地址
二维数组数组元素的地址可用数组元素前面加地址操作符的方式来表示:
&数组名[下标1][下标2]
【课堂精练】
1.求出矩阵a的主对角线上的元素之和,程序运行结果如图6-8所示。
图6-8程序运行结果
根据程序运行结果,将下面程序补充完整。
#include"stdio.h"
main()
{
inta[3][3]={1,3,5,7,9,11,13,15,17},sum=0,i,j;
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(i==j)/*对角线上元素的行列下标值是相等的*/
____________________________________
printf("sum=%d",sum);
getch();}
2.定义一个二维数组,编程求出最大值的元素所在的行和列下标值。
程序的运行结果如图6-9所示。
图6-9程序运行结果
根据程序运行结果,将下面程序补充完整。
#include"stdio.h"
main()
{inti,j,row=0,col=0,max;
inta[3][3]={3,-6,90,15,-53,71,12,48,91};/*定义二维数组并初始化*/
max=a[0][0];/*假设第一个数组元素就是最大值,后面再进行比较*/
for(i=0;i<3;i++)
for(j=0;j<3;j++)
if(a[i][j]>max)
{_________________________________
row=i;
col=j;}
printf("最大值:
%d\n所在行号为:
%d\n所在列号为:
%d",max,row,col);
getch();}
6.3字符数组与字符串
【学习目标】
(1)掌握字符数组的定义与引用方法
(2)掌握字符串的存储形式
(3)掌握字符数组与字符串的区别
实例23字符数组的定义与引用——字母替换
【实例任务】
编写程序将一行字符中所有字母替换为在字母表中其后的第三个字母,即a替换为d、b替换为f、c替换为g……,x、y、z分别替换为a、b、c,然后输出。
运行结果如图6-10所示。
图6-10程序运行结果
【程序代码】
#include"stdio.h"
#include"string.h"
main()
{charstr[80],i;
printf("请输入大小写字符序列:
");
i=0;
while((str[i]=getchar())!
='\n')/*输入字符序列,当输入字符为回车时结束*/
i++