C语言数组

C语言数组:

数组的简介:

  一般格式:类型 数组名[数组下标]

    例如:int a[10];

  1:数组属于构造类型。他是基本数据类型元素的组合。
  2:一个数组中的成员在内存上是连续的。
  3:a:代表数组名,他同时又代表数组的首地址。
    a是一个常量。(不可以自加,自减 a++,--a等操作),可以进行 a+1 的操作(因为没有赋值) 。
  4:[ ]:数组的格式,10数组的成员有十个。
     a[0], a[1] .................. a[9]

  5:编译器不对数组越界检查(一定要注意越界问题)
      a[-1]   不会出错
      a[10]   不会出错

数组赋值的使用:

  1、定义的时候直接赋值初始化:
   int a[10] = {1,2,3,4,5,6,7,8,9,10};

   int a[10] = {1,2,3,4,5};
      a[0]----a[4] 里面的值是1,2,3,4,5
      a[5]----a[9] 这里面的值都是0

   int a[10] = {0};  数组中的成员都是0

   int a[ ] = {1,2,3,4,5}; 这里a没指定数组的成员个数,但是初始化的时候给了4个处理,编译器就会给他4个int 类型的大小。

   对于字符数组也可以这样初始化:
     char a[5] = " 'a' , 'b' , 'c' , 'd' , 'e' ";
     char b[5] = " abcd " ; //注:这样给数组赋值时,尽量把最后一个位置空出来,用于存放字符串的结束符 (‘ \0 ’)
     char c[ ] = " ajnj564 " ;

   也可以先定义一个数组,然后在一个一个的赋值。
     int a[5];
     a[0] = 1;
     a[1] = 2;
     a[2] = 3;
     a[3] = 4;
     a[4] = 5;

数组的排序问题:

  (1)、冒泡排序:
     拿相邻的两个数比较,如果前面的数字大,就将这两个数进行交换,否则不交换。

     n个数, 需要比较(n-1)趟
     趟:i=0 =====> i < n-1
     每一趟比较的次数是(n-1-i)【 i是趟数 (趟数是从0开始的)】

点击查看代码
#include  <stdio.h>

#define  N    5

int main()
{
    int a[ N];
    int i , j ;
    int temp;

    printf("请输入5个整数:");

    for(i = 0; i < N; i++)
    {
        scanf("%d",&a[ i ] );
    }
    for(i=0; i < N; i++)
    {
        printf("a[%d] = %d\n", i , a[i]);  //按原顺序打印数组中的元素(也可以封装成一个函数)
    }
    for(i=0; i < N; i++)
    {
        for(j = 0; j<N-1-i; j++)
        {
            if(a[ j ] > a[j + 1])
            {
                temp   =  a[j];
                a[j]   =  a[j+1];
                a[j+1] =  temp;
            }
        }    
    }
     for(i=0; i < N; i++)
    {
        printf("a[%d] = %d\n", i , a[i]);  //按排序后的顺序打印数组中的元素(也可以封装成一个函数)
    }
    return  0;
}

  (2)选择排序
     从数组中随便选择一个数,和数组中的其他成员挨个比较。如果这个数比数组中的某个数小,就和他交换数据。
      注:这个随便选择的数据一般是第一个数据。

点击查看代码
#include <stdio.h>

#define N 5

int a[N];

void show_data()  //打印数组元素
{
    int i;
    for(i=0; i<N; i++){
        printf("%d\t",a[i]);
    }
    puts("");

}

void input_data()   //对数组元素赋值
{
    int i;

    for(i=0; i<N; i++){
        printf("please input %d number > ",i+1);
        scanf("%d",&a[i]);
    }
}

void selection_sort()  //利用 选择排序  对数组元素进行排序。
{
    int i,j,temp;

    for(i=0; i<N; i++){
        for(j=i+1; j<=N; j++){
            if(a[i] > a[j]){
                temp = a[i];
                a[i] = a[j];
                a[j] = temp;
            }
        }
    }

}

int main(int argc, const char *argv[])
{
    input_data();

    printf("selection sort before\n");
    show_data();

    selection_sort();

    printf("selection sort after\n");
    show_data();

    return 0;
}
  (3)、快速排序:

    总体思想:对于一个数组,我们从中间任意选择一个数据,把这个数组,从这个从选择的这个数据的两边分成两部分。
         然后对于划分的两部分再分别从中间任意选择一个值,同样的方法进行分成两部分。
         这样无限制的递归下去,到最后只剩下一个数据的时候就排序完成了。
         然后再把排序好的数据规整到一起即可。
         
        

点击查看代码
#include <stdio.h>

#define N 6

int Arr[N] = {0};
int i=0, j=0;

void show_Arr_num(int *arr_show){
        for(i=0; i<N; i++){
                fprintf(stderr, "Arr[%d] = %d \n", i, arr_show[i]);
        }
}

void Arr_sort_func(int *Arr_sort, int begin, int end){
        if(begin < end){
                int tmp = Arr_sort[begin];
                int x = begin;
                int y = end;
                while(x<y){
                        while(x<y && Arr_sort[y]>tmp){
                                y--;
                        }
                        Arr_sort[x] = Arr_sort[y];
                        while(x<y && Arr_sort[x]<tmp){
                                x++;
                        }
                        Arr_sort[y] = Arr_sort[x];
                }
                Arr_sort[x] = tmp;
                Arr_sort_func(Arr_sort,begin,x-1);
                Arr_sort_func(Arr_sort,x+1,end);
        }
}

int main(int argc, char *argv[])
{
        fprintf(stderr, "Please input six integers > ");
        for(i=0; i<N; i++){
                scanf("%d", &Arr[i]);
        }
        show_Arr_num(Arr);
        fprintf(stderr, "************\n");

        //Arrary sort
        Arr_sort_func(Arr,0,5);

        show_Arr_num(Arr);

        return 0;
}

//执行结果:
//ubuntu@linux:~$ ./a.out
//Arr[0] = 23
//Arr[1] = 89
//Arr[2] = 16
//Arr[3] = 39
//Arr[4] = 47
//Arr[5] = 67
//************
//Arr[0] = 16
//Arr[1] = 23
//Arr[2] = 39
//Arr[3] = 47
//Arr[4] = 67
//Arr[5] = 89

二维数组:

  访问数组的实质:
    一维数组:a[] =====> * (a+i)
    二维数组:a[][] =====> (*(a+i))[j]

二维数组简介:

  1、二维数组的一般形式:
    类型说明符 数组名[常量表达式1][常量表达式2];

   二维数组分行和列,a[行][列],二维数组是一个大数组里包含了N个小数组,每个小数组里都包含了M个元素,这个N就是行,M就是列
    a[][4]={{1,2,0,0},{3,0,0,0},{4,5,6,7}};
    int b[5];
    行能省略,列不能省略

   a、二维数组在内存上存储也是连续的
   b、二维数组的数组名也是常量,也不允许进行自加,自减操作。
   c、在定义数组时,行下标可以省略,列下标一定不能省略。
  2、二维数组的初始化:
    int a[4][3] = {1,2,3,4,5,6};

    int a[4][3] = {{1,2},{3,4},{5,6}};

    int a[ ][2] = {{1,2},{3,4},{5,6}};

    int a[3][ ] = {{1,2},{3,4},{5,6}}; //错误的

点击查看代码
//:将一个二维数组中的最大的数的下标打印出来。
int main()
{
    int     arr[4][3]    =  {10,30,-10,1,2,3,60,80,9,10,11,13};
    int     i, j ,k=0, w=0;

    for(i=0;i<4;i++) //循环的是行
    {
    
        for(j=0;j<3;j++) //循环的是列
        {
            if(arr[k][w]<a[i][j])
            {
                k=i;
                w=j;
            }        
        }
    }
    printf("数组arr中最大的那个元素的:行下表 = %d , 列下标 = %d",k,w);
}

  3、二维字符数组
    char a[10][10] = {"hello","hello"};
    char a[ ][10] = {"hello","hello"};
    char a[10][10] = {'h','e','l','l','o','h','a','l','l','o'};

posted @ 2022-06-23 11:20  皆为过客  阅读(610)  评论(0)    收藏  举报