C专栏8-高级类型数组

/*************************************************

function:c language Technology
author  :chinayaosir   QQ:44633197 
blog    :http://blog.csdn.net/chinayaosir
note    :禁止其它网站转载此文章

**************************************************/

 

C的高級類型数组

1.数组的声明
声明数组的语法为在数组名后加上用方括号括起来的维数说明。
下面是一个整型数组的例子:
int array[10];
这条语句定义了一个具有10个整型元素的名为array的数组。
这些整数在内存中是连续存储的。数组的大小等于每个元素的大小乘上数组元素的个数。
方括号中的维数表达式可以包含运算符,但其计算结果必须是一个长整型值。
下面这些声明是合法的:       
int offset[5+3];       
float count[5*2+3];
下面是不合法的:
int n=10;
int offset[n];  /*在声明时,变量不能作为数组的维数*/
***************************************************************
2.用下标访问数组元素
千万注意,数组的第一个元素下标从0开始。
int offset[10];
表明该数组是一维数组,里面有10个数,它们分别为offset[0],offset[1],……offset[9];
一些刚学编程的人员经常在这儿犯一些错误。offset[3]=25;
上面的例子是把25赋值给整型数组offset的第四个元素。
在赋值的时候,可以使用变量作为数组下标。
main()
    {
        int i,offset[10];
        for(i=0;i<10;i++)  scanf("%d",&offset[i]);
        for(i=9;i>=0;i--)  printf("%d ",offset[i]);
        printf("/n");
    }
***************************************************************
3.数组的初始化
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[i]);
        printf("/n");
}
最终结果为1 3 5 7 9
***************************************************************
4.字符数组
整数和浮点数数组很好理解,在一维数组中,还有一类字符型数组。
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[i]);
        printf("/n");
}
    最终的输出结果为72 69 76 76 79
***************************************************************
5.字符型数组和整型数组也有不同的地方
看下面的:
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[i]);
        printf("/n");
}
其实我们可以根据判断'/0'来输出字符串,看下面的:
main()
{
        int i;
        char array[]="094387fdhgkdladhladaskdh";
        for(i=0;array[i]!='/0';i++) printf("%c",array[i]);
        printf("/n");
}

***************************************************************
6.数组例子:
6.1.输入10个整数存入数组中,然后把它们从小到大排列并放在同一数组中。
(思路:先找出最小的,放在第一个位置,为了防止把原先的数覆盖掉,可以把原先的第一个数和最小数的位置互换)。
main()
{
        int array[10];
        int i,j,min,stmp;
        for(i=0;i<10;i++) scanf("%d",&array[i]);
        for(i=0;i<9;i++)
        {
            min=array[i];
            for(j=i+1;j<10;j++)
                if(min>array[j])        /*里面的4行语句很重要*/
                {
                    min=array[j];
                    stmp=array[i];
                    array[i]=array[j];
                    array[j]=stmp;
                }
        }
        for(i=0;i<10;i++) printf("%d ",array[i]);
        printf("/n");
}
               
分析:先让第一个值作为基准,如果后面有比它小的,那么就把这两个数互换一下,同时把基准换成小的值。
两个数互换应该这样(stmp=a;a=b;b=stmp;),而不是(a=b;b=a;),想想这是为什么?
必须要用一个变量作为桥梁。这种一个一个的把最小的放在前面的排序方法,我们形象的叫做冒泡法。

6.2.输入一行字符存入数组,然后把他们反序存入到同一数组中。
    #include "stdio.h"
    main()
    {
        char c,stmp,array[80];
        int i=0,j;
        while((c=getchar())!='/n')   /*注意这儿的用法*/
            array[i++]=c;
        array[i]='/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[i]!='/0';i++) printf("%c",array[i]);
        printf("/n");
    }
               
6.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[i]=array[i+1];
            printf("%d ",array[i]);
        }
        printf("/n");
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值