C++(8)--数组array-长度固定

《老九学堂C++课程》《C++ primer》学习笔记。《老九学堂C++课程》详情请到B站搜索《老九零基础学编程C++入门》
-------------简单的事情重复做,重复的事情用心做,用心的事情坚持做(老九君)---------------

1.数组基本概念

什么是数组:数组是一个变量,由数据类型相同的一组元素组成,在内存占一串连续的内存空间。

数组是一个类型:比如int 型的数组,类型就是int []
C++中数组元素必须拥有相同的数据类型加粗样式

数组基本要素
1.表示符:数组的名称,用于区分不同的数组(用来表示数组的变量名)
2.数组元素:向数组中存放的数据
3.元素下标:对数组元素进行编号,表明元素在数组中的位置。从0开始,可以通过下标来访问数组
4.元素类型:数组中元素的数据类型
数组长度固定, 避免数组越界

使用数组的优点: 方便管理需要相同操作的数据

demo1:可以构成数组的一组元素?
在C/C++中可以构成一个数组,在java中不行

198, 98, ‘c’, 230 // 字符在C++中是整形存的
1, 0, true, false, 38, -1 // c++中布尔类型实际是整形

2.一维数组

可以存成数组的情况:学生单门学科的成绩,某类商品的单价,某人N个月的工资

2.1数组的定义

定义语法:

datatype arrayName[size];

demo:

int nums[25];
char array_of_name[30];
double curr_salary[35];

const int N = 5;
int nums[N];
nums[0] = 9527;

const int N = 5;
int nums[N];
nums[0] = 9527;

注意:C++中数组的大小可以定义变量,C中不可以可以定义成变量

2.2数组初始化

用大括号初始化元素内容

int years[6] = {2012,2013,2014,2015,2016,2017}; //可以少给元素,但是不能多给
int months[12] = {1, 3, 5, 7}; // 未初始化的元素默认值未0
int days[] = {1,15}; // 不设定数组大小,编译器自动计算数组大小
int array[] = {} // ❌,未知元素个数是不可以的

c++ 11中新的改动:
a.初始化是可以不用等于号;
b.大括号可以为空,默认为所有元素执行置0操作

int days[] {};
float m[100] {};

2.3一维数组动态赋初值

动态从键盘录入信息,赋值给数组

int main(){
	int N = 5;
	double scores[N];
	//for(int i = 0; i < N; i++){
	for(int i = 0; i < sizeof(scores) / sizeof(double); i++){
		cout << "请输入第" << i + 1 << "课程的成绩:" ;
		cin >> scores[i];
	}
	for(int i = 0; i < N; i++){
		cout << scores[i] << endl;
	}
	return 0;
}

注意C++中数组没有.len()的属性,没法直接获得数组的长度。

2.4一维数组应用实例

demo1:一维数组求和,求平均

int main(){
int main(){
	int nums[7] = {8, 4, 2, 1, 23, 344, 12};
	int nums_len = sizeof(nums) / sizeof(nums[0]);
	int sum = 0;
	double average = 0;
	for(int i = 0; i < nums_len; i++){
		cout << nums[i] << " ";
		sum += nums[i];
	}
	average = sum / nums_len;
	cout << "和为:" << sum << ", 均值为:" << average << endl;
	return 0;
}

demo2: 找出数组的最大值,最小值

	// 求数组的最大值最小值
	int min_val = nums[0], max_val = nums[0]; //假设第一个元素为最小值/最大值,其后的元素依次和最大最小比,然后更新最大值/最小值
	int min_index = 0, max_index = 0;
	for(int i = 1; i < nums_len; i ++){
		if(nums[i] < min_val){
			min_val = nums[i];
			min_index = i;
		}
		if(nums[i] > max_val){
			max_val = nums[i];
			max_index = i;
		}
	}
	cout << "最小值为:" << min_val << ", 对应的下标为:" << min_index << endl;
	cout << "最大值为:" << max_val << ", 对应的下标为:" << max_index << endl;

demo3:定义一个整形数组,找出奇数/偶数元素的个数

	// 定义一个整形数组,找出奇数/偶数元素的个数
	int odd_count = 0, even_count = 0;
	for(int i = 0; i < nums_len; i++){
		if(nums[i] % 2 == 0){
			even_count += 1;
		}
		else{
			odd_count += 1;
		}
			}
	cout << "偶数有:" << even_count << "个, 奇数有:" << odd_count << "个" <<endl;

demo4:查找数组中是否存在某个元素,如果存在返回元素在数组中的下标,不存在返回-1

	//查找数组中是否存在某个元素,如果存在返回元素在数组中的下标,不存在返回-1
	int searchNum;
	int searchIndex = -1;  //初值值是一个不可能达到的值,如果最后他还是这个不可能达到的值,那么就没找到
	cout << "请输出要查找的数字" << endl;
	cin >> searchNum;
	for(int i = 0; i < nums_len; i++){
		if (nums[i] == searchNum){
			searchIndex = i;
			break;
		}
	}
	if(searchIndex == -1){
		cout << "没有查到要找的数字" << endl;
	}
	else{
		cout << "要查找的数字在数组中的下标为:" << searchIndex << endl;
	}

2.5一维数组的排序算法

1.冒泡排序
每次相邻的元素比较,将较大或者较小的元素放着后面,依次比较,较小/较大的数字就会冒到最后面 。

int main(){
	// 循环输入5个整形数字,进行降序排列后输出结果
	int n = 5;
	int nums[5] = {};
	for(int i = 0; i < n; i++){
		cout << "请输入数字" << endl;
		cin >> nums[i];
	}
	// 选择排序法
	// 每次找剩下元素的最大值/最小(和老师讲的有点不一样,但实质是一样的)
	for(int i = 0; i < n; i++){
		for(int j = i+1; j < n; j++){
			if(nums[i] < nums[j]){
				int tmp = nums[i];
				nums[i] = nums[j];
				nums[j] = tmp;
			}
		}
	}

	for(int i = 0; i < n; i++){
		cout << nums[i] << endl;
	}
	

2.选择排序

int main(){
	// 循环输入5个整形数字,进行降序排列后输出结果
	int n = 5;
	int nums[5] = {};
	for(int i = 0; i < n; i++){
		cout << "请输入数字" << endl;
		cin >> nums[i];
	}
	// 选择排序法
	// 每次找剩下元素的最大值/最小(和老师讲的有点不一样,但实质是一样的)
	for(int i = 0; i < n; i++){
		for(int j = i+1; j < n; j++){
			if(nums[i] < nums[j]){
				int tmp = nums[i];
				nums[i] = nums[j];
				nums[j] = tmp;
			}
		}
	}

	for(int i = 0; i < n; i++){
		cout << nums[i] << endl;
	}
	return 0;
}

2.6 一维数组元素的删除和插入

数组的大小一旦确定了,就无法改变。

int main(){
	// 有序数组的插入和删除
	//数组的删除和插入(数组一旦定义,大小不能改变,所以本例子说的是数组的长度远大于有效存储元素的个数)
	double power[99];
	int powerCount = 0;  // 当前数组中元素的个数
	power[powerCount++] = 45760;
	power[powerCount++] = 45770;
	power[powerCount++] = 45772;
	power[powerCount++] = 45773;
	double tmp;
	for(int i = 0; i < powerCount; i++){
		for(int j = 1; j < powerCount - i; j ++){
			if(power[j] < power[j-1]){
				tmp = power[j];
				power[j] = power[j-1];
				power[j-1] = tmp;
			}
		}
	}
	cout << "排序后的数组为:" << endl;
	for(int i = 0; i < powerCount; i++){
		cout << power[i] << "\t";
	}
	cout << endl;
	}
	//插入数字,插入新数字之后数组依旧有序
	cout << "请输入要插入的数字" << endl;
	double insert_power;
	cin >> insert_power;    
	// 1. 放在末尾,再排序
	// 2. 找到第一个比插入数大的元素位置,其后的元素一次往后移动一位
	int insert_index = powerCount;
	for(int i = 0; i < powerCount; i++){
		if(power[i] > insert_power){
			cout << power[i] << insert_power;
			insert_index = i;
			break;
		}
	}
	for(int i = powerCount-1; i >= insert_index; i--){
		power[i+1] = power[i];
	}
	power[insert_index] = insert_power;
	powerCount+=1;
	cout << "插入元素后的数组为"<< endl;
		for(int i = 0; i < powerCount; i++){
		cout << power[i] << "\t";
	}
	// 删除元素,找到要删除的元素位置,将其后的元素往前移动一位
	// 没有判断相同元素
	double delete_power;
	int delete_index = -1;
	cout << "请输出要删除的元素" << endl;
	cin >> delete_power;
	for(int i = 0; i < powerCount; i++){
		if(power[i] == delete_power){
			delete_index = i;
			break;
		}
	}
	if(delete_index == -1){
		cout << "没有找到要删除的元素" << endl;
	}
	else{
		for(int i = delete_index; i < powerCount; i++){
			power[i] = power[i+1];
		}
		powerCount-=1;
			cout << "删除元素后的数组为"<< endl;
			for(int i = 0; i < powerCount; i++){
			cout << power[i] << "\t";
		}
	}
	return 0;
//}

array

用array定义数组与原来的方式定义数组效果是一样的

#include <array>
int value1[5];
array<int 5> value2;  //至少是c++11才支持

3.二维数组

3.1数组定义

datatype name[rowSize][colSize];
double score[5][3]
int prices[4][4]

3.2二维数组的动态赋值

demo:输入学生各门课程的成绩

在这里插入代码片int main(){
	string stu_names[] = {"刘备","关羽", "张飞"};
	string course_names[] = {"数学", "语文", "英语"};
	const int ROW = 3;  // sizeof(stu_names) / sizeof(stu_names[0])   双字名字下可以这么写,其他情况下不行
	const int COL = 3;
	double scores[ROW][COL];
	for(int i = 0; i < ROW; i++){
		for(int j = 0; j < COL; j++){
			cout << stu_names[i] << "的" << course_names[j] << "成绩为:";
			cin >> scores[i][j];
		}
	}
	cout << "\t";
	for(int i = 0; i < COL; i++){
		cout << course_names[i] << "\t";
	}
	cout << endl;
	for(int i = 0; i < ROW; i++){
		cout << stu_names[i] << "\t";
		for(int j = 0; j < COL; j++){
			cout << scores[i][j] << "\t";
		}
		cout << endl;
	}
	return 0;
}
        数学    语文    英语
刘备    1       2       3
关羽    4       5       6
张飞    7       8       9
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值