分享
 
 
 

数组的初始化

王朝other·作者佚名  2008-06-01
窄屏简体版  字體: |||超大  

5.4.1 数组初始化

C语言答应在说明时对全局数组和静态局部数组初始化,但不能对非静态局部数组初始化。

与其它变量相似,数组初始化的一般形式如下:

type-specifier array_name[size1]...[sizen]={value-list};

数值表是一个由逗号分隔的常量表。这些常量的类型与类型说明相容,第一个常量存入数组的第一个单元,第二个常量存入第二个单元,等等,注重在括号“ }”后要加上分号。

下列中一个1 0元素整型数组被初始化装入数字1到1 0:

int i[10]={1,2,3,4,5,6,7,8,9,1 0 } ;

这意味着i [ 0 ]的值为1,而i [ 9 ]的值为1 0。

存放字符串的字符数组的初始化可采用如下简化的形式:

char array_name[size] = "string";

例如,以下代码段将str 初始化为” h e l l o”。

char str[6] = "hello";

上面代码产生和下面代码相同的结果:

char str[6]={'h',' e ' ,' l ' ,' l ' ,' o ' ,' \ o ' } ;

因为C语言中的字符串都以空( N U L L)字符为终结,故要确认定义的数组足够长以存放

空字符。这就是为什么h e l l o只有5个字符,而str 要有6个字符长的原因。使用字符串常量时,

编译程序自动地在末尾加上空字符。

多维数组初始化的方法与一维数组相同,例如,下式将s q r s初始化为从1到1 0及它们各自

的平方数。

int sqrs[10][2]={

1,1,

2,4,

3,9,

4,1 6 ,

5,2 5 ,

6,3 6,

7,4 9 ,

8,6 4 ,

9,8 1,

1 0,1 0 0 ,

} ;

5.4.2 变长数组的初始化

设想用数组初始化的方法建立一个如下错误信息表:

char e1[12] = "read error\n";

char e2[13] = "write error\n";

char e3[18] = "cannot open file\n";

可以想象,假如用手工去计算每一条信息的字符数以确定数组的长度是何等的麻烦。利

用变长数组初始化的方法可以使C自动地计算数组的长度。变长数组初始化就是使C编译程序

自动建立一个不指明长度的足够大的数组以存放初始化数据。使用这种方法,以上信息表变

为:

char e1[] = "read error\n";

char e2[] = "write error\n";

char e3[] = "cannot open file\n";

给定上面的初始化,下面的语句PRintf("%s has length %d\,n"e2 ,si z e o f ( e 2 ) ) ;

将打印出:

write error

has length 13

除了减少麻烦外,应用变长数组初始化使程序员可以修改任何信息,而不必担心随时可

能发生的计算错误。

变长数组初始化的方法不仅仅限于一维数组。但在对多维数组初始化时,必须指明除了

第一维以外其它各维的长度,以使编译程序能够正确地检索数组。其方法与数组形式参数的

说明类似。这样就可以建立变长表,而编译程序自动地为它们分配存储空间。例如,下面用

变长数组初始化的方法定义数组s q r s :

int sqrs[ ][2]={

1,1,

2,4,

3,9,

4,1 6,

5,2 5,

6,3 6,

7,4 9,

8,6 4,

9,8 1,

1 0,1 0 0

} ;

相对定长数组的初始化而言,这种说明的优点在于可以在不改变数组各维长度的情况下,

随时增加或缩短表的长度。

5.5 应用程序举例

[例5-6] 为比赛选手评分。

计算方法:从1 0名评委的评分中扣除一个最高分,扣除一个最低分,然后统计总分,并

除以8,最后得到这个选手的最后得分(打分采用百分制)。

# i n c l u d e < s t d i o . h >

m a i n ( )

{

int score[10]; / * 1 0 个评委的成绩* /

float mark; /最*后得分*/

int i;

int max = -1; / *最高分* /

int min = 101; /*最低分* /

int sum = 0; /*10个评委的总和* /

f o r ( i = 0 ; i < 1 0 ; i + + )

{

printf("Please Enter the Score of No. ,%di"+ 1 ) ;

s c a n f ( " % d \ n " ,& s c o r e [ i ] ) ;

s u m = s u m + s c o r e [ i ] ;

}

f o r ( i = 0 ; i < 1 0 ; i + + )

{

i f ( s c o r e [ i ] > m a x )

m a x = s c o r e [ i ] ;

}

f o r ( i = 0 ; i < 1 0 ; i + + )

{

i f ( s c o r e [ i ] < m i n )

m i n = s c o r e [ i ] ;

}

m a r k = ( s u m - m i n - m a x ) / 8 . 0 ;

printf("The mark of the player is %.1f,\nm"a r k ) ;

}

三层交换技术

交换机与路由器密码恢复

交换机的选购

路由器设置专题

路由故障处理手册

数字化校园网解决方案

[例5-7] 数列排序,采用选择法实现对有5个数的数列进行排序。

选择法的算法思想是:(降序)

1. 将待排序的n个数放入数组n u m中,即n u m [ 0 ]、n u m [ 1 ]、. . . n u m [ n - 1 ]。

2. 让n u m [ 0 ]与后续n u m [ 1 ] . . . n u m [ n - 1 ]依次比较,保证大数在前、小数在后。此次比较,

n u m [ 0 ]是数组中最大。

3. 余下n - 1个元素

4. num[1]与n u m [ 2 ] . . . n u m [ n - 1 ]依次比较,大数在前、小数在后,此次n u m [ 1 ]是全部元素的

最大。

n u m [ n - 2 ]与n u m [ n - 1 ]比较,n u m [ n - 2 ]存大数。

n u m [ n - 1 ]存小数,比较结束,整理有序。

例:待排序5个数为: 44 76 82 63 71

一趟排序: 1次比较:76 44 82 63 71

2次比较:82 44 76 63 71

3次比较:82 44 76 63 71

4次比较:82 44 76 63 71

最大

#include <stdio.h>

m a i n ( )

{

int num[5];

int i,j ;

int temp;

num[0]=94; num[1]=76; num[2]=82; num[3]=63; num[4]=71;

for(i=0; i<4; i++)

for(j=i+1; j<5; j++)

{

i f ( n u m [ i ] > n u m [ j ] )

{

t e m p = n u m [ i ] ;

n u m [ i ] = n u m [ j ] ;

n u m [ j ] = t e m p ;

}

}

for(i=0; i<5; i++)

p r i n t f ( " % 4 d " ,n u m [ i ] ) ;

p r i n t f ( " o k \ n " ) ;

}

这是一个非常简单的排序程序,我们只需稍加扩展就可以编制出很多功能强大的治理程

序,如学生统计总分、平均排列年级名次等。

[例5-8] 简易学生成绩查询系统。

图5 - 3为学生成绩登记表,下例程序完成如下功能:

1) 根据输入的学生学号,给出各次考试成绩及平均成绩;

2) 根据输入考试的次数,打印出该次考试中每个学生的成绩,并给出平均分;

3) 根据学号查出学生某次考试成绩;

4) 录入考试成绩。

#include <stdio.h>

m i a n ( )

{

int select;

int i,j ;

int score[5][7];

int average=0;

int sum=0;

d o {

printf("本程序有4项功能\n");

printf("1、根据学号查询学生成绩\n");

printf("2、根据考试号统计成绩\n");

printf("3、根据考试号和学号查询成绩\n");

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]);

break;

default:

break;

}while(1);

}

从本例中可以看出,当涉及到二维数组时,通常用两重for循环来存取元素。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有