C++数组

本文详细介绍了C++中的数组,包括一维数组的定义、元素引用、存储结构、输入输出、插入删除、查找统计和元素排序。通过实例演示了数组在幸运数划分、队伍调整、抽奖、求最大值等问题中的应用。同时,还探讨了二维数组、回型方阵和字符数组的相关知识,强调了数组使用中的注意事项和心得。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C++数组
——知识点
一、一堆数组的定义
1、数组:
数组就是一组相同类型的变量,它们往往都是为了表示同一批对象的统一属性,如一个班级所有同学的身高、全球所有国家的人口数等。
数组可以是一维的,也可以是二维或多维的。
2、一堆数组的定义:
(1)、格式:类型标识符 数组名[常量表达式];
其中:
类型标识符可以是任何基本数据类型,也可以是结构体等构造类型,相同类型的数组可以一起定义;
数组名必须是合法的标识符;
常量表达式的值即为数组元素的个数。
3、一堆数组的元素引用:
数组定义好后,就可以引用(调用)其中的任意一个元素。引用格式如下:
数组名[下标]
如:h[5]、h[i2+1]等。其中,下标只能是整型常量或整型表达式,值必须在数组定义的下标内,否则会出现"下标越界错误"。
需要注意的是,不能一次引用整个数组,只能逐个引用数组的单个元素。
4、一堆数组的存储结构:
数组在计算机内存单元中是连续存储的。程序一旦执行到数组的定义语句,就会开辟出若干字节的内存单元。
二、一堆数组的输入与输出
1、一堆数组的输入与输出:
一堆数组的输入、输出等操作,都是采用循环语句结合下标变化,逐个元素进行。
2、批量数据一次性输入到一堆数组中:
(1)、键盘逐个读入数组元素值;
, (2)、给每个数组元素直接赋值。
3、给数组"整体"赋值:
(1)、memset函数
memset函数是给数组"按字节"进行赋值,一般用在char型数组中,如果是int类型的数组,一般赋值为0或-1。使用前需要包含头文件:#include。
(2)、fill函数
fill函数是给数组"按元素"进行赋值,可以是整个数组,也可以是部分连续元素,可以赋任何值。使用前需要包含头文件:#include。
应用举例:幸运数的划分
问题描述:
判断一个正整数n是否能被一个"幸运数"整除。幸运数是指一个只包含4或7的正整数,如7、47、477等都是幸运数,17、42则不是幸运数。
输入格式:
一行一个正整数n,1<=n<=1000。
输出格式:
一行一个字符串,如果能被幸运数整除输出"YES";否则,输出"NO"。
输入样例:47
输出样例:YES
问题分析:分析发现,1~1000范围内的幸运数只有14个。于是,将这14个幸运数直接存储到一个数组lucky中,再穷举判断其中有没有一个数能整除n。
#include
using namespace std;
int main( ){
int n,lucky[14]={4,7,44,47,74,77,444,447,474,477,744,747,774,777}
scanf("%d",&n);
bool flag =false;
for(int i=0;i<14; i++)
if(n%lucky[i]==0)flag =true;
if(flag)printf(“YES\n”);
else printf(“NO\n”);
return 0;
}
三、一堆数组的插入删除
1、一堆数组的插入
插入一个元素,需要先找到插入的位置(假设下标为x),将这个元素及其之后的所有元素依次往后移一位(注意要从后往前进行操作),再将给定的元素插入(覆盖)到位置x。
2、一堆数组的删除
删除某一个元素,也需要先找到删除的位置(假设下标为x),将下标为x+1及其之后的所有元素依次像前移一位,覆盖原来位置上的元素。
应用举例:队伍调整
问题描述:有n个人(每个人有一个唯一的编号,用1~n之间的整数表示)在一个水龙头前排队准备接水,现在第x个人有特殊情况离开了队伍,求第x个人离开队伍后的排队情况。
输入格式:
第一行1个正整数n,表示有n个人,2<n<=100。
第二行包含n个正整数,之间用一个空格隔开,表示排在队伍中的第1个到第n个人的编号。
第三行包含一个正整数x,表示第x个人离开队伍,1<=x<=n。
输出格式:一行包含n-1个正整数,之间用一个空格隔开,表示第x个人离开队伍后的排队情况。
输入样例:
7
7 2 3 4 5 6 1
3
输出样例:
7 2 4 5 6 1
#include
using namespace std;
int main( ){
int n,i,x,q[102];
scanf("%d “,&n);
for(i=1;i<=n;i++)scanf(”%d",&q[i]);
scanf("%d",&x);
for(i=x;i<n;i++) q[i]=q[i+1];
n–;
for(i=1;i<n;i++)prinf("%d",q[i]);
printf("%d\n",q[n]);
return 0;
}
四、一堆数组的查找统计
一堆数组的查找操作,就是在一堆数组中查找有没有某个元素,它的值等于指定的值x。查找操作的结果可能是一个没找到、找到一个或者找到很多个。
常见的查找算法有"顺序"查找和"二分"查找。
顺序查找就是按照从前往后的顺序,将数组中的元素依次与要查找的数x进行比较。
二分查找又称"折半"查找,其优点是比较次数少、查找速度快。但是要求数据是递增或递减排序的。
应用举例:抽奖
问题描述:公司举办年会,为了活跃气氛,设置了摇奖环节。参加聚会的每位员工都有一张带有号码的抽奖券。现在,主持人从小到大依次公布n个不同的获奖号码,小谢看着自己抽奖券上的号码win,无比紧张。请编写一个程序,如果小谢获奖了,请输出他中奖的是第几个号码;如果没有获奖,请输出0。
输入格式:
第一行一个正整数n,表示有n个获奖号码2<n<=100。
第二行包含n个正整数,之间用一个空格隔开,表示依次公布的n个获奖号码。
第三行一个正整数win,表示小谢抽奖券上的号码。1<=获奖号码,win<10000。
输出格式:
一行一个整数,如果小谢中奖了,表示中奖的是第几个号码;如果没有中奖,则为0。
输入样例:
7
1 2 3 4 6 17 9555
3
输出样例:3
#include
using namespace std;
int main( ){
int n,i,win,f,left,right,mid,g[101];
scanf( “%d”, &n );
for(i=1;i<=n;i++)scanf("%d",&g[i]);
scanf("%d",&win);
f=0;left=1;right=n;
while(left<=n){
mid=(left+right)/2;
if (g[mid]==win){f=mid;break;}
if(win<g[mid])right=mid-1;
if(g[mid]<win)left=mid+1;
}
printf("%d\n",f);
return 0;
五、一堆数组的元素排序
"排序"就是按照某个关键字的大小,将若干对象从小到大或者从大到小进行重新排列。关键字是对象的某一个属性,它可以是任何基本数据类型,甚至结构体等。
例如,体育课上我们会按照身高从矮到高站队,这就是"升序"排列,身高是我们每个人的一个属性,也就是排序的关键字。再如,将所有单词按照"字典序"倒过来排序,如zoo,yes,most,key,computer,book,bad,apple等,就是"降序"排序,关键字的类型就是字符串。
应用举例:
求n个数中的最大值,并记录在数组中的位置
main( ){
int a[100000]
int i,max,l;
cin >> n;
for (i=0;i<n; i++) cin >> a[i];
max=a[0];l=0;
for(i=1;i<n ;i++){
if(max<a[j])
{max=a[j];l=i}
cout << l << endl;
}
return 0;
C++sort函数用法
1、#include
using namespace std;
默认的sort函数是按升序排。
sort(a,a+n);//两个参数分别为待排序数组的首地址和尾地址。
2、可以自己写一个cmp函数,按特定意图进行排序。
六、一堆数组的应用举例
素数大酬宾:
问题描述:某商场的仓库中有n个种商品,每件商品按1~n依次编号。现在商场经理突发奇想,决定将编号为素数的所有商品拿出来搞优惠酬宾活动。请编程帮助仓库管理员将编号为素数的商品选出来。
输入格式:一行一个正整数n,表示有n种商品,2<=n<=100000。
输出格式:一行若干个正整数,表示若干种商品编号且每个编号均为素数,请从小到大输出,每两个数之间有一个空格。
输入样例:20
输出样例:2 3 5 7 11 13 17 19
筛选法:
#include
#include
using namespace std;
int main ( ){
int n,i,j;
bool p[100001];
for (i=0;i<=100000;i++)p[i]=true;
p[1]=false;
cin >> n;
cout << 2;
for(i=2;i<=sqrt(n);i++)
if(p[i]) for(j=2;i
j<=n;j++)p[i
j]=false;
for(i=3;i<=n;i++) if(p[i]) cout <<" “<<i;
cout << endl;
return 0;
}
七、二维数组的定义和操作
1、二维数组的定义和初始化
(1)、一维数组的元素可以是任何基本数据类型,也可以是结构体。那么,如果一堆数组的每一个元素又是一个一堆数组呢?我们称这种数组为"二维数组”。
(2)、定义二维数组的一般格式为:
类型标识符 数组名[常量表达式1][常量表达式2];
常量表达式1的值表示第一维大小,常量表达式2的值表示第二维大小,常量表达式1和常量表达式2的乘积就是二维数组的元素个数。
(3)、在二维数组定义的同时,可以进行初始化赋值。例如:
int a[2][3]={{1,2,3},{4,5,6}};//分行初始化
也可以给数组中的部分元素初始化。例如:
int a[2][3]={{1,2},{4}};
第一行只有两个初值,按顺序分别赋值给a[0][0]和a[0][1],第二行的初值4赋给a[1][0],其他元素默认为0。
在定义二维数组时,可以省略第一维的大小,但是第二维的大小不能省略。例如,定义"a[][5];"是允许的,被省略的第一维大小根据初值的个数由系统来确定。例如:
int[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
系统根据{ }中的元素个数,自动确定a数组的第一维大小为3。
2、二维数组的存储及元素引用。
二维数组本质上是一维数组的每一个元素又是一个一维数组,而计算机内部存储一维数组采用的是连续存储单元。所以,二维数组的存储方式是"行优先"的连续存储,先逐个存储第0行上的所有元素,再逐个存储第0行上的所有元素,再逐个存储第1行上的所有元素,以此类推。
引用二维数组的某一个元素,格式为:
数组名[下标1][下标2]
3、二维数组的输入输出
二维数组的输入、输出操作也是针对每一个元素进行,结合两个维度的下标变化,用循环嵌套实现。
应用举例:回型方阵
问题描述:输入一个正整数n,输出n
n的回型方阵。例如,n=5时,输出:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
输入格式:一行一个正整数n,2<=n<=9。
输出格式:共n行,每行包含n个正整数,之间用一个空格隔开。
输入样例:5
输出样例:
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
#include
using namespace std;
int n,i,j,k,a[10][10];
int main( ){
cin >> n;
for(k=1;k<=(n+1)/2;k++)
for(i=k;i<=n+1-k;i++)
for(j=k;j<=n+1-k;j++)
a[i][j]=k;
for(i=1;i<=n;i++){
for (j=1;j<n;j++)
cout<<a[i][j]<<endl;
return 0;
}
八、数字方阵
1、数字方阵就是一个行列数相等的二维数组,其中的每个元素都是数字。解决数字方阵问题,一般有两种方法:解析法和模拟法。
(1)、解析法就是找出每一个方阵元素f[i][j]与i、j和数组规模n的通项公式,然后直接用二重循环给数组元素赋值,相对比较容易,一般用在初始化等场合。
(2)、模拟法就是把数字方阵看成一个动态的填数过程,把n
n个数依次填入数组中,每填好一个数,就定位好下一个数的位置i和j。
九、字符数组
数组中的每个元素都是一个字符的数组称为"字符数组"。有时,把一堆字符数组又称为"字符串"。定义字符数组的方法与定义其他类型数组的方法类似。
对于字符数组的定义"char s[10]={‘H’,‘e’,‘l’,‘l’,‘o’}",也可以说,字符串的末尾都会有一个空字符串’\0’。
1、字符数组赋值方法:
用字符常量逐个初始化:char letter[5]={‘a’,‘e’,‘i’,‘o’,‘u’};
用赋值语句逐个元素赋值:letter[0]=‘a’;…
用scanf读入整个数组:scanf("%s",letter);
用cin 输入整个数组:cin >> letter;
用gets读入整个数组:gets(letter);
2、字符数组输出方法:
用cout输出整个数组:cout<<letter;
用printf输出整个数组:printf("%s",letter);
用puts输出整个数组:puts(letter);
——收获
通过对数组的学习,我学到了怎样把一堆具有相同类型的变量用一个十分简单的方式表示出来,学到了一维数组和二维数组的定义,引用,存储,输入与输出,插入与删除,查找统计以及元素排序。认识到了一种新的处理数据的办法,一种新的工具。
——心得体会
1、数组必须先初始化,再使用。
2、定义数组中常量表达式时,一般要超过所需的数组个数,以免出现越界错误。
3、不能直接引用一个数组,只能逐个引用数组中的元素。
4、在数组的查找操作中,二分查找具有比较次数少,查找速度快的优点,但要求数据是递增或递减排序的。
5、[ ]里的下标只能为整型常量或整型表达式,值必须在数组定义的下标范围内,否则会出现"下标越界错误"。
6、数据存储在数组中总是从下标为0的第一个元素开始存放,而且是连续存放的。
7、对数组的各种操作,其实就是对数组下标的操作。
8、想要数组输出正常,必须要有\0这个符号,没的话,输出会有乱码。
9、若不给可初始化的数组赋初值,则全部元素均为0值。
——认识
通过对数组的学习,可以预见的将会使一些问题简单化处理,特别是一些特殊函数的出现,可以使一些本需要很多程序来表述的问题得以一步解决,但是与此同时而来的是难度系数的增加,没有之前循环结果,分支结果等的遂心应手,也逐渐体会到一上午甚至一整天调不出一个程序的崩溃。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值