文章教程

全国计算机等级考试二级C语言7.1一维数组的定义和引用

8/22/2020 10:24:52 PM 人评论 次浏览

7.1 一维数组的定义和引用

考点1 一维数组的定义及其元素的引用

真考链接

考点1 是 C语言的基本知识。属于重点掌握内容。其中一维数组元素的引用是考查的重点,考核概率为80%。在操作题中,常在修改题中考查一维数组的定义。考核概率为40%。

1.一维数组的定义

一维数组是指数组中的每个元素只带有一个下标的数组。一维数组的一般定义方式为:类型说明符 数组名[常量表达式],……;。例如:

long array[10];

说明:

(1)array是数组名。

(2)此数组共有10个元素。

(3)每个元素的类型都为长整型。

(4)每个元素只有一个下标。在C语言中,每个数组的第一个元素的下标总是0,这也称为数组下标的下界,所以上面数组的最后一个元素的下标应该是9,这也称为数组下标的上界。

(5)在执行上面的语句后,C编译程序将在内存中开辟连续的10个存储单元,每个存储单元的名称就是每个数组元素的名称,如array[0],array[1]…,可以用这样的名字来直接引用各存储单元。

(6)在定义一个数组的语句中,可以有多个数组说明符。例如:

int x[7],y[8],z[9];

(7)可以把数组说明符和普通变量名同时写在一个类型定义语句中。

2.一维数组元素的引用

由于是一维数组,因此引用数组元素时只带一个下标。数组元素的引用形式为:数组名[下标表达式]。

注意:

(1)一个数组元素实质上是一个变量名,代表内存中的一个存储单元,一个数组占据的是一连串连续的存储单元。

(2)引用数组元素时,数组的下标可以是整型常量,也可以是整型表达式。

(3)和变量一样,数组必须先定义后使用。

(4)只能逐个引用数组元素而不能一次引用整个数组。

(5)在C语言程序的运行过程中,系统并不自动检验数组元素的下标是否越界,所以数组两端都可能因为越界而破坏其他存储单元中的数据,甚至破坏程序代码,因此,在编写程序时要保证数组的下标不能越界。

小提示

在定义一个数组时,需要定义数组的类型。所以一定会出现类型说明符。而在引用数组里的元素时,直接写出数组名及要引用元素的下标即可。

真题精选

【例1】下面程序有错误的行是( )

main()

{ int a[3] = {1};

int i;

scanf("% d",&a);

for(i=1;i < 3;i++)a[0] = a[0] + a[i];

printf("a[0] =% d\n",a[0]);

A.3    B.6    C.7    D.4

【答案】D

【解析】本题考查了一维数组的定义、初始化及元素的引用方法。第4行代码scanf输入数据时,要求输入项为地址,而数组名即为数组的首地址,所以不应该再在前面加取地址符号&。

【例2】若有定义:inta[10];语句,则对数组a元素的正确引用是( )

A.a[10]    B.a[3.5]    C.a(5)    D.a[10-10]

【答案】D

【解析】本题考查了对一维数组引用的基本语法问题,读者需要清楚地了解引用一维数组的基本格式

【例3】请编写函数fun(),该函数的功能是:统计各年龄段的人数。N个年龄通过调用随机函数获得,并放入主函数的age数组中。要求函数把0~9岁年龄段的人数放在d[0]中,把10~19岁年龄段的人数放在d[1]中,把20~29岁年龄段的人数放在d[2]中,依此类推,把100岁(含100岁)以上年龄的人数都放在d[10]中。结果在主函数中输出 。

注意:部分源程序给出如下。

请勿改动main()函数和其他函数中的任何内容,仅在函数fun()的花括号中填入你编写的若干语句。

试题程序

#include <stdio.h>

#define N 50

#define M 11

void fun(int *a,int *b){

double rnd()

{ static t=29,c=217,m=1024,r=0;

r=(r*t+c)%m;

return((double)r/m);

void main()

{ int age[N],i,d[M];

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

age[i] =(int)(115*rnd());

/*产生一个随机的年龄数组*/

printf("The original data:\n");

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

printf((i + 1)% 10 == 0?"% 4d \n":"% 4d",age[i]);/*每行输出10个数*/

printf("\n\n");

fun(age,d);

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

printf("% 4d—% 4d:% 4d\n",i*10, i*10+9,d[i]);

printf("Over 100:% 4d\n",d[10]);

【答案】void fun(int *a,int *b)

{ int i,j;

for(j=0;j<M;j++)

b[j] =0;/*数组b初始化为0*/

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

if(a[i] > =100)

b[10] ++;/*如果年龄大于等于100,b[10]自增1*/else

b[a[i]/10] ++;/*如果年龄小于100,则将其分别统计到b[a[i]/10]中*/

【解析】本题考查数组元素赋初值。本题是一个分段函数的问题,用两个循环来完成。第1个循环的作用是使b中的所有元素值都为0。这个循环不能省略,因为若未对b中的元素赋初值,则它们的值是不可预测的。第2个循环的作用是分别统计a中各年龄段的人数。当a[i]≥100时,按题意要将其统计到b[10]中。else的作用是如果年龄小于100,则将其分别统计到b[a[i]/10]中。由运算优先级可知先进行a[i]/10的运算,所得结果作为b的下标。若a[i]为0~9时,a[i]/10的值为0,且0~9岁的人数正好要存入b[0]中。若a[i]为10~19时,a[i]/10的值为1,且10~19岁的人数正好要存入b[1]中,依此类推。

考点2 一维数组的初始化

真考链接

考点2比较简单,属于重点掌握知识点。在选择题中考核概率为70%。在操作题中主要以填空题和编程题的形式考查。在操作题中考核概率为30%。

当数组定义后,系统会为该数组在内存中开辟一串连续的存储单元,但这些存储单元中并没有确定的值。可以在定义数组时为所包含的数组元素赋初值,如:inta[6] ={ 0,1,2,3,4,5 };

所赋初值放在一对花括号中,数值类型必须与所说明的类型一致。所赋初值之间用逗号隔开,系统将按这些数值的排列顺序,从a[0]元素开始依次给数组a中的元素赋初值。以上语句将a[0]赋值0,a[1]赋值1,……,a[5]赋值5。在指定初值时,第一个初值必定赋给下标为0的元素。也就是说,数组元素的下标是从0开始的。同时,不可能跳过前面的元素给后面的元素赋初值,但是允许为前面元素赋值为0。当所赋初值个数少于所定义数组的元素个数时,将自动给后面的其他元素补以初值0;当所赋初值个数多于所定义数组的元素个数时,也就是说超出了数组已经定义的范围,在编译时系统将给出出错信息。

C语言程序中可以通过赋初值来定义一维数组的大小,定义数组时的一对方括号中可以不指定数组的大小。例如

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

以上语句定义的数组初始化了10个整数,它隐含地定义了a数组含有10个元素,此定义语句和以下语句是等价的:

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

小提示

C语言规定可以通过赋初值来定义数组的大小,这时一对方括号中可以不指定数组大小。

常见问题

如果定义了一个一维数组a[3] ={1,2,3},则a[2]所指的元素的值是多少?

数组元素的下标是从0开始的。同时,不可能跳过前面的元素给后面的元素赋初值,但是允许为前面元素赋值为0。当所赋初值个数少于所定义数组的元素个数时,将自动给后面的其他元素补以初值0。所以a[2]所指元素的值是3。

真题精选

【例1】现有以下程序段

#include <stdio.h>

main()

{ int k[30] = {12,324,45,6,768,98,21,34,453,456};

int count = 0,i=0;

while(k[i])

{if(k[i] % 2 == 0 ||k[i] % 5 == 0)count++;

i++ }

printf("% d,% d\n",count,i);}

则程序段的输出结果是( )。

A.7,8    B.8,8    C.7,10    D.8,10

【答案】D

【解析】在C语言中,定义一维数组的语句一般形式如下:

类型说明符 数组名[常量表达式];

一维数组的引用形式为:数组名[下标表达式]。count表示能被2或5整除的个数,i则计算有多少个数组元素。

【例2】以下选项中,合法的数组说明语句是(  )。

A.inta[] ="string"; B.inta[5] ={0,1,2,3,4,5}; C.chara="string"; D.chara[] ={0,1,2,3,4,5};

【答案】D

【解析】在C语言中,字符变量中存放的是与字符相对应的ASCII码。数值0,1,2,3,4,5所对应的ASCII字符虽然是不可显示的字符,但是这些都可作为控制字符。此时,数组的大小由后面的初始化数据的数量决定,即包含6个元素。

【例3】已知int类型的变量占4个字节,现有以下程序段

#include <stdio.h>

main()

{ int a[] = {1,2,3,4,5};

printf("% d",sizeof(a));

则程序段的输出结果是( )。

A.5    B.10    C.15    D.20

【答案】D

【解析】int类型的数组a初始化了5个整数,它隐含地定义了a数组大小为5个元素,而一个int变量占4个字节,所以程序输出20。

【例4】若有以下语句,则正确的描述是(  )

char x[] ="12345";

char y[] ={'1', '2', '3', '4', '5'};

A.x数组和y数组的长度相同    B.x数组长度大于y数组长度

C.x数组长度小于y数组长度    D.x数组等价于y数组

【答案】B

【解析】由于语句charx[] ="12345";说明是字符型数组并进行初始化,系统按照C语言对字符串处理的规定,在字符串的末尾自动加上串结束标识'\0',因此数组x的长度是6;而数组y是按照字符方式对数组进行初始化的,系统不会自动加上串结束标识'\0',所以数组y的长度是5。

【例5】下列给定程序中,函数fun()的功能是:把形参a所指数组中的奇数按原顺序依次存放到a[0]、a[1]、a[2]、…中,把偶数从数组中删除,奇数个数通过函数值返回。

例如,若a所指数组中的数据最初排列为9、1、4、2、3、6、5、8、7,删除偶数后a所指数组中的数据为9、1、3、5、7,返回值为5。

请在标号处填入正确的内容,使程序得出正确的结果。

注意:部分源程序给出如下。

不得增行或删行,也不得更改程序的结构。

试题程序

#include <stdio.h>

#define N 9

int fun(int a[],int n)

{ int i,j;

j=0;

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

if(a[i]% 2==【1】)

{ a[j] =a[i];【2】;

return【3】;

main()

{ int b[N] ={9,1,4,2,3,6,5,8,7},i,n;

printf("\nThe original data:\n");

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

printf("% 4d ",b[i]);

printf("\n");

n=fun(b,N);

printf("\nThe number of odd:% d \n", n);

printf("\nThe odd number:\n");

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

printf("% 4d ",b[i]);

printf("\n");

【答案】【1】1 【2】j++ 【3】j

【解析】本题考查:if语句条件表达式;自增/自减运算符;函数返回值

标号【1】:根据题目要求,需要进行奇偶数的判定,可以通过if条件语句来判断数组元素是否是奇数,如果元素不能被2整除,则为奇数,所以填入if(a[i]%2==1)。

标号【2】:将为奇数的元素重新存放到数组的前面,同时下标增1。

标号【3】:函数返回值需要返回数组中奇数的个数,因此返回变量j。

教程类别