第七章 数  组
本章重点:
处理好循环与数组下标的关系,就掌握了数组的核心技术.
数组的赋值方法.
一些典型算法:排序,查,插入的过程
字符数组和字符串的根本区别在于程序在处理字符串时是以\0作为结束标志的.
字符串不能用赋值语句.
7.1一维数组的定义和引用
1.一维数组的定义
定义方式为:
类型说明符  数组名[常量表达式]
例如:int  a[10];
数组名后面的常量表达式只能用“[  ]”括起来,不能用“(  )”号。
2. 一维数组元素的引用
每次可引用一个数组元素,不能引用整个数组。
一个数组元素就如同一个简单变量.
引用时应注意下标的值不要超过数组长度的范围。
a[0]=a[5]+a[7]-a[2*3]  常量和表达式做下标
a[i]=a[i]+1;        变量做下标
a[a[0]]=>a[1]      数组元素做下标
  例7.1 程序自已输入0-9,然后按逆序输出。
    main()
{
int i, a[10];
    for (i=0;i<=9;i++) a[i]=i;
    for (i=9; i>=0;i--)
    printf(%d,a[i]);
}
3.一维数组的初始化
(1)在定义数组时对各元素指定初始值。
          int a[10]={1,2,3,4,5,6,7,8,9,10};
等价于
int a[10];
a[0]=1;a[1]=2;a[2]=3; … a[9]=10;
(2) 可只对一部分元素赋以初值。
            int a[5]={1,3,5};
            a[0]=1;a[1]=3;a[2]=5;  a[3],a[4]未确定
    (3)数组可以不规定维数, 在初始化赋值时, 数组维数从0 开始被连续赋值。
    例如:
    char f[]={'a', 'b', 'c'};
int a[ ]={1,3,5};
(4)数组不赋初值,系统自动给所有实数组元素赋以0值。数组元素的赋值可以通过赋值语句或scanf函数输入。
例7.2:求一组数(10个)的平均与总和。E5_1a
main()
{ int i,sum,a[10];
  float av;
  for(i=0;i<10;i++)
    scanf("%d",&a[i]);  /*数据输入*/
  sum=0;
  for(i=0;i<10;i++)  {
printf("%d ",a[i]);    /*数据输出。并求和*/
    sum=sum+a[i];
  }
    av=sum/10.0;
  printf("%d\n",sum);
  printf("%f\n",av);
}
 
4.一维数组举例
例7.3:对10个数由小到大排序(冒泡排序)。
  冒泡排序法的基本思想:
将相邻两个数相比较,将小的调到前头。不断比较,直到将最后两数比较处理完毕。每进行一轮,把剩下的数中最大的一个移到最后位置。
#include stdio.h
main()
{ int a[10]={9,8,5,4,2,0,6,1,3,7}
int  i, n=10;
  for  (i=0;i<n-1;i++)
      for (j=0;j<n-i;j++)
        if (a[j]>a[j+1])
        { temp=a[j],a[j]=a[j+1];a[j+1]=temp;}
  for (i=0;i<9;i++)
      printf(“%3d”,a[i]);
}
例7.4:对N个数由小到大排序(选择排序)。
选择法的基本思想:
从所有元素中选择一个最小元素放在a[0],作为第一轮,第二轮从a[1]开始到最后的各元素中选择一个最小元素,放在a[1]中,依次类推,n个数进行n-1轮。 
3 5 1 4 7 2
第一轮:1 8 5 7 3 10 
第二轮:1 3 5 7 8 10 
for(i=0,i<10,i++)
{ k=i;
for(j=i+1,j<10,j++)
  if ( a[j]<a[k])  k=j    //k记住最小值的下标
if (i!=k) { temp=a[i];a[i]=a[k];a[k]=temp;}
}
例7.5 折半查法。
顺序查及折半查。
折半查方法的介绍
1、 前提:查数据已按一定规律(升序或降序)排列好。
2、 基本思想:先检索正中间一个数据,看它是否为所需的数据,若不是,则判断数据在正中间数的哪一边,若在左侧,就在左侧范围查,否则,在右侧查。
3、 查过程:
 例:有一组已排序的数据:
8 13 21 28 35 41 52 63 71 76 81 95 101 150 164 
按树形排列如下:
   
Main()
{ int a[15]={8,13,21,28,35,41,52,63,71,76,81,95,101,150,164};
  int m=15,n=0,y,x;
  printf("enter x:");
  scanf("%d",&x);
  do
  { y=(m+n)/2;
    if ((x>a[y] && x<a[y+1]) || (x<a[y] && x>a[y-1]))
    {printf("no find!");break;}
  if (x<a[y])      m=y;
  if (x>a[y])      n=y;
  if (x==a[y])  printf("%d at the position %d",x,y+1);break;}
  } while (1);
  }
7.2 二维数组
7.2.1.二维数组
(1)一般说明格式是:
类型  数组名[第1维长度][第2维长度]
  (2).例如:
    int m[3][2];      /*定义一个整数型的二维数组*/
    char c[3][4];  /*定义一个字符型的三维数组*/
  数组m[3][2]共有3*2=6个元素, 顺序为:
      m[0][0], m[0][1], m[1][0], m[1][1], m[2][0], m[2][1];
    数组c[3][4]共有3*4=12个元素, 顺序为:
      c[0][0] c[0][1], c[0][2], c[0][3]
      c[1][0] c[1][1], c[1][2], c[1][3]
      c[2][0] c[2][1], c[2][2], c[2][3]
  (3. 数组占用的内存空间(即字节数)的计算式为:
    字节数=第1维长度*第2维长度*该数组数据类型占用的字节数
7.2.2.二维数组的初始化
  ( 1)
int p[2][3]={{2, -9, 0}, {8, 2, -5}};  /*定义数组p并初始化/*
    int m[2][4]={{27, -5, 19, 3}, {1, 8, -14, -2}};
  (2) 多维数组存储是连续的, 因此可以用一维数组初始化的办法来初始化多维数组。
    例如:
    int x[2][3]={1, 2, 3, 4, 5, 6};  /*用一维数组来初始化二维数组*/
  (3) 对数组初始化时, 如果初值表中的数据个数比数组元素少, 则不足的数组元素自动用0来填补。
3. 二维数组的引用
    行号和列号都是从0开始的,并注意行号和列号不要超过数组定义的范围。
a[0][0]=1;      a[0][1]=2;….
main()
        {
          int m[2][2];
          float n[3];
定义数组初始化          m[0][0]=0, m[0][1]=17, m[1][0]=21;/*数组元素赋值*/

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。