13.数组-一维数组
13.1 知识点
基本概念
数组是存储一组相同类型数据的集合。数组可以分为一维数组和多维数组。通常情况下,一维数组简称为数组。
数组的存储序列是线性的,这意味着数组中的数据在内存中是紧挨着的。
数组的声明
声明指定容量的数组,值未初始化
int array[6]; // 声明一个容量为6的数组,数组的值未指定
声明并初始化指定容量的数组
int array2[6] = { 1, 2, 3, 4, 5, 6 }; // 声明一个容量为6的数组,并初始化值
声明不指定容量的数组,容量由编译器推导
int array3[] = { 1, 2, 3 }; // 不指定容量,编译器根据初始化值的数量推导容量
注意:
在声明数组时,不能用变量作为数组的容量。只有在学习堆内存分配后,才能使用变量作为容量进行动态数组的声明。
数组的使用
1. 数组的长度(容量)
数组的长度可以通过 sizeof
进行计算。假设有一个数组 arr
:
int arr[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int length = sizeof(arr) / sizeof(int); // 计算数组的长度
cout << length << endl; // 输出 8
2. 获取数组中的元素
数组的索引是从0开始的,通过索引可以获取数组中的某个元素。注意,数组的索引范围是从 0
到 length - 1
。
cout << arr[0] << endl; // 1
cout << arr[7] << endl; // 8
cout << arr[3] << endl; // 4
注意:
如果访问越界(比如arr[-1]
或arr[8]
),不会报错,但可能会返回不确定的值。
3. 初始化所有坑位
如果初始化时没有指定某些元素的值,未指定的元素将被初始化为 0
。
int arr2[99] = { 888 };
cout << arr2[0] << endl; // 888
cout << arr2[1] << endl; // 0
4. 修改数组中的元素
可以通过索引修改数组中的元素值。
arr2[0] = 99;
cout << arr2[0] << endl; // 99
arr2[1] = 5;
cout << arr2[1] << endl; // 5
5. 遍历数组
通过循环遍历数组中的每一个元素。
int arr3[6] = { 156, 223, 3123, 4435, 5123, 6123 };
int l = sizeof(arr3) / sizeof(arr3[0]);
for (int i = 0; i < l; i++) {
cout << arr3[i] << endl;
}
6. 增加数组的元素
数组一旦初始化,其容量是固定的,无法直接增加元素。为了增加元素,可以创建一个新数组并复制原数组的元素。
int arr4[7];
for (int i = 0; i < l; i++) {
arr4[i] = arr3[i];
}
arr4[6] = 9999; // 新增元素
for (int i = 0; i < 7; i++) {
cout << arr4[i] << endl;
}
7. 删除数组的元素
数组一旦初始化,不能直接删除其中的元素。删除操作需要通过重新分配数组来实现。
8. 查找数组中的元素
通过遍历数组查找目标元素的位置。
int arr5[] = { 99, 2, 3, 5, 3 };
int target = 3;
for (int i = 0; i < sizeof(arr5) / sizeof(int); i++) {
if (target == arr5[i]) {
cout << "和目标元素值相等的元素在第" << i << "索引位置" << endl;
break; // 找到后跳出循环
}
}
静态数组的限制
我们目前学习的数组是静态数组。静态数组的大小在声明时就固定了,且必须在编译时确定。静态数组的大小和类型一旦确定,就不能修改。
对于动态数组,数组的大小可以在运行时进行调整,堆内存分配将会在后续学习中介绍。
总结
- 数组是同一变量类型连续存储的数据集合。
- 需要掌握数组的声明、遍历、增删查改等操作。
- 所有的变量类型都可以声明为数组。
- 数组常用于存储同一类型的大量数据,如游戏中的怪物或玩家。
- 当前学习的是静态数组,动态数组将在学习堆内存分配后介绍。
13.2 知识点代码
Lesson13_数组_一维数组.cpp
#include <iostream>
using namespace std;
int main()
{
std::cout << "一维数组\n";
#pragma region 知识点一 基本概念
//数组是存储一组相同类型数据的集合
//数组分为 一维、多维
//一般情况 一维数组 就简称为 数组
//数组的存储序列是线性的
//意思就是数组中的数据之间 在内存中是紧挨着的
#pragma endregion
#pragma region 知识点二 数组的声明
// 1.变量类型 数组名[容量];
// 声明一个指定容量的数组,但是每个房间的值并不确定
// 变量类型 可以是我们学过的 或者 没学过的所有变量类型
int array[6]; //通过这种方式声明一个数组 相当于开了6个小房间 但是房间里面的int值是不确定
// 2.变量类型 数组名[容量] = {值,值,值.....};
// 声明一个指定容量的数组,每个房间的值在声明时进行初始化
int array2[6] = { 1,2,3,4,5,6 };
// 3.变量类型 数组名[] = {值,值,值.....};
// 声明一个不指定容量的数组,具体容量编译器根据初始化值的数量自动推导数组大小
int array3[] = { 1,2,3 };
//注意,在声明数组时不能用变量作为容量
//只有之后学了堆上分配的数组 才可以用变量表示容量
/*int size = 6;
int array4[size];*/
#pragma endregion
#pragma region 知识点三 数组的使用
//1.数组的长度(容量)
// 利用sizeof进行计算
cout << sizeof(int) << endl; // 4(通常情况下,int类型在常见系统中占4个字节)
int arr[8] = { 1,2,3,4,5,6,7,8 };
//sizeof(arr)通过这种方式可以得到数组占多少内存空间 (字节)
//sizeof(int)通过这种方式又可以得到 数组类型 所占内存空间(字节)
int length = sizeof(arr) / sizeof(int);
cout << length << endl; // 8(数组arr包含8个元素,计算得到的长度就是8)
//2.获取数组中的元素
//数组中的下标和索引 他们是从0开始的
//通过 索引下标去 获得数组中某一个元素的值时
//一定注意!!!!!!!!
//不能越界 数组的房间号 范围 是 0 ~ Length-1
cout << arr[0] << endl; // 1(获取数组arr的第一个元素,值为1)
cout << arr[7] << endl; // 8(获取数组arr的最后一个元素,值为8)
cout << arr[3] << endl; // 4(获取数组arr下标为3的元素,值为4)
//如果越界 不会报错 但是会出现获取到不确定的数值!!!
cout << arr[-1] << endl;// -858993460
cout << arr[8] << endl;//- 858993460
//3.初始化所有坑位
// 至少初始化一个值,后面的坑位会用0进行初始化
// 否则由于没有初始化 获取到的可能是不确定的数值 比如-858993460
int arr2[99] = { 888 };
cout << arr2[0] << endl; // 888(初始化后第一个元素值为8)
cout << arr2[1] << endl; // 0(第二个元素值也为0,因为用888初始化了所有未指定值的元素)
cout << arr2[2] << endl; // 0(同理,第三个元素值同样为0)
cout << arr2[98] << endl; // 0(最后一个元素也被初始化为0)
//4.修改数组中的元素
arr2[0] = 99;
cout << arr2[0] << endl; // 99(修改后第一个元素的值变为99)
arr2[1] = 5;
cout << arr2[1] << endl; // 5(第二个元素的值变为5)
//5.遍历数组 通过循环 快速获取数组中的每一个元素
cout << "********************" << endl;
int arr3[6] = { 156,223,3123,4435,5123,6123 };
int l = sizeof(arr3) / sizeof(arr3[0]);
for (int i = 0; i < l; i++)
{
//访问是可以通过变量作为索引去访问的
//但是声明不能够通过变量去声明
cout << arr3[i] << endl;
// 依次输出:156(第一次循环,输出数组arr3的第一个元素)
// 223(第二次循环,输出数组arr3的第二个元素)
// 3123(第三次循环,输出数组arr3的第三个元素)
// 4435(第四次循环,输出数组arr3的第四个元素)
// 5123(第五次循环,输出数组arr3的第五个元素)
// 6123(第六次循环,输出数组arr3的第六个元素)
}
//6.增加数组的元素
// 数组初始化以后 是不能够 直接添加新的元素的
//搬家
//想要把原本存储了n个元素的数组 变为存储n + m个元素
cout << "********************" << endl;
int arr4[7];
for (int i = 0; i < l; i++)
{
arr4[i] = arr3[i];
}
//增加数组的元素了
arr4[6] = 9999;
for (int i = 0; i < 7; i++)
{
cout << arr4[i] << endl;
// 依次输出:156(第一次循环,输出数组arr4的第一个元素,从arr3复制过来)
// 223(第二次循环,输出数组arr4的第二个元素,从arr3复制过来)
// 3123(第三次循环,输出数组arr4的第三个元素,从arr3复制过来)
// 4435(第四次循环,输出数组arr4的第四个元素,从arr3复制过来)
// 5123(第五次循环,输出数组arr4的第五个元素,从arr3复制过来)
// 6123(第六次循环,输出数组arr4的第六个元素,从arr3复制过来)
// 9999(第七次循环,输出数组arr4新添加的最后一个元素)
}
//7.删除数组的元素
// 数组初始化以后 是不能够 直接删除元素的
// 也要搬家
//8.查找数组中的元素
int arr5[] = { 99,2,3,5,3 };
//想要查找 3这个元素在数组中哪个位置
//只有通过遍历才能确定 数组中 是否存储了一个目标元素
int target = 3;
for (int i = 0; i < sizeof(arr5) / sizeof(int); i++)
{
if (target == arr5[i])
{
cout << "和目标元素值相等的元素在第" << i << "索引位置" << endl; // 输出:和目标元素值相等的元素在第2索引位置(第一次找到3时的索引位置),若继续循环还会输出:和目标元素值相等的元素在第4索引位置(第二次找到3时的索引位置),这里代码遇到第一个符合条件的就break跳出循环了,所以实际只输出第一次找到的位置
break;
}
}
#pragma endregion
#pragma region 知识点四 静态数组的限制
//我们目前学习的数组相关知识,属于静态数组相关知识
//声明一个静态数组时,数组的大小是固定的,并且必须在编译时确定
//声明后,无法改变数组的大小或将其指向另一个数组
//静态数组的大小和类型在声明时固定,不能在运行时修改
//与之对应的动态数组
//我们将学习了堆内存分配后再讲解
#pragma endregion
#pragma region 总结
//1.概念:同一变量类型连续存储的数据集合
//2.一定要掌握的数组相关知识:声明、遍历、增删查改
//3.所有的变量类型都可以声明为 数组
//4.它是用来批量存储游戏中的同一类型的对象的 容器 比如 所有的怪物 所有玩家
//5.目前学习的声明和使用方式时静态数组的 ,以后学习了堆内存分配相关的知识 就知道动态数组是什么了
#pragma endregion
}
13.3 练习题
请创建一个一维数组并赋值,让其值与下标一样,长度为100
int array[100];
int l = sizeof(array) / sizeof(int);
for (int i = 0; i < l; i++)
{
array[i] = i;
cout << array[i] << endl;
}
创建另一个数组B,让数组A中的每个元素的值乘以2存入到数组B中
int arrayB[100];
for (int i = 0; i < 100; i++)
{
arrayB[i] = array[i] * 2;
//cout << arrayB[i] << endl;
}
随机(0~100)生成1个长度为10的整数数组
int array1[10];
for (int i = 0; i < sizeof(array1) / sizeof(int); i++)
{
array1[i] = getRandom(0, 100);
cout << array1[i] << endl;
}
从一个整数数组中找出最大值、最小值、总合、平均值(可以使用随机数1~100的数组)
int max = array1[0]; //用于存储最大值的变量
int min = array1[0]; //用于存储最小值的变量
int sum = 0; //用于存储总和的变量
float avg = 0; //用于存储平均值的变量
int length = sizeof(array1) / sizeof(int); //得到容量 方便一会儿计算平均值
for (int i = 0; i < length; i++)
{
//得到最大、最小
//如果当前元素比记录的最小值还小 那就更新最小值
if (array1[i] < min)
min = array1[i];
//如果当前元素比记录的最大值还大 那就更新最大值
if (array1[i] > max)
max = array1[i];
//计算总和
//就是所有元素加起来
sum += array1[i];
}
//计算平均值
// 总和 / 个数(容量)
avg = sum / (float)length;
cout << "最大值:" << max << "最小值:" << min << "总和:" << sum << "平均值:" << avg << endl;
写一个函数,求一个数组的总合、最大值、最小值、平均值
void GetArrayInfo(int array[], int length);
void GetArrayInfo(int array[], int length)
{
//传递的int array[] 实际上是传递了指针变量
int max = array[0]; //用于存储最大值的变量
int min = array[0]; //用于存储最小值的变量
int sum = 0; //用于存储总和的变量
float avg = 0; //用于存储平均值的变量
//int length = sizeof(array) / sizeof(int);
//不可以这样得到容量 应该多加一个参数 外部传入length
//因为array传递的是指针变量 得到的就不是数组的长度了
for (int i = 0; i < length; i++)
{
//得到最大、最小
//如果当前元素比记录的最小值还小 那就更新最小值
if (array[i] < min)
min = array[i];
//如果当前元素比记录的最大值还大 那就更新最大值
if (array[i] > max)
max = array[i];
//计算总和
//就是所有元素加起来
sum += array[i];
}
//计算平均值
// 总和 / 个数(容量)
avg = sum / (float)length;
cout << "最大值:" << max << "最小值:" << min << "总和:" << sum << "平均值:" << avg << endl;
}
//目前没有学习后面知识之前,我们如果想要把数组作为函数参数
//那么如果函数中要使用输入的容量,那么一定在调用函数之前将容量计算好再传入函数使用
//不要在函数中利用形参去计算数组容量!因为传递数组实际传递的是指针
GetArrayInfo(array1, length);
交换数组中的第一个和最后一个、第二个和倒数第二个,依次类推,把数组进行反转并打印
int array2[10];
//数组容量
length = sizeof(array2) / sizeof(int);
for (int i = 0; i < sizeof(array2) / sizeof(int); i++)
{
array2[i] = getRandom(0, 100);
cout << array2[i] << endl;
}
//要交换两个变量的值
//中间商不赚差价
/*int temp = array2[0];
array2[0] = array2[length - 1 - 0];
array2[length - 1 - 0] = temp;
temp = array2[1];
array2[1] = array2[length - 1 - 1];
array2[length - 1 - 1] = temp;
temp = array2[2];
array2[2] = array2[length - 1 - 2];
array2[length - 1 - 2] = temp;*/
cout << "******************" << endl;
for (int i = 0; i < length / 2; i++)
{
int temp = array2[i];
array2[i] = array2[length - 1 - i];
array2[length - 1 - i] = temp;
}
for (int i = 0; i < length; i++)
{
cout << array2[i] << endl;
}
将一个整数数组的每一个元素进行如下的处理:
如果元素是正数则将这个位置的元素值加1;
如果元素是负数则将这个位置的元素值减1;
如果元素是0,则不变
int array3[10];
//数组容量
length = sizeof(array3) / sizeof(int);
for (int i = 0; i < sizeof(array3) / sizeof(int); i++)
{
array3[i] = getRandom(-100, 100);
cout << array3[i] << endl;
}
cout << "******************" << endl;
for (int i = 0; i < length; i++)
{
if (array3[i] < 0)
array3[i] -= 1;
else if(array3[i] > 0)
array3[i] += 1;
cout << array3[i] << endl;
}
定义一个有10个元素的数组,使用for循环,输入10名同学的数学成绩,将成绩依次存入数组,然后分别求出最高分和最低分,并且求出10名同学的数学平均成绩
int arr[10];
//上面的练习题已经声明了 min max avg sum 我们直接用 就不去声明了
for (int i = 0; i < 10; i++)
{
try
{
cout << "请输入同学的数学成绩" << endl;
//根据玩家输入 转换为数字 存入到我们的数组中
string str;
cin >> str;
arr[i] = stoi(str);
//如果是第一次输入 那么认为最小最大都是它 相当于进行一个初始化
if (i == 0)
{
min = arr[i];
max = arr[i];
}
else
{
//记录最好和最坏成绩
if (arr[i] < min)
min = arr[i];
if (arr[i] > max)
max = arr[i];
}
//累加总分
sum += arr[i];
}
catch (const std::exception&)
{
cout << "请输入正确的数字" << endl;
}
}
//有了总分 就可以球平均值了
avg = sum / 10;
cout << "这次数学考试,最高分为" << max << ",最低分为" << min << ",平均分为" << avg << endl;
请声明一个string类型的数组 (长度为25)(该数组中存储着符号),通过遍历数组的方式取出其中存储的符号打印出以下效果
string strs[25];
for (int i = 0; i < 25; i++)
{
strs[i] = i % 2 == 0 ? "■" : "□";
/*if (i % 2 == 0)
strs[i] = "■";
else
strs[i] = "□";*/
if (i % 5 == 0 && i != 0)
cout << endl;
cout << strs[i];
}
//for (int i = 0; i < 25; i++)
//{
// if (i % 5 == 0 && i != 0)
// cout << endl;
// cout << strs[i];
//}
13.4 练习题代码
Lesson13_练习题.cpp
#include <iostream>
#include <string>
#include "CustomConsole.h"
using namespace std;
void GetArrayInfo(int array[], int length);
int main()
{
std::cout << "一维数组 练习题\n";
#pragma region 练习题一
//请创建一个一维数组并赋值,让其值与下标一样,长度为100
int array[100];
int l = sizeof(array) / sizeof(int);
for (int i = 0; i < l; i++)
{
array[i] = i;
cout << array[i] << endl;
}
#pragma endregion
#pragma region 练习题二
//创建另一个数组B,让数组A中的每个元素的值乘以2存入到数组B中
int arrayB[100];
for (int i = 0; i < 100; i++)
{
arrayB[i] = array[i] * 2;
//cout << arrayB[i] << endl;
}
#pragma endregion
cout << "******************" << endl;
#pragma region 练习题三
//随机(0~100)生成1个长度为10的整数数组
int array1[10];
for (int i = 0; i < sizeof(array1) / sizeof(int); i++)
{
array1[i] = getRandom(0, 100);
cout << array1[i] << endl;
}
#pragma endregion
cout << "******************" << endl;
#pragma region 练习题四
//从一个整数数组中找出最大值、最小值、总合、平均值
//(可以使用随机数1~100的数组)
int max = array1[0];//用于存储最大值的变量
int min = array1[0];//用于存储最小值的变量
int sum = 0;//用于存储总和的变量
float avg = 0;//用于存储平均值的变量
int length = sizeof(array1) / sizeof(int);//得到容量 方便一会儿计算平均值
for (int i = 0; i < length; i++)
{
//得到最大、最小
//如果当前元素比记录的最小值还小 那就更新最小值
if (array1[i] < min)
min = array1[i];
//如果当前元素比记录的最大值还大 那就更新最大值
if (array1[i] > max)
max = array1[i];
//计算总和
//就是所有元素加起来
sum += array1[i];
}
//计算平均值
// 总和 / 个数(容量)
avg = sum / (float)length;
cout << "最大值:" << max << "最小值:" << min << "总和:" << sum << "平均值:" << avg << endl;
#pragma endregion
#pragma region 练习题五
//写一个函数,求一个数组的总合、最大值、最小值、平均值
//目前没有学习后面知识之前,我们如果想要把数组作为函数参数
//那么如果函数中要使用输入的容量,那么一定在调用函数之前将容量计算好再传入函数使用
//不要在函数中利用形参去计算数组容量!因为传递数组实际传递的是指针
GetArrayInfo(array1, length);
#pragma endregion
cout << "********习题六**********" << endl;
#pragma region 练习题六
//交换数组中的第一个和最后一个、第二个和倒数第二个,依次类推,把数组进行反转并打印
int array2[10];
//数组容量
length = sizeof(array2) / sizeof(int);
for (int i = 0; i < sizeof(array2) / sizeof(int); i++)
{
array2[i] = getRandom(0, 100);
cout << array2[i] << endl;
}
//要交换两个变量的值
//中间商不赚差价
/*int temp = array2[0];
array2[0] = array2[length - 1 - 0];
array2[length - 1 - 0] = temp;
temp = array2[1];
array2[1] = array2[length - 1 - 1];
array2[length - 1 - 1] = temp;
temp = array2[2];
array2[2] = array2[length - 1 - 2];
array2[length - 1 - 2] = temp;*/
cout << "******************" << endl;
for (int i = 0; i < length / 2; i++)
{
int temp = array2[i];
array2[i] = array2[length - 1 - i];
array2[length - 1 - i] = temp;
}
for (int i = 0; i < length; i++)
{
cout << array2[i] << endl;
}
#pragma endregion
cout << "******************" << endl;
#pragma region 练习题七
/*将一个整数数组的每一个元素进行如下的处理:
如果元素是正数则将这个位置的元素值加1;
如果元素是负数则将这个位置的元素值减1;
如果元素是0,则不变*/
int array3[10];
//数组容量
length = sizeof(array3) / sizeof(int);
for (int i = 0; i < sizeof(array3) / sizeof(int); i++)
{
array3[i] = getRandom(-100, 100);
cout << array3[i] << endl;
}
cout << "******************" << endl;
for (int i = 0; i < length; i++)
{
if (array3[i] < 0)
array3[i] -= 1;
else if(array3[i] > 0)
array3[i] += 1;
cout << array3[i] << endl;
}
#pragma endregion
#pragma region 练习题八
//定义一个有10个元素的数组,使用for循环,输入10名同学的数学成绩,
//将成绩依次存入数组,然后分别求出最高分和最低分,并且求出10名同学的数学平均成绩
int arr[10];
//上面的练习题已经声明了 min max avg sum 我们直接用 就不去声明了
for (int i = 0; i < 10; i++)
{
try
{
cout << "请输入同学的数学成绩" << endl;
//根据玩家输入 转换为数字 存入到我们的数组中
string str;
cin >> str;
arr[i] = stoi(str);
//如果是第一次输入 那么认为最小最大都是它 相当于进行一个初始化
if (i == 0)
{
min = arr[i];
max = arr[i];
}
else
{
//记录最好和最坏成绩
if (arr[i] < min)
min = arr[i];
if (arr[i] > max)
max = arr[i];
}
//累加总分
sum += arr[i];
}
catch (const std::exception&)
{
cout << "请输入正确的数字" << endl;
}
}
//有了总分 就可以球平均值了
avg = sum / 10;
cout << "这次数学考试,最高分为" << max << ",最低分为" << min << ",平均分为" << avg << endl;
#pragma endregion
#pragma region 练习题九
//请声明一个string类型的数组 (长度为25)(该数组中存储着符号)
//通过遍历数组的方式取出其中存储的符号打印出以下国际象棋棋盘效果
string strs[25];
for (int i = 0; i < 25; i++)
{
strs[i] = i % 2 == 0 ? "■" : "□";
/*if (i % 2 == 0)
strs[i] = "■";
else12
strs[i] = "□";*/
if (i % 5 == 0 && i != 0)
cout << endl;
cout << strs[i];
}
//for (int i = 0; i < 25; i++)
//{
// if (i % 5 == 0 && i != 0)
// cout << endl;
// cout << strs[i];
//}
#pragma endregion
}
void GetArrayInfo( int array[], int length )
{
//传递的int array[] 实际上是传递了指针变量
int max = array[0];//用于存储最大值的变量
int min = array[0];//用于存储最小值的变量
int sum = 0;//用于存储总和的变量
float avg = 0;//用于存储平均值的变量
//int length = sizeof(array) / sizeof(int);
//不可以这样得到容量 应该多加一个参数 外部传入length
//因为array传递的是指针变量 得到的就不是数组的长度了
for (int i = 0; i < length; i++)
{
//得到最大、最小
//如果当前元素比记录的最小值还小 那就更新最小值
if (array[i] < min)
min = array[i];
//如果当前元素比记录的最大值还大 那就更新最大值
if (array[i] > max)
max = array[i];
//计算总和
//就是所有元素加起来
sum += array[i];
}
//计算平均值
// 总和 / 个数(容量)
avg = sum / (float)length;
cout << "最大值:" << max << "最小值:" << min << "总和:" << sum << "平均值:" << avg << endl;
}
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com