Lichen5221 / Report-Daily

記錄每日上課內容與作業。
0 stars 0 forks source link

2021-05-04 #15

Open Lichen5221 opened 3 years ago

Lichen5221 commented 3 years ago

內建函式做做看

練習實作內建函式

理解內建函式,較能理解並使用。

實戰:Array.map

老師解答:

function double(n) {
  return n*2
}

let arr = [1, 2, 3]
let newArr = arr.map(double)
function map(arr, callback) {
  let result = [ ]
 for(let i = 0; i < arr.length; i++) {
    result[i] = callback(arr[i])
  }
  return result
}
console.log(map[1, 2, 3], double)

實戰:String.repeat

老師解答:

function repeat(str, n) {
  let result = ''
  for(let i = 1; i <= n; i++) {
    result += str
  }
  return result
}

console.log(repeat('abc', 3))

實戰:Array.lastIndexOf

老師解答:

function lastIndexOf(arr, target) {
  for(let i = arr.length - 1; i >= 0; i--) {
    if(arr[i] === target) {
      return i
    }
  }
  return -1 //代表迴圈內都沒有找到沒有想到的 target
}
console.log(lastIndexOf([2, 1, 2], 3))
Lichen5221 commented 3 years ago

LIOJ 1031:完全平方和

自己試寫:

function sqr(n) {
  let sum = 0
  for (var i = 1; i <= n; i++) {
    if (i % Math.sqrt(i) === 0) {
      sum += i
    }
  }
  return sum
}

console.log(sqr(30))

哀, LIOJ 又不能執行我寫的東西了,真煩。

還以為跟是否能驗證整數有關,無聊又寫了一個:

  let sum = 0
  for (var i = 1; i <= num; i++) {
    n = Math.sqrt(i)
    if (n % 1 === 0) {
      sum += i
    }
  }
  return sum

node.js 完美執行,可是在 LIOJ 上還是不能執行哇~

老師解答:

let n = Number(lines[0])
let sum = 0
for(let i = 1; i <= n; i++) {
  if (isSquare(i)) {
    sum += i
  }
}
console.log(sum)

function isSquare(n) {
  let r = Math.floor(Math.sqrt(n))
  return r*r === n
}

差異:我是直接可整除即為平方和,為什麼要用無條件捨去,然後再判斷相乘是否相同⋯⋯好煩啊。

結果丟老師的上去才發現自己少了個 v ,補上去之後放上我的答案,結果是錯誤的答案欸,為什麼啊?明明 node.js 就能完美執行啊!

然後呢,又發現是要 console.log ,而不是 return 欸,到底想怎樣啊?結論就是要印出答案要用 console.log 喔。

LIOJ 1032:平面距離計算

LIOJ 1033:最近點對

LIOJ 1034:凱薩加密

自己試寫:

function code(n, str) {
  let s = ''
  for (var i = 0; i < str.length; i++) {
    let ASCII = str.charCodeAt(i) + n
    if (ASCII > 122) {
      let nc = ASCII - 26
      console.log(nc)
      s += String.fromCharCode(nc)
    } else {
      console.log(ASCII)
      s += String.fromCharCode(ASCII)
    }
  }
  console.log(s)
}

code(10, 'xray')

LIOJ 版本:

  let n = Number(lines[0])
  let str = lines[1]
  let s = ''
  for (var i = 0; i < str.length; i++) {
    let ASCII = str.charCodeAt(i) + n
    if (ASCII > 122) {
      let nc = ASCII - 26
      s += String.fromCharCode(nc)
    } else {
      s += String.fromCharCode(ASCII)
    }
  }
  console.log(s)

真心不解錯在哪裡⋯⋯明明 node 上執行好好的⋯⋯

老師解答:

let n = Number(lines[0])
let str = lines[1]
let result = ''
for (let i = 0; i < str.length; i++) {
  result += ceaserCipher(n, str[i])
}
console.log(result)

function ceaserCipher(n, s) {
  let code = s.charCodeAt(0) - 97
  let newCode = (code + n) % 26
  return String.fromCharCode(newCode + 97)
}

差異:老師還把數字變 0 再去處理,這樣不是多此一舉嗎⋯⋯為什麼一定要這樣也沒有說⋯⋯

我自己看著程式想了很久,理解到為什麼不能用減,因為 n 會大到 100 ,當 100 的時候根本不能只減一次 26,讓我好好想想有沒有可能利用之前的不斷減 26 直到數字小於 122 這個迴圈。

有空再回來改看看吧。

LIOJ 1046:圈圈叉叉

Lichen5221 commented 3 years ago

Project 6 介紹

老師提供基本格式

// LIOJ 1036:Array reverse function reverse(arr) { }

// LIOJ 1037:Array filter // 這題 callback 會是一個 function,但難度會比較高 // 若是做不出來,也可以調整參數 function filter(arr, callback) { }

// LIOJ 1038:Array indexOf function indexOf(arr, searchElement) { }

// LIOJ 1039:Array fill function fill(arr, value) { }

// LIOJ 1040:Array join function join(arr, separator) { }

// LIOJ 1041:String trim function trim(str) { }

// LIOJ 1042:String toLowerCase function toLowerCase(str) { }

// LIOJ 1043:String endsWith function endsWith(str, searchString) { }

// LIOJ 1044:String padEnd function padEnd(str, targetLength, padString) { }

// LIOJ 1045:String slice function slice(str, beginIndex, endIndex) { }

Lichen5221 commented 3 years ago

LIOJ 1036:Array reverse

LIOJ 1037:Array filter

LIOJ 1038:Array indexOf

LIOJ 1039:Array fill

LIOJ 1040:Array join

Lichen5221 commented 3 years ago

LIOJ 1041:String trim

LIOJ 1042:String toLowerCase

LIOJ 1043:String endsWith

LIOJ 1044:String padEnd

LIOJ 1045:String slice

Lichen5221 commented 3 years ago

JS102

借別人的東西來用:require

如果沒有模組:將東西全部放在一起(例如:登入、金流、會員管理、權限管理⋯⋯),容易改到其他的部分,難以管理。

如果有模組:可以將所有東西切割開來,用一個主程式將東西全部串接起來。這樣即便是修改其他的系統,也不會去影響另一個系統。

node.js 本身就提供一些模組,參考 此頁

var os = require('os') //因為 os 是 node.js 直接的模組(中國:模塊),不用加什麼東西,透過 require 可引入。

os.platform( ) 回傳你所用的作業系統

require 是要引入的模組,利用變數宣告(變數愛取什麼就取什麼),可以使用他人寫好的模組。

把東西借給別人:export

建立東西給別人用:

function double(n) {
  return n * 2
}

module.export = double

非系統提供借用:

var myModule = require('./myModule.js') //不打 .js 也可以
console.log(myModule)

以物件的方式輸出多樣:

var obj = {
  double: double,
  triple: function( ) {
    return n * 3
  }
}

module.exports = obj

// 引入:
var myModule = require('./myModule')
console.log(myModule.double(2), myModule.triple(10))

第二種方法:

exports.double = double //引入結果絕對是物件
exports.triple = function (n) {
  return n * 3
}

為什麼需要模組?當兩個檔案需要相同的驗證方式或是相關函式時,不必用複製貼上,也不必更改時兩個都要更改(如果用在十個檔案上就要更改十個?),這樣太沒效率也很不方便,故寫好一個模組後,將模組引入這些檔案裡即可。