【C++】学习日志——数组

第五章 数组

一维数组

数组是一个有序数据的集合,每个元素都有同样的类型。
定义方法:

//变量名 数组名[元素个数];
int value[10];
float a[5] = {1, 2, 3, 4, 5};

元素个数是一个常量不是变量
元素下标从0开始
下标可以是表达式,但不能是实型变量
下标可以是变量或常量

  • 数组定义了一块连续的内存空间,空间的大小等于每个元素所占的空间大小*元素个数
  • 数组名可以看作存储该数组起始地址的常量
  • 注意不要下标越界
  • 数组的操作主要是对各个数组分别操作。
  • 不能对数组名进行赋值

遍历数组的方法:

#include <iostream>
const n = 10;
int main(){
	int value[n];
	for(i = 0; i < n; ++i){
		cout << value[i] << endl;
	}
}

例程:输入一串字符,统计每个字母出现的次数,知道输入的不是字母为止

#include <iostream>
int main(){
	int count[26], i;
	char ch;

	for (i = 0; i < 26; i++) count[i] = 0;
	ch = toupper (cin.get())
	while (ch >= 'A' && ch <= 'Z'){
		++count[ch - 'A']; ch = toupper(cin.get());
}
	for (i = 0; i < 26; i++)  cout << count[i];
	return 0;
}

查找

顺序查找

一一遍历数组元素对照,得到结果

二分查找

要求数组已经排序,假设全为升序
过程:

  • 设定查找范围的边界:lh,rh;
  • 找出中间元素的位置:mid = (lh + rh)/2
  • 比较中间元素和查找元素key
    • key==中间元素,那么mid就是元素位置
    • key>中间元素,那么左边一半就不可能是key,则为mid+1---->rh
    • key<中间元素,那么右边一半就不可能是key,则为lh---->mid-1

二者效率不同,顺序查找是(1 + 2 + … + n)/n
而二分查找是log2(N),当数据量大的时候效率较高。

排序

选择排序

在所有元素中找到最小的元素放在数组的第0个位置,在剩余元素中找到最小的放在第1位…

整个过程
在这里插入图片描述

例程:

#include <iostream>

int main(){
	int array1[8] = {31, 41, 59, 26,53, 58, 97, 93};
	int lh, rh, k ,tmp;
	for (lh = 0; lh < 9; lh++){
		rh = lh;
		for (k = lh; k < 9; k++){
			if (array1[k] < array[lh]) rh = k;
		}
		//交换变量
		tmp = array1[lh]; 
		array1[lh] = array1[rh];
		array1[rh] = tmp;
	}
	for (lh = 0; lh < 10; lh++) cout << array[lh] << '';
	return 0;
}

冒泡排序

将两个带冒泡的数据从头到尾依次处理,比较相邻的两个元素,如果大的在前小的在后,就交换两个元素
第一次冒出最大的气泡,放入最后一个位置,然后第二个,第三个…

整个过程
在这里插入图片描述

int main(){
	int a[]={0,3,5,1,3,7,9,4,2,10,6};
	int i, j, tmp, n=11;
	bool flag;
	for (i = 1; i < n; ++i) {
		flag = false;
		for (j = 0; j < n-i; ++j){
		if (a[j+1] < a[i])
			{tmp = a[j]; a[i] = a[i+1]; a[i+1] = tmp; flag = true;}
		}
	if (!flag) break;//一趟冒泡中没有发生交换,排序结束
}
cout << endl;
for (i = 0; i < n; ++i) cout << a[i] << '';
return 0;
}

二维数组

二维数组的内存排列:先排第0行,在排第1行…
下标越界就会往后移动一位

  • 一维数组:不带[ ]的数组名(如int a[5];中的a)可看做存储该数组起始地址的变量。它可以被输出(如cout << a;得到该地址),但不可被赋值。
  • 二维数组:当只指定其中一维的下标i时(如对于int b[4][5]; 使用b[i]),则表示第i行在内存中的起始地址。同样可被输出,不可赋值。
  • 二维数组的b和b[0]是相等的,但意义不同。

初始化

	//类型说明 数组名[][] = {};
	int a[3][4] = {
	{1, 2, 3, 4},
	{5, 6, 7, 8},
	{9, 10, 11, 12}
};

遍历按照一维数组遍历

字符串

一系列字符组成的一个单元成为字符串(String)

  • 字符串的本质是一系列的有序字符,因此可以用一个字符数组来保存这组字符,用数组名表示这个字符串。
  • 由于数组名是数组的起始地址,因此该字符串从该地址开始存储。但到哪里为止?字符串的长度可以小于数组的长度。
    c++ 用’\0’表示字符串的结束。
  • 字符串所需的存储空间比实际的字符串长度大1。
  • 如要将字符串“Hello,world”保存在一个数组中,该数组的长度至少为12(10个字母+1个逗号+\0)

初始化

 char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
 char site[7] = "RUNOOB";
 char site[7] = {"RUNOOB"};

在这里插入图片描述

如定义了一个字符数组ch[]
要输入一个符串放在ch中,可直接用cin >> ch;
用cin>>输入时是以空格、回车或Tab键作为结束符,因此cin>>无法输入包含空白字符的字符串。存人宇符数组后,该结束符被替换为空字符 ‘\0’。
在用cin>>输入时,要注意输人的字符串的长度不能超过数组的长度,最好在提示信息中告知允许的最长字符串长度。

cin.getline()函数

  • 从用户输入中读取一个包合任意字符(包括空白字符)的字符串。
  • 格式:cin.getline(字符数组起始地址,数组长度,结束标记)
  • “结束标记”是个宇符。
  • 将结束标记前的宇符串存入宇符数组(结束标记会被删掉)。
  • 如果结束标记缺省(即只有前两个参数),则默认回车为结束标记。
  • 前两个参数不能缺省。
  • 存入宇符数组的宇符串长度不超过参数“数组长度”。
  • 如果存入字符串未达到数组长度,则以 '\0’结束。

空白字符等概念的区分
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Arctic-aurora

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值