数组的初始化

时间:2007-06-14 来源: 作者: 【字体: 减小 增大收藏 | 投稿
  

5.4.1数组初始化
C语言允许在说明时对全局数组和静态局部数组初始化,但不能对非静态局部数组初始化。
与其它变量相似,数组初始化的一般形式如下:
type-specifierarray_name[size1]...[sizen]={value-list};
数值表是一个由逗号分隔的常量表。这些常量的类型与类型说明相容,第一个常量存入数组的第一个单元,第二个常量存入第二个单元,等等,注意在括号“}”后要加上分号。
下列中一个10元素整型数组被初始化装入数字1到10:
inti[10]={1,2,3,4,5,6,7,8,9,10};
这意味着i[0]的值为1,而i[9]的值为10。
存放字符串的字符数组的初始化可采用如下简化的形式:
chararray_name[size]="string";
例如,以下代码段将str初始化为”hello”。
charstr[6]="hello";
上面代码产生和下面代码相同的结果:
charstr[6]={'h','e','l','l','o','\o'};
因为C语言中的字符串都以空(NULL)字符为终结,故要确认定义的数组足够长以存放

财管家,园,fs119.net


空字符。这就是为什么hello只有5个字符,而str要有6个字符长的原因。使用字符串常量时,
编译程序自动地在末尾加上空字符。
多维数组初始化的方法与一维数组相同,例如,下式将sqrs初始化为从1到10及它们各自
的平方数。
intsqrs[10][2]={
1,1,
2,4,
3,9,
4,16,
5,25,
6,36,
7,49,
8,64,
9,81,
10,100,
};
5.4.2变长数组的初始化
设想用数组初始化的方法建立一个如下错误信息表:
chare1[12]="readerror\n";
chare2[13]="writeerror\n";
chare3[18]="cannotopenfile\n";
可以想象,如果用手工去计算每一条信息的字符数以确定数组的长度是何等的麻烦。利
用变长数组初始化的方法可以使C自动地计算数组的长度。变长数组初始化就是使C编译程序
自动建立一个不指明长度的足够大的数组以存放初始化数据。使用这种方法,以上信息表变 财管 家园 fs119.net
为:
chare1[]="readerror\n";
chare2[]="writeerror\n";
chare3[]="cannotopenfile\n";
给定上面的初始化,下面的语句printf("%shaslength%d\,n"e2,sizeof(e2));
将打印出:
writeerror
haslength13
除了减少麻烦外,应用变长数组初始化使程序员可以修改任何信息,而不必担心随时可
能发生的计算错误。
变长数组初始化的方法不仅仅限于一维数组。但在对多维数组初始化时,必须指明除了
第一维以外其它各维的长度,以使编译程序能够正确地检索数组。其方法与数组形式参数的
说明类似。这样就可以建立变长表,而编译程序自动地为它们分配存储空间。例如,下面用
变长数组初始化的方法定义数组sqrs:
intsqrs[][2]={
1,1,
2,4,
3,9,
4,16,
5,25,
6,36,
7,49,
8,64,
9,81,
10,100
};
相对定长数组的初始化而言,这种说明的优点在于可以在不改变数组各维长度的情况下,
财软联 盟 fs119.net

随时增加或缩短表的长度。
5.5应用程序举例
[例5-6]为比赛选手评分。
计算方法:从10名评委的评分中扣除一个最高分,扣除一个最低分,然后统计总分,并
除以8,最后得到这个选手的最后得分(打分采用百分制)。
#include<stdio.h>
main()
{
intscore[10];/*10个评委的成绩*/
floatmark;/最*后得分*/
inti;
intmax=-1;/*最高分*/
intmin=101;/*最低分*/
intsum=0;/*10个评委的总和*/
for(i=0;i<10;i)
{
printf("PleaseEntertheScoreofNo.,%di"1);
scanf("%d\n",&score[i]);
sum=sumscore[i];
}
for(i=0;i<10;i)
{
if(score[i]>max)
max=score[i];
}
for(i=0;i<10;i)
{
if(score[i]<min)
min=score[i];
}
mark=(sum-min-max)/8.0;
printf("Themarkoftheplayeris%.1f,\nm"ark);
}

财管家园.fs119.net

财管家园,fs119.net

财,管家园,fs119.net


财软联,盟,fs119.net

财管家园.fs119.net


[例5-7]数列排序,采用选择法实现对有5个数的数列进行排序。
选择法的算法思想是:(降序)
1.将待排序的n个数放入数组num中,即num[0]、num[1]、...num[n-1]。
2.让num[0]与后续num[1]...num[n-1]依次比较,保证大数在前、小数在后。此次比较,
num[0]是数组中最大。
3.余下n-1个元素
4.num[1]与num[2]...num[n-1]依次比较,大数在前、小数在后,此次num[1]是全部元素的
最大。
num[n-2]与num[n-1]比较,num[n-2]存大数。
num[n-1]存小数,比较结束,整理有序。
例:待排序5个数为:4476826371
一趟排序:1次比较:7644826371
2次比较:8244766371
3次比较:8244766371
4次比较:8244766371
最大
#include<stdio.h>
main()
{
intnum[5];
inti,j;
inttemp;
num[0]=94;num[1]=76;num[2]=82;num[3]=63;num[4]=71;
for(i=0;i<4;i)
for(j=i1;j<5;j)
{
if(num[i]>num[j])
{
temp=num[i];
num[i]=num[j];

财软联盟,fs119.net

num[j]=temp;
}
}
for(i=0;i<5;i)
printf("%4d",num[i]);
printf("ok\n");
}
这是一个非常简单的排序程序,我们只需稍加扩展就可以编制出很多功能强大的管理程
序,如学生统计总分、平均排列年级名次等。
[例5-8]简易学生成绩查询系统。
图5-3为学生成绩登记表,下例程序完成如下功能:
1)根据输入的学生学号,给出各次考试成绩及平均成绩;
2)根据输入考试的次数,打印出该次考试中每个学生的成绩,并给出平均分;
3)根据学号查出学生某次考试成绩;
4)录入考试成绩。

#include<stdio.h>
mian()
{
intselect;
inti,j;
intscore[5][7];
intaverage=0;
intsum=0;
do{
printf("本程序有4项功能\n");
printf("1、根据学号查询学生成绩\n");
printf("2、根据考试号统计成绩\n");
printf("3、根据考试号和学号查询成绩\n");
财管家园 fs119.net

printf("4、成绩录入\n");
printf("0、退出\n");
printf("请输入选择(0-4):");
scanf("%d\n",&select);
switch(select)
{
case0:
printf("OK\n");
exit(0)
break;
case1:
printf("输入学号:");
scanf("%d\n",&i);
for(j=1;j<7;j)
{
printf("第%d科成绩是%d\n",j,score[i][j]);
sum=score[i][j];
}
average=sum/6;
printf("学生的平均成绩是%d\n",average);
break;
case2:
printf("输入考试号:");
scanf("%d\n",&j);
for(i=1;i<5;i)
{
printf("第%d号学生本科成绩是%d\n",i,score[i][j]);
sum=score[i][j];
}
average=sum/4;
printf("本科平均成绩是%d\n",average);
break;
case3:
printf("输入学号和考试号:");
scanf("%d%d\n",&i,&j);
printf("第%d号学生的第%d科考试成绩是%d\n",i,j,
score[i][j]);
break;
case4:
printf("请输入成绩\n");
for(i=1;i<5;i)
for(j=1;j<7;j)
scanf("%d\n",&score[i][j]); 财软联 盟 fs119.net
break;
default:
break;
}while(1);
}
从本例中可以看出,当涉及到二维数组时,通常用两重for循环来存取元素。 财管家.园.fs119.net

财管家园 fs119.net

财管家,园,fs119.net


上一篇:指针与指针变量
下一篇:多维数组

精品课程推荐