循环语句
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后面的代码
while循环一般都会有: 循环初始值, 循环条件 和 循环变量增量(或者减量)
循环语句do-while
do-while循环语法格式:
do {
执行代码;
} while(表达式)
注意:
1. do-while和while比较类似, 也有表达式和执行代码.
2. do-while和while的区别在于判断条件的先后不一样, while是先判断条件, 而do-while是先执行
再判断; 所以不管do-while表达式的条件是否成立, 都至少会执行一次循环体.
3. 和while的区别
执行顺序的问题,while是先判断,do-while是先执行循环体的代码,再判断。当条件第一次就
不满足时,更能体现出区别。
在开发中,while用的情况多。如果while处理逻辑比较别扭时,就需要使用do-while。
do-while循环一般也会有: 循环初始值, 循环条件 和 循环变量增量(或者减量)
循环语句for
for循环语法格式:
for (表达式1; 表达式2; 表达式3) {
执行代码;
}
注意:1, 表达式1: 可写循环初始值, (可以不填)
2. 表达式2: 循环条件
3. 表达式3: 循环增量(减量)
4. 两个分号必须写.
for循环将 循环初始值, 循环条件, 循环变量增量写在了一起 注意: 三个表达式都是可选填写, 但是如果后两个不写,会造成死循环; 而第一个为初始化值,所以我们三个一般都要写上.
循环的嵌套
一个循环语句内又包含另一个完整的循环语句;
三种循环都可以相互嵌套; 而for循环嵌套for循环的使用会更频繁, 以下的循环嵌套都是合法的.
break和continue
break关键字
bbreak的功能:
1. 在switch语句中使流程跳出switch结构。
2. 在循环语句中使流程跳出当前的循环
注意:
1. 如果已执行break语句,就不会执行循环体中位于break后的语句。
2. 在多层循环中,一个break语句只向外跳一层
示例:
1. 判断一个数是不是合数。(指自然数中除了能被1和本身整除外,还能被其他的数整除(不包括0)的数。)
2. 判断一个数是不是素数。(除了1和它本身以外不再有其他的除数整除。)
continue关键字
continue的功能:
只能在循环语句中使用,使本次循环结束,即跳过循环体中下面尚未执行的语句,接着进行下次是否执
行循环的判断。
注意:
1. continue语句只能用在循环里。
2. 对于 while 和 do-while 循环,continue 语句执行之后的动作是条件判断;对于 for 循环,随后
的动作是变量更新。
示例:
1. 求整数1~100的累加值,但要求跳过所有个位为3的数。
var sum = 0
for (var i = 1; i <= 100; i++) {
if (i % 10 == 3) {
continue
}
sum += i
}
console.log(sum);
break和continue对比
练习
<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(" ")
}
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(" ");
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 + " ");
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>