二维数组
二维数组就是在一维数组的基础上,多加一个维度
就是一维数组只有行的属性,二维数组比一维数组增加了一个列的属性,通常是以矩阵的形式呈现
二维数组的定义方式
1、数据类型 数组名[ 行数 ] [ 列数 ];
2、数据类型 数组名[ 行数 ] [ 列数 ] = { {1,2}, {3,4} };
3、数据类型 数组名[ 行数 ] [ 列数 ] = { 1,2,3,4 };
4、数据类型 数组名[][ 列数 ] = { 1,2,3,4 };
例如第一种方法
#include<iostream>
using namespace std;
int main()
{
int arr[3][3];
arr[0][0]=1; // 为数组元素赋值,第一个下标表示行,第二个下标表示列
arr[0][1]=2;
arr[0][2]=3;
arr[1][0]=4;
arr[1][1]=5;
arr[1][2]=6;
arr[2][0]=7;
arr[2][1]=8;
arr[2][2]=9;
cout<<arr[0][0]<<endl; // 访问数组元素,适合元素数量较少的情况
cout<<arr[0][1]<<endl; // 当元素数量过多时,可以使用嵌套for循环
cout<<arr[0][2]<<endl;
return 0;
}
第二种方法(代码可读性更强)
#include<iostream>
using namespace std;
int main()
{
int arr[3][3] = // 创建二维数组
{
{1,2,3},
{4,5,6},
{7,8,9}
};
for(int i=0;i<3;i++) // 遍历数组元素
{
for(int j=0;j<3;j++)
{
cout<<arr[i][j]<<endl;
}
}
return 0;
}
第三种方法
#include<iostream>
using namespace std;
int main()
{
int arr[3][3] = {1,2,3,4,5,6,7,8,9};
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
第四种方法
#include<iostream>
using namespace std;
int main()
{
int arr[][3] = {1,2,3,4,5,6,7,8,9}; // 计算机能自动识别出行数
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{
cout<<arr[i][j]<<" ";
}
cout<<endl;
}
return 0;
}
名称用途
1、查看二维数组所占内存空间
2、获取二维数组的首地址
用途1
#include<iostream>
using namespace std;
int main()
{
int arr[3][3]=
{
{1,2,3},
{4,5,6},
{7,8,9}
};
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;
return 0;
}
用途2
#include<iostream>
using namespace std;
int main()
{
int arr[3][3]=
{
{1,2,3},
{4,5,6},
{7,8,9}
};
cout<<"二维数组的首地址为:"<<arr<<endl;
cout<<"二维数组第一行的首地址为:"<<arr[0]<<endl;
cout<<"二维数组第一个数据的首地址为:"<<&arr[0][0]<<endl;
return 0;
}
案例
输出这三名学生的成绩
语文 | 数学 | 英语 | |
---|---|---|---|
李明 | 100 | 80 | 90 |
李华 | 90 | 100 | 80 |
小明 | 80 | 90 | 100 |
#include<iostream>
#include<string>
using namespace std;
int main()
{
int scores[3][3]= //创建二维数组
{
{100,80,90},
{90,100,80},
{80,90,100}
};
string name[3] = {"李明","李华","小明"}; //创建名字数组
for(int i=0;i<sizeof(scores)/sizeof(scores[0]);i++)
{
int sum=0; // 初始化总分变量
for(int j=0;j<sizeof(scores)/sizeof(scores[0]);j++)
{
sum+=scores[i][j];
}
cout<<name[i]<<"的总分为:"<<sum<<endl;
}
return 0;
}
函数
概述
作用:将一段经常使用的代码封装起来,减少重复代码,提高代码可读性
定义
函数定义一般有五个步骤:
1、函数返回值的类型
2、函数名称
3、参数列表
4、函数体语句
5、return表达式
具体到语法中为(伪代码):
返回值类型 函数名( 参数列表 )
{
函数体语句;
return表达式;
}
例子(传入两个整形数据,返回相加的结果)
#include<iostream>
using namespace std;
int add(int num1,int num2)
{
int sum=num1+num2;
return sum;
}
函数的调用
使用已经定义好的函数
#include<iostream>
using namespace std;
int add(int num1,int num2) // 形参
{
int sum=num1+num2;
return sum;
}
int main()
{
int a=10,b=20;
int c=add(a,b); // 实参
cout<<c<<endl;
return 0;
}
函数定义中小括号里面的参数是形参,函数调用时传入的参数是实参
函数的值传递
值传递就是函数在调用时实参将数值传入给形参
值传递的过程中形参改变也不会影响实参
void是空类型,当函数不需要返回值的时候可以使用
#include<iostream>
using namespace std;
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;
}
int main()
{
int a=1,b=2;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
swap(a,b);
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}
/*
运行结果如下所示,可知值传递的过程中,并没有改变a,b本身的值
a=1
b=2
交换前:
num1=1
num2=2
交换后:
num1=2
num2=1
a=1
b=2
*/
函数的声明
在函数定义之前,声明其存在
即把main()函数写到程序的最前方时,需要用到后续未写的函数时使编译器不报错
#include<iostream>
using namespace std;
int main()
{
int max(int a,int b); // 函数的声明,不写声明就调用的话会报错
int a=100,b=200;
cout<<"max="<<max(a,b)<<endl;
return 0;
}
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
// 或者使用三目运算符 return a>b?a:b;
}
函数的声明可以写很多次(但是写一次就足够了),但是定义只能定义一次
函数的分文件编写
作用:当代码量很大时,让代码结构更清晰
步骤:
1、创建后缀名为.h的头文件
2、创建后缀名为.cpp的源文件
3、在头文件中写函数声明
4、在源文件中写函数定义