【77】JS数组 函数 对象 算法练习题(小白思路VS更优思路)


本篇学习目标:
1.识别小白思路之弊端,掌握更优思路




一、数组

1. 统计大于等于平均成绩的人数

  • 有10个学生的成绩存在数组中,请统计大于等于平均成绩的人数。
  • 成绩直接以数组形式写在程序中,不需要用户输入。

这一题比较基础,涉及数组的定义以及数组长度与项之间关系:

var grades = [60,70,80,56,38,95,67,88,100,75];
//console.log(grades);
sumgrades = 0;
 for (i = 0 ; i <= grades.length-1 ; i++) {
   
     sumgrades += grades[i];
}
//console.log("所有人分数之和="+sumgrades);
 var  av = sumgrades / grades.length;
 // console.log("平均分="+av);
 //计数:大于平均分的人数
 var count =0;
 for (i = 0 ; i <= grades.length-1 ; i++) {
   
      if (grades[i] > av) {
   
               count++;
        }
 } 
 console.log("大于等于平均成绩"+av+"的人数有"+count+"人");

在这里插入图片描述


2. 数组中的最大值和最小值,以及所在位置的下标

  • 求一组数中的最大值和最小值,以及所在位置的下标。

比较简单的方法如下,灵活运用中间变量:

var arr = [2,4,1,5,3,9,10,8,7,6];
console.log(arr);
//定义中间变量,储存比较过程中的最大值最小值以及对应下标
  var max = 0; //最大值的初始值必须是最小的
  var min = 20;  //最小值的初始值必须是最大的
  var max_index = 0;
  var min_index = 0;
//循环遍历数组进行比较
for (var i = 0; i <= arr.length-1 ; i++) {
   
    //比较是否比最大值更大
    if (arr[i] > max) {
   
           max = arr[i];
           max_index = i;
     }
         //比较是否比最小值更小
    if (arr[i] < min) {
   
           min = arr[i];
           min_index = i;
   }
} 
 //输出
console.log("最大值"+ max+"所在下标为"+max_index);
console.log("最小值"+ min+"所在下标为"+min_index);

也可以用到内置对象中的一些方法:

//①定义一组数 
var arr = new Array(2,4,1,5,3,9,10,8,7,6);
console.log(arr);
//②数组转字符串,之后找位置可以借助字符串,因为数组排序后顺序会变
 var char = arr.join("");
//console.log(char);//转数组成功
//③从大到小给数组排序
arr.sort(function(a,b) {
   
     if (a > b) {
   
               return -1; //a在b前,越大越在前,说明是从大到小排序
     } else if (a < b) {
   
               return 1; //a在b后
     } else {
   
              return 0; //a和b保持原来位置
     }
});
//④排序后数组的第一个是最大值,最后一个是最小值//数组顺序变了,所以从之前转号的字符串中找两个值所在位置
console.log("最大值"+arr[0]+"所在位置下标"+char.indexOf("10"));
console.log("最小值"+arr[arr.length-1]+"所在位置下标"+char.indexOf("1"));

在这里插入图片描述






二、函数

1.完美数

  • 使用函数方法书写一段程序,判断一个数是不是完美数。 如果一个数恰好等于它的因数之和,则称该数为“完美数”。
  • 例如:第1个完全数是6,它有因数1、2、3、6,除去它本身6外,其余3个数相加,1+2+3=6。

小白思路:刚开始学习这里的我,容易写成以下形式,虽然也可以成功实现效果,但是违背了函数的作用:让函数的功能模块化(单一),并且可以尽量在任何需要它的地方再次调用

 function fun1 (a = prompt("请输入一个整数","6")) {
   
      sum = 0;  
      for (i = 1; i <= a ; i++) {
   
           if (a % i == 0) {
   
                sum += i;
           } 
       }
        if (sum == 2*a) {
   
                alert(a+"是完美数");
       } else {
   
                alert(a+"不是完美数");
       }             
}
fun1();

在这里插入图片描述

1.更优思路:需要把其中涉及到函数单独拎出来,模块化,实现单一的功能。
2.思考顺序: 判断→需要用户先输入→需要知道怎么判断完美数→需要知道约数和情况。而写代码实现思路与之相反~也就是逆向思维
3.写代码实现顺序:设置约数和函数→设置判断完美数函数→用户输入→判断
4.虽然下例代码看起来更多,但是却可以在更多的场合调用,真正实现了函数的作用

//约数和函数(约数和情况)
  function yueshuhe(a) {
   
     //累加器
    sum = 0;
    for (var i = 1; i < a ; i++) {
   
        if (a % i === 0){
   
            sum += i;
         }
    }
     //循环结束后,sum中储存了a的约数和
    return sum;
 }
 //判断完美数函数(怎么判断完美数)
  function isWm(a) {
   
       if (yueshuhe(a) === a) {
   
              return true;
        }else {
   
              return false;
       }
   }
//用户输入
var n = parseInt(prompt("请输入一个数,会自动判断其是否为完美数","6"));
//判断用户输入是否为完美数并且弹出结果
    if (isWm(n)){
   
            alert(n+"是完美数");
    } else {
   
            alert(n+"不是完美数");
    }

2. 盈数

  • 求2000 以内的全部亲密数。
  • 盈数是一种特殊的自然数,除去它本身以外的一切正约数的和大于它本身。与完美数类似。

小白思路:刚开始学习这里的我,容易写成以下形式,虽然也可以成功实现效果,但是违背了函数的作用:让函数的功能模块化(单一),并且可以尽量在任何需要它的地方再次调用。与上题犯错情况类似

 function fun () {
      
     for (a = 1 ; a < 100; a++) {
   
       sum = 0; //累加器初始化位置很重要!因为每次是一个a对应它所有的i(因数)之和,所以再a的循环之内
       for(i = 1 ; i < a ; i++) {
   
            if (a % i == 0) {
   
               sum += i; 
              //因为上面定义了i<a,所以这里的sum就是除了a本身的所有a的因数i之和
           }  
       }
        //console.log(a +"的因数和为"+sum); 
        if (sum > a ) {
   
              console.log(a+"是盈数");
       }
   }
}
        fun ();

在这里插入图片描述

1.更优思路:需要把其中涉及到函数单独拎出来,模块化,实现单一的功能。
2.思考顺序:输出盈数→需要知道怎么判断盈数→需要知道约数和情况
3.代码书写顺序:约数和函数→判断盈数函数→输出盈数函数→调用

 //约数和函数(与上题一样):输入参数a,输出a的约数和
function yueshuhe(a) {
   
    sum = 0;
     for (var i = 1; i < a;i++) {
   
          if (a % i === 0) {
   
              sum += i;
          }
    }
    return sum;
}
//判断盈数函数:
function isYs(a) {
   
    if (yueshuhe(a) > a) {
   
            return true;
     }else {
   
             return false;
     }
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

倏存

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值