---
# System prepended metadata

title: U4.1、 練習寫程式
tags: [7/21, 7/20, Lidemy心得, 2020七月第三週, 7/19, 進度筆記, ALG 101, JavaScript]

---

# U4.1、 練習寫程式
###### tags:  `ALG 101` `JavaScript` `2020七月第三週` `進度筆記` `Lidemy心得` `7/19`

---

## 虛擬碼到程式碼

看懂題目 > 虛擬碼 > 看別人寫好的程式 > 虛擬碼轉到程式碼 。

虛擬碼寫得好，轉 code 就順。

### 陣列加總

```
let sum = 0
for(i from 0 to n-1)do
  sum+= arr[i]
end for (區塊)
print sum  
```

宣告變數 0 ， 讓 i 元素從 0 跑到 n-1 (順著跑) ， 0 = 0 + 陣列的元素一直加到 n-1 個，結束，印出。

```
let sum = 0
for(let i=0; i<n; i++) {  //等於 for(let i=0; i<=n-1; i++) {
  sum+=arr[i]
}
console.log(sum)
```

### 找最大值
預設陣列有元素(輸入範圍)。

一個區塊一個區塊翻譯 ， for 到 end for ， if 到 if  : 

![](https://i.imgur.com/yM3o2Vf.png)

左虛擬碼; 右邊程式碼。

---
** 圖片均為上課教材中所擷取供本人學習使用。

---

# U4.2、 函式填空
###### tags:  `ALG 101` `JavaScript` `2020七月第三週` `進度筆記` `Lidemy心得` `7/20`

起承轉合。
先寫架構，再寫細節。
可以避免雙層迴圈(之後會用)。

---

## [LIOJ 1020：判斷質數](https://oj.lidemy.com/problem/1020)

如果有出現 2 3 5 7 ， 除了 1 和該數自身外，無法被其他自然數整除的數 (by wiki) 。
合數(Composite) ， 質數(Prime) 。

### 加 function ~

```
for(i from 0 to n-1) do
  if(arr[i] is Prime) do
    print 'Prime'
  else
    print 'Composite'
  end if
end for
```

### 簡化問題，函式放進去:
主要邏輯。
印出陣列裡的質數。
```
for(let i=0; i<n; i++)
  if(isPrime(arr[i])) {
    console.log('Prime') {
  } else {
    console.log('Composite')  
  }
}

function isPrime(n) {

}
```

### 判斷質數邏輯:
如果從 2 到 n-1 都沒有數字可以整除，就是質數。
輔助函式。
```
function isPrime(n) {
  if(n===1) return false 
  for(let i=2; i<n; i++) {
    if(n%i===0) {  
      return false
    } // 不要直接 else return true ;
  }
  return true //如果前面都沒有 return 就是質數。
}
```

### 加起來:

```
for(let i=0; i<n; i++) {
  if(isPrime(arr[i])) {
    console.log("Prime") 
  } else {
    console.log("Composite")  
  }
}

function isPrime(n) {
  if(n===1) return false 
  for(let i=2; i<n; i++) {
    if(n%i===0) {  
      return false
    } // 不要直接 else return true ;
  }
  return true //如果前面都沒有 return 就是質數。
}
```

函式填空法可以切割問題。

---

### 雙層迴圈
```
for(let i=0; i<n; i++) {
  let isPrime=true
  if(arr[i]===1) {  // edgecase ; 如果從這 → 
    isPrime=false
  }
  for(let j=2; j<arr[i]; i++) {
    if(arr[i]%j===0) {
    isPrime=false
    break
    }
  }
  if(isPrime) {
    console.log('Prime') {
  } else {
    console.log('Composite')  
  }
} // ← 到這都沒有符合，就是質數;

function isPrime(n) {
  if(n===1) return false 
  for(let i=2; i<n; i++) {
    if(n%i===0) {  
      return false
    } // 不要直接 else return true ;
  }
  return true //如果前面都沒有 return 就是質數。
}
```

![](https://i.imgur.com/84S008x.png)

### 加 function 加很多

![](https://i.imgur.com/3OgdbbQ.png)

---
** 圖片均為上課教材中所擷取供本人學習使用。

---

# U4.3、 簡化法
###### tags:  `ALG 101` `JavaScript` `2020七月第三週` `進度筆記` `Lidemy心得` `7/21`

從句子開始，難的解不出來先解簡化版的。
大問題變小問題。

---

[LIOJ 1021：好多星星](https://oj.lidemy.com/problem/1021)

如果寫不出很多個 N ! 那可以先從一個開始。

```
for(let i = 1; i<=n; i++){
  console.log('*')
}
```

搭配函式填空法:

```
for(let i = 1; i<=n; i++){
  printStar(i)
}
function(printStar(n)) {

}
```

問題簡化成如何印出 n 個星星。

再用迴圈加上星星:

```
for(let i = 1; i<=n; i++){
  printStar(i)
}
function(printStar(n)) {
  let s = ''
  for(let i=1; i<=n; i++) {
    s+='*'
  }
  console.log(s)
}
```

# U4.4、 Loop, function, if
###### tags:  `ALG 101` `JavaScript` `2020七月第三週` `進度筆記` `Lidemy心得` `7/21`

迴圈、函式、判斷式。

---

## 用內建函式 `array.map()` `array.filter` `array.reduce` 去解 ?

如果能用內建函式解，一定也能用迴圈、函式、判斷式解，可以實做出來。

---




