[黑马程序员]02[c语言]while和for语句的应用,0-9乱序数组的生成

时间:2022-12-13 14:08:46

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


前言:


这是一道循环结构的练习题,在敲代码的过程中自己一开始使用的是for循环嵌套完成的函数功能实现,后来也考虑也一


些其他的解法,但是后来看到别人的几种代码解决方式,都是用的while循环解决的,于是这里稍微对比考虑了下在一般化


循环嵌套中for循环和while循环的选择问题,并对这个问题做了一点总结,这里将其作为博客日志记录下来,方便以后翻


阅’

 

绪论:



题:建立一个长度为10的数组,为其赋值,要求取值为0-9,并且不重复



//自己的做法


//编程思路1(下标固定,依次寻找填坑数据):采用循环的方式从0号位开始给数//组赋值,当当前的随机数与已有的数组元


素数据不重复,就把这个随机数填进去//.否则重新生成随机数

#include<stdio.h>

#include<stdlib.h>

#define LENGTH10

 

int main()

{

    //使用循环生成随机数

    //生成随机数后,判断数组中是否包含该数字

    //如果包含,忽略本次生成的随机数,重新生成

    //如果不包含,加到数组

    int temp,i=0;

    int nums[LENGTH];

N:

    for (; i <LENGTH; i++) {

        temp = arc4random_uniform(10);

        if (i==0) {

            nums[i] = temp;

            continue;

        }

        else

            {

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

                    if (temp ==nums[j]) {

                        goto N;

                    }

                }

            }

        nums[i] = temp;

    }

   

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

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

    }

    printf("\n");

   

    return0;

}

 

 

//编程思路 2(数据固定,依次寻找填坑下标):采用循环的方式将0-9放进10个随机的坑里去,当当前随机的下标里并没有储


存元素,就放进去,否则重新开始找随机下标

#include<stdio.h>

#include<stdlib.h>

 

int main()

{

    int num =0;

    int count =10;

    int index;

    int array[10] ={-1,-1,-1,-1,-1,-1,-1,-1,-1,-1};

    while (num <10) {

        index = arc4random_uniform(count);

        if (array[index]==-1) {

           array[index]==num++;

        }

    }

    return0;

}

 

 

首先这两种思路的比较,第一种是顺向思维,为了实现思路,我们需要使用双for循环嵌套的方式进行循环判断,第一层循环


是0-9的循环,是为了遍历10个数组的坑,赋值满10个位,第二层的循环是0-i的循环,比较判断是否重复,决定是否把当前数


据填进坑里去,为了实现跳出,引入了一个goto语句,这种思维比较符合正常的顺向思维.

 

但是当我们跳到第二种思路做法上去看的时候,发现要比第一种做法简洁地多,首先它采用的时逆向思维方式固定填坑


数随机下标数来找坑,并且通过-1的标记来简化重复的比较判断问题,最后采用wile循环,使得程序主体显得比较简单,也


避免了goto语句的跳转.

 

 

这道例题的这两种做法,我们可以探讨并得到启示的有两点:1是解题的思路方向问题, 2是具体的语法算法实现问题.

 


从解题思路方向上来看,我们可以看到同一道题的解决方式是非常之多的,每一个人都可以对应这一种解题的思维方式,


通过标记flag标记,for循环也能衍生出不同的做法,while循环通过goto语句也能衍生新的做法,甚至引入额外双数组来比


较判断,也是可行的.为了使我们在代码编写的时候思维更开阔,学习更多地解题思想,从而寻找更高效的思维方式,我们应


该多多与优秀的算法优秀的代码编程者交流学习,即使在自己独立解决一个问题的时候,也要尝试从多种方向去考虑其


可行性,开阔自己的思维广度.

 

从算法实现上来说,关于这里涉及到的for循环和while循环的具体使用场合,究竟哪些地方使用for更好,哪些地方使用


while更高效,困扰了我一段时间,在经过多种题型下的比较和具体语句环境下的效率比较(这里就不列出具体的代码段


了),最终获得的初步总结是:

 

1>  在循环次数不确定的情况下,用while语句比较好,这种情况下while语句的真假语句通常比较容易判断,而用for语句来


写非常麻烦

 

2>  在循环次数确定的情况下,这种情况就比较复杂了.有些情况下使用for(inti=0;<NUMBER;i++)可以很清晰方便的进行


循环操作,在有些情况下使用while(<NUMBER)比较方便进行内部条件判定.但是最终很多代码比较分析后的初步总结


是:for循环一般用于次数确定的循环遍历比较好,而当涉及到复杂条件判定的情况下,使用while循环来进行循环判定比较


好,这种情况下for循环也能够做,但是条件撰写部分可能要更复杂些