一维数组
课上练习
知识总结
L2-03.一维数组-知识总结
一维数组-知识总结 数组概念 用于存储多个数据的线性数据结构。数组的数据在内存中是连续存储的,并且一个数组内存储的数据必须是同类型的,在定义数组的时候需要同时确定数组的大小。
定义数组 定义数组时,需要说明数组中存储的数据类型,数组的名称和数组的大小。其中数组的命名规则和变量的命名规则相同,数组的大小用[]加数字的形式表述。
int arri[10];
double arrd[1];
bool arrb[12];由于竞赛时有内存限制,所以建议在主函数外定义数组。
关于数组的大小,有几点需要额外注意: 数组的大小必须在程序编译时已经知道,即不可以通过读入一个数据,然后根据读入数据的方式进行创建。
int n;
cin >> n;
int arr[n]; //不要通过这种形式定义一个数组一般我们直接使用数字表示数组大小,有时候当我们需要创建多个大小相同的数组是,我们会使用常量表示数组数组大小。
int N = 100000;
int arr1[N];
double arr2[N];数组大小必须使用整数表示,但是因为字符型实际也是以整数的形式存储的,所以也可以使用字符型来定义数组大小,但是平时请不要使用这种方式定义进行数组定义。
int arr['0']; //创建一个大小为48的数组数组的初始化 序列初始化 使用{}的方式对数组进行初始化,必须在定义数组时对其进行初始化。若{}内填写数组,则按照顺序对数组内元素进行赋值,未填写部分补0。
int arr[10] = {}; // 初始化为全0
int arr[5] = {1, 2}; // 将第一个数初始化为1,第二个数初始化为2,其余所有数初始化为0
int arr[5] = {0}; // 将第一个数初始化为0,其余所有数初始化为0
int arr[5] = {2, 3, 8, 1, 3}; // 整个数组初始化为2,3,8,1,3filln初始化
需要添加头文件:
1#include <iostream>
2#include <algorithm>
3using namespace std;
4
5int arr[105];
6
7int main () {
8 fill_n(arr, 105, 1);
9 return 0;
10}memset初始化 memset是C语言风格的初始化方式,可以在任意位置对数组进行赋值,将数组元素全部设置为某一个值。 使用memset需要填写三部分内容:数组名称、初始化数值和数组大小。 其中初始化的数值一般使用16进制表示常用数值为:0、1、-1、0x3f、0x7f,其中0x3f和0x7f都表示一个比较大的整数。 另外数组大小不是数组里面存储的数值的个数,而是占用内存的大小。
1#include <iostream>
2#include <algorithm>
3using namespace std;
4
5int arr[105];
6
7int main () {
8 memset(arr, 0, sizeof(arr));
9 memset(arr, 1, sizeof(arr));
10 memset(arr, -1, sizeof(arr));
11 memset(arr, 0x3f, sizeof(arr));
12 memset(arr, 0x7f, sizeof(arr));
13 return 0;
14}将数组初始化为全0的几种方式
arr[3] = {};
arr[3] = {0};
arr[3] = {0, 0, 0};
fill_n(arr, 3, 0);
memset(arr, 0, sizeof(arr));数组元素的访问 我们使用:数组名称[下标]的形式访问数组,可以通过该方式获得到下标位置的元素的值或者对该位置进行赋值。
1#include <iostream>
2#include <algorithm>
3using namespace std;
4
5int arr[105];
6
7int main () {
8 fill_n(arr, 105, 1);
9 arr[10] = 2; //对某个位置进行赋值
10 arr[20] = 4; //对某个位置进行赋值
11 for (int i = 0; i < 105; i++) { // 使用循环遍历数组的所有下标
12 cout << arr[i] << " "; // 获取某个位置的数值
13 }
14 return 0;
15}访问数组元素需要注意几点: 下标从0开始,到数组个数-1结束,即如果数组的元素个数为n,第一个元素对应的下标为0,第二个元素对应的下标为1,最后一个元素对应的下标为n-1。 数组下标不可以为负数,如果是用arr[i-1]这样的操作时,一定要注意检查i-1是否大于等于0。 数组下标不可以越界使用,即如果数组的元素个数为n,不能使用超过n-1的下标,如果是用arr[i+1]这样的操作时,一定要注意检查i+1是否小于n。 对于越界使用数组下标的情况,编译器不会报错,但是程序运行时会出现错误,所以必须谨慎使用。
️课后作业
☝️单选作业
错误的题目要弄懂,不会的千万要来问老师⚠️
✌️总结作业
总结作业非常重要,请务必认真完成✔️
- 定义数组时都需要写明什么?
- 竞赛时在哪里定义数组最合适?
- 定义数组时需要填写数组的大小,写出3个注意事项。
- 介绍使用{}初始化数组的方式。
- 介绍使用fill_n初始化数组的方式。
- 介绍使用memset初始化数组的方式。
- 写出使用数组下标的2个注意事项。
👌编程作业
考试只有一次提交机会,请务必本地检查正确后再提交❇️
👌编程作业标准答案
请在AC后或者思考15分钟没有进展后查看,不可抄代码❇️
一维数组-选择题
一维数组-选择题 下面C++数组的定义中,会丢失数据的是( )。
A. char dict_key[] = {'p', 't', 'o'};
B. int dict_value[] = {33, 22, 11};
C. char dict_name[]={'chen', 'wang', 'zhou'};
D. float dict_value[]={3, 2, 1};执行以下C++语言程序后,输出结果是( )。 截屏2024-06-20 10.45.10.png
1#include <iostream>
2using namespace std;
3
4int main() {
5 int fib[10];
6 fib[0] = 0;
7 fib[1] = 1;
8 for(int i = 2; i < 10; i++)
9 fib[i] = fib[i - 1] + fib[i - 2];
10 cout<< fib[10] <<endl;
11 return 0;
12}A. 0 B. 5 C. 55 D. 无法确定
在 C++语言中,长度为 n 的数组,合理的下标范围是从 0 到 n,包括 0 和 n。 A. 正确 B. 错误
在 C++语言中,可以使用字符(如'0')作为数组下标。 A. 正确 B. 错误
在 C++语言中,数组被定义时,它的大小就确定了。 A. 正确 B. 错误
在下列代码的横线处填写( ),可以使得输出是“2”。 截屏2024-06-20 10.53.21.png
1#include <iostream>
2using namespace std;
3int main() {
4 int array[5] = {3,7,5,2,4};
5 int min = 0;
6 for (int i = 0; i < 5; i++)
7 if (______________) //在此处填写代码
8 min = array[i];
9 cout<<min<<endl;
10 return 0;
11}A. min > array[i] B. min < array[i] C. min = array[i] D. 以上均不对
下列关于 C++语言中数组的叙述,不正确的是( )。 A. 数组必须先定义后使用。 B. 数组的所有元素在内存中是连续存放的。 C. 除了字符数组,在定义数组时“[]”内必须有常数。 D. 不能对数组赋值,但可以对数组的每个基础类型的元素赋值。
以下数组定义,符合 C++语言语法的是( )。
A. int a[];
B. int b['3'];
C. int c[3.0];
D. int[3] d;一个数组定义为 double array[3];,则这个数组占用内存的大小为( )。 A. 24 B. 12 C.6 D.3
在C++语言中,数组被定义时,它的大小可以调整。( ) A. 正确 B. 错误
一维数组-选择题答案
一维数组-选择题答案 C 解析:char dict_name[] 为字符数组,初始化时每个元素只能存储一个字符,所以第一个字符之后的其他字符将会丢失 D 解析:fib[]大小为10, 最后一个元素下标为9,所以fib[10]越界访问,结果无法确定 B 解析:大小为n的数组,合法下标为0 至 n-1 A 解析:a['0'] 等价于 a[48] A 解析:数组被定义时,它的大小就确定了,这与C++中数组的定义和特性相符。 D 解析:A选项如果将 min 初始化为数组的第一个元素,并使用这个条件,代码将正确地找到最小值。B选项这个条件会导致代码找到最大值,而不是最小值。C选项是一个赋值语句,不是条件判断。 C
解析:数组在定义时初始化,就不需要常数,例如int a[] = {0,1,2};B 解析:原理同第四题 A 解析:double类型为8字节,所以double array[3]的大小为3*8=24 字节 B 解析:GESP原题,更严谨的说法是数组定义后,大小不能调整
L2034题解+参考代码
L2034题解+参考代码 题目链接 查找支撑数:L2034
题解 我们需要找到一组整数中那些比左右相邻数都大的数,并且这些数既不在第一个位置也不在最后一个位置。这样的数被称为支撑数。
算法步骤 读取输入:读取一个整数 m,表示整数的个数。然后读取 m 个整数存入一个一维数组中。 遍历数组:从第二个元素到倒数第二个元素,检查每个元素是否比它的左邻居和右邻居都大。 输出结果:如果找到这样的数,输出它们。
示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4int main() {
5 // 读取输入
6 int m;
7 cin >> m;
8 int nums[100]; // 定义一维数组来存储输入的整数
9 for (int i = 0; i < m; ++i) {
10 cin >> nums[i];
11 }
12
13 // 遍历数组,找到支撑数
14 for (int i = 1; i < m - 1; ++i) {
15 if (nums[i] > nums[i - 1] && nums[i] > nums[i + 1]) {
16 cout << nums[i] << endl;
17 }
18 }
19
20 return 0;
21}L2035题解+参考代码
L2035题解+参考代码 题目链接 GESP3级2309 小杨的储蓄:L2035
题解 题目要求我们模拟一个存钱的过程,小杨有 N 个储蓄罐,从第 1 天开始,每天选择一个储蓄罐存入对应天数的钱。经过 D 天后,我们需要计算每个储蓄罐中有多少钱。
算法步骤 读取输入:读取两个整数 N 和 D,表示储蓄罐的数量和存钱的天数。接着读取 D 个整数,表示每天选择的储蓄罐编号。 初始化数组:创建一个大小为 N 的数组,初始值为 0,用于记录每个储蓄罐中的钱。 模拟存钱过程:遍历 D 天,每天根据选择的储蓄罐编号,存入对应天数的钱。 输出结果:输出 N 个整数,表示每个储蓄罐中的钱。
示例代码 这里是使用 C++ 实现的示例代码:
1#include <bits/stdc++.h>
2using namespace std;
3
4int main() {
5 // 读取输入
6 int N, D;
7 cin >> N >> D;
8 int savings[1000] = {0}; // 初始化储蓄罐数组,初始值为0
9 int a[1000]; // 存储每天选择的储蓄罐编号
10
11 for (int i = 0; i < D; ++i) {
12 cin >> a[i];
13 }
14
15 // 模拟存钱过程
16 for (int i = 0; i < D; ++i) {
17 savings[a[i]] += (i + 1); // 第 i 天存入 i + 1 元
18 }
19
20 // 输出结果
21 for (int i = 0; i < N; ++i) {
22 if (i != 0) {
23 cout << " ";
24 }
25 cout << savings[i];
26 }
27 cout << endl;
28
29 return 0;
30}