11.18 JS基础3

  • 作业回顾与修改

发现昨天做的第二题我理解错了,要把加减乘除放在select标签里,特此修改。另外两题没毛病,只有一个常识要记住:2月份在平年里是28天,闰年里是29天。平年或者闰年和年份有关,闰年的判断标准:年份能被4整除,不能被100整除,或者能被400整除。

<body>
<input type="text" id="num1" value="" placeholder="请输入第一个数字"><br/>
<select id="op">
    <option>+</option>
    <option>-</option>
    <option>*</option>
    <option>/</option>
</select><br/>
<input type="text" id="num2" value="" placeholder="请输入第二个数字"><br/>
<input type="button" id="btn" value="计算">
=<input type="text" id="result" value="0" placeholder="此处显示结果"><br/>
<script>
let n=document.getElementById("btn").onclick=function(){
    //1 获取文本框1的值
    let num1=parseFloat(document.getElementById("num1").value);
    //2 获取文本框2的值
    let num2=parseFloat(document.getElementById("num2").value);
    //3 获取运算符
    let op=document.getElementById("op").value;
    //条件判断
    let sum = 0;
    switch (op){
        case "+":
            sum = num1+num2;
            break;
        case "-":
            sum = num1-num2;
            break;
        case "*":
            sum = num1*num2;
            break;
        case "/":
                if(num2==0){
                    alert("除数不能为0");
                    document.getElementById("result").value="除数不能为0";
                    return;
                }
            sum = num1/num2;
            break;
    }document.getElementById("result").value=sum;


}
</script>

</body>

 

  • 循环结构

循环结构解决的是重复相同或相似的操作问题。

<script>
    //for
    //while
    //do...while

//    for(表达式1;表达式2;表达式3){
//
        //循环体
//    }

    //表达式1先执行一次,而且只执行一次-》给变量赋值;
    //表达式2是条件判断,表达式1执行完后,去执行表达式2
    //true 执行 循环体 false 循环体不执行 直接跳过循环体

    //当表达式为2并执行完循环体后,我们的代码去执行表达式3 ==>变量的变化 i++
    //表达式3执行完之后,继续执行表达式2

    for(let i=1;i<=5;i++){
        console.log("i"+i);//输出i的值
    }


</script>

 

  • 小练习:随机次数(100次以下)打印一句话
<script>
    //打印随机数
    //不确定字数
    let n=Math.floor(Math.random()*100);//包括0不包括100
    console.log(n);
    for(let i=0;i<=n;i++){
        console.log("hello world"+i);
    }
</script>

 

  • 猴子吃桃问题

问题:猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。

第二天早上又将第一天剩下的桃子吃掉一半,又多吃了一个。

以后每天早上都吃了前一天剩下的一半多一个。到第 10 天早上想再吃时,发现只剩下一个桃子了。

编写程序求猴子第一天摘了多少个桃子。

<script>
    //初次想法
    let n=1;//n 第10天剩一个
    let p;//p 前一天
    for(let i=9;i>0;i--){
        p=(1+n)*2;//第9天4个 第8天10个
        n=p;
    }document.write(n);

    //简化
    let peach=1;
    for(let i=9;i>=1;i--){
        peach=(peach+1)*2;
    }document.write("第1天共摘了"+peach+"个桃子");
</script>

分析过程:猴子吃桃子只吃了9天,第10天还没吃。这道题用的是逆向思维,从第9天到第1天,定义循环。

for(let i= 9;i>=1;i--){

     //没吃之前有几个?

        sum= (sum+1)*2

}//第9天 4个桃子 即 2*(1+1)

//第8天 10个桃子 即 2*(2*(1+1)+1)

下附老师的解法:

<script>
    let sum = 1;//第九天吃完之后还剩1个.[第10天早上起来还没吃]
    for(let i = 9;i>=1;i--){

        //没吃之前有几个?
        sum= (sum+1)*2
        console.log("第"+i+"天没吃之前有"+sum+"个桃子")
        //4  10
    }
    
</script>

 

  • 小球问题

有一个弹力球,从100米的高度,落地后会弹起来.每次弹起的高度是原来高度的一半.

问,第10次落地后弹起来的高度是多少?

<script>
    let height=100;
    let iniHeight=100;//初始高度
    let sum=0;//除了开始的100米其余的弹起落下高度之和
    let path=0;//总的路程

    for(let i=1;i<=10;i++){
        height/=2;
        if(i!=10){//i=10时其实是第11次落下,因为初始高度100不可忽视
            sum+=2*height;
            path=sum+iniHeight;
        }
    }
    console.log(height);
    console.log(path);
    //调试
//    1次 100
//    2次 100+50+50=200
//    3次 100+50+50+25+25=250
//    4次  100+50+50+25+25+12+12
</script>

自己的还有待改进。。下图是老师的解法

<script>
    //原始高度
    let height = 100;
    //定义变量保存每次落地时经历的路程.
    let sum = height;
    //i表示第几次落地
    for(let i = 1;i<=10;i++){
        //这个sum?
        console.log("第 "+i+" 次落地时候经过的距离: "+sum+" 米")
        //弹起后的高度
        height = height / 2;
        //计算结果(将每次弹起高度+下落高度) 累加
        if(i!=10){
            sum = sum + 2*height;
        }
    }

    console.log("第10次落地后弹起的高度: " + height);
    console.log("第10次落地时经过的距离: " + sum);

</script>

老师的解法有明显的优越性,在for循环中输出第i次落地时经过的距离,便于验证数值。

console.log("第 "+i+" 次落地时候经过的距离: "+sum+" 米")

其实,这种题画图会更便于理解(Ps:画的丑了点,但没毛病。。)

 

  • 循环练习3题

1. for循环实现计算 2+22+222+2222+22222的和。

难度不高,关键在于发现数字之间的规律 n*10+2 10*(n*10+2)+2 10*(10*(n*10+2)+2)+2

<script>
    let num1 = 2;
    let sum = num1;
//    console.log(num1);
    for (let i = 1; i <= 4; i++) {
        num1 = num1 * 10 + 2;
//      console.log(num1);
        sum += num1;//累加后面四个数字
    }
    document.write("2+22+222+2222+22222的和为" + sum + "<br/>");
    
</script>

 

2. 判断并输出500以内既能被3整除又能被5整除的整数。

这题也不难,关键在于逻辑与的使用,还有将数字定位在1到499之间。

//循环变量从1开始到499
for (let i = 0; i < 500; i++) {
    //条件判断 逻辑与
    if (i % 3 == 0 && i % 5 == 0) {
        //满足条件就输出结果
        console.log(i);
        document.write("输出500以内既能够被3整除又能够被5整除的整数为" + i + "</br>");
    }
}

 

3. 寻找所有的水仙花数 水仙花数定义:
a、一定是三位数
b、每一位的立方,加起来正好是这个数的本身,比如153=1*1*1 + 5*5*5 + 3*3*3;

for (let i = 100; i <= 999; i++) {
    //以153为栗 153%10=3 153%100=53 153/100=1.53向下取整得1 53/10=5.3向下取整得5
    if ((i % 10) * (i % 10) * (i % 10) + Math.floor(i % 100 / 10) * Math.floor(i % 100 / 10) * Math.floor(i % 100 / 10) + Math.floor(i / 100) * Math.floor(i / 100) * Math.floor(i / 100)
            == i){
        console.log(i);
    }
}

我的方法稍微笨了些。。忘了用变量存储各个数字,老师的就有用。。

<script>
    //循环变量从100开始到999
    for(let i =100;i<=999;i++){
        //i 拆开
        let g =i%10;//个位
        let s=Math.floor(i/10%10);//十位
        let b=Math.floor(i/100);//百位

        //console.log(g+", "+s+", "+b)
        if(i == g*g*g + s*s*s + b*b*b)
        {
           //满足条件就输出结果
           console.log(i);
       }
    }
</script>

 

  • 今日作业:页面输入一个5位数数字; 12345 ,我们验证一下这个数字是否为回文数
<body>
<input type="text" id="num" placeholder="请输入一个5位数数字">
<input type="button" id="btn" value="验证">
<input type="text" id="result" value="">
<script>
    //字符串转数组判断
//    document.getElementById("btn").onclick=function(){
//        let num=document.getElementById("num").value;
//        let result=document.getElementById("result").value;
//        let num1=num.split("");
////        console.log(num1);
////        console.log(typeof num1);
//        if(num1[0]==num1[4]&&num1[1]==num1[3]){
//            console.log("您输入的是回文数");
//            document.getElementById("result").value="您输入的是回文数";
//        }else{
//            console.log("您输入的不是回文数");
//            document.getElementById("result").value="您输入的不是回文数";
//        }
//    }
    //笨办法,用取余取整把一个个数字取出来做对比
//12345 十万位1 Math.floor(12345/10000) 万位 Math.floor(12345/1000%10)
//        document.getElementById("btn").onclick=function(){
//            let num=parseInt(document.getElementById("num").value);
//            let result=parseInt(document.getElementById("result").value);
//            let num1=Math.floor(num/10000);//1
//            let num2=Math.floor(num/1000)%10;//2
//            let num3=Math.floor(num/100)%10;//3
//            let num4=Math.floor(num%100/10);//4
//            let num5=num%10;//5
//            if(num1==num5&&num2==num4){
//                console.log("您输入的是回文数");
//                document.getElementById("result").value="您输入的是回文数";
//            }else{
//                console.log("您输入的不是回文数");
//                document.getElementById("result").value="您输入的不是回文数";
//            }
//     }
        //字符串 稍微改进的方法
    document.getElementById("btn").onclick = function () {
        let num = document.getElementById("num").value;
        if (num > 99999 || num < 10000 || isNaN(num)) {
            document.getElementById("result").value = "您输入的不是五位数数字,请重输";
        } else {
            let result = document.getElementById("result").value;
                if (num[4] == num[0] && num[1] == num[3]) {
                    console.log("您输入的是回文数");
                    document.getElementById("result").value = "您输入的是回文数";
                } else {
                    console.log("您输入的不是回文数");
                    document.getElementById("result").value = "您输入的不是回文数";
            }
        }
    }
</script>
</body>

 

今日感想:今天遇到的多是逻辑题,考验脑袋。。立马动手效果可能不是很好,出来的多是有瑕疵的笨办法,思考一下,画个图也许会理解更透彻些。(Ps:今天基金亏到不想说话。。医疗,说好的年底飞起呢?可能还是敲出来的代码更温暖些,起码手暖和了)

18:27:43 2021-11-18

posted on 2021-11-18 18:26  heyiyang1312  阅读(5)  评论(0)    收藏  举报

导航