数组易错题与课堂小结


5. 1个函数返回指定的数据在数组中的下标.

  比如:

   int arr[3] = {10,20,30,50};

  找出这个数组中指定的元素的下标. 数组只是举个例子,你需要通过参数让调用者传递进来.

  如果不存在这个数据则返回-1;

 

#include <stdio.h>

 

 

int getFan(intarr[],int length,intnum){

 

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

       if (arr[i] == num ) {

           return i;

       }

    }return -1;

}

int main(intargc, const char* argv[]) {

    /*intarr[]= {2,34,45,67,78,23,34};

   int length = sizeof(arr)/sizeof(int);

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

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

           if (arr[j] > arr[j+1]) {

//               int temp = arr[j];

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

//               arr[j+1] = temp;

               arr[j] = arr[j] ^ arr[j+1];

               arr[j+1] = arr[j] ^ arr[j+1];

               arr[j] = arr[j] ^ arr[j+1];

           }

       }

   }for (int i = 0 ; i < length; i++) {

       printf("%d  ",arr[i]);

   }*/

    

    /*5.1个函数 返回指定的数据在数组中的下标.

    比如:

   int arr[3] = {10,20,30,50};

    找出这个数组中指定的元素的下标. 数组只是举个例子,你需要通过参数让调用者传递进来.

    如果不存在这个数据则返回-1;*/

    int arr[4] = {10,20,30,50};

    int length = sizeof(arr)/sizeof(int);

    int num;

    printf("请输入一个数据\n");

    scanf("%d",&num);

    int res = getFan(arr,length,num);

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

 

 

2. 1个整型数组,请自己设计算法将这个数组中的元素进行翻转(此题选作*****)

比如: 有数组 int arr[5] = {10,11,3,45,6};

将元素的值设置为翻转        {6,45,3,11,10}

 

 int arr[5] = {10,11,3,45,6};

    int length = sizeof(arr)/sizeof(int);

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

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

           arr[j] = arr[j]^arr[j+1];

           arr[j+1] = arr[j]^arr[j+1];

           arr[j] = arr[j]^arr[j+1];

       }

    }for (int i = 0;i < length; i++) {

       printf("%d ",arr[i]);

    }

    

  *************************************************

    

    for (int j = 0;j < length/2; j++) {

       arr[j] = arr[j]^arr[length-1-j];

       arr[length-1-j] = arr[j]^arr[length-1-j];

       arr[j] = arr[j]^arr[length-1-j];

    }for (int i = 0;i < length; i++) {

       printf("%d ",arr[i]);

    }

    return 0;

 

 

第一种方法里用冒泡排序的方法做,但是不对其大小进行对比;

第二种方法对数组进行一分为二,以免遍历到后面将前面已经换好的数据进行二次对换造成数据错误;

 

数组元素其实就是一个普通的变量,普通变量可以干什么,那么数组元素也可以干什么;

声明数组:

数组类型     数组名[数组长度]

声明数组时,必须要有数组长度,但是作为参数时可以不写长度,长度可以另设一参数。

谨记:

调用一个局部变量中的值时,若在另一个函数中发生变化,并不影响,函数与函数之间的变量是相互独立的,但数组除外(是数组 不是数组元素)

 

换而言之,除了数组之外都是值传递;

数组是引用传递:形参发什么变化会直接影响到实参。

 

 

例:

 

#include <stdio.h>

 

 

void test(int num){//接收int类型参数的函数

    

    num =200;

}

 

void test2(intnums[]){

    

    nums[0]= 300;

}

 

int main(intargc, const char* argv[]) {

    

    int nums[5] = {10,20,30,40,50};

    

    test(nums[0]); //传递的是数组元素,是值传递,因为数组元素就可以理解为普通变量

    

    printf("%d\n",nums[0]);//10

 

   test2(nums); //传递数组,是引用传递

    printf("nums[0]=%d\n",nums[0]);//300

    

    return 0;

}

计算数组长度:

 

Intlength = sizeof(arr)/sizeof(int);

 

就是写一个函数,这个函数的功能是用来打印数组中的每个元素的

 

 

 注意:函数内是无法计算出传进来的数组的真实长度的

 

 

 以后如果要把数组作为函数的参数传递进去,那么必须再加一个参数,这个参数是用来传递数组长度的

 

 

冒泡排序:

 

详解版

其实就是把一个数组的元素,按照从小到大(从大到小)的顺序,重新排列起来,这种排序就叫冒泡排序

 

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

 

    //经过排序后

    下标0的元素变成了 2

    下标1的元素变成了 3

    下标2的元素变成了 5

    下标3的元素变成了 6

    下标4的元素变成了 9

 

    {23469}

 

 核心思想:

        N轮,每轮从第一个元素开始跟下一个元素进行比较,大的放在后面,小的放在前面

 

下标:   0   1   2   3   4

 ---------------------------

         5   4   3   2  1

  

 第一轮: 4   5   3   2   1    nums[0] > nums[0+1];  int temp = nums[0]; nums[0]=nums[0+1]

         4   3   5   2  1     nums[1] > nums[1+1];

         4   3   2   5  1     nums[2] > nums[2+1];

         4   3   2   1  5     nums[3] > nums[3+1];

                             这一轮比较了4

 

 第二轮: 3   4   2   1   5   nums[0] > nums[0+1]

         3   2   4   1  5    nums[1] > nums[1+1]

         3   2   1   4  5    nums[2] > nums[2+1]

                             这一轮比较了3

 

 第三轮:  2  3   1   4   5   nums[0] > nums[0+1];

          2  1   3   4  5    nums[1] > nums[1+1]

                             这一轮比较2

 

 第四轮:  1  2   3  4   5   nums[0] > nums[0+1];

                            这一轮比较了1

 

 

 外层循环:循环长度-1

 

 内层循环:循环长度-1-j

 

*/

 

#include <stdio.h>

 

int main(intargc, const char* argv[]) {

   

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

   

   /*

    //第一轮

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

        

        if(nums[i] > nums[i+1]){

            

            int temp = nums[i];

            

            nums[i] = nums[i+1];

            

            nums[i+1] = temp;

        }

    }

    

    //第二轮

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

        

        if (nums[i] > nums[i+1]) {

            

            int temp = nums[i];

            

            nums[i] = nums[i+1];

            

            nums[i+1] = temp;

        }

    }

    

    //第三轮

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

        

        if (nums[i] > nums[i+1]) {

            

            int temp = nums[i];

            

            nums[i] = nums[i+1];

            

            nums[i+1] = temp;

        }

    }

    

    //第四轮

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

        

        if (nums[i] > nums[i+1]) {

            

            int temp = nums[i];

            

            nums[i] = nums[i+1];

            

            nums[i+1] = temp;

        }

    }

    */

   

    //冒泡排序初版

   for (intj=0; j<4; j++) {

       

        for (int i=0; i<4-j; i++) { //j的取值是0,1,2,3  总轮数4 4-0 = 44-1=34-2=24-3=1

           

           if(nums[i]> nums[i+1]){

               

               inttemp = nums[i];

               

               nums[i] = nums[i+1];

               

               nums[i+1] = temp;

           }

       }

   }

   

   

    //遍历数组

   for (inti=0; i<5; i++) {

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

   }

   

      return 0;

}

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值