【C++】c++入门之数组基础一


前言

本章节主要讲述数据类型与数据结构之间的区别,以及简单的数组相关内容。

学习路线:C++从入门到NOI学习路线

学习大纲:C++全国青少年信息学奥林匹克竞赛(NOI)入门级-大纲

上一站:C++算法入门之穷举

下一站:


一、数据结构概念

《C++程序设计入门三》中我们曾提到过数据类型这个概念,而今天我们要学习数据结构。

首先回顾以下数据类型。

数据类型是指计算机处理的对象的类型,它定义了数据的存储方式和可进行的操作。C++中的数据类型包括整型、浮点型、字符型等。数据类型用于定义变量的类型,以便在程序中存储和操作数据。

请添加图片描述
可以理解为计算机为了区分不同的变量,我们给变量穿了一个叫数据类型的马甲,而不同的数据类型将获得不同的“服务”。

路人:哦,那什么是数据结构呢?

数据结构是指数据的组织形式,它描述了数据之间的关系和如何存储数据。数据结构用于组织和管理大量数据,以便更高效地进行操作和处理。
在这里插入图片描述
比如说我们以前可以用一个变量记录一个学生的一门成绩,然后可以多建立几个变量去记录他的所有成绩,通过运算可以得到他的平均分等等。

但是现在要求你算出班上所有同学的平均成绩和找出优秀学科成绩呢?有 20 位同学的成绩要计算,我们需要定义 20 个变量吗?如果有100 位同学的成绩要计算,我们要定义 100 个变量吗?

显然这种做法是不行的,聪明的程序员也想到了这个问题,所以数据结构被发明了出来。

简而言之,数据类型是描述数据的属性,而数据结构是描述数据之间的关系和组织方式

数据结构可以分为两类:线性数据结构和非线性数据结构。而我们今天学习的数组属于线性数据结构。

线性数据结构是一种按照顺序排列的数据结构,其中数据元素之间存在一对一的关系。

C++数组是一种用于存储多个相同类型的元素的数据结构。我们可以想象有一个运动会,有一群选手,他们穿着相同的马甲,然后按着顺序在排队,他们有个响亮的名号叫做“江南皮革厂”。

在这里插入图片描述

二、数组的创建

C++数组的创建可以通过以下两种方式实现:

静态数组:静态数组是在编译时期确定大小的数组,其大小在声明时就已经确定,并且不能改变。

C++中创建静态数组的方法如下:

  1. 声明数组类型和数组名:
dataType arrayName[arraySize];

其中,dataType表示数组中元素的数据类型,arrayName是数组的名称,arraySize是数组的大小。

例如:

int arr[5];

这将创建一个包含5个整数的静态数组。

  1. 初始化数组元素:
int arr[5] = {
    
    1, 2, 3, 4, 5};

这将创建一个包含5个整数的静态数组,并将其初始化为给定的值。

提示:静态数组的声明和初始化可以在同一行完成,也可以分开进行。

动态数组:动态数组是在运行时期确定大小的数组,其大小可以根据需要进行动态分配和释放。动态数组的创建需要使用new关键字来分配内存空间,并使用delete关键字来释放内存空间。

C++中创建一维动态数组的方法如下:

  1. 使用new关键字来分配内存空间,指定数组的大小。
  2. 将返回的指针赋值给一个指针变量,以便后续使用。

关闭一维动态数组的步骤如下:

  1. 使用delete关键字释放之前分配的内存空间。
  2. 将指针变量设置为nullptr,以避免悬空指针的问题。

演示了如何创建和关闭一维动态数组:

#include <iostream>
using namespace std;

int main() {
    
    
    int size;
    cout << "请输入数组的大小:";
    cin >> size;

    // 创建一维动态数组
    int* arr = new int[size];

    // 为数组赋值
    for (int i = 0; i < size; i++) {
    
    
        cout << "请输入第 " << i+1 << " 个元素的值:";
        cin >> arr[i];
    }

    // 输出数组的值
    cout << "数组的值为:";
    for (int i = 0; i < size; i++) {
    
    
        cout << arr[i] << " ";
    }
    cout << endl;

    // 关闭一维动态数组
    delete[] arr;
    arr = nullptr;

    return 0;
}

三、数组的使用

要想学会如何使用数组,那么就要知道什么是数组下标?

C++数组下标是指通过索引值来访问数组中的元素。在C++中,数组的索引从0开始,依次递增。通过使用数组名和索引值,可以访问和修改数组中的特定元素。

在这里插入图片描述

  1. 访问数组元素:
int x = arr[2];

这将访问数组中索引为2的元素,并将其赋值给变量x。

在这里插入图片描述

  1. 修改数组元素:
arr[3] = 10;

这将修改数组中索引为3的元素的值为10。
在这里插入图片描述

  1. 遍历数组:
length=7;
for (int i = 0; i < length; i++) {
    
    
    cout << arr[i] << " ";
}

这将遍历数组并打印每个元素。
在这里插入图片描述

注意:长度为 n 的数组,下标从 0~n-1,不能超过这个范围访问数组元素,如果超过就是错的,语法上叫“越界”了!

四、样题讲解

问题一:1423 - 考试成绩的简单统计

期末考试结束,王老师想知道这次考试中成绩优秀的同学有多少人(考试成绩大于或等于 90 表示成绩优秀),请你编程帮助王老师来计算出成绩优秀的人数。

在这里插入图片描述

1.分析问题

  1. 已知:n个人的成绩。
  2. 未知:成绩优秀的同学有多少人。
  3. 关系:大于或等于 90 表示成绩优秀。

2.定义变量

根据分析的已知,未知按需要定义变量。
n:n个人的成绩。
a[100]:数组,存储具体成绩数值。
count:成绩优秀的同学人数。

	//二、数据定义 
	int n,a[100],count=0; 

3.输入数据

通过遍历的方式,循环录入学生成绩。

//三、数据输入
	cin>>n;
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
	}

4.数据计算

大于或等于 90 表示成绩优秀,统计个数即可。

//四、数据计算
if(a[i]>=90){
    
    
	count++;
}

5.输出结果

#include<iostream>
using namespace std;
int main(){
    
    
	//一、分析问题
	//已知:n个人的成绩
	//未知:成绩优秀的同学有多少人
	//二、数据定义 
	int n,a[100],count=0; 
	//三、数据输入
	cin>>n;
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
		//四、数据计算
		if(a[i]>=90){
    
    
			count++;
		}
	}
	 

	//五、输出结果 
	cout<<count<<endl;
	return 0;	
}

问题二:1153 - 查找“支撑数”

在已知一组整数中,有这样一种数非常怪,它们不在第一个,也不在最后一个,而且刚好都比左边和右边相邻的数大,你能找到它们吗?

在这里插入图片描述

1.分析问题

  1. 已知:一组整数
  2. 未知:支撑数
  3. 关系:比左边和右边相邻的数大的数

2.定义变量

根据分析的已知,未知按需要定义变量。
n:n个整数
a[100]:用来存储n个整数数值。

	//二、数据定义 
	int n,a[100]; 

3.输入数据

从键盘读入。

	//三、数据输入 
	cin>>n;
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
	}

4.数据计算

同时满足比左边和右边相邻的数大,注意第一个数(索引为0)左边没有数,所以应该从第二个数开始判断(索引为1)。

//四、数据计算 
	for(int i=1;i<n-1;i++){
    
    
		if(a[i-1]<a[i]&&a[i]>a[i+1]){
    
    
			
		}
	}

5.输出结果

#include<iostream>
using namespace std;
int main(){
    
    
	//一、分析问题
	//已知:一组整数
	//未知:刚好都比左边和右边相邻的数大的数 
	
	//二、数据定义 
	int n,a[100]; 

	//三、数据输入 
	cin>>n;
	
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
	}
	//四、数据计算 
	for(int i=1;i<n-1;i++){
    
    
		if(a[i-1]<a[i]&&a[i]>a[i+1]){
    
    
			//五、输出结果 
			cout<<a[i]<<endl;
		}
	}
	
	return 0;	
}

问题三:1156 - 排除异形基因

神舟号飞船在完成宇宙探险任务回到地球后,宇航员张三感觉身体不太舒服,去了医院检查,医生诊断结果:张三体内基因已被改变,原有人体基因序列中已经被渗入外星球不明异形生物基因,但可喜的是,这些异形基因都有一个共同的特征,就是该基因序号的平方除以 7 的余数都是 1,要赶快清除掉,否则会危害整个人类。赶快行动吧。

在这里插入图片描述

1.分析问题

  1. 已知:人体基因序列
  2. 未知:异形基因
  3. 关系:基因序号的平方除以 7 的余数是否等于 1

2.定义变量

根据分析的已知,未知按需要定义变量。

//二、数据定义 
int n,a[200];

3.输入数据

从键盘读入。

//三、数据输入 
	cin>>n;
	
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
		
	}
	

4.数据计算

基因序号的平方除以 7 的余数等于 1是异形基因。

//四、数据计算
if(a[i]*a[i]%7!=1){
    
    
			
}

5.输出结果

去除异形基因后的正常序列,空格隔开。

#include<iostream>
using namespace std;
int main(){
    
    
	//一、分析问题
	//已知:人体基因序列
	
	//未知:该基因序号的平方除以 7 的余数是否等于 1
	
	//二、数据定义 
	int n,a[200];
	
	//三、数据输入 
	cin>>n;
	
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
		//四、数据计算
		if(a[i]*a[i]%7!=1){
    
    
			//五、输出结果
			cout<<a[i]<<"\t";
		}
	}
	
	return 0;	
}

问题四:1155 - 找找谁的身高超过全家的平均身高

找找谁的身高超过全家的平均身高。
全家 n 口人,输入输出数据如下: (平均身高保留一位小数)。

在这里插入图片描述

1.分析问题

  1. 已知:全家的身高。
  2. 未知:谁的身高超过全家的平均身高。
  3. 关系:平均身高=全家的身高/人数。

2.定义变量

根据分析的已知,未知按需要定义变量。
ave:平均身高。

	//二、数据定义 
	int n,a[100];
	double ave=0;

3.输入数据

从键盘读入。
先将全家的身高进行累加。

//三、数据输入 
	cin>>n;
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
		ave+=a[i];
	}

4.数据计算

第一行为全家的平均身高(保留一位小数);
并判断谁的身高超过全家的平均身高。

//四、数据计算 
	ave/=n;
	printf("AVE=%.1f\n",+ave);
	for(int i=0;i<n;i++){
    
    
		if(a[i]*1.0 > ave){
    
    
			
		}
	}

5.输出结果

第二行有若干个数,为超过平均身高的人的身高厘米数。

#include<iostream>
using namespace std;
int main(){
    
    
	//一、分析问题
	//已知:全家的身高
	//未知:谁的身高超过全家的平均身高
	
	//二、数据定义 
	int n,a[100];
	double ave=0;

	//三、数据输入 
	cin>>n;
	for(int i=0;i<n;i++){
    
    
		cin>>a[i];
		ave+=a[i];
	}
	
	//四、数据计算 
	ave/=n;
	printf("AVE=%.1f\n",+ave);
	for(int i=0;i<n;i++){
    
    
		if(a[i]*1.0 > ave){
    
    
			//五、输出结果 
			cout<<i+1<<":"<<a[i]<<" ";
		}
	}
	return 0;	
}

五、练习

问题一:1231 - 考试成绩的分布情况

期末考试结束,小明的语文老师想知道,这次考试的成绩分布情况,主要计算如下几个数据:平均分、≥ 平均分的总人数、 < 平均分的总人数,请你写程序帮助小明的语文老师来计算一下!

在这里插入图片描述
1231 - 考试成绩的分布情况 题解

问题二:1160 - 打折优惠

商场周末大优惠,规定凡购物超过 100 元时,超过 100 元那部分便可打9折。
小雄同妈妈一起购买了一大批物品,你能帮他算出最终的应付款吗?

在这里插入图片描述
1160 - 打折优惠 题解

问题三:1316 - 橘子称重

学校买回来一大箱橘子,有 m 个( 100≤m≤1000 ),橘子大小比较均匀,学校想称一下总共有多重,发现大称坏掉了还没有修好,只有一个小的弹簧秤。学校又不想分开称,那样太慢了。
小明想了一个办法,由于橘子大小比较均匀,可以从中拿n个出来(5≤n≤20),这 n 个橘子的重量弹簧秤是可以称出来的,有了这 n 个橘子的重量,就可以计算出平均一个橘子有多重,这样就能知道整箱大约有多重了。
请编写程序,从键盘读入橘子总数 m ,小明称的橘子的个数 n 以及这 n 个橘子的重量,计算出这箱橘子总共约有多重(结果保留1位小数)。

在这里插入图片描述
1316 - 橘子称重 题解

问题四:1388 - 陶陶摘苹果

陶陶家的院子里有一棵苹果树,每到秋天树上就会结出 10 个苹果。苹果成熟的时候,陶陶就会跑去摘苹果。陶陶有个 30 厘米高的板凳,当她不能直接用手摘到苹果的时候,就会踩到板凳上再试试。
现在已知 10个苹果到地面的高度,以及陶陶把手伸直的时候能够达到的最大高度,请帮陶陶算一下她能够摘到的苹果的数目。假设她碰到苹果,苹果就会掉下来。

在这里插入图片描述
1388 - 陶陶摘苹果 题解

问题五:1174 - 求和

输入 n ( 1≤n≤5000 )个正整数,每个数都在 1到20000 之间;要求对这 n 个数中的奇数和偶数分别求和。
在这里插入图片描述
1174 - 求和 题解

问题六:1397 - 完美的偶数?

完美偶数指的是,如果一个数本身是偶数,且这个数是偶数位的数,且这个数的各个位也是偶数,那么这个数就可以称为完美偶数;比如: 28 就是完美偶数,而 246 就不是,因为 246 是一个 3 位数。
请你编程求出,从键盘读入的 n 个数中,哪些数是完美的偶数,输出他们。

在这里插入图片描述
1397 - 完美的偶数? 题解

问题七:1158 - 输出奇数和偶数

输入 n 个整数,将其中的奇数和偶数分别显示出来(1<n<30)。
在这里插入图片描述
1158 - 输出奇数和偶数 题解

问题八:1354 - 拿到某个数的概率是多少?

老师在一个不透明的纸袋里放入一些乒乓球,每个乒乓球上都有一个数字,当球放入之后,让小明从中随机拿一个。在球放入之后,小明抽之前,老师想让您帮忙编程先计算一下,拿到某个数字x的概率是多少?
比如:老师向袋子里面放入了 5 个球,对应的数字分别是 2 3 2 4 2 ,那么拿到数字 2 的概率为 3/5 = 0.6 ,拿到数字3的概率为 1/5 = 0.2。

在这里插入图片描述
1354 - 拿到某个数的概率是多少? 题解

问题九:1357 - 哪个厂家的零件更标准?

在统计描述中,方差用来计算每一个变量(观察值)与总体均数之间的差异。比如:甲乙 2 个厂商生产某零件,一批零件要求在尺寸合格的情况下,大小越一致越好,由于生产工艺的问题,零件生产厂商生产的零件不可能一模一样。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1357 - 哪个厂家的零件更标准? 题解

六、总结

以上就是本节的全部内容,数组在实际运用中的次数还是非常多,但是学习难度并不大,静态数组的创建、数组下标的使用,数组的遍历都是必须要掌握的,动态数组可以了解学习。

猜你喜欢

转载自blog.csdn.net/qq_39180358/article/details/135338305