C++之数组

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')`忽略掉输入流中的剩余部分

请注意,这种方法假设输入的字符串和数字之间有一个空格分隔。如果你的输入格式不同,你可能需要修改代码以适应你的需求。

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值