C++课堂笔记四

C++课堂笔记四

数组基本概念

  1. 可以用来表达类型相同的元素的集合,集合的名字就是数组。
  2. 数组里的元素都有编号,元素的编号叫下标. 通过数组名下标,就能访问元素。
    1
    2
    3
    4
    5
    定义方法:
    类型名 数组名[元素个数]
    (元素个数必须是常量或常量表达式,不能是变量,其值必须是正整数。元素个数也称作数组的长度)

    int a[100] 名字为a的数组,有100个元素,每个元素都是一个int型的变量。
1
2
3
4
5
T a[N]:   //T为类型名,如char, double, int等              N为正整数或值为正整数的常量表达式。

数组a有N个元素,每个元素都是一个类型为T的变量。 N个元素在内存里是一个挨一个连续存放的。 a数组占用大小总共为N*sizeof(T)字节的储存空间。

表达式sizeof(a)的值就是整个数组的体积,即N*sizeof(T)。

倒序问题: 键盘输入100个整数,将他们按和原顺序相反的顺序输出。

1
2
3
4
5
6
7
8
#define NUM 100  //使用符号常量,便于修改
int a[NUM]; //数组一般不要定义在mian里面,尤其是大数组
int main() {
for(int i=0;i<NUM;i++)
cin>>a[i];
for(int i=NUM-1;i>=0;--i)
cout<<a[i]<<" ";
return 0;

数组的初始化

在定义一个一维数组的同时,就可以给数组中的元素赋初值

类型名 数组名[常量表达式] = {值,值……值};

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

用数组取代复杂分支结构

1
2
3
4
5
6
7
8
9
10
11
string weekdays[] = {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
int main()
{
int n;
cin>>n;
if(n>7||n<1)
count<<"Illegal";
else
cout<<weekdays[n-1];
return 0;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
思路: 2012122日是星期天,算出给定日期就是该天起过了x天,然后输出x%7  
#include <iostream>
using namespace std;
int monthDays[13] = {-1,31,28,31,30,31,30,31,31,30,31,30,31};
int main(){
int year,month,date;
int days = 0; //从2012-01-22开始过了多少天
cin >> year >> month >> date;
for(int y = 2012; y < year; ++y){
if (y%4 == 0 && y%100!= 0 || y%400 == 0)//判断y是否为闰年
days += 366;
else
days += 365;
}
if (year%4 ==0 && year%100!=0 || year%400 ==0)
monthDays[2] = 29;
for(int m =1; m < month; ++m)
days += monthDays[m];
days += date;
days -= 22;//2012年1月22日是星期天
cout << days % 7 << endl;
return 0;
}

数组的越界

int a[10];用变量作为数组下标时,不小心会导致数组越界(变量下标值变为负数,或太大)

  1. 可能引起意外修改其他变量的值,导致运行结果不正确
  2. 可能试图访问不该访问的内存区域,导致程序崩溃某些编译器
  3. 可能可以正确运行,换一个就错误

二维数组

1
2
3
4
5
6
7
8
定义N行M列的二维数组:

T a[N][M]; //T: 类型名,如char, double, int等
M、N: 正整数,或值为正整数的常量表达式
每个元素都是一个类型为T的变量
N*M个元素在内存里是一个挨一个连续存放的
数组占用了一片连续的,大小总和为N*M*sizeof(T)字节的存储空间
表达式"sizeof(a)"的值就是整个数组的体积即N*M*sizeof(T)
1
2
3
访问数组元素的方法:
a [i][j];
数组名 [行下标][列下标] //下标都是从0开始

二位数组的存放方式:

二维数组的每一行,实际上都是一个一维数组

二维数组的初始化:

遍历二维数组: 遍历一个二维数组,将所有元素逐行依次输出

1
2
3
4
5
6
7
8
#define ROW 20  //行数
#define COL 30 //列数
int a[ROW][COL];
for( int i=0;i<ROW;i++){ //i行号
for(int j= 0;j<COL;++j) //j列号
cout<<a[i][j]<<" ";
cout<<endl;
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#define ROWS 8
#define COLS 8
int a[ROWS][COLS];//存放输入的矩阵
int b[ROWS][COLS];//存放输入的矩阵
int c[ROWS][COLS];//存放乘法结果的矩阵
int main()
{
int m,n,p,q;
cin>>m>>n;
for(int i=0;i<m;++i)//读入a矩阵
for(int j=0;j<n;++j)
cin>>a[i][j];
cin>>p>>q;
for(int i=0;i<p;++i) //读入b矩阵
for(int j=0;j<q;++j)
cin>>b[i][j];
for(int i=0;i<m;++i){// i为行号
for(int j=0; j<q;++j) { // j为列号
c[i][j] = 0;
for(int k=0;k<n;++K)
c[i][j] +=a[i][k]*b[k][j];
}
}
for(int i=0;i<m;++i){ //遍历结果矩阵c
for(int j=0;j<q;++j){
cout<c[i][j]<<" ";
}
cout<<endl;
}
return 0;
}