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;
//总共排序轮数为 元素个数 - 1
for (int j = 0; j < 9 - 1; j++)
{
//内层循环对比 次数 = 元素个数-当前轮数-1
for (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')`忽略掉输入流中的剩余部分。
请注意,这种方法假设输入的字符串和数字之间有一个空格分隔。如果你的输入格式不同,你可能需要修改代码以适应你的需求。