1,概述
所谓数组,就是一个集合,里面存放了相同类型的数据元素
特点1:数组中没干过数据元素都是相同的数据类型
特点2:数组都是连续存放位置组成的
2,一维数组
2.1 一维数组的定义
一维数组定义有三种方式:
1,数据类型 数组名【数组长度】;
2,数据类型 数组名[数组长度] = {值1,值2....}
3,数据类型 数组名[ ] = {值1,值2};
示例一:
int main()
{//1,数据类型 数组名[ 数组长度 ]int arr[5];//给数组每个元素赋值arr[0] = 10;arr[1] = 20;arr[2] = 30;arr[3] = 40;arr[4] = 50;//访问数据元素cout << arr[0] << endl;cout << arr[1] << endl;cout << arr[2] << endl;cout << arr[3] << endl;cout << arr[4] << endl;system("pause");return 0;
}
示例二:
int main()
{//2,数据类型 数组名[数组长度] = {值1,值2....};int arr2[5] = { 10,20,30,40,50 };for (int i = 0; i < 5; i++){cout << arr2[i] << endl;}system("pause");return 0;
}
示例三:
int main()
{//3,数据类型 数组名[] = { 值1,值2 };int score3[] = { 100,90,80,70,60,50,40,30,20,10 };for (int i = 0; i < 10; i++){cout << score3[i] << endl;}system("pause");return 0;
}
2.2 一维数组的用途
int main()
{//数组名用途//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 << "数组中第一个元素地址为:" << &arr[0] << endl;cout << "数组中第二个元素的地址为:" << &arr[1] << endl;//数组名是常量,不可以进行赋值操作//arr = 10;system("pause");return 0;
}
2.3 练习案例1: 五只小猪称体重
描述:在一个数组中记录了五只小猪的体重,如int arr[5] = {300,350,200,400,250};
找出并打印最重的小猪的体重
思路:
代码展示:
int main()
{
//描述:在一个数组中记录了五只小猪的体重,
//如int arr[5] = {300,350,200,400,250};
//找出并打印最重的小猪的体重int arr[5] = { 300,350,200,400,250 };cout << "小猪的体重分别是:" << endl;for (int i = 0; i < 5; i++){cout << arr[i] << " " ;}cout<< endl;int max = 0;for (int i = 0; i < 5; i++){if (arr[i] > max){//如果访问的数组中的元素比我认定的最大值还要大,就更新最大值max = arr[i];}}cout << "最重的小猪的体重是:" << max<<endl;system("pause");return 0;
}
2.4 练习案例2:数组元素逆置
描述:请声明一个5个元素的数组,并且将元素逆置
如:原数组元素为:1,2,3,4,5
逆置后为5,4,3,2,1
思路:
代码如下:
int main()
{//创建数组int arr[5] = { 1,2,3,4,5 };cout << "逆置前:" << endl;for (int i = 0; i < 5; i++){cout << arr[i] << endl;}//2,实现逆置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] << endl;}system("pause");return 0;
}
2.5:练习案例3:冒泡排序
思路:
int main()
{int arr[ ] = { 2,4,0,5,7,1,3,8,9 };cout << "排序前:" << endl;for (int i = 0; i < 9; i++){cout << arr[i] << " ";}cout << endl;//总共排序轮数为 元素个数 - 1for (int j = 0; j < 9 - 1; j++){//内层循环对比 次数 = 元素个数-当前轮数-1for (int k = 0; k < 9 - j - 1; k++){if (arr[k] > arr[k + 1]){//如果第一个数比第二个数大,交换两个数字int temp = arr[k];arr[k] = arr[k + 1];arr[k + 1] = temp;}}}cout << "冒泡排序后:" << endl;for (int i = 0; i < 9; i++){cout << arr[i] << " ";}cout << endl;system("pause");return 0;
}
3,二维数组
3.1二维数组的定义的四种方式:
1,数据类型 数组名 [行数 ][ 列数 ];
2,数据类型 数组名 [行数 ][ 列数 ] = { {数据1,数据2} , {数据3,数据4}};
3,数据类型 数组名 [行数 ][ 列数 ] = { {数据1,数据2 ,数据3,数据4}};
4,数据类型 数组名 [ ][ 列数 ] { {数据1,数据2 ,数据3,数据4}};;
建议:以上4种定义方式,利用第二种更加直观
3.1示例一:
int main()
{//二维数组的定义的四种方式:
//1,数据类型 数组名 [行数 ][ 列数 ];int arr[2][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;cout << arr[0][0] << endl;cout << arr[0][1] << endl;cout << arr[0][2] << endl;cout << arr[1][0] << endl;cout << arr[1][1] << endl;cout << arr[1][2] << endl;system("pause");return 0;
}
示例二:
int main()
{//2,数据类型 数组名 [行数 ][ 列数 ] = { {数据1,数据2} , {数据3,数据4}};int arr1[2][3] = { {1,2,3},{4,5,6} };//外层循环打印行数,内层循环打印列数for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr1[i][j] << endl;}}system("pause");return 0;
}
示例三:
int main()
{//3,数据类型 数组名 [行数 ][ 列数 ] = { {数据1,数据2 ,数据3,数据4}};int arr1[2][3] = { 1,2,3,4,5,6 };//外层循环打印行数,内层循环打印列数for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr1[i][j] << " ";}cout << endl;}system("pause");return 0;
}
示例四:
int main()
{//4,数据类型 数组名 [ ][ 列数 ] { {数据1,数据2 ,数据3,数据4}};int arr1[][3] = { 1,2,3,4,5,6 };//外层循环打印行数,内层循环打印列数for (int i = 0; i < 2; i++){for (int j = 0; j < 3; j++){cout << arr1[i][j] << " ";}cout << endl;}system("pause");return 0;
}
3.2 二维数组数组名
查看二维数组所占的内存空间
获取二维数组首地址
示例:
int main()
{//二维数组的用途//1,可以查看占用内存空间的大小int arr1[2][3] = { {1,2,3},{4,5,6} };cout << "二维数组占用内存空间为:" << sizeof(arr1) << endl;cout << "二维数组第一行元素占用内存空间为:" << sizeof(arr1[0]) << endl;cout << "二维数组第一个元素占用内存空间为:" << sizeof(arr1[0][0]) << endl;cout << "二维数组行数:" << sizeof(arr1) / sizeof(arr1[0]) << endl;cout << "二维数组列数:" << sizeof(arr1[0]) / sizeof(arr1[0][0]) << endl;cout << endl;//可以查看二维数组的首地址cout << "二维数组首地址为:" << arr1 << endl;cout << "二维数组第一行首地址为:" << arr1[0] << endl;cout << "二维数组第二行首地址为:" << arr1[1] << endl;cout << endl;cout << "二维数组第一个元素首地址为:" << &arr1[0][0] << endl;cout << "二维数组第二个元素首地址为:" << &arr1[0][1] << endl;system("pause");return 0;
}
3.3 二维数组案例举例:
int main()
{int arr[3][3] ={{100,100,100 },{90,50,100},{60,70,80}};//统计分数for (int i = 0; i < 3; i++){int sum = 0;string name[3] = { "张三","李四","王五" };for (int j = 0; j < 3; j++){sum += arr[i][j];}cout << name[i]<<"的总分:" << sum << endl;}system("pause");return 0;
}
4,字符串与在数组中字符串的应用
4.1 拼接字符串常量
作用:当字符串很长时,运用字符串拼接可将两段字符串分行输入输出
int main()
{//拼接字符串cout << "I'd give my right arm to be""a great violinist.\n";cout << "I'd give my right arm to be a great violinist.\n";cout << "I'd give my right arm to be""a great violinist.\n";system("pause");return 0;
}
注意:拼接时不会在被连接的字符串之间添加空格,第二个字符串的第一个字符将紧跟在第一个字符串的最后一个字符(不考虑\0)后面。
第一个字符串中的 \0 字符将被第二个字符串的第一个字符取代
4.2 在数组中使用字符串
在C++中,你可以定义和操作字符串数组。字符串数组是由多个字符串组成的数组,每个元素都是字符串类型。下面是一个简单的例子,展示如何定义和使用字符串数组:
#include <iostream>
#include <string>
using namespace std;int main() {string array[3] = {"apple", "banana", "cherry"}; // 定义并初始化字符串数组// 访问和打印数组元素for (int i = 0; i < 3; i++) {cout << array[i] << endl; // 输出:apple banana cherry}return 0;
}
在这个例子中,`string array [3] 定义了一个包含三个元素的字符串数组,每个元素都对应一个字符串。然后,我们通过一个for循环来遍历数组,并打印出每个元素的值。
需要注意的是,字符串数组中的每个元素都可以存储不同的字符串,而且每个元素的长度可以不同。例如,你可以有一个元素存储"hello",另一个元素存储"world",它们的长度是不同的。
此外,字符串数组中的每个元素实际上存储的是字符串的地址,而不是字符串本身。这是因为字符串在内存中是动态分配的,可能会随着字符串长度的变化而改变位置。因此,当你引用字符串数组的一个元素时,你实际上是在引用存储在该位置的字符串的地址
4.3 字符串输入
在C++中,你可以使用多种方法来输入字符串。以下是一些常见的方法:
1. `cin >>`
这是一个基本的方法,可以用来输入一个字符串。
但是,它会在遇到空格、制表符或换行符时停止输入。例如:
#include <iostream>
#include <string>
using namespace std;int main() {string str;cin >> str; // 输入:Hello World!cout << str << endl; // 输出:Hello return 0;
}
2. `getline()`
:这个函数可以读取一整行文本,包括空格。例如:
#include <iostream>
#include <string>
using namespace std;int main() {string str;getline(cin, str); // 输入:Hello World!cout << str << endl; // 输出:Hello World!return 0;
}
3. `cin.get()`
这个函数可以逐个读取字符。例如:
#include <iostream>
#include <string>
using namespace std;int main() {string str;cin.get(str, 20); // 输入:Hello World!cout << str << endl; // 输出:Hello World!return 0;
}
4.4 每次读取一行字符串输入
在C++中,如果你想每次只读取一行字符串输入,可以使用`getline()`函数。
这个函数可以从指定的输入流中读取一行文本,直到遇到换行符为止。
以下是一个示例:
#include <iostream>
#include <string>
using namespace std;int main() {string line;while (getline(cin, line)) {cout << line << endl;}return 0;
}
在这个例子中,`getline(cin, line)`用于从输入流中读取一行文本,并将结果存储在`line`变量中。然后,`cout << line << endl;`用于打印这一行文本。这个过程会一直重复,直到用户输入结束。
请注意,`getline()`函数会读取整行,包括换行符。换行符会被丢弃,不会被包含在`line`变量中。如果你希望保留换行符,可以使用`cin.get()`函数,如下所示:
#include <iostream>
#include <string>
using namespace std;int main() {string line;while(cin.get(line, 20)) {cout << line << endl;}return 0;
}
在这个例子中,`cin.get(line, 20)`用于从输入流中读取最多20个字符,并将结果存储在`line`变量中。然后,`cout << line << endl;`用于打印这一行文本。这个过程会一直重复,直到用户输入结束。请注意,`cin.get()`函数会将换行符包含在`line`变量中。
4.5混合输入字符串和数字
在C++中,如果你想同时输入字符串和数字,可以使用`cin`和`getline()`函数的组合。以下是一个示例:
#include <iostream>
#include <string>
using namespace std;int main() {string str;int num;while(true) {if(cin >> str && cin >> num) {cout << "String: " << str << ", Number: " << num << endl;break;} else if(cin.fail()) {cin.clear();cin.ignore(10000, '\n');} else {break;}}return 0;
}
在这个例子中,首先使用`cin >> str`读取字符串,然后使用`cin >> num`读取数字。如果输入的内容不符合预期格式,`cin`会失败并设置`failbit`。在这种情况下,我们使用`cin.clear()`清除错误标志,并使用`cin.ignore(10000, '\n')`忽略掉输入流中的剩余部分。
请注意,这种方法假设输入的字符串和数字之间有一个空格分隔。如果你的输入格式不同,你可能需要修改代码以适应你的需求。