[黑马程序员]08[C语言]数组部分学习总结

来源:互联网 发布:微信淘宝客发单机器人 编辑:程序博客网 时间:2024/05/29 17:35

------- android培训、java培训、IOS培训、期待与您交流! ----------



1.    数组的基本概念

 

//int main()

//{

//    //intnums[5];

//    //表示的涵义是声明了5int类型的变量,分别是:nums[0],nums[1],nums[2]....

//

//    //数组的初始化:

//    //1.如果不初始化,会有垃圾数

//    //2.和变量的使用一样需要先定义,再初始化,再使用(一般情况)

//    //初始化方法:

//    //1>定义数组再初始化

//    //2>定义同时初始化(可以使用变量作为数组的长度)

//    //3>由用户输入数字,确定数组的长度,再使用循环进行初始化(c99才开始可行),最好用宏定义进行替换

//

//    return 0;

//}

 

 

//数组练习:

 

//这种动态分配数据兼容性很好,上面的在早期编译环境下可能无法通过,性能比上面好一点点(可忽略)[更普遍的用法]

 

//#define LEN 256

//

//int main()

//{

//    //使用宏定义定义一个数组

//    //需要有一个变量记录一共输入了多少个数字

//    //每次输入数字的时候让这个数++

//

//    //尝试使用循环初始化数组,如果用户输入的是q表示输入结束,进行统计

//    int i =0,num,temp,nums[LEN];

//    char ch;

//    while (1) {

//        temp=scanf("%d",&num);//temp =scanf(%d,&num), temp获取的时scanf函数获取值的个数,只能为0或者1

//

//        if (temp==1) {

//            nums[i++] =num;

//        }else

//        {

//            scanf("%c",&ch);

//            if (ch =='q') {

//                break;

//            }

//        }

//    }

////    int n;

////

////    int number = scanf("%d",&n);

////

////    return 0;

//    return 0;

//}

 

 

//数组练习:打印n的二进制格式

 

//利用一个数组和一个变量模拟栈结构

 

//int main()

//{

//    int i,nums[10];

//

//    nums[i++]=10;

//

//    //取数据

//    nums[i--];

//

//    return 0;

//}

//int main()

//{

//    int num =-2,len =0,nums[256],temp;

//

//    for (int i=0; i <32; i++) {

//        temp = num &1;

//        num>>=1;

//        nums[len++]= temp;

//    }

//

//    for (int i =0; i <32; i++) {

//        printf("%d",nums[--len]);

//    }

//    printf("\n");

//

//    return 0;

//}

 

 

//练习04:用户输入字符,统计字符出现个数

 

int main()

{

    //方法1:

    //只需要一个int型数组intnums[256]

    //初始全为0;

    //把下标与字符一一对应,出现某字符直接在该字符对应的数组元素位置+1

   

    //方法2:

    //int nums[256]

    //char chs[256]

    //两个数组构成一一对应的关系

    //用户每次输入一个字符,判断是否子啊字符数组中,不如不在在数组的结尾追加字符

    //并在数字数组的结尾追加一个1

    //如果字符存在,就在字符数组中找出字符的位置i

    //取出数字数组中位置为i的数据自增,nums[i]++

   

    char chs[256] ={0};

   

    char ch;

   

    //用户一次性输入,回车结束

    while (1) {

        scanf("%c",&ch);

        if (ch =='\n') {

            break;

        }else

        {

            chs[ch]++;

        }

    }

   

    for (int i =0; i<256; i++) {

        if (chs[i]>0) {

            printf("字符%c出现%d\n",i,chs[i]);

        }

    }

    return0;

}

 


2.    数组名作为函数参数

 

int main()

{

    //如果一个函数的参数是一个数组,那么调用函数时,只需要将数组名放到函数参数中即可

    //传递的时数组的首地址,可以使用nums[i]来访问数组里面的某一个元素

   

    //int array[10] ={,,,,,,,};

    return0;

}

 

 

//希望初始化:全为0,全为1,全为-1

void iniWithZero(int nums[10])

{

   

}

 

//sizeof可以计算出数组的长度

//sizeof(nums)/sizeof(int);

//一维数组作为函数参数的时候,方括号的数字可以省略,传入的数组长度永远会打印8

//使用数组名作为函数参数的时候,应该附带一个int参数表示数组的长度

 

//3.数组是一个常量,指针是变量

 

//int length;

//length表示数组中有几个数据是可以使用的

//当执行nums[length++]=1;

//length标记了数组的长度

//length还可以用来进行循环遍历

//length记录了数组添加元素的下一个位置

 



3.    数组排序(主要需要掌握冒泡和二分法)

 

//1.冒泡排序

//不要求成为算法大师,只是需要熟练使用数组下标

//冒泡排序算法规则:

//比较相邻的两个元素,如果一个较大或者较小,就交换两个元素的位置

//#define LENGTH 11

//void bubble_sort(int*array,int length);

//

//int main()

//{

//    int nums[LENGTH] ={3,2,5,4,1,-9,89,34,-34,-1,234};

//

//    bubble_sort(nums,LENGTH);

//

//    for (int i =0; i <LENGTH; i++) {

//        printf("%d ",nums[i]);

//    }

//    printf("\n");

//

//    return 0;

//}

//

//void bubble_sort(int*array,int length)

//{

//    for (int i =0; i <length-1; i++) {

//        for (int j =0; j <length-i-1; j++) {

//            if (array[j]>array[j+1]) {

//                int temp =array[j];

//                array[j] =array[j+1];

//                array[j+1]=temp;

//            }

//        }

//    }

//}

 

 

//二分查找

 

#include<stdio.h>

#define LENGTH9

 

int erFenSort(int *array,int length,int search);

 

int main()

{

    int nums[LENGTH]={1,2,3,4,5,6,7,8,9};

   

    int n =5;

   

    int result =erFenSort(nums,LENGTH,n);

   

    printf("%d\n",result);

   

    return0;

}

 

int erFenSort(int *array,int length,int search)

{

    int lower =0;

    int higher =length -1;

    int mid;

    while (lower <= higher) {

        //首先计算中间数字

        mid = (lower +higher)/2;

        if (search ==array[mid]) {

            //找到了

            return mid;

            break;

        }elseif(search >array[mid]){

            //去右边找

            lower = mid+1;

        }else{

            higher =mid-1;

        }

    }

    //判断是否找到

    return -1;

}

 

void init(int *array)

{

    //创建数组

}

 

void bubbleSort(int *array,int length)

{

    //排序

}

 



4.    访问二维数组成员

 

 

// 难点

 

// 1>二维数组的成员是什么  int nums[2][3];

 

// 成员:nums[0][0]  成员:nums[0],nums[1];

 

// 2>首先讨论数组名的使用  int nums[2][3];

 

// 此时定义了一个二维数组 1)nums (二维数组首地址)  2)nums[0]将其当做一位数组看,表示这个数组的首地址

 

// 它们的类型是什么?有什么区别?

 

// nums+1移动12个字节,nums[0]移动4个字节;因此nums是数组类型,nums[0]int类型

 

// 指针变量的类型是几个字节,那么+1运算是,就移动几个字节

 

// nums[0]是指向int类型的指针

 

// *(nums[0]) ==nums[0][0]

 

// nums是指向数组类型的指针

 

// *(nums) == nums[0]; //nums[0]是数组

 

// nums[0]就是一维数组的首地址,就是指向int类型的指针

 

int test()

{

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

   

    for (int i=0; i<6; i++) {

        printf("%d ",*(nums[0]+i));

    }

    printf("\n");

   

    return0;

}

 

// nums + i在垂直方向移动,表示指向不同的二维数组中得"一维数组"

// nums[i] + j表示在第i行的水平方向移动,指向一个int类型的变量

// nums + i表示指向数组,  *(nums + i)表示之指向这个数组的第一个元素

// *(nums + i) + j表示指向这个数组中得第j个元素

// *(*(nums + i) + j)指的是指向的变量

 

 

// 3.首先学习一个新的概念

// 指向int类型的指针,int指针,指向一个int数组的指针,数组指针(int数组二维指针)

// 数组指针是一个指向一个数组的指针(区别于指向数组元素的指针)

// 指向二维数组元素的指针

// 数组名就是一个数组指针

// 数组指针定义:

// 类型(*数组指针变量名)[长度]int (*p)[3]

// 初始化:

// 数组指针变量名 =二维数组的名字;p = nums

// 数组指针变量名 =&一维数组的名字; p = &nums[0] ? // p指向nums[0]OK

 

int main()

{

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

   

    // 声明了一个数组指针

    // 这个指针p式指向一个长度为3int类型的数组

   

    // nums数组

    // nums[0]

    // nums[1]

    int (*p)[3];

   

    p = nums; // p指向nums[0]

    //   *p == nums[0]

    //   *(nums[0])

    //   **p

   

   

   

    return0;

}

 

// 4.可以尝试使用一个指向int类型的指针去访问一个二维数组

// 设立一个int类型的指针,指向二维数组的第一个元素,通过p+i进行访问

//i起始为1,对应的行号为i/列号,对应的列号为i%列号

0 0
原创粉丝点击