数组是一个集合,里面存放了相同类型的数据元素,数组中的元素被存储在一段连续的内存空间中。
特点1:数组中的每个数据元素都是相同的数据类型;特点2:数组是由连续的内存位置组成的。
数组定义的3种形式如下
//数组定义1
//数据类型 数组名[ 数组长度 ]; `
int arr1[10];
//利用下标赋值
arr1[0] = 100;
arr1[1] = 99;
arr1[2] = 85;
//通常使用for循环进行输出
for (int i = 0; i < 3; i++){
cout << arr1[i] << endl;
}
//数组定义2
//数据类型 数组名[ 数组长度 ] = { 值1,值2 ...};
int arr2[5] = {1,2,3,4,5};
for (int i = 0; i < 5; i++){
cout << arr2[i] << endl;
}
//数组定义3
//数据类型 数组名[ ] = { 值1,值2 ...};`
int arr3[] = { 10,20,30,40,50,60,70};
for (int i = 0; i < 7; i++){
cout << arr3[i] << endl;
}
//数组名用途
//1、可以通过数组名统计整个数组占用的内存大小
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
cout << "整个数组占用内存空间: " << sizeof(arr) << endl;
cout << "一个数组元素占用内存空间: " << sizeof(arr[0]) << endl;
cout << "数组中元素的个数为: " << sizeof(arr)/ sizeof(arr[0]) << endl;
//2、可以通过数组名查看数组首地址
cout << "数组首地址: " << (int)arr << endl;
cout << "数组中的第一个元素地址为:" << (int)&arr[0] << endl;
cout << "数组中的第二个元素地址为:" << (int)&arr[1] << endl;
// 数组名是常量,不可以进行赋值操作 数组名指向一个地址了
//arr = 100;
在一个数组中记录了五只小猪的体重,如:int arr[5] = {300, 350, 200, 400, 250};找出并打印最重的小猪体重。
int max = 0;
int arr[5] = { 300,350,200,400,250 };
for (int i = 0; i < 5; i++)
{
if (arr[i] > max){
max = arr[i];
}
}
cout<< "最大的小猪体重是:" << max << endl;
请声明一个5个元素的数组,并且将元素逆置。(如原数组元素为:1, 3, 2, 5, 4;逆置后输出结果为:4,5,2,3,1)。
利用首尾下标作为while循环的判断条件来进行排序。
int arr[5] = { 1,3,2,5,4 };
cout << "数组元素逆置前:" << endl;
for (int i = 0; i < 5; i++){
cout << arr[i] << " ";
}
cout << endl; //输出换行
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--;
//单数最后两个参数会相等,刚好剩余一个不交换
//双数最后刚好交换后 两参数不相等
}
cout << "数组元素逆置后:" << endl;
for (int i = 0; i < 5; i++){
cout << arr[i] << " ";
}
cout << endl;
最常用的排序算法,对数组内元素进行排序。
(1)内层循环比较相邻的元素。如果第一个比第二个大,就交换他们两个。
(2)对每一对相邻元素做同样的工作,执行完毕后,找到第一个最大值。
(3)重复以上的步骤,每次比较次数-1,直到不需要比较
int arr[] = { 2,4,0,5,7,1,3,8,9 };
//开始冒泡排序
//总共排序轮数为元素个数 - 1
for (int i = 0; i < (sizeof(arr) / sizeof(arr[0]) - 1); i++)
{
//内层循环对比 次数 = 元素个数 - 当前轮数(第0轮开始算起的) - 1
for (int j = 0; j < (sizeof(arr) / sizeof(arr[0])) - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
//二维数组定义的四种方式:
/*1.数据类型 数组名[行数][列数];
2.数据类型 数组名[行数][列数] = { {数据1,数据2 } ,{数据3,数据4 } };
3.数据类型 数组名[行数][列数] = { 数据1,数据2,数据3,数据4 };
4.数据类型 数组名[][列数] = { 数据1,数据2,数据3,数据4 }; */
//2.常用 数据类型 数组名[行数][列数] = { {数据1,数据2 } ,{数据3,数据4 } };
int arr[2][3] =
{
{1,2,3},
{4,5,6}
};
for (int i = 0; i < 2; i++){
for (int j = 0; j < 3; j++){
cout << arr[i][j] << " ";
}
cout << endl;
} //整行注释ctrl+shift+/
//3.数据类型 数组名[行数][列数] = { 数据1,数据2,数据3,数据4 };
int arr1[2][3] = { 1, 2, 3, 4, 5 };
for (int i = 0; i < 2; i++){
for (int j = 0; j < 3; j++){
cout << arr1[i][j] << " ";
}
cout << endl;
}
/*二维数组名称用途
1 可以查看内存大小
2 可以查看二维数组的首地址*/
int arr[2][3] =
{
{1,2,3},
{4,5,6}
};
cout << "二维数组占用内存空间:" << sizeof(arr) << endl;
cout << "二维数组第一行占用内存空间:" << sizeof(arr[0]) << endl;
cout << "二维数组第一个元素占用内存空间:" << sizeof(arr[0][0]) << endl;
cout << "二维数组行数为:" << sizeof(arr)/sizeof(arr[0]) << endl;
cout << "二维数组列数为:" << sizeof(arr[0])/ sizeof(arr[0][0]) << endl;
cout << "二维数组的首地址为:" << (int)arr << endl;
cout << "二维数组第一行首地址为:" << (int)arr[0] << endl;
cout << "二维数组第二行首地址为:" << (int)arr[1] << endl;
cout << "二维数组第一个元素的首地址为:" << (int)&arr[0][0] << endl;
cout << "二维数组第二个元素的首地址为:" << (int)&arr[0][1] << endl;
案例描述:有三名同学(张三,李四,王五),在一次考试中的成绩分别如下表,请分别输出三名同学的总成绩
语文 | 数学 | 英语 | |
---|---|---|---|
张三 | 99 | 98 | 97 |
李四 | 90 | 59 | 90 |
王五 | 60 | 75 | 80 |
int scores[3][3] =
{
{99, 98, 97},
{90, 59, 90},
{60, 75, 80}
};
string names[3] = { "张三","李四","王五" };
for (int i = 0; i < 3; i++)
{
int sum = 0; //统计每个人的总分数
for (int j = 0; j < 3; j++){
sum += scores[i][j];
}
cout << names[i] << "的成绩是:" << sum << endl;
}
作用:将一段经常使用的代码封装起来,减少重复代码一个较大的程序,一般分为若干个程序块,每个模块实现特定的功能。
函数定义里小括号内称为形参,函数调用时传入的参数称为实参。
函数的定义
返回值类型 函数名 参数列表
{
?函数体语句
?return 表达式
}
int add(int num1, int num2)
{
//num1 num2并没用真实数据,其为形参
int sum = num1 + num2;
return sum;
}
int main()
{
int a = 10;
int b = 20;
//a b为实参
int c = add(a, b); //c接收的是add函数的返回值sunm 即 c = sum;
cout << "结果是:" << c << endl;
system("pause");
return 0;
}
void swap(int num1, int num2)
{
cout << "交换前:" << endl;
cout << "num1 = " << num1 <<endl;
cout << "num2 = " << num2 << endl;
int temp = num1;
num1 = num2;
num2 = temp;
cout << "交换后:" << endl;
cout << "num1 = " << num1 << endl;
cout << "num2 = " << num2 << endl;
//return:返回值不需要的时候,可以不用
}
int main()
{
int a = 10;
int b = 20;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
//当我们做值转递的时候,函数的形参发生改变,并不会影响实参
swap(a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
system("pause");
return 0;
}
系统分别为实参a,b分别开辟空间,而进行函数调用时,也会为形参num1、num2开辟空间并拷贝a,b的值。因此最后输出的a,b并不会由于形参改变而改变。
常见的函数样式有4种。
1 无参数无返回值
2 有参数无返回值
3 无参数有返回值
4 有参数有返回值
//1 无参无返
void test01()
{
cout << "this is test01 " << endl;
}
//2 有参无返
void test02(int a)
{
cout << "this is test02 a = " << a << endl;
}
//3 无参有返
int test03()
{
cout << "this is test03 " << endl;
return 10;
}
//4 有参有返
int test04(int a)
{
cout << "this is test04 a = " << a << endl;
return a;
}
int main()
{
test01();
test02(10);
int num1 = test03();
cout << "num1 = " << num1 << endl;
int num2 = test04(100);
cout << "num2 = " << num2 << endl;
system("pause");
return 0;
}
作用:告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。 函数的声明可以多次,但是函数的定义只能有一次。
//函数声明可以多次,定义只能一次
//函数声明 后面加逗号
int max(int a, int b);
int max(int a, int b);
//函数定义
int max(int a, int b)
{
return a > b ? a : b;
}
int main() {
int a = 100;
int b = 200;
cout << max(a, b) << endl;
system("pause");
return 0;
}
函数分文件编写一般有4个步骤
//swap.h文件
#include<iostream>
using namespace std;
//实现两个数字交换的函数声明
void swap(int a, int b);
//swap.cpp文件
#include "swap.h"
void swap(int a, int b)
{
int temp = a;
a = b;
b = temp;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
}
//main函数文件
#include "swap.h"
int main() {
int a = 100;
int b = 200;
swap(a, b);
system("pause");
return 0;
}