数组

第五单元  数组
一、          一维数组的定义1.定义:   数组是定义一组变量,数组用下标来代表元素,但下标必须在数组定义下的范围内,否则出现越界错误。1):数组就是一组相同类型的变量,它们往往是为了表示同一批对象的统一属性,例如一个班级所有同学的身高,全球所有国家的人口数等。数组可以是一维的,也可以是二维或多维的。在使用一维数组时,一般是从0开始编号,h[i]表示第i+1个同学的身高,i称为‘’下标变量"。例如,读入50个同学的身高如下:for(i=0;i<=49;i++) cin>>h[i];2)格式:类型标识符   数组名   [常量表达式];注:①类型标识符可以是任何基本数据类型,也可以是基本结构体等构造类型,相同类型的数组可以一起定义。②常量表达式的值即为数组元素的个数。(可以写为表达式形式,但不能超过其上限)例如:“int h[10];“表示定义一个一维数组h,共10个元素,编号从0开始到9,千万不能出现h102.  一维数组的元素引用注明:①数组中的下标只能为整型变量或整型表达式,值必须在数组定义的下标范围内,否则会出现越界错误。②不能一次引用整个数组,只能逐个引用数组的单个元素。例如,对一个数组a来说,语句"cout<<a”;是不合法。3.一维数组的存储结构数组在计算机中连续存储。程序一旦执行到数组的定义语句,就会开辟出若干字节的内存单元。占用空间=数组个数单个字节空间    其中整型类型占四个字节。sizeof函数可以直接求出一个数组所占的内存空间。二、       一维数组的输入与输出1.一维数组的输入与输出都是采用结合语句结合下标变化逐个元素进行。例如:   int h[100]            for(i=0;i<100;i++)   cout<<h[i];2.批量数据一次性输入到一堆数组中的方法:①键盘读入            int h[100]            for(i=0;i<100;i++)   cin>>h[i];②直接赋值            int h[100],a[20];            for(i=0;i<100;i++)  h[i]=0;            for(i=0;i<20;i++)    a[i]=i2+1;3.给数组"整体"赋值的两个函数①memset函数给数组"按字节"进行赋值,一般用在char型数组中,如果是int类型的数组,一般赋值为0和-1。使用头文件:#include例如:“memset(h,0,sizeof(h));“就是将h数组所有元素均赋值为0。最好只用于赋值0。按字节赋值按二进制给出。某种字符占用的字节数即h占用的字节数,每个数只代值0。②fill函数给数组"按元素"进行赋值,可以是整个数组,也可以是部分连续元素,可以赋任何值。使用头文件:#include例如(fill(a.a+10.5);“就是将a数组的前10个元素赋值为5。数组从第n个元素开始,到第几个元素为止。③例:幸运数的划分经分析1~1000范围内的幸运数只有14个,于是将14个幸运数直接存储到一个数组lucky中,再穷举判断其中有没有一个数能整除n。三、      一维数组的插入删除1.①在数组中插入一个元素,或者删除数组中的某一个元素,称为数组的"插入"操作或者"删除"操作。②插入一个元素,需要先找到插入的位置(假设下标为x)将这个元素之后及其之后的所有元素依次往后移一位(注意从后往前进行操作),再将给定的元素插入(覆盖)到位置x。③删除某一个元素,需要将先找到删除的位置(假设下标为x)将下标为x+1及其之后的所有元素依次往前移一位,覆盖原来位置上的元素。④注:插入或删除一个区间(连续若干个数),只要重复以上单个元素的操作即可。2.例:插队问题:N个人的排队情况可以用数组q表示,q[i]表示排在第i个位置上的人。定义数组时多定义一个位置,然后重复执行:q[i+1]=q[i],其中,i从n-x。最后再执行q[x]=q[n+1]输出q[1]~q[n]。四、   一维数组的查找统计1.①一维数组的查找操作,就是  在一维数组中查找有没有某个元素,它的值等于指定的值x。查找到的结果可能是一个没找到,找到一个或者找到很多个。常见的方法有"顺序"查找和"二分"查找。②顺序查找是按从前往后的顺序,将数组中的元素依次与要查找的数x进行比较。②如果数组中元素是有序的,可用二分查找,查找次数少且快速。③例:比身高#includeusing  namespace  std;int  h[1001],n,i,j,ans,t1,t2;int  main(){      scanf(”%”,&n);      for(i=1;i<=n;i++)  scanf(”%d”,&h[i]);      for(i=1;i<=n;i++){            t1=t2=0;            for(j=1;j<i;j++)                  if(h[j]>h[i])    t1++;//排在他前且比他高的            for(j=i+1;j<=n;j++)                人数                  if(h[j]>h[i])    t2++;//排在他后面且比他高             if(t1==t2)    ans++;               的人数}五、        一维数组的元素排序1.  排序就是按照某个关键字的大小,将若干对象从小到大或者从大到小进行重新排列。关键字是对象的某一属性,它可以是任何基本数据类型,甚至结构体。2.①选择排序每一趟从待排序的数据中,通过打擂台比较选出最小元素,放在这些数据的最前面。②冒泡排序从第一个数开始,依次不断比较相邻的两个元素,如果"逆序"就交换。结束后,最大的元素就位于第n个位置了。用sort函数不超时,速度快。③插队排序把所有待排元素分成前后两段,前一段是已经排好序的,后一段是待排序的。每一趟都是把后一段的第一个数"插入"到前一段的某一个位置,保证前一段仍然是有序的。在一个序列加入一个数使之重新排列为有序的则依稀排列n遍,即多加一个序列后仍有序。void   inssort  (int    a,int,num){    for(i=1;i<num;i++){l=i-1;temp=a[i];while(l>=0&&a[l]>temp){a[l+1]=a[l];l–}a[l+1]=temp;}}c++sort函数用法#includeusing  namespace  std;默认的sort函数是按升序排sort(a,a+h);//两个参数分别为排序数组的首地址和尾地址比较函数用法#include#includeusing  namespace  std;bool   complare(int a,int b){return   a>b;若a>b为真值则返回次序直接输出a>b若a>b为假值,则返回次序要交换a,b位置。六、    一维数组的应用举例计算机计数是十的九次方,超过十的九次方,则计算机运行超过一秒。商品排序:桶排序:                            数组元素取值范围较小,       #include     但元素个数很多。using  namespace  std;int  n,i,j,number,num[1001];       每一个成绩段为int  main(){                                       一个桶      cin>>n;      for(i=1;i<=n;i++){           cin>>number;           num  [number]++;//记录整数number出现的次数}for(i=0;i<1001;i++)  for(j=1;j<=num[i];j++)          cout<<i<<endl;//输出num[i]次i  return   0;}七、    二维数组的定义和操作如果一堆数组的每一个元素是一个一维数组,则称这种数组为二维数组。1.二维数组的定义和初始化格式:类型标识符    数组名[常量表达式1][常量表达式2]常量表达式1的值表示第一维大小,常量表达式2的值表示第二维大小,常量表达式1和常量表达式2的乘积就是二维数组的元素个数。例如:int a[2] [3]={{1,2,3},{4,5,6}}2.二维数组的存储及元素引用二维数组的存储方式是"行优先"的连续存储,先逐个存储第0行上的所有元素,再逐个存储第1行上的所有元素,依此类推。格式:   数组名[下标1]  [下标2]3.二维数组的输入输出针对每一个元素进行,结合两个维度的下标变化,用循环嵌套实现。例:回型方阵先给左上角的a[n/2] [n/2]赋值,a[i][j]=min(i,j),右上角、左下角、右下角三部分,通过下标的对称性复制过去即可。例:     a[i][n+1-j][j]=a[n+1-i][n+1-j]=a[i][j]八、      二维数组应用举例例①:杨辉三角形定义一个二维数组tri存储杨辉三角形(其实只用到二维数组的左下部分)。对于第i行(1<=i<=n),共有i个数,其中第一个数和最后一个数都是1,其他数tri[i][j]=tri[i-1][j-1]+tri[i-1][j]。采用递推法给每个元素赋值。九、数字方阵1.数字方阵就是一个行列数相等的二维数组,其中的每个元素都是数字。解决数字方阵问题有两种方法:解析法和模拟法。①解析法:找出每一个方阵元素f[i][j]与i、j和数组规模n的通项公式,然后直接用两重循环给数组元素赋值。②:模拟法:把数字方阵看成一个动态的填数过程,把n*n个数依次填入数组中,每填好一个数,就可以定位下一个数的位置i和j。十、字符数组①如果数组中的每个元素都是一个字符,这样的数组称为"字符数组"。有时,把一维字符数组又称为"字符串"。定义字符数组的方法与定义其他类型数组的方法类似。例如,“char  letter[5];“与"char  matrix[20][20];“两个语句分别定义了一个一维字符数组letter和一个二维字符数组matrix。②给字符数组赋值的方法用字符常量逐个初始化:char  letter[5]={‘a’,‘e’,‘i’,‘o’,‘u’};用赋值语句逐个元素赋值:letter[0]=‘a’;…用scanf读入整个数组:scanf(”%s”,letter);用scanf逐个元素读入:scanf(”%c",&letter[0]);…用cin输入整个数组:cin>>letter;用cin逐个元素输入:cin>>letter[0];…用gets读入整个数组:gets(letter);用getchar逐个读入:letter[0]=getchar();…③字符数组的输出方法用cout输出整个数组:cout>>letter;用cout逐个元素输出:cout>>letter[0];…用printf输出整个数组:printf("%s",letter);用printf逐个元素输出:printf("%c",letter[0]);…用puts输出整个数组:puts(letter);用putchar逐个元素输出:putchar(letter[0]);…注:在用scanf的%s格式或gets读入字符串时,在字符串末尾自动添加一个空字符’\0’。而使用getchar等方法读入字符串时,则要在字符串后手工加’\0’。学习总结:数组为我们提供了存储数据的空间以及通过学习数组可以使大批量,同一类型的数据很好的表达出来。对于数组的插入与删除,插入时需要从后往前依次赋值,而删除则需要从前往后依次进行。二分查找则为我们寻找数据提供了简单快速的方法。元素的排序,方法很多,尤为注意它们使用的方法与区别。一维数组由一个下标确定位置,而二维数组由两个下标确定位置。  学习收获:相比于前三种语句结构的学习,更加强调方法性和规律性,就比如我做的一道题,因为循环语句写多了,所以最终结果显示超时,因为数组中的数的个数最多可以达到1000个,像我这样循环可能会循环到10的9次方次。于是我把循环语句简略了一下,虽然可以,但还是不够好。总之,数组较前面需要更多的功夫与精力。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值