c++学习笔记(二)-- 数组

参考资料:面向对象程序设计–赵宏

本笔记石墨文档链接

第六章 数组

6.1 数组的概念

数组,是由若干同一类型的数据元素构成的有序集合。
其中,数组中所包含的元素个数称为数组的长度。根据数组的组织形式不同,数组又可以分为一位数组,二维数组,三维数组…

6.2 数组的声明

数组本质上是一组变量,即数组的每一个元素都是一个变量,因此在使用数组之前必须先给出数组的声明。一般形式为:
数据类型 数组名[常量表达式1][常量表达式2]…[常量表达式 D];
注意:计算机在编译程序时决定数组长度,而变量在运行程序时才会有值,因此声明数组时必须使用常量表达式指定数组在各维上的长度,而不能使用变量。
有些情况下需要根据程序运行时用户临时输入的数值来决定数组长度,这时需要用堆内存分配方式来解决这类问题。编写程序时遇到此类问题,可以先定义一个足够大的数组。
与简单变量一样,数据类型可以是 int,float 等,命名规则与简单变量的命名规则相同,中括号中的常量表达式 N 为数组的下标,必须是整型常量、符号常量或枚举常量,表示数组在第 N 维上的长度,数组的下表个数即被称作数组的维数。
图片

6.2.1 一维数组

一维数组即下标个数为1的数组,其声明形式为:
数据类型 数组名[常量表达式];

int size=60;
float score[size];  //这种写法是错误的,[]内必须为常量。

const int size=60;
float score[size];  //这种写法正确,使用 const 声明,size是常量

float score[] //这种写法是错误的,必须要给出数组长度

6.2.3 二维数组

二维数组即下标个数为2的数组,其声明形式为:
数据类型 数组名[常量表达式1][常量表达式2];
60名学生三门课的成绩:float score[60][3];
二维数组可以看做一个二维表,第一个下标为行下标,第二个下标为列下标。

6.3 数组的初始化

在声明数组的同时可为数组中的各个元素赋初值,也可以只对部分元素赋值。

6.3.1 一维数组

数据类型 数组名[常量表达式]={初值1,初值2,…,初值 n};
(初始化列表中得到数据个数可以小于数组长度)

数据类型 数组名[]={初值1,初值2,…,初值 n};

  1. 此时并没有指定数组长度,会自动将初始化列表中的数据个数作为数组长度。
  2. ”sizeof(数组名)/sizeof(数据类型)“可以获取数组的长度。
    int a[]={1,2,3} sizeof(a)/sizeof(int)=3, 可知数组的长度为3.
    注意:
  3. 初始化列表中的数据个数不能超过数组长度;

int score[3]={1, 2, 3, 4, 5}; //错误

  1. 初始化顺序由左至右,不能跳过某个元素而直接初始化后面的元素;

int score[2]={1, ,3}; //错误

6.3.2 二维数组

二维数组初始化的形式为:
数据类型 数组名[行下标][列下标]={{},…,{}};
int a[3][4]={{1,2},{2,3,4,5},{5,6,7}};
int a[3][4]={{1,2},{2,3,4,5}};
初始化列表中的数据个数小于等于数组长度,各行中初始化的数据个数可以不一致。

数据类型 数组名[][列下标]={{},…,{}};
带初始化的二维数组的声明行下标可以省略,列下标不能省略。
例如:n名学生三门课的成绩:float score[][3]; 即可以不用声明具体要录入多少名学生的成绩,但是最多只能录入三门课的成绩。

数据类型 数组名[][列下标]={初值1,…,初值 n};
可省略用于表示行的内层花括号。
比如:int a[2][3]={1,2,3,4,5}; 相当于int a[2][3]={{1,2,3},{4,5}};

6.4 数组的访问

声明一个数组后,C++将为该数组分配一片连续的存储空间来存放数组中的元素,存储空间的大小由数据类型和长度确定。要访问数组中的元素,必须给出该元素的下标值。
对数组的访问,既可以是对数组元素的赋值,也可以是从数组中取出某个元素的值。
与声明数组不同,访问数组时下标可以是常量也可以是变量。
访问范围:0~n-1。超出范围时,C++编译不会报错,但是会导致程序运行时报错或运行结果不正确。

6.4.1 一维数组

声明一个一维数组并为其赋值:

int main()
{
  int a[5];
  a[0]=2;
  a[1]=4;
  a[2]=6;
  a[3]=8;
  a[4]=10;
  return 0;
}

可以看出为 a 所赋的值其实是一个等差数列,因此可以替换为:

int main()
{
  int a[5];
  for(int i=0;i<sizeof(a)/sizeof(int);i++)
  {
    a[i] = 2*i+2;
  }
  return 0;
}

例题:

  1. 利用数组编写求最大值的程序,并将结果输出到屏幕上。
#include<iostream>
 using namespace std;
 int main()
 {
   int a[]={6,-3,5,-1,10,25,38,1};
   int max=0;   //假设最大值的索引值为0
   for(int i=1;i<sizeof(a)/sizeof(int);i++)
   {
     if(a[max]>a[i]) max=max;   //可以改成if(a[max]<a[i]) max=i;省一句代码啊!!!   
     else max=i;
   }
   cout<<"最大值是:"<<a[max]<<endl;
   return 0;
 }
  1. 利用选择排序方法将数组中的元素从小到大排列,并将排序后的结果输出到屏幕上。

选择排序的基本思想:对于一个包含 n 个待排序数据的集合,每一遍从中取出最小的元素并将其插入到有序序列的最后,直至所有数据都被放到有序序列中。
待排序数据和有序序列的元素个数和保持不变,因此可以采用一个数组进行存储。有序序列放在数组前面,待排序放在后面。

#include<iostream>
using namespace std;
int main()
{
  int a[]={35,20,-5,25};
  int min;
  int swap;
  for(int j=0;j<sizeof(a)/sizeof(int)-1;j++)
  {
    min=j;  
    for(int i=j+1;i<sizeof(a)/sizeof(int);i++)
    {
      if(a[min]>a[i]) min=i;
    }
    if(min!=j)
    {
      swap=a[min];
      a[min]=a[j];
      a[j]=swap;
    }
  }
  cout<<"元素从小到大排列为:";
  for(int i=0;i<sizeof(a)/sizeof(int);i++)
    cout<<a[i]<<" ";
  cout<<endl;
  return 0;
}

6.4.2 二维数组

二维数组在内存中按照先行后列的顺序线性排列,先存储第一行的元素再存储第二行的元素。
例题:

  1. 利用二维数组存储2名学生3门课程的成绩,并将其输出到屏幕上。
#include<iostream>
using namespace std;
int main()
{
  int a[][3]={{76,85,99},{54,67,90}};
  for(int i=0;i<sizeof(a)/sizeof(a[0]);i++)
  {
    cout<<"第"<<i+1<<"名学生的成绩为";
    for(int j=0;j<sizeof(a[0])/sizeof(int);j++)
    {
      cout<<a[i][j]<<" ";
    }
    cout<<endl;
  }
    return 0;
}

注意求取几行几列的方法,行:sizeof(a)/sizeof(a[0]),列:sizeof(a[0])/sizeof(int).

  1. 将第一题改为一维数组实现。

(数组维数越大,计算机访问数组所花费的时间就越多。因此在编写程序时,一般不要使用维数过大的数组,尽量使用一维数组解决。)

#include<iostream>
using namespace std;
int main()
{
  int a[]={76,85,99,54,67,90};
  int i=2,j=3;
  for(int k=0;k<i;k++)
  {
    cout<<"第"<<k+1<<"名学生的成绩为:";
    for(int h=k*j;h<(k+1)*j;h++)
    {
       cout<<a[h]<<" ";
    }
    cout<<endl;
  }
  return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值