c++从入门到放弃> <
C++ Day3 数组与函数
一、一维数组
- 数组:一个存放相同类型的数据元素的集合;
- 数组中每个数据元素都是
相同的数据类型
; - 数组由
连续的内存位置
组成; - 数组下标从0开始索引;
- 数组名不要和变量名相同;
1.1 定义方式
- 数据类型 数组名[数组长度];
- 数据类型 数组名[ ]={值1,值2,。。。};
- 数据类型 数组名[数组长度 ]={值1,值2,。。。};//不够长度用0填充
1.2 数组名
- 可以统计整个数组在内存中的长度;sizeof(数组名)
- 可以获取在数组在内存中的首地址;
#include<iostream>
using namespace std;
int main()
{
int arr1[]={1,2,3,4};
cout<< arr1<<endl;//查看数组的首地址
cout<< &arr1[0]<<endl;//查看数组中第一个元素地址
cout<< &arr1[1]<<endl;//查看数组中第二个元素地址
system("pause");
}
示例
- 最大值
#include<string>
#include<iostream>
using namespace std;
int main()
{
int arr2[]={100,700,500,250,350};
int lenarr2=sizeof(arr2)/sizeof(arr2[0]);//数组长度
int maxarr=0;
for(int i=0;i<lenarr2;i++)
{
if(arr2[i]>maxarr)
{
maxarr=arr2[i];
}
}
cout<<"最大值为"<<maxarr<<endl;
system("pause");
}
- 元素逆置
#include<string>
#include<iostream>
using namespace std;
int main()
{
int arr3[]={2,1,3,4,5};
int end=sizeof(arr3)/sizeof(arr3[0])-1;//数组从0开始索引
int start=0;
while(start<end)
{
int temp=arr3[start];
arr3[start]=arr3[end];
arr3[end]=temp;
start++;
end--;
}
for(int i=0;i<5;i++)
{
cout<<arr3[i]<<endl;
}
system("pause");
}
1.3冒泡排序
- 作用:对数组内的元素进行排序
步骤:
- 比较相邻的两个元素,如果第一个比第二个大就交换他们;
- 对数组中的每个元素执行第一步,最大值像气泡一样被放在比较的最后一位;
- 重复1.2但每次比较次数-1;
#include<string>
#include<iostream>
using namespace std;
int main()
{
int arr1[]={5,4,2,1,3,6,7,9,8};
//冒泡排序
int len=sizeof(arr1)/sizeof(arr1[0]);//数组长度
for (int i =len-1;i>=0;i--)//外层循环每次循环次数减一
{
for(int k=0;k<i;k++)
{
if(arr1[k]>arr1[k+1]) //找到第1/2/3.。个最大值放在数组最后1/2/3.。位
{
int temp=arr1[k];
arr1[k]=arr1[k+1];
arr1[k+1]=temp;
}
}
}
for(int i=0;i<len;i++)
{
cout<<arr1[i]<<endl;
}
system("pause");
}
二、二维数组
- 在一维数组的基础上多加了一个维度;
2.1.定义方式
- 数据类型 数组名[行数][列数];
- 数据类型 数组名[行数][列数]={{值1,值2},{值3,值4}}; //
推荐直观
- 数据类型 数组名[行数][列数]={值1,值2,值3.。};//自动划分行列
- 数据类型 数组名[ ][列数]={值1,值2,值3.。};//
可以省略行数但要有列数
2.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;
三、函数
-将经常使用的代码封装起来,减少重复代码
3.1函数的定义
步骤:
- 返回值类型;//不需要返回值声明void
- 函数名;
- 参数列表;
- 函数体语句;
- return表达式
int add(int num1,int num2)//num1和num2为形参没有真实数据
{
int sum=num1+num2;
return sum;
}
3.2 函数的调用
- 使用定义好的函数
- 语法:函数名(参数)
3.3值传递
- 当函数调用的时候,实参的值会传递给形参;
- 值传递时,
形参发生改变不会影响实参
#include<string>
#include<iostream>
using namespace std;
void swap(int num1,int num2)
{
int temp=num1;
num1=num2;
num2=temp;
cout<< "num1: "<<num1<<endl;
cout<< "num2: "<<num2<<endl;
}
int main()
{
int a=10;
int b=20;
swap(a,b);
cout<<"a: "<< a<<endl;
cout<< "b: "<<b<<endl; //a b 不发生改变
system("pause");
}
3.4 常见样式
- 有参有返
- 有参无返
- 无参无返
- 无参有返
3.5 函数的声明
可以声明多次,只能定义一次
;- 一般函数定义在main函数之前;若在main函数之后则应先声明存在该函数;
void swap(int num1,int num2);//声明
void swap(int num1,int num2);//声明可以多次
int main()
{
int a=10;
int b=20;
swap(a,b);
cout<<"a: "<< a<<endl;
cout<< "b: "<<b<<endl;
system("pause");
}
void swap(int num1,int num2) //定义只能有一次
{
int temp=num1;
num1=num2;
num2=temp;
cout<< "num1: "<<num1<<endl;
cout<< "num2: "<<num2<<endl;
}
3.6 函数的分文件编写
- 使代码的结构更加清晰;
- 创建后缀名为.h的头文件;
- 创建后缀名为.cpp的源文件;
- 在头文件中写函数的声明;
- 在源文件中写函数的定义;
引用自定义文件要用""不是<>
1.day3.h
void swap(int num1,int num2);//声明
#include<iostream>
using namespace std;
2.day3.cpp:
#include"day3.h" //自定义文件要用""不是<>
int main()
{
int a=10;
int b=20;
swap(a,b);
cout<<"a: "<< a<<endl;
cout<< "b: "<<b<<endl;
system("pause");
}
void swap(int num1,int num2) //定义
{
int temp=num1;
num1=num2;
num2=temp;
cout<< "num1: "<<num1<<endl;
cout<< "num2: "<<num2<<endl;
}