javaScript学习第三章(流程控制小练习)
javaScript学习第三章(流程控制小练习)
我们学习了代码块,流程控制,基于这些业务,整理出来了每一个流程控制的小练习
- if
- if - else
- switch
- while
- for
一、if 练习
需求背景
编写一个程序,获取一个用户输入的整数。然后通过程序显示这个数是奇数还是偶数。
解题分析
<script>// 练习1 let num = +prompt('请输入一个整数'); console.log(num)if(isNaN(num) || num % 1 != 0) {alert("输入数字不合法,请检查")} else {if(num % 2 == 0) {console.log(`${num} 为一个偶数!~`)} else {console.log(`${num} 为一个基数!~`)}}</script>
二、if -else 判断
需求背景
从键盘输入小明的期末成绩:
当成绩为100时,‘奖励一辆BMW’
当成绩为[80-99]时,‘奖励一台iphone’
当成绩为[60-79]时,‘奖励一本参考书’
其他时,什么奖励也没有
解题分析
<script>// 练习1 let score = +prompt('小明的期末成绩'); // 合法性校验 0 - 100 之间if(isNaN(score) || score % 1 != 0 || score < 0 || score > 100) {alert("输入分数不合法,请检查")} else {if(score === 100) {alert("分数为100,奖励一辆BMW")} else if(score >= 80) {alert("分数为80-99,奖励一台iphone")}else if(score >= 60) {alert("分数为60-79,奖励一本参考书")} else {alert(`分数为:${score},什么奖励也没有`)}}console.log(num)</script>
三、if -else 综合
我们使用if -else 多重条件判断,可以运用 and 并且,|| 或条件 综合进行判断
需求背景
大家都知道,男大当婚,女大当嫁。那么女方家长要嫁女儿,当然要提出一定的条件:
高:180cm以上; 富:1000万以上; 帅:500以上;
如果这三个条件同时满足,则:‘我一定要嫁给他’
如果三个条件有为真的情况,则:‘嫁吧,比上不足,比下有余。’
如果三个条件都不满足,则:‘不嫁!’
解题分析
<script>// 练习1 let height = +prompt('请输入你的身高(cm)'); let monery = +prompt('请输入财富(万元)'); let face = +prompt('请输入你的颜值'); if(isNaN(height) || isNaN(monery) || isNaN(face)) {alert("输入参数不合法~~~~")} else {// 合法参数if(height > 180 && monery > 1000 && face > 500) {alert("我一定要嫁给他")} else if(height > 180 || monery > 1000 || face > 500) {alert("嫁吧,比上不足,比下有余。")} else {alert('不嫁!')}}console.log(num)</script>
四、while 练习
我们使用while 进行已知次数的循环
需求背景
假设银行存款的年利率为5%,问1000块存多少年可以变成5000块
解题分析
<script>// 第一步 分解一年能得到多少let monery = 1000;// 一年 let year = 1;monery = monery * 0.05 * year + monery;// console.log('存一年得:'+monery);// 传统写法1 while(monery < 5000) {monery = monery * 0.05 + monery;console.log(`当前年份为:${year},现在的金额为:${monery}`)// 更新年份year ++;}console.log(`当前年份为:${year},现在的金额为:${monery}`)// 第二种写法let monery1 = 1000;let year1 = 1;// 编写循环,计算存款的年数while(monery1 < 5000){monery1 *= 1.05 // 循环没执行一次,就相当于钱存了一年year1++}console.log(`当前年份为:${year1},现在的金额为:${monery1}`)</script>
do -while 部分
实际上 do - while 和while 在大于1次的时候展示的效果是一样的,如果 我们有某种需求,不论是否满足,我们都需要通知一次的场景比较适合
五、for 练习
我们进行for 有多个练习
练习1
求100以内所有3的倍数(求它们个数和总和)
解题分析
<script>//方式1let total = 0;let sum = 0;let totalCount = 0;for(let i = 0;i < 100;i ++) {if(i % 3 == 0) {total ++;sum += i;}totalCount ++;}console.log(`迭代的次数:${totalCount},满足条件的有${total}次,总数为:${sum}`)//迭代的次数:100,满足条件的有34次,总数为:1683// 优化方式 2 let count = 0;let sum1 = 0;let totalCount1 = 0;for(let i = 3; i< 100; i += 3) {count ++;totalCount1 ++;sum1 += i;}console.log(`迭代的次数:${totalCount1},满足条件的有${count}次,总数为:${sum1}`)//迭代的次数:33,满足条件的有33次,总数为:1683</script>
练习2
求 1000 以内的水仙花数
- 水仙花数
- 一个n位数(n >= 3),如果它各个位上数字的n次幂之和还等于这个数,那么这个数就是一个水仙花数
- 153 --> 1 5 3 --> 1 125 27 --> 153
解题分析
<script>let initNum = 1000;// 起码是100以上,必须是三个数for(let i = 100;i < initNum; i ++) {// 1. 求百分位的数字let bai = parseInt(i / 100);// 2. 获取十分位上的数字 let shi = parseInt((i - bai * 100) / 10)// 3. 获取个位的数字let ge = i % 10;//console.log(`数字:${i},百分位数字:${bai},十分位数字:${shi},个位数字:${ge}`)// 如果 if( (bai ** 3) + (shi ** 3) + (ge ** 3) == i) {console.log('当前数字满足水仙花规则,数字为:',i)}}// 方案2 优化for(let num = 100; num < initNum ; num ++) {// 转为字符串 let numStr = num + '';if(numStr[0] **3 + numStr[1] **3 +numStr[2] **3 === num) {console.log('数字满足水仙花规则,数字为:',num)}}</script>
练习3
获取用户输入的大于1的整数(暂时不考虑输错的情况)
然后编写代码检查这个数字是否是质数,并打印结果
质数
-
一个数如果只能被1和它本身整除,那么这个数就是质数
-
1既不是质数也不是合数
解题思路
如果我们的值为9,拆分值计算
编写代码检查9是否是质数
检查9有没有1和9以外的其他因数
如果有,说明9不是质数
如果没有,说明9是质数
获取所有的可能整除9的数(1-9)
2 3 4 5 6 7 8检查这一堆数中是否有能整除9的数
代码
// for (let i = 2; i < 9; i++) {// if(9 % i !== 0){// // 如果9 % i !== 0 成立,说明9不能被i整除// // 9 不能被 i 整除 能不能说明9是质数? 不能 // // 9 必须不能被所有的i整除,才能说明9是质数// // alert("9是质数")// }// }
<script>// 获取用户输入的数值let num = +prompt("请输入一个大于1的整数:")// 用来记录num的状态,默认为true,num是质数
let flag = truefor(let i=2; i<num; i++){
if(num % i === 0){// 如果num能被i整除,说明num一定不是质数 // 当循环执行时,如果从来没有进入过判断(判断代码没有执行),则说明9是质数// 如果判断哪怕只执行了一次,也说明 9 不是质数 flag = false}
}if(flag){alert(`${num}是质数!`)}else{alert(`${num}不是质数!`)}let num = +prompt('输入一个大于1的整数');let result = false;for(let i = 2 ; i < num; i ++) {if(num % i == 0) {result = true;break;}}console.log(`输入数字${num} , ${result ? '不是质数' : '是质数'}`)</script>
ge-20250519203057072.png&pos_id=img-DVu40Jj1-1747663856902)
六、循环嵌套
- 九九乘法口诀
- 质数判断
练习1
<script>document.write("<hr>");// 高度是 9 for(let i = 1; i <=9 ; i ++) {for(let j = 1; j < i+1; j ++) {document.write(`<span> ${j} * ${i} = ${i * j} </span>`);}document.write("<br>");}
</script>
练习2
质数判断
<script>document.write("<hr>");// 高度是 9 for(let i = 2; i <= 100 ; i ++) {let flag = false;for(let j = 2 ; j < i; j ++) {// 进入判断代表不是质数if (i % j == 0) {flag = true;}}if(!flag) {document.write(`<p> 数字${i} 是质数 </p>`);}}
</script>
七、break和continue练习
- 利用break 提前跳出,优化质数判断
方案1
<script>// 开始一个计时器console.time('质数练习')for (let i = 2; i < 1000; i++) {let flag = truefor (let j = 2; j < i; j++) {if (i % j === 0) {flag = false// 进入判断说明i一定不是质数,后续检查没有执行的必要break}}if (flag) {//console.log(i)}}// 停止计时器console.timeEnd('质数练习')console.time('质数练习方式2')for (let i = 2; i < 1000; i++) {let flag = falsefor (let j = 2; j < i; j++) {if (i % j === 0) {flag = truebreak}}if (!flag) {//console.log(i)}}// 停止计时器console.timeEnd('质数练习方式2')</script>
方案2
<script>// 开始一个计时器console.time('质数练习')for (let i = 2; i < 100; i += 2) {let flag = truefor (let j = 2; j <= i ** .5; j++) {if (i % j === 0) {flag = false// 进入判断说明i一定不是质数,后续检查没有执行的必要break;}}if (flag) {//console.log(i)}}// 停止计时器console.timeEnd('质数练习')</script>