一、一维数值数组
1. 一维数值数组的概述
用一段连续空间存放相同类型的变量,这样的容器(结构)叫做数组
数组的下标是从0开始的
假设数组有n个元素:下标范围:0 — n-1
元素范围:arr [0] — arr [n-1]
2. 一维数值数组的定义
定义的步骤:数组名和 [ ] 表示数组,将数组数值的个数放入 [ ] 里面,用元素的类型定义一个变量,从上往下替换
案例1:定义一个数组,有五个元素,每个元素为int
// 步骤1:数组名和[]表示数组
arr[]
// 步骤2:将数组数值个数放入[]里面
arr[5]
// 步骤3:用元素的类型定义一个变量
int a
// 从上往下替换: arr[5] 替换 a
int arr[5]
案例2:定义一个数组,有五个元素,每个元素为int *
// 步骤1:数组名和[]表示数组
arr[]
// 步骤2:将数组数值个数放入[]里面
arr[5]
// 步骤3:用元素的类型定义一个变量
int *a
// 从上往下替换: arr[5] 替换 a
int *arr[5]
案例3:定义一个数组,有5个元素,每个元素为数组,该数组有10个元素每个元素为int
// 步骤1:数组名和[]表示数组
arr[]
// 步骤2:将数组数值个数放入[]里面
arr[5]
// 步骤3:用元素的类型定义一个变量
int arr1[10]
// 从上往下替换: arr[5] 替换 arr1
int arr[5][10]
案例4:定义一个数组,有5个元素,每个元素为函数的入口地址,该函数有两个int型形参,int类型返回值
// 步骤1:数组名和[]表示数组
arr[]
// 步骤2:将数组数值个数放入[]里面
arr[5]
// 步骤3:用元素的类型定义一个变量
int *func(int,int)
// 从上往下替换: arr[5] 替换 func
int (*arr[5])(int,int)]
数组的大小 = 元素的个数 * 每个元素的大小
// 数组的总大小
sizeof(arr)
// 元素的大小
sizeof(arr[0])
// 元素的个数
sizeof(arr)/sizeof(arr[0])
不管几维数组,数值数组必须逐个元素访问
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int arr[5] = {1,2,3,4,5};
for(int i=0;i<5;i++)
{
cout << arr[i] << ' ';
}
cout << endl;
return 0;
}
3. 一维数值数组的初始化
(1) 全部元素初始化
int arr[5] = {10,20,30,40,50};
注意:如果数组的全部元素都初始化,可以省略 [ ] 里的数字
如果省略了 [ ] 里的数字,数组的元素个数就由初始化的元素个数确定
int arr[] = {10,20,30,40,50};
(2) 部分元素初始化
未被初始化的部分自动补零
int arr[5] = {10,20,30;
(3) 建议将数组所有元素都初始化为0
int arr[5] = {0};
4. 一维数值数组的元素操作
(1) 元素的操作(对元素的读或写)
必须逐个元素进行操作
数组的每个元素等价于变量
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int arr[5] = {0};
int n = sizeof(arr)/sizeof(arr[0]);
// num取值
cout << arr[2] << endl;
// num赋值
arr[1] = 10;
// data=num
arr[2] = arr[1] + 10;
// num++
arr[3] = 30;
arr[3]++;
for(int i=0;i<n;i++)
{
cout << arr[i] << ' ';
}
cout << endl;
return 0;
}
(2) 键盘给数组元素获取输入
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int arr[5] = {0};
int n = sizeof(arr)/sizeof(arr[0]);
cout << "请输入5个整型数字:";
for(int i=0;i<n;i++)
{
cin >> arr[i];
}
cout << "输入的5个整型数字:";
for(int i=0;i<n;i++)
{
cout << arr[i] << ' ';
}
cout << endl;
return 0;
}
(3) 案例:键盘输入10个int数,求这十个数的最大值和最小值
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int arr[5] = {0};
int max = 0;
int min = 0;
int n = sizeof(arr)/sizeof(arr[0]);
cout << "请输入5个整型数字:";
for(int i=0;i<n;i++)
{
cin >> arr[i];
if(i==0)
{
max = arr[i];
min = arr[i];
}
// 比大小(运用三目运算符比较简单,可不使用if)
max = max<arr[i]?arr[i]:max;
min = min>arr[i]?arr[i]:min;
}
cout << "max = " << max << endl;
cout << "min = " << min << endl;
return 0;
}
二、二维数值数组
1. 二维数值数组的概述
int arr[3][4]
二维数组第一个 [ ] 里的数值表示行标,第二个 [ ] 里的数值表示列标
行标和列标都是从0开始的
二维数组:数组的数组
二维数组的总大小 = 行数 * 列数 * 每个元素的大小
数组的总大小 = sizeof(arr)
行数:sizeof(arr)/sizeof(arr[0])
列数:sizeof(arr[0])/sizeof(arr[0][0])
2. 二维数值数组的初始化
(1) 分段初始化
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
// 完全初始化
int arr1[3][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
// 如果完全初始化,只能省略行数
int arr2[][4] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
// 部分初始化
int arr3[3][4] = {{1,2},{5,6},{9,10,11}};
for(int i=0;i<3;i++)
{
cout << "第" << i+1 << "行: ";
for(int j=0;j<4;j++)
{
cout << arr1[i][j] << ' ';
}
cout << endl;
}
cout << "------------------" << endl;
for(int i=0;i<3;i++)
{
cout << "第" << i+1 << "行: ";
for(int j=0;j<4;j++)
{
cout << arr2[i][j] << ' ';
}
cout << endl;
}
cout << "------------------" << endl;
for(int i=0;i<3;i++)
{
cout << "第" << i+1 << "行: ";
for(int j=0;j<4;j++)
{
cout << arr3[i][j] << ' ';
}
cout << endl;
}
return 0;
}
(2) 连续初始化
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
// 完全初始化
int arr1[3][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
// 如果完全初始化,只能省略行数
int arr2[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};
// 部分初始化
int arr3[3][4] = {1,2,5,6,9,10,11};
for(int i=0;i<3;i++)
{
cout << "第" << i+1 << "行: ";
for(int j=0;j<4;j++)
{
cout << arr1[i][j] << ' ';
}
cout << endl;
}
cout << "------------------" << endl;
for(int i=0;i<3;i++)
{
cout << "第" << i+1 << "行: ";
for(int j=0;j<4;j++)
{
cout << arr2[i][j] << ' ';
}
cout << endl;
}
cout << "------------------" << endl;
for(int i=0;i<3;i++)
{
cout << "第" << i+1 << "行: ";
for(int j=0;j<4;j++)
{
cout << arr3[i][j] << ' ';
}
cout << endl;
}
return 0;
}
案例:arr1[1][2] + arr2[1][2] 结果是(11)
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int arr1[3][4] = {{1,2},{5,6},{9,10,11}};
int arr2[3][4] = {1,2,5,6,9,10,11};
cout << "result = " << arr1[1][2] + arr2[1][2] << endl;
return 0;
}
3. 二位数值数组的元素操作
(1) 二位数值数组获取键盘输入
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int arr[3][4] = {0};
int row = sizeof(arr)/sizeof(arr[0]);
int col = sizeof(arr[0])/sizeof(arr[0][0]);
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
cin >> arr[i][j];
}
}
cout << "-----------" << endl;
for(int i=0;i<row;i++)
{
for(int j=0;j<col;j++)
{
cout << arr[i][j] << ' ';
}
cout << endl;
}
return 0;
}
(2) 求出每个人的平均成绩
语文 | 数学 | 化学 | 物理 | |
老大 | 56 | 75 | 78 | 89 |
老二 | 89 | 98 | 76 | 67 |
老三 | 88 | 99 | 77 | 66 |
老四 | 67 | 78 | 89 | 90 |
老五 | 98 | 97 | 96 | 95 |
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
int grade[5][4] = {{56,75,78,89},
{89,98,76,67},
{88,99,77,66},
{67,78,89,90},
{98,97,96,95}};
float ave[5] = {0.0f};
float num = 0.0f;
int row = sizeof(grade)/sizeof(grade[0]);
int col = sizeof(grade[0])/sizeof(grade[0][0]);
for(int i=0;i<row;i++)
{
num = 0;
for(int j=0;j<col;j++)
{
num += grade[i][j];
}
ave[i] = num/col;
}
for(int i=0;i<col;i++)
{
cout << ave[i] << endl;
}
return 0;
}
三、一维字符数组
1. 一维字符数组的初始化
(1) 逐个元素初始化(不推荐)
char arr[5] = {'h','e','l','l','o'};
(2) 字符串的方式初始化一维字符数组(推荐)
" " 描述的是字符串,比如字符串 "hello" ,编译器会自动在字符串末尾添加 '\0' 字符作为字符串的结束标记
char arr[6] = "hello";
两种初始化的区别:1. 'h' 'e' 'l' 'l' 'o'
2. 'h' 'e' 'l' 'l' 'o' '\0'
2. 字符数组的遍历
(1) 使用循环方式逐个遍历(逐个字符操作)
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char arr[6] = "hello";
int l = sizeof(arr);
for(int i=0;i<l;i++)
{
cout << arr[i];
}
return 0;
}
(2) 使用cout直接输出字符串
需要字符数组的组名,遇到 '\0' 才结束(遍历字符串)
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char arr1[6] = "hello";
char arr2[] = "hel\0lo";
cout << arr1 << endl; // hello
cout << arr2 << endl; // hel
return 0;
}
3. 键盘获取字符串
(1) cin获取字符串,遇到空格和回车结束输入
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char str[20] = "";
cout << "请输入字符串:";
cin >> str; // hello world
cout << "输入的字符串为:" << str << endl; // hello
return 0;
}
(2) cin.getline获取带空格的字符串
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char str[20] = "";
cout << "请输入字符串:";
cin.getline(str,sizeof(str)); // hello world
cout << "输入的字符串为:" << str << endl; // hello world
return 0;
}
四、二维字符数组
char arr[5][128] = {"hello","C++","你好","C++","I am Python"};
1. 遍历二维字符数组
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char arr[5][128] = {"hello","C++","你好","C++","I am Python"};
int row = sizeof(arr)/sizeof(arr[0]);
for(int i=0;i<row;i++)
{
cout << arr[i] << endl;
}
return 0;
}
2. 二位字符数组获取键盘输入
获取不带空格的字符串
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char arr[5][32] = {""};
int row = sizeof(arr)/sizeof(arr[0]);
cout << "请输入5个字符串:";
for(int i=0;i<row;i++)
{
cin >> arr[i];
}
for(int i=0;i<row;i++)
{
cout << arr[i] << endl;
}
return 0;
}
获取带空格的字符串
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
char arr[5][32] = {""};
int row = sizeof(arr)/sizeof(arr[0]);
cout << "请输入5个字符串:" << endl;
for(int i=0;i<row;i++)
{
cin.getline(arr[i],sizeof(arr[i]));
}
for(int i=0;i<row;i++)
{
cout << arr[i] << endl;
}
return 0;
}
五、函数
1. 函数的介绍
(1)函数的概述
函数是C++语言的功能单位,实现一个功能可以封装一个函数来实现
定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值
需要传哪些数据给函数?(实参)
函数的功能代码(函数体)如何实现?
函数需要返回啥类型的数据?(函数的返回值类型)
(2)函数的分类(定义角度)
库函数(C++语言库),自定义函数,系统调用(内核提供给用户的函数接口)
(3)函数的分类(有无参数)
无参的函数:不能将函数外部的数据传递给函数内部
有参的函数:通过参数将函数外部的数据传递到函数内部
参数:函数外部到函数内部的桥梁
2. 函数定义、声明、调用
(1)函数的定义
实现函数体,确认函数名,函数的形参,函数的返回值类型
// 函数的定义 定义处的x,y叫做形参(函数定义时不会为形参开辟空间)
// 只有当函数调用的时候,才会为形参开辟空间,保存实参的值
int my_add(int x,int y)
{
// return 返回函数的运算结果,结束当前函数
return x + y;
}
(2)函数的声明
一般先调用函数后定义函数,需要提前进行函数声明
函数声明:告知编译器该函数的函数名是什么,有几个形参,返回值类型是什么
// 函数声明 告知编译器,如果遇到my_add,有两个int形参,以及一个int返回值类型
// 请通过编译
// int my_add(int,int); // OK但不推荐
int my_add(int x, int y);
(3)函数的调用
执行函数体,一般调用格式是:函数名(实参);
#include <iostream>
using namespace std;
// 函数声明
int my_add(int x, int y);
int main(int argc, char *argv[])
{
// 定义实参 data1 和 data2
int data1 = 10;
int data2 = 20;
// 定义一个变量接受函数返回值
int res = 0;
// 调用函数,并用res接受函数返回值
res = my_add(data1,data2);
cout << data1 << '+' << data2 << '=' << res << endl;
return 0;
}
// 函数定义,形参是x和y,返回值是int类型
int my_add(int x, int y)
{
// return返回函数运算结果,结束当前函数
return x + y;
}
3. 函数的参数
(1)普通变量作为函数的参数
函数内部需要使用外部变量的值需要将外部变量的值传递给内部函数。这是普通变量就作为函数的形参
(2)数值数组作为函数的参数
函数内部可以操作(读写)外部数组的元素
#include <iostream>
using namespace std;
// 声明函数
void arrInput(int arr[], int n);
void arrSort(int arr[], int n);
void arrPrint(int arr[], int n);
int main(int argc, char *argv[])
{
int arr[5] = {0};
int n = sizeof(arr)/sizeof(arr[0]);
// 数组输入函数
arrInput(arr, n);
// 数组从小到大排序函数
arrSort(arr, n);
// 数组输出函数
arrPrint(arr, n);
return 0;
}
// 定义函数
void arrInput(int arr[], int n)
{
cout << "请输入5个int类型的数据:";
for(int i=0;i<n;i++)
{
cin >> arr[i];
}
return;
}
void arrSort(int arr[], int n)
{
for(int i=0;i<n-1;i++)
{
for(int j=0,num=0 ;j<n5-1;j++)
{
if(arr[j]>arr[j+1])
{
num = arr[j];
arr[j] = arr[j+1];
arr[j+1] = num;
}
}
}
return;
}
void arrPrint(int arr[], int n)
{
for(int i=0;i<n;i++)
{
cout << arr[i] << ' ';
}
cout << endl;
return;
}
(3)字符数组作为函数的参数
#include <iostream>
using namespace std;
// 声明函数
void strGet(char str[], int n);
int strLen(char str[]);
int main(int argc, char *argv[])
{
char str[100] = "";
// 调用键盘获取字符串的函数
strGet(str,sizeof(str));
// 调用测量字符串长度的函数
cout << "字符串的长度是:" << strLen(str) << endl;
return 0;
}
// 定义函数
void strGet(char str[], int n)
{
cout << "请输入一个字符串:";
cin.getline(str,n);
return;
}
int strLen(char str[])
{
int len = 0;
while(str[len]!='\0')
{
len++;
}
return len;
}