数组专项总结

一、知识点
1:概念:一维数组的定义数组就是一组相同类型的变量,它们往一、知识点数组就是用一组相同类型的变量,它们往往表示同一批对象的统一属性,表示同一批对象的统一属性,如一个班所有同学的身高、全球所有国家的人口数等。数组可以是一维的 也可以是多维的,一般从0可是编号,h[i]就表示i+1个同学的身高。
1.一维数组定义:类型标示符 数组名[常量表达式];int d[50],g[100];int a[5*10];#define N 50;假设要存储10000个人的中考成绩和性别,可以定义两个数组:int score[10000];//或者float score[10000];bool xb[10000];//或者char xb[10000];
*重点注意:数组定义后,可以引用数组中任一元素。需注意的是,不能一次引用整个数组 只能逐个引用数组的单个元素。
*同时下表越界错误也是在有关数组的题目当中最常见的错误。
2.一维数组的输入和输出键盘读入int h[100];for(i=0;i<100;i++)cin>>h[i];直接赋值int h[100];for(i=0;i<100;i++) h[i]=0;
*重点:两个函数:1.memset函数是给数组按字节进行赋值,一般用在char型数组中,如果是int类型的数组,一般赋值为0和-1。使用前需要包含头文件#include。
例如memset(h,0 sizeof(h));就是将h数组中所有元素均赋值为0。
*如果使用memset函数的话如果为int类型只能够使用0或者1,通常情况下使用该函数用作数组元素的清零
2.fill函数是给数组按元素进行赋值,可以是整个数组,也可以是部分连续元素,可以赋任何值。使用前要包含头文件#include。例如fill(a,a+10,5);就是将a数组的前10个元素赋值为5。
*注意区分memset函数与fill函数在使用时格式之间的区别,适当进行记忆。
例如#include #include using namespace std;int main(){int n,i,f[31];scanf("%d",&n);f[1]=1;f[2]=2;for(i=3;i<=n;i++)f[i]=f[i-1]+f[i-2];for(i=1;i<n;i++)printf("%d",f[i]);printf("%d\n",f[n]);return 0;}
3.一维数组的插入删除在实际应用中,经常需要在数组中插人一个元素,或者删除数组中的某一个元素 ,称为数组的“插人”操作或者“删除”操作。
插人一个元素,需要先找到插人的位置(假设下标为x),将这个元素及其之后的所有元素依次往后移- -位 (注意要从后往前进行操作),再将给定的元素插入(覆盖)到位置x.如图5.3-1所示。
删除某- 个元素, 也需要先找到删除的位置(假设下标为x).将下标为x+1及其之后的所有元素依次向前移一位,覆盖原来位置上的元素,如图5.3-2所示。
插人或者删除一个区间(连续若干个数),只要重复以上单个元素的操作即可。另外,插人操作需要注意把数组下标定义的足够大。为了防止下表越界错误。
例如#include #include using namespace std;int main(){int n,i,x,q[102];scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d",&x);for(i=n;i>=x;i–)q[i+1]=q[i];q[x]=q[n+1];for(i=1;i<n;i++)printf("%d",q[i]);printf("%d\n",q[n]);return 0;}
4.一维数组的查找统计生活中,人们经常需要做一些“查找”操作。例如,在英文字典中查找某个英文单词及其读音,在学生数据库中查找学籍号,出行前查询火车车次、飞机航班等信息,考试后查询某个同学的成绩,等等。一维数组的查找操作,就是在一维数组中查找有没有某个元素 ,它的值等于指定的值x。查找操作的结果可能是个没找到 、找到一个或者找到很多个。
常见的查找算法有 “顺序”查找和”二分”查找。顺序查找就是按照从前往后的顺序,将数组中的元素依次与要查找的数x进行比较。如果数组中的元素是有序的(递增或者递减),也可以采用二分查找。二分查找又称“折半”查找.其优点是比较次数少,查找速度快。
*二分查找常用作有序序列
例如P147 例二抽奖问题
#include
using name space std;
int main(){
int n,i,win,f,left,right,mid,g[101];
cin>>n;
for(i=1;i<=n;i++)cin>>g[i];
cin>>win;
f=0;
left=1;
right=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;}
print(“%d\n”,f)
return 0;
}
5.一维数组的排序排序就是按照某个关键字的大小,将若干对象从小到大或者从大到小进行重新排列。
关健字是对象的某个属性,它可以是任何基本数据类型,甚至结构体等。
例如.体有课上会按照身高从矮到高站队,这就是“升序”排序,身高是每个人的一一个属性,也就是排序的关键字。 再如,将所有单词按照“字典序”倒过来排序.
如zoo、yes、most、key、computer 、book 、bad、apple等,就是降字”排序.关字的类型就是字符串。排序算法非常多.本课学习其中最基本的三种选择排序冒泡排序和插人排序。它们本质上都是通过数组中的元素比较和交换来实现的,所以关键是数组下标的分析。
本课结合一个具体例子,分析和讲解这三种算法。(1)选择排序的基本思想是:每一趟从待排序的数据中,通过“打擂台”比较选出最小元素,放在这些数据的最前面。这样,第一趟把n个数中(第1个到第n个)最小的放在第一个位置,第二趟把剩余的n-1个数中(第2个到第n个)最小的放在第二个位置,第三趟把剩余的a-2个数中(第3个到第n个)最小的放在第三个位置,…n-1趟把剩下的2个数中(第n-1个到第n个)最小的放在第n-1个位置,剩下的最后一个数(第n个)一定最大,自然落在了第n个位置。
(2)冒泡排序的基本思想是:从第一一个数开始,依次 不断比较相邻的两个元素,如果“逆序”镇交换。这样,越排序结束后,最大的元素就放在了第个位置了。
(3)插入排序的基本思想是:把所有待排序元素分成前后两段,前一段是已经排好序的,后 一-段是待排序的。每-趟都是把后一段的第一个数“插人到前段的某不位置,保证前段仍然是有序的。开始时,第1个数作为前一段肯定是有序的;第一 -趟,把第2个数插入进去,保证前2个数有序:第二趟,把第3个数插人进去,保证前3个数有…第n-1趟,把第n个数插入进去,保证n个数都有序。
*常用C++sort函数用法.#include using namespace std;默认的sort函数是按升序排。sort(a,a+n); //两个参数分别为待排序数组的首地址和尾地址。
例如#include #include using namespace std;int main(){ int a[10]={9,6,3,8,5,2,7,4,1,0}; for(int i=0;i<10;i++) cout<<a[i]<<" “; cout<<endl; sort(a,a+10); for(int i=0;i<10;i++) cout<<a[i]<<” “; cout<<endl; return 0; }
6.二维数组的定义和操作一般格式类型标示符 数组名[常量表达式1][常量表达式2];常量表达式1的值表示第维大小,常量表达式2的值表示第二维大小,常量表达式1和常量表达式2的秉积就是二维数组的元素个数。例如#include#includeusing namespace std;int main(){ int a[6][6],m,n,k;for(int i=1;i<=5;i++){ for(int j=1;j<=5;j++) cin>>a[i][j]; } cin>>m>>n; for(int j=1;j<=5;j++){ k=a[n][j]; a[n][j]=a[m][j]; a[m][j]=k; } for(int i=1;i<=5;i++){ for(int j=1;j<=5;j++){ cout<<a[i][j]<<” “; } cout<<endl;} return 0; }
7.字符数组(数组的特殊格式,末尾自带空字符’\n’)
赋值:
逐个赋值:
(需要循环输入,每次输入单个字符后,需要用getchar()吸收空格/回车/Tab
scanf逐个元素读入:scanf(”%c",&letter[i])
cin逐个元素读入:cin>>letter[i]
getchar逐个元素读入:letter[i]=getchar()
整体赋值:(自行将字符串分割,可以储存空格,以回车作为结束符)
scanf读入整个数组:scanf("%s",letter)
cin输入整个数组:cin>>letter
gets读入整个数组:gets(letter)
输出:
用对应语句输出函数:
strcpy(字符串1,字符串2):将字符串2复制给字符串1,完全覆盖,输出字符串1。
strcmp(字符串1,字符串2):比较字符串1和字符串2的大小,字符串1>字符串2,返回正整数;字符串1=字符串2,返回0;字符串1<字符串2返回一个负整数。strlen(字符串名):返回字符串长度,不包括’\n’
二:收获:通过这一章节的学习,在面对许多数据时,给我们提供了一种全新的解题方法以使我们能够快速的输入和输出这些庞大的数据。同时在面对数字方阵类型的题目时,我们可以利用数组进行简便的程序设计。
三:感想:数组在难度方面数组确实比前几章难度有所增加,在专项练习中有关数组的题目常常会使用到前面循环语句的知识,这就要求我们融会贯通,熟练的使用各个章节的知识才是学好这一章节乃至于这本书的关键,与此同时通过这一章节的学习我们可以把程序设计的知识与高等代数中的矩阵内容所联系起来,使不同科目之间融会贯通。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值