C++ 基础知识点 三 第4章 数组

来源:互联网 发布:姚明nba新秀赛季数据 编辑:程序博客网 时间:2024/04/29 17:27

第4章        数组

【内容提要】

一维数组

二维数组

多维数组

【重点与难点】

4.1 数组的基本概念

    数组是由一组具有相同数据类型的元素组成的集合。数组的类型就是这组元素的数据类型。构成数组的这组元素在内存中占用一组连续的存储单元。可以用一个统一的数组名标识这一组数据,而用下标来指明数组中各元素的序号。根据数组维数的不同,可分为一维数组、二维数组和多维数组,常用的是一维和二维数组。

4.1 一维数组

4.1.1一维数组的定义与初始化

  一维数组的定义

    定义格式:  类型 数组名[常量表达式];

    说明:

    ①类型为第二章中介绍的数据类型,这里的类型是数组的类型也就是数组中每个元素的类型。

    ②数组名是一个标识符,代表数组在内存中的起始地址。数组中各元素在内存中连续存储。

    ③常量表达式又称下标表达式,就是数组中的元素个数。通常采用符号常量,这样使得程序的伸缩性更强。

  一维数组的初始化

在定义数组时对其中的全部或部分元素指定初始值,这称为数组的初始化。

初始化的格式为:  类型  数组名[常量表达式]={值1,值2,…,值n};

         说明:

         ①只有存储类别为静态的或外部的数组才可以进行初始化。

         ②当初始化的元素比数组中的元素个数少时,则按顺序对前一部分元素赋初值,其余元素自动初始化为0或空字符‘\0’(对字符数组);当初始化的元素超过数组元素个数时,编译器会报错。

    ③当初始化元素个数与数组实际元素个数相等时,可以省略数组长度但[]不能省略。

    ④对字符数组进行初始化可以对每个数组元素一一赋初值,也可将一个字符串直接赋值给一个数组。但要注意数组长度除了包含字符串中字符个数还包含一个’\0’字符。

 

4.1.2 访问数组元素

    格式:   数组名[下标]

    说明:对于一个有n个元素的数组,其下标从0开始到n-1。在引用时要防止越界引用,这样会引起逻辑错误。可以通过sizeof(数组名)/sizeof(数组类型)来求得实际的数组长度。

 

4.2 二维数组

4.2.1 二维数组的定义与初始化

  二维数组的定义

    定义格式:  类型 数组名[常量表达式1][常量表达式2];

    说明:

    ①数组名是一个标示符,代表数组在内存中的起始地址,二维数组按“先行后列”的顺序被存储在一维的存储空间中的。

    ②常量表达式1表示数组的行数,常量表达式2表示数组的列数。

  二维数组的初始化

对二维数组的初始化主要有两种形式:

第一、  数值按行用花括号分组对二维数组初始化。

第二、  所有数值按顺序在一个花括号中给出。

    说明:

    ①对以上两种形式,如果没有给出所有数组元素,则剩余元素自动初始化为0。

②若在一个花括号中对所有元素赋初值或者按行用花括号分组而组内元素部分或全部赋值,则可以缺省第一维的长度,但是[]不能省略,并且在任何情况下,二维数组第二维的长度均不可省略。

 

4.2.2 访问数组元素

    格式:  数组名[下标1][下标2]

    说明:

    若该数组为n行m列的二维数组,则下标1从0到n-1,下标2从0到m-1。

【典型例题】

例题1:下面定义数组的语句正确的是(  )。

(a) int i=6;char a[i]= “hello”;

(b) const int i=5;chara[i]= “hello”;

(c) char a[6]=”hello”;

(d) char a5=”hello”;

解答:

本题主要考查字符数组在定义及初始化时需要注意的问题。数组定义中数组长度不能指定为除const变量以外的变量,选项a中i为变量;选项b中字符串“hello”含有6个字符,而数组a的长度是5所以编译器报错;选项d中a5是一个字符变量而不是字符数组,而“hello”含有6个字符,无法放在一个字符变量中。所以答案为:c

 

例题2:已知数组a定义为:int a[][3]={{1,2,3},{4}};, 则a[1][2]的值为(  )。

(a)2      (b)3     (c)4      (d)0

解答:

在对数组进行初始化时只给出部分元素的初始值,则剩余元素自动初始化为0。答案为:d。

 

例题3:已知数组定义为inta[2][4];,下列对数组元素引用正确的为( )。

(a)a[1,2]      (b)a[1][2]      (c)a(1,2)      (d)a[1][4]

解答:

对二维数组的引用格式为:数组名[下标1][下标2];n行m列的二维数组其第一维的下标从0到n-1,第二维的下标从0到m-1。选项a和c引用格式错误,d中下标越界。

答案为:b。

 

例题4:下列程序段错误的是(  )。

(a)char str1[8];

cin>>str1;

(b)char str1[8];

strcpy(str1,”first”);

(c)char str1[8];

for(inti=0;i<7;i++)

     cin>>str1[i];

str1[7]=’\0’;

(d)char str1[8],str2[8]=”first”;

str1=str2;

解答:

本题主要考查如何为字符数组赋值。为字符数组赋值可以直接从键盘输入一个字符串、用strcpy函数将一个字符串复制到该字符数组或者用循环语句逐个为字符数组元素赋值。不能直接将一个数组赋值给另一个数组。答案为:d。

 

例题5:下列说法正确的是(  )。

(a)数组可以存放不同类型的元素。      (b)定义int a[2];,则数组a有两个数组元素。

(c)定义int a[3];,则该数组中元素分别为:a[0],a[1],a[2],a[3]。

(d)在编译时,不必确定数组的大小。

解答:

数组中所有的元素具有相同类型,选项a错误;定义int a[3];则数组a中含有三个元素分别为a[0],a[1],a[2],选项c错误;编译时必须确定数组的大小,即在定义数组时必须给出数组长度。

答案为:b。

 

例题6:运行下列程序结果为________________。

#include<iostream.h>

#include<iomanip.h>

void main()

{

    int array1[3][3]={{1,2,13},{4,5,16},{7,8,9}},i=0,j=2,sum1=0,sum2=0;

    for(;i<3;i++)

    {

        sum1+=array1[i][i];

        sum2+=array1[i][j--];

    }

    cout<<sum1<<setw(5)<<sum2<<endl;

}

解答:

本题中程序的作用是对一个给定的3×3矩阵求出其主对角线元素值之和与逆对角线元素值之和然后输出计算结果。其中主对角线上的元素即为行和列下标相同的元素,逆对角线元素下标满足行下标从小到大依次递增同时列下标从大到小依次递减的元素。答案为:15   25。

 

例题7:下列程序的作用是检查字符串s中是否包含字符串t,若包含,则返回并输出t在s中的开始位置(下标值),否则返回-1。请将程序补充完整。

#include<iostream.h>

int main()

{

    int i,j,k;

    char s[20]="Today is sunday!",t[10]="sun";

    for(i=0;s[i]!='\0';i++)

    {

        for(j=i,k=0;_______①_________ &&s[j] ==t[k];j++,k++);

        if(________②________)

        {

            cout<<"t在s中的开始位置下标为:"<<i<<endl;

            return i;

        }

    }

    return -1;

}

解答:

本程序用于解决检查一个字符串是否包含于另一个字符串。程序的思想是从s串的第0个字符起与t串进行比较,若到t串结束时所比字符均相等则说明t在s中,返回t在s中的开始位置,程序结束;否则从s的第1个字符起重复以上操作,依此类推直到匹配或s串结束为止。程序中变量i用于记录本轮中正在与t串相比较的s串的子串的首字符位置(下标),k用于记录t串中当前比较字符的位置(下标),j用于记录s串中当前比较的字符的位置(下标)。因此,答案为:①t[k]!='\0' ②t[k]=='\0'

 

例题8:编程实现任意输入10个数,然后按从小到大的顺序输出这10个数。

解答:

算法思想:关于排序问题的实现算法非常多。有插入排序、希尔排序、快速排序、选择排序、归并排序、基数排序等。在时间空间复杂度方面这些算法各有优缺点。有关这方面的内容可以参考数据结构方面的介绍。在这里给出了一个采用简单选择排序的参考程序。其思路为循环n-1次(n为元素个数),每次循环都从剩下的数中选择出最小的一个。如下给出排序过程:

下标i        0  1   2   3

list[i]      100 34  20  200

第1轮       34 100  20  200

             20  100  34  200

第2轮       20 34   100200

第3轮       20 34   100 200

 

参考程序:

#include <iostream.h>

#include<iomanip.h>

int main()

{

    const int COUNT=10;

    int list[COUNT];

    int i,j,tmp;

    cout<<"请输入10个数:"<<endl;

   

    for(i=0;i<COUNT;i++)  //输入数组元素

        cin>>list[i];

 

    for(i=0;i<COUNT-1;i++)       //排序

    {

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

            if(list[j]<list[i])

            {

                tmp=list[i];

                list[i]=list[j];

                list[j]=tmp;

            } 

    }

 

    for(i=0;i<COUNT;i++)        //输出排序后的结果

        cout<<setw(5)<<list[i];

    cout<<endl;

 

    return 0;

}

0 0
原创粉丝点击