一、数组
1、定义:就是一个集合,里面存放了相同类型的元素
2:特点:每个元素数据类型相同;数组由连续的内存位置组成
3、作用:打包数据,便于取用和管理
二、一维数组
1、定义方式:数据类型 数组名[数组长度];
数据类型 数组名[数组长度]={值1,值2......} 常用,不易出错
数据类型 数组名[]={值1,值2......}
注意:索引下标从0开始,初始未写元素必须定义数组长度(否则未定义);若写了可以不用定义长度,定义了长度但是元素未写全则默认为0,没定义根据有多少元素长度默认为多少。
#include<iostream>
using namespace std;
int main()
{
int arr[5] = { 10,20,30,40,50 };
//利用循环输出数组中的元素
for (int i = 0; i < 5; i++)//5代表个数
{
cout << arr[i] << " ";
}
}
若没有赋值完全,后几个元素由零补充
#include<iostream>
using namespace std;
int main()
{
int arr[5] = { 10,20,30 };
//利用循环输出数组中的元素
for (int i = 0; i < 5; i++)//5代表个数
{
cout << arr[i] << " ";
}
}
2、数组名的作用
1)统计整个数组内存中的长度 sizeof()
2)获取数组在内存中的首地址
#include<iostream>
using namespace std;
int main()
{
int arr[5] = { 10,20,30,40,50 };
cout <<"整个数组所占内存大小"<<sizeof(arr) << endl;//整个数组的内存大小
cout << "数组中第一个元素所占内存大小"<<sizeof(arr[0]) << endl;//某个元素的内存大小
cout << "元素个数" << sizeof(arr) / sizeof(arr[0]) << endl;//根据上述结果得到元素个数(第三种定义方式时方便查看)
cout << "数组内存地址"<<arr << endl;//打印数组内存首地址
cout << "数组第一个元素的地址为:" << &arr[0] << endl;
}
运行结果:
注意:数组的首地址与数组中第一个元素位置重合。由于定义为int型,第二个元素地址与第一个元素地址差4个字节。数组名是常量,不可以进行赋值操作,eg:arr=100不可以。
3、案例:五只小猪称体重,打印最重的小猪体重
思路:用数组定义五只小猪体重;用if语句比较小猪的体重(数组中取出元素)得到最重的。
#include<iostream>
using namespace std;
int main()
{
int arr[5] = { 100,200,350,260,130 };
if (arr[0] > arr[1])
{
if (arr[0] > arr[2])
{
if (arr[0] > arr[3])
{
if (arr[0] > arr[4])
{
cout << "最重的小猪重量" << arr[0] << endl;
}
}
}
}
else
{
if (arr[1] > arr[2])
{
if (arr[1] > arr[3])
{
if (arr[1] > arr[4])
{
cout << "最重的小猪重量" << arr[1] << endl;
}
}
}
else
{
if (arr[2] > arr[3])
{
if (arr[2] > arr[4])
{
cout << "最重的小猪重量" << arr[2]<<endl;
}
}
else
{
if (arr[3] > arr[4])
{
cout << "最重的小猪重量" << arr[3] << endl;
}
else
{
cout << "最重的小猪重量" << arr[4] << endl;
}
}
}
}
}
上述复杂了
优化:定义最大值,取一元素与最大值比较,更新最大值;将剩下元素与最大值比较然后更新最大值,最终的最大值几位最重小猪体重。
#include<iostream>
using namespace std;
int main()
{
int arr[5] = { 100,200,350,260,130 };
int max = 0;//先认定一个最大值
for (int i = 0; i < 5; i++)
{
if (arr[i] > max)
{
max = arr[i];
}
}
cout << "最重小猪体重" << max << endl;
}
2)数组元素逆置
#include<iostream>
using namespace std;
int main()
{
int arr[] = { 10,20,30,40,50,130,450,23,13,3,54};
int num;
int b;//创建临时内存,实现互换
num = sizeof(arr) / sizeof(arr[0]);//数组的个数
if (num / 2 == 0)
{
for (int i = 0; i < num / 2; i++)
{
b = arr[i];
arr[i] = arr[(num - 1) - i];//num-1为末尾下标
arr[(num - 1) - i] = b;
}
for (int j = 0; j < num ; j++)
{
cout << arr[j]<<" ";
}
}
else
{
for (int i = 0; i < (num - 1) / 2; i++)
{
b = arr[i];
arr[i]=arr[(num - 1) - i];
arr[(num - 1) - i] = b;
}
for (int j = 0; j < num ; j++)
{
cout << arr[j]<<" ";
}
}
}
以上为我写,导致任意数组。
视频中,老师的优化
#include<iostream>
using namespace std;
int main()
{
int arr[5] = { 1,2,3,4,5 };
int start = 0;//起始下标
int end = sizeof(arr) / sizeof((arr[0]))-1;//结束下标
while (start < end)
{
int temp = arr[start];
arr[start] = arr[end];
arr[end] = temp;//实现元素互换
start++;
end--;
}
for (int i = 0; i < 5; i++)
{
cout << arr[i] << " ";
}
}
3)冒泡排序*****
1、比较相邻的元素,如果第一个比第二个大,就交换他们
2、对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值
3、重复以上步骤,每次比较次数-1,直到不需要比较
#include<iostream>
using namespace std;
int main()
{
int arr[] = {1,15,8,90,23,34,12,3,4};
int num;
num = sizeof(arr) / sizeof(arr[0]);
int temp ;
for (int i = 0; i < num-1; i++)
{
for (int j = 0; j < num - i-1; j++)
{
if (arr[j] > arr[j + 1])
{
temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int k = 0; k < num; k++)
{
cout << arr[k] << " ";
}
}
遇到的错误:j < num - i-1写成了num-i,程序运行不了。原因:下标从0开始,当循环条件是<没有=时,循环次数就是下标数字。上述程序若写成num-i,那么第一轮,就会循环0-8即9次,而我们只需要循环8次,相邻元素比较。
注意:下标和元素个数的关系。下标是从0开始