本篇学习目标:
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;
}