day03JS循环语句

92 阅读4分钟

循环语句

1.JS循环的概念
  循环就是重复做一件事,  在程序中指的是重复执行某段代码.
  循环结构是程序中一种很重要的结构,其特点是在给定的条件成立时,反复执行某程序段,直到条件不
  成立为止. 
2.死循环的概念
  死循环就是重复执行代码, 不会停止.   
  死循环会造成程序卡死甚至崩溃等问题,  我们不能写会造成死循环的代码.
3.循环的用处
  循环的用处非常广泛, 特别是对大量的数据进行操作的时候,
  如:求若干个数之和; (重复做加法)  
   求某个班全部学生的总成绩;(重复做加法)
4.循环的分类
  循环有很多种方式, 如: while, do-while, for, for-in, for-each等. 
  这里我们先介绍最常见的,也是很多其他计算机语言通用的三种方式: 
    1). while循环
    2). do-while循环
    3). for循环

循环语句while

1.while循环语法格式:
   while(表达式)
{
       执行代码;
}
while循环是先判断后执行

注意:1. while循环必须按照上述语法格式来写, 只能更改表达式内容和执行代码.
     2. 表达式可以是常量,变量或者其他表达式,该表达式会被强制转换为boolean类型, 可以理解表达式
     就是循环的条件, 条件成立则进入括号{}里面执行代码,否则不进入;
     3. 执行代码可以有多行, {}所包含的称为循环体.
     4. 表达式不要一直是true, 避免死循环.
     5. while循环的顺序是: 先判断表达式是否为true, 若true则执行执行代码, 然后再继续判断表达式
     是否为true, ….  直到判断表达式为false才会跳出循环, 执行while后面的代码
      

image.png

while循环一般都会有: 循环初始值, 循环条件 和 循环变量增量(或者减量)

循环语句do-while

do-while循环语法格式:
    do {
       执行代码;
    } while(表达式)

 注意:
     1. do-whilewhile比较类似, 也有表达式和执行代码.
     2. do-whilewhile的区别在于判断条件的先后不一样, while是先判断条件, 而do-while是先执行
     再判断;  所以不管do-while表达式的条件是否成立, 都至少会执行一次循环体.
     3.while的区别
       执行顺序的问题,while是先判断,do-while是先执行循环体的代码,再判断。当条件第一次就
     不满足时,更能体现出区别。
       在开发中,while用的情况多。如果while处理逻辑比较别扭时,就需要使用do-while

image.png

do-while循环一般也会有: 循环初始值, 循环条件 和 循环变量增量(或者减量)

循环语句for

for循环语法格式:
   for (表达式1; 表达式2; 表达式3) {
   执行代码;
}
注意:1, 表达式1: 可写循环初始值, (可以不填)
     2. 表达式2: 循环条件
     3. 表达式3: 循环增量(减量)
     4. 两个分号必须写.

image.png

for循环将 循环初始值, 循环条件, 循环变量增量写在了一起 注意: 三个表达式都是可选填写, 但是如果后两个不写,会造成死循环; 而第一个为初始化值,所以我们三个一般都要写上.

循环的嵌套

  一个循环语句内又包含另一个完整的循环语句; 
  三种循环都可以相互嵌套; 而for循环嵌套for循环的使用会更频繁, 以下的循环嵌套都是合法的.

image.png

break和continue

break关键字

bbreak的功能:
  1. 在switch语句中使流程跳出switch结构。
  2. 在循环语句中使流程跳出当前的循环
        
注意: 
  1. 如果已执行break语句,就不会执行循环体中位于break后的语句。
  2. 在多层循环中,一个break语句只向外跳一层

示例: 
  1. 判断一个数是不是合数。(指自然数中除了能被1和本身整除外,还能被其他的数整除(不包括0)的数。)
  2. 判断一个数是不是素数。(除了1和它本身以外不再有其他的除数整除。)

continue关键字

continue的功能:
    只能在循环语句中使用,使本次循环结束,即跳过循环体中下面尚未执行的语句,接着进行下次是否执
    行循环的判断。

注意: 
  1. continue语句只能用在循环里。
  2. 对于 whiledo-while 循环,continue 语句执行之后的动作是条件判断;对于 for 循环,随后
  的动作是变量更新。
示例:
1. 求整数1100的累加值,但要求跳过所有个位为3的数。
    var sum = 0
    for (var i = 1; i <= 100; i++) {
        if (i % 10 == 3) {
            continue
        }
        sum += i
    }
    console.log(sum);

break和continue对比

image.png

练习

<script>
    // 1,一个新入职,月工资为2000元的员工,每年涨当年工资5%,
    //20年后的月工资是多少?
        var salary = 2000;
        var num = 1;
        while (num <= 20) {
            salary = salary *(1  + 0.05) 
            num ++
        }
        console.log(salary.toFixed(2));


    // 2,山上有一口缸可以装50升水,现在有15升水。
    //老和尚叫小和尚下山挑水,每次可以挑5升。
    //问:小和尚要挑几次水才可以把水缸挑满?通过编程解决这个问题。
        var num = 15;
        var count = 0;
        while (num < 50) {
            num +=5;
            count++
        }
        console.log(count);


    // 3,打印100- -200之间所有能被3或者7整除的数
        var num = 100;
        while (num <= 200) {
            if (num % 3 == 0 || num % 7 == 0) {
                console.log(num);
            }
            num++
        }
        
        
    // 4,计算10的阶乘( 1*2*3*4*5*6*7*8*9*10 n的阶乘.....n
        var n = 10;
        var sum = 1;
        while (n != 0) {
            console.log(n);
            sum *= n
            n--
        }
        console.log(sum);



    // 5 计算1+3+5+.. . +99的和
        var num = 1;
        var sum = 0
        while (num <= 99) {
            sum += num;
            num += 2;
        }
        console.log(sum);


        
    // 6,99乘法表
        var n = 1
	for (;n <= 9 ;n++ ){
            for (var m = 1;m <= n ;m++ ){
    		sum = n * m
    		document.write(n + "x" + m+ "=" + sum)
    		document.write("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;")
            }
            document.write("<br>")

	}
        var n = 1
	while (n <= 9){
        var m = 1;
            while (m <= n){
    		sum = n * m;
    		document.write(n + "x" + m+ "=" + sum);
    		document.write("&nbsp;&nbsp;&nbsp;");
                m++;
            }
            document.write("<br>")
            n++
	 }


    // 7, 输出20~80之间能被3整除的整数, 每行5个
        var num = 20;
        var count = 0;
        for (; num <= 80; num++) {
            if (num % 3 == 0) {
                document.write(num + "&nbsp;");
                count++
                if (count % 5 == 0) {
                    document.write("<br>")
                }
            }
        }


    // 8, 打印1000~2000年中所有的闰年, 每行4个
        var year = 1000;
        for (; year <= 2000; year++) {
            var exp1 = year % 4 == 0 && year % 100 !== 0;
            var exp2 = year % 400 == 0;
            if (exp1 || exp2) {
                console.log(year + "闰年");
            }
        }


    // 9, 求: 1-1/2+1/3-1/4 …  1/100的和
        var num = 1;
        var sum = 0;
        for (; num <= 100; num++) {
            if (num % 2) {
                sum+=(1/num)
            }else{
                sum-=(1/num)
            }
        }
        console.log(sum);


    // 9,  输入两个数,求两个数的最小公倍数(****)
        //如: 9和6的最小公倍数是18, 
        //1, 先找出两个数中的最大数   // 9 -> 6*9
        //2, 最大数++,找出能被两个数整除的数(退出循环)
        var num1 =prompt("请输入一个数字")
        var num2 =prompt("请输入一个数字")
        var num = num1 > num2 ? num1:num2;
        for(;;num++){
            if (num % num1 == 0 && num % num2 == 0) {
                console.log(num);
                break
            }
        }


    // 10,  输入两个数n,a,如果n==3, a == 2;
        //输出 2 + 22 + 222 的值。(不用输出式子)(****)
        //如: n == 4, a == 3;
        //输出 3 + 33 + 333 + 3333的值。
        //提示1、n = 3,相加三次,每次相加比前一次相加的数,多一位
        //    2、每次多的这个位数的值为a,  3, 3*10+3(33), 33*10+3(333),...

        var n = Number(prompt("请输入一个数字"));
        var a = Number(prompt("请输入一个数字"));
        var sum = 0;
        for (var i = 1; i <= n; i++) {
            sum = sum + a;
            a = sum + a * 10;
        }
        console.log(sum);


    // 11, 五位数中,对称的数称为回文数,找出所有的回文数。 如: 12321
        var num = 10000
        for (; num <= 99999; num++) {
            var exp1 = num % 10 === parseInt(num / 10000)
            var exp2 = parseInt((num / 10) % 10) === parseInt((num / 1000) % 10)
            if (exp1 && exp2) {
                console.log(num + "是回文数");
            }
        }


    // 12, 宰相的麦子:相传古印度宰相达依尔,是国际象棋的发明者。有一次,国王因为他的贡献要奖励他,问他想要什么。达依尔说:“只要在国际象棋棋盘上(共64格)摆上这么些麦子就行了:第一格一粒,第二格两粒,……,后面一格的麦子总是前一格麦子数的两倍,摆满整个棋盘,我就感恩不尽了。”国王一想,这还不容易,刚想答应,如果你这时在国王旁边站着,你会不会劝国王别答应,为什么?
        var num = 0;
        var sum = 0;
        for( ;num < 63; num++){
            sum = sum + 2 ** num//n ** 数字 / n的数字次方
        }
        console.log(sum);


    // 13, 求1!+2!+3!+4!+5! 
        var sum = 0;
        for (var i = 1; i <= 5; i++) {
            var num = 1;
            for (var j = 1; j <= i; j++) {
                num = num * j
            }
            sum = sum + num;
        }
        console.log(sum);


    // 14, 找出所有的水仙花数,三位数,各位立方和等于该数本身。
        //如: 153 = 1 ^ 3 + 5 ^ 3 + 3 ^ 3 
        var min = 100
        var max = 999
        for (var i = min; i <= max; i++) {
            var a = Math.pow((i % 10),3)
            var b = Math.pow((parseInt(i / 10)) % 10,3)
            var c = Math.pow((parseInt(i / 100)),3) 
            if (a+b+c == i) {
                console.log(i)
            }
        }


    // 15, 输入任意两个数,如果第一个数小,从第一个数打印到第二个数,如果第二个数小,从第二个数打印到第一个数  
        var num1 = Number(prompt("请输入第一个数"))
        var num2 = Number(prompt("请输入第二个数"))
        if (num1 < num2) {
            for (; num1 <= num2; num1++) {
                console.log(num1);
            }
        }else {
            for (; num2 <= num1; num2++) {
                console.log(num2);
            }
        }


    // 16,  输入两个数,求两个数的最大公约数(*****)
    //如: 12和8的最大公约数是4,
    //提示: 能够同时整除两个数的最大数          
    //1, 先找出两个数中最小的那个数, 
    //2, 最小数--, 找出能被两个数整除的数(退出循环break)
        var num1 = Number(prompt("请输入一个数字"))
        var num2 = Number(prompt("请输入一个数字"))
        var num = num1 < num2 ? num1 : num2;
        for (; num > 0; num--) {
            if (num1 % num == 0 && num2 % num == 0) {
                console.log(num);
                continue
            } else if (num == 2) {
                console.log("没有公约数");
            }
        }
    </script>