JavaScript的數組練習

1. 讀取學生的10門課的成績, 然後輸出10門課成績的最高分, 最低分, 總分, 平均分.
   提示:把10門課的成績保存如一個數組中.

2. 創建100個隨機的10到60的隨機整數, 然後分別統計每個數字出現的次數

3. 定義一個函數, 判斷數組中是否所有的數字都大於0
    提示: 傳入一個數組, 返回布爾值

4. 封裝函數: 把兩個數組共同的元素放入一個新的數組, 並返回新的數組
    提示: 傳入兩個數組, 返回值爲新的數組

5. 定義一個函數: 可以把數組中的下標爲 3 的元素移到數組的開頭.
    提示: 傳入一個數組

6. 有一個從大到小排好序的數組{99,85,82,63,60}。
    現從頁面輸入一個數,要求按原來的規律將它插入數組中。
    假設你輸入的80,則應該插入到82和63之間。

7. 一個數字中有20個元素,對前10個元素使用升序,後10個元素使用降序。
    元素都是整數。

1.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<!--題目:讀取學生的10門課的成績, 然後輸出10門課成績的最高分, 最低分, 總分, 平均分.
    提示:把10門課的成績保存如一個數組中.-->
<body>
<script>
    var sum = 0;
    var ave = 0;
    var arr = [90, 100, 10, 20, 30, 40, 50, 60, 70, 80];
    console.log(arr);
    //排序
    arr.sort(function (a, b) {
        return a - b;
    });

    //最高分
    function large(arr) {
        return arr[arr.length - 1];
    };

    //最低分
    function small(arr) {
        return arr[0];
    };

    //總分
    function total(arr) {
        for (var ele of arr) {
            sum += ele;
        }
        return sum;
    };

    //平均分
    function ave(arr) {
        return sum / arr.length;
    }

    //輸出
    console.log("總分: " + total(arr));
    console.log("最高分: " + large(arr));
    console.log("最低分: " + small(arr));
    console.log("平均分: " + ave(arr));

</script>
</body>
</html>
<!--記得再次用原型替換3進行調試-->

用函數封裝起來:(更具面向對象的思想)

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
function Student(){
    this.scores = [];
    this.init = function (){
        for (var i = 0; i < 3; i++){
            var score = +prompt("請輸入學生的成績:");
            this.scores.push(score);
        }
    };
    this.max = function (){
        var scores = this.scores;
        var m = scores[0];// ["100", "200", "40"]
        for(var i = 1; i < scores.length; i++){
            if(m < scores[i]){
                m = scores[i];
            }
        }
        return m;
    }
    this.min = function (){
        var scores = this.scores;
        var m = scores[0];// ["100", "200", "40"]
        for(var i = 1; i < scores.length; i++){
            if(m > scores[i]){
                m = scores[i];
            }
        }
        return m;
    }
    this.sum = function (){
        var s = 0;
        for(var e of this.scores){
            s += e;
        }
        return s;
    }
    this.avg = function (){
        return this.sum() / this.scores.length;
    }
}

var s1 = new Student();
s1.init(); //初始化學生的成績

console.log(s1.max());
</script>
</body>
</html>

2.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<!--創建100個隨機的10到60的隨機整數, 然後分別統計每個數字出現的次數-->

<script>
    //arr是放隨機數產生的數字,newArr是放重複元素和重複個數的二維數組
    var arr = [];
    var newArr = [];

    //js的數組可以動態增加,使用數組字面量創建
    for (var i = 0; i < 100; i++) {
        //用random判斷隨機數其實不是perfect(正態分佈)
        arr[i] = parseInt(Math.random() * 50 + 10);
    }
    console.log("隨機數(正態分佈):\n" + arr);

    //對數組進行排序
    arr.sort(function (a, b) {
        return a - b;  //升序
    });
    console.log("隨機升序排序:\n" + arr);

    //判斷數組元素的重複個數,這樣算法是相對而言比較高效的,省掉了低效的代碼率
    for (var i = 0; i < arr.length;) {
        var count = 0;
        for (var j = i; j < arr.length; j++) {
            if (arr[i] == arr[j]) {
                count++;
            } else {
                break;
            }
        }
        newArr.push([arr[i], count]);
        i += count;
    }
    //輸出二維數組
    for (var i = 0; i < newArr.length; i++) {
        console.log(newArr[i][0] + "重複次數:" + newArr[i][1]);
    }
</script>
<body>
</body>
</html>

在這順便講解一下隨機數生成的方法,以後只要涉及到隨機數,就套路進去就行,就跟數學公式一樣。(證明略)

如何使用js生成n到m間的隨機數字,主要目的是爲後期的js生成驗證碼做準備。

方法1:Math.random() 函數返回0和1之間的僞隨機數,可能爲0,但總是小於1,[0,1)

生成n-m,包含n但不包含m的整數:

Step1:算出 m-n的值,假設等於w

Step2:Math.random()*w

Step3:Math.random()*w+n

Step4:parseInt(Math.random()*w+n, 10)  在這裏10表示10進制,默認就是10進制。


方法2:生成n-m,不包含n但包含m的整數:​

Step1:算出 m-n的值,假設等於w

Step2:Math.random()*w

Step3:Math.random()*w+n

Step4:Math.floor(Math.random()*w+n) + 1    

注:Math.floor() 返回小於等於數字參數的最大整數,對數字進行下舍入

一般記住這兩種方法就行了。

另解:(在那裏要不要加1,看自己的情況,掌握怎麼算的):

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//  [0, 1)  [0, 51)   [10, 61)   [10, 60]
// m = 10 n= 60
function randomInt(m, n){  //區間: [m, n]
    return parseInt(Math.random() * (n - m + 1) + m);
}

/*創建一個長度是 count, 元素的值的範圍 是 [m, n]的數組*/
function createArray(count, m, n){
    var arr = [];
    for (var i = 0; i < count; i++){
        arr.push(randomInt(m, n));
    }
    return arr;
}

function tongji(){
    var obj = {};
    var arr = createArray(400, 10, 19);
    for (var num = 10; num <= 19; num++){
        var c = 0;
        for (var e of arr){
            if (e == num){
                c++;
            }
        }
        obj[num + ""] = c;
    }
    return obj;
    
}
var result = tongji();
console.log(10 + "的個數:" + result["10"]);
console.log(result["11"]);
console.log(result);

</script>
</body>
</html>

3.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<!--定義一個函數, 判斷數組中是否所有的數字都大於0
    提示: 傳入一個數組, 返回布爾值
-->
<body>
<script>
    var arr=[10,20,3,1,3.1,9,1,34,90,0,-100,100];
    var flag=true;
    for(var i=0;i<arr.length;i++){
        if(arr[i]<0){
            flag=false;
            console.log("數組存在第一個非正值爲:"+arr[i]+" 其數組下標爲 "+i);
            break;
        }
    }
    if(flag){
        console.log("數組恆正~");
    }else{
        console.log("因此,數組不是恆正的~");
    }
</script>
</body>
</html>

4.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<!--封裝函數: 把兩個數組共同的元素放入一個新的數組, 並返回新的數組
    提示: 傳入兩個數組, 返回值爲新的數組
-->
<body>
<script>
    var arr1 = [1, 2, 3, "aaa", "hello", 999, -1];
    var arr2 = [3, 78, "aaa", "bbb", 99, 1, -1, "hello"];
    var newArr = [];

    //兩層嵌套,效率很低。
    function common(arr1, arr2) {
        for (var i = 0; i < arr1.length; i++) {
            for (var j = 0; j < arr2.length; j++) {
                if (arr1[i] === arr2[j]) {
                    newArr.push(arr1[i]);
                }
            }
        }
    }

    common(arr1, arr2);
    console.log(newArr);
</script>
</body>
</html>

5.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--定義一個函數: 可以把數組中的下標爲 3 的元素移到數組的開頭.
    提示: 傳入一個數組
-->
<script>
    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 111];
    console.log("原數組: " + arr);
    //函數alter將下標爲3的移動到開頭
    function alter(arr) {
        var temp = arr[3];
        arr.splice(3, 1);
        arr.splice(0, 0, temp);
    }

    alter(arr);
    console.log("移動後數組: " + arr);
</script>
</body>
</html>

6.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<!--題目:有一個從大到小排好序的數組{99,85,82,63,60}。
    現從頁面輸入一個數,要求按原來的規律將它插入數組中。
    假設你輸入的80,則應該插入到82和63之間。
-->
<!--
此題方法集錦:
法1:投機取巧   直接先把數字插入到數組頭部或者尾部,然後一塊排序,很ok吧。

法2:用折半查找二分法,在大樣本數據下比較高效,本題解法實則時間複雜度達到O(n),而折半O(log2n)

-->
<body>
<script>
    //需插入的數字
    var insertNum=16;

    //假設未排序,自己先排序一下
    var arr=[88,98,2,5,8,10,25,36];
    arr.sort(function (a,b) {
        return b-a;    //降序排列
    });
    console.log("降序排列的數組爲:"+arr);

    // 此循環得到的i值就是排序好的數組最接近insertNum值得那個最大下標,雖然效率很差。
    for(var i=0;i<arr.length;i++){
        if(arr[i]>=insertNum){
            var temp=i;
        }
    }

    //插入到下標爲temp+1的位置
    arr.splice(temp+1,0,insertNum);

    //輸出info
    console.log("插入數字"+insertNum+"後的新數組爲: "+arr);


</script>
</body>
</html>

另解:

<script>
/*7. 有一個從大到小排好序的數組{99,85,82,63,60}。
    現從頁面輸入一個數,要求按原來的規律將它插入數組中。
    假設你輸入的80,則應該插入到82和63之間。*/
function insert(arr, num){
    for(var i = 0; i < arr.length; i++){
        if(arr[i] < num){
            arr.splice(i, 0, num);
            return;   // 直接結束函數
        }
    }
    arr.push(num);
}
var arr = [99, 85, 82, 63, 60];
insert(arr, 610);
console.log(arr);
</script>

7.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<script>
    //數組元素20個
    var arr = [100,12,34,67,23,16,6,9,24,79,2,90,33,69,1,34,-2,0,666,1000];

    //切片
    var arr1=arr.slice(0,10);
    var arr2=arr.slice(10);

    //前升序
    arr1.sort(function (a,b) {
        return a-b;
    });

    //後降序
    arr2.sort(function (a,b) {
        return b-a;
    });

    //組合新數組(cs6)並輸出
    var newArr = [...arr1,...arr2];
    console.log("前升序後降序的數組爲: " + newArr);
</script>
</body>
</html>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章