---
# System prepended metadata

title: 111年 程式設計與專案管理(可連動編輯)
tags: [程設與專案管理]

---


###### tags: `程設與專案管理`
# 111年新尖兵計畫 ─ 程式設計與專案管理
# <font color="#FF79BC">新尖兵課程資源 :speak_no_evil:</font>
> See all emoji list here[HackMD表情](https://www.webfx.com/tools/emoji-cheat-sheet/)
>> ### [ - 總資源 - ](https://drive.google.com/drive/folders/1KPXoa0c_4XLhexMceodRU1_A38GBl1CC?usp=share_link)


- ### 同學檔案 [Google Drive](https://drive.google.com/drive/folders/1QvN4Dgfp_7-WMItb1SC7HplsTmZD7VLP?usp=share_link)
- ### 教師資源 [Google Drive](https://drive.google.com/drive/folders/14OwARXrbpwhdJ9P-E8zIO8vYteBy1-Pl)

# Tarkus 托可思 程式邏輯

### Continue print console input　( 2023/01/10
![](https://i.imgur.com/zZovuND.png)
---

### Print A & B To Get A * B 解1　( 2023/01/10
![](https://i.imgur.com/w5FjcZf.png)
---

### ▲▲▲ After Module >> Get A * B (main code)
![](https://i.imgur.com/fEE1B4H.png)

#### (module of part A & B)
![](https://i.imgur.com/2g59zFU.png) ![](https://i.imgur.com/j13lrJW.png)

### Return value
![](https://i.imgur.com/twlc92K.png)

---
### Print A & B To Get A * B 解2　( 2023/01/10 -- by Changyu
![](https://i.imgur.com/5C6Y0cJl.png)

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

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

---

### Guess number　( 2023/01/10 -- by changyu
![](https://i.imgur.com/jw6r95Z.png)
---

### Guess number　( 個位數 & 十位數 比較 ( 2023/01/13
>思路：將答案 和 猜數 的 個位數 & 十位數分別存取，在
main code
![](https://i.imgur.com/nIvywBl.png)

answer md 定義答案
![](https://i.imgur.com/2Wtr5Rb.png)

guess md 定義參數
![](https://i.imgur.com/a0DfNGR.png)

vs1 比較十位數
![](https://i.imgur.com/sxjki33.png)

vs2 比較個位數
![](https://i.imgur.com/F2YKGdp.png)

zero 參數歸零
![](https://i.imgur.com/eoRAr1k.png)

guess zero 猜數歸零
![](https://i.imgur.com/1SpgEjv.png)



---

### 終極密碼 ( 2023/01/13
> #### 思路：
| Exam | 所需參數   | 每次輸入參數 |
| ------ | ------ | --- |
| 第一次猜數：50 輸出結果：0-50 | answer (終極密碼)     |1.覆蓋guess |
| 第二次猜數：20 輸出結果：20-50| guess (前次輸入，後次輸入)   |2.比較答案|
| 第一次猜數：38 輸出結果：20-38| min (最小值) & max (最大值) | 3.取代範圍值  |

>若後次 guess 大於 answer 取代 max
>若後次 guess 小於 answer 取代 min 

main code
![](7b3YnbP.png)

answer part
![](https://i.imgur.com/Rih7ii0.png)

大於答案
![](https://i.imgur.com/C59pvHc.png)

輸入0繼續
![](https://i.imgur.com/UJNhVSS.png)

小於答案
![](https://i.imgur.com/HCaV7SS.png)

a值
![](https://i.imgur.com/2C2UPFR.png)

b值
![](https://i.imgur.com/BMCr80o.png)



---


# (WordPress) Website design & manage
#### Wordpress 參考yt >> 小犬、帶路姬

### wordpress 後臺進入 
 王彥勳 [後臺進入](https://wjmarvin.parasophia.net/lazycat-welcome/)

 張簡千郁 [後臺進入](https://changyu.parasophia.net/lucky-girl-web-longin/)

-2022/12/23 編輯-
[tarkustech](https://tarkustech.com/zh_tw/)
流程圖使用繪圖軟體：[draw.io](https://app.diagrams.net/)
圖庫推薦
 - [stocksnap](https://www.shutterstock.com/zh-Hant/explore/taiwan-stock-assets?c3apidt=p70822971621&gclid=EAIaIQobChMI_oCs9IyZ_AIVKtWWCh1azwBIEAAYASAAEgKL-PD_BwE&gclsrc=aw.ds&kw=stock%20photo%20website)
 - [pixabay](https://pixabay.com/) (free)
 - [pexels](https://www.pexels.com/zh-tw/) (free)

可編輯圖片設計
 - [patternico](https://patternico.com/)
 - [Subtle pattern](https://www.toptal.com/designers/subtlepatterns/?adnetwork=search&keyword=toptal%20pattern&creative=354748341567&campaignid=1592880893&adgroupid=64417985961&matchtype=e&network=g&device=c&devicemodel=&adposition=&noun=&gclid=EAIaIQobChMInO2r442Z_AIVUa2WCh0kng6PEAAYASAAEgIbB_D_BwE)

參考資料：[2022 10大網頁製作平台推薦](https://deanlife.blog/web-design-platforms-recommend/)
參考關鍵字：wix、weebly、strikingly、webnode、webflow、wordpres_.org、wordpress_com、manaferra wprdpress


(上課所說 wordpress 指的是 ==wordpress.org==)

### 文章目錄索引
外掛：
- easy table of content
- Q2W3 Fixed Widget for wordpress
- chained quiz. (branching logic) >> 問卷相關掛外
- Contact 7 / wpform (表格類外掛)
- WPS Hide Login 更改登入後台網址 ( 資安
![](https://i.imgur.com/4mrEFOSm.png)
- UpdraftPlus - Backup/Restore >> 備份
![](https://i.imgur.com/TItEwBJm.png)

-----

一頁式 Langing page (著陸頁)
--
KeyWord：[scrooser](https://www.scrooser.com/en/) / [agnes-b](https://reurl.cc/Z1q3b3) / [Thermomug](https://thermomug.com/) / [PHC](https://www.phchd.com/global) / [The eddy nyc](https://www.theeddynyc.com/) / [Dyson360](https://reurl.cc/ROEGvg) / [jetedge](https://www.flyjetedge.com/) / 


 ## A.張簡千郁
- 題目領域：毛小孩
- 參考網頁：[好味小姐-好味商店](https://www.ladyflavor.com/?gclid=Cj0KCQiAwJWdBhCYARIsAJc4idCrdbQxZHDI_E-ul9Ppwcn09xHY_EonkbO-0ivn6jYsVH-6RdORjU8aAje4EALw_wcB)

 ## B.王彥勳
- 題目領域：餐飲
- 參考網頁：[noma](https://noma.dk/)
- 參考資料：[2021世界最佳50餐廳](https://www.vogue.com.tw/lifestyle/article/noma-the-worlds-50-best-restaurants-2021)
-----
網域服務商：網域代管商是專門為您管理網域名稱(例如<貴機構網域>.com) 的網際網路服務供應商，他們會使用網域名稱系統(DNS) 記錄將您的網域名稱與電子郵件服務、網站及其他網路服務建立連結。 常見的網域代管商包括GoDaddy、enom、DreamHost 和1&1 IONOS 等。

網域是否可用&購買：[GoDaddy](https://tw.godaddy.com/?checkAvail=1&tmskey=1dom_03_all_20spin) / [namecheap](https://www.namecheap.com/?gclid=Cj0KCQiAwJWdBhCYARIsAJc4idDBf3Ke3ayvQ-3V0rSrvGU5G0560qO2q71Hshbj-zbPOzYDeGMbFy4aAmWoEALw_wcB)

-----
Keyword：[Bluehost](https://reurl.cc/ROEMen) / [A2 hosting](https://reurl.cc/6LYzjk) / Traffic 引流 / 網站後台製作NAS(不建議，除非是很厲害的工程師)


# 專案管理 :nerd_face:
- ### 如何用價值主張圖真正了解你的顧客... [WebSite](https://reurl.cc/06lN8x)
- 專案題目：機車行車紀錄器
    -參考資料：嘖嘖-[雙頭行車紀錄器](https://www.zeczec.com/projects/mufu-v20s) / 蝦皮-[安全帽行車紀錄氣](https://reurl.cc/WqM96x)
安規實驗室：[Intertek](https://www.intertek-twn.com/FrontEnd/default.aspx)　EX：評估-測試-取得證書

### 專案的五大流程
![](https://i.imgur.com/Bvz2v7x.png)

### About 開發成本
藍色段 >> 產品生命週期 (開發成本)
營運成本：製作成本30%、行銷成本30%、營運成本30%、稅&手續費10%
營運成本先訂定價 > 製作成本 除 0.3 會落在價格區間

執行、監控：進度(時間) / 錢(成本) / 品質(規範)

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

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

### About 定價

![](https://i.imgur.com/dwIvpti.jpg)

![](https://i.imgur.com/JhOV52Z.jpg)


### 定價 & 成本 的關係與算法

![](https://i.imgur.com/3e1mcMp.jpg)

 - 若定價未知：先網上查詢參考價 
 EX：$3000為例，3000*0.3 約 1000，則$1000為製作成本
 以行車紀錄器為主題，我方提供雲服務方面要開單一帳號的成本$100，故為$1100
 再以 $1100 / 0.3 = $3666 此為我方定價
 $3666 * 1.3 = $4766 為終端建議售價，則3666 至 4766 為價格把控區間
 
     ![](https://i.imgur.com/SUVr5oAm.jpg)
 
    EX：$3666為 "早鳥價"，按照時間和層級最終還原為市價。
     而早鳥價過時候，則 $3666 為經銷商價 (拿到經銷價條件比如賣至一定累積金額或個數)
 
 ### 補充：跨國定價算法
 
 ※若生產地不同，會影響製作成本的高低；銷售地不是本國的話會讓運費和關稅的價格提高
  > [ 製作成本 + 運費 + 關稅 ] / 0.3 = 跨國定價
 
 !［］[(https://i.imgur.com/6iFzSGl.jpg)
 

 - 分析市場價值：價 * 數/年

### About 直接成本 & 間接成本
 - 直接成本：跟賺錢(收費)有直接關係的
  
 EX：撞球店若有人開桌才會開燈，
     A.10W水電  B.10W人事  C.10W租金
     代表開燈時即有賺錢，所以水電為直接成本，嚴謹點的話 >> 指的是電燈的費用，而人事和租金在不賺錢時也一直消耗著，所以人事和租金為間接成本
     
  撞球店收費：$2.5 /分/桌
  店內有47桌，營業時間為：10am to 7am
  產值：$2.5 * 60(min>hr) * 21(營業時間) * 30(月天) * 47(桌數) = $4441500
  
  ---
  
  ![](https://i.imgur.com/ZTexyY9.png)
  
  ---
 ## Arduino
 ### [軟體下載安裝](https://www.arduino.cc/en/software) // [上課參考講義](https://reurl.cc/lZmL2E)//  [Arduino 程式語法](https://reurl.cc/YdgloO)

### Arduino 軟體起始設定
![](https://i.imgur.com/cUeGo9J.png)

接上主機板後，從裝置管理員確認要選擇的COM
![](https://i.imgur.com/zJH3TBC.png)

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

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

### 4個 led燈 同時閃爍
![](https://i.imgur.com/gq3Me6z.png)
---

### 4個 led燈 依序亮起(前燈不滅) 然後暗掉/ 循環
![](https://i.imgur.com/oBMPj4v.png)
---

### 4個 led燈  依序亮起(前燈滅) 然後暗掉/循環
![](https://i.imgur.com/A9n0k9N.png)
---

### 4個 led燈 暗 > 半亮 > 亮 三個 去 循環
![](https://i.imgur.com/j8bKzXK.png)
---

### 4個 led燈 暗 > 半亮 > 亮 > 半亮 > 暗 循環後
![](https://i.imgur.com/ywXBgk2.png)
---


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

### 單一led呼吸燈跑完後遞增循環
![](https://i.imgur.com/I1b4bGZ.png)

#### 程式解二
![](https://i.imgur.com/hI6biwp.png)

---

### 矩陣 --2023/01/11
![](https://i.imgur.com/3DIj3vh.png)

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


### 矩陣應用題目  --2023/01/11
![](https://i.imgur.com/pCMVATS.png)

#### 矩陣題目解  --2023/01/11
![](https://i.imgur.com/I71n53U.png)
---

### 蠟燭燈  --2023/01/11
![](https://i.imgur.com/VGthmvE.png)
---

### 結合距離感測器後 的語法
![](https://i.imgur.com/lo21icg.png)



### [下方回饋距離感測數值](https://i.imgur.com/IP6sR6J.png)
```c=
const byte TrigPin = 35;
const int EchoPin = 34;
float Time_Value;
float CM_Value;

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);
pinMode(TrigPin,OUTPUT);
pinMode(EchoPin,INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
digitalWrite(TrigPin,LOW);
delayMicroseconds(5);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin,LOW);
Time_Value=pulseIn(EchoPin,HIGH);
CM_Value=Time_Value/29/2;
Serial.println(CM_Value);
delay(100);
}
```
----


### [Arduino 控制馬達 2023/01/12](https://i.imgur.com/9FyC0j9.png)

```c=
void setup() {
  // put your setup code here, to run once:
pinMode(38,OUTPUT);
pinMode(39,OUTPUT);
pinMode(40,OUTPUT);
pinMode(41,OUTPUT);

}

void loop() {
  // put your main code here, to run repeatedly:
analogWrite(2,255); //speed
digitalWrite(38,HIGH);
digitalWrite(39,LOW);
analogWrite(3,255); //speed
digitalWrite(40,HIGH);
digitalWrite(41,LOW);
delay(1000);

}

```
### [Arduino 控制馬達 優化01 2023/01/12](https://i.imgur.com/MCEMNBu.png)
```c=
int speed;

void forward(int a){
analogWrite(2,speed); //speed
digitalWrite(38,HIGH);
digitalWrite(39,LOW);
analogWrite(3,speed); //speed
digitalWrite(40,HIGH);
digitalWrite(41,LOW);
delay(a*1000);
}

void setup() {
  // put your setup code here, to run once:
pinMode(38,OUTPUT);
pinMode(39,OUTPUT);
pinMode(40,OUTPUT);
pinMode(41,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
speed=100;
forward(10);
delay(500);
speed=0;
forward(10);
}
```



### [Arduino 透過輸入數值"1" 控制馬達運轉 "前進&停止" 2023/01/12](https://i.imgur.com/85mZaCW.png)
```c=
int speed;

void forward(int a){
analogWrite(2,speed); //speed
digitalWrite(38,HIGH);
digitalWrite(39,LOW);
analogWrite(3,speed); //speed
digitalWrite(40,HIGH);
digitalWrite(41,LOW);
delay(a*100);
}

void setup() {
  // put your setup code here, to run once:
pinMode(38,OUTPUT);
pinMode(39,OUTPUT);
pinMode(40,OUTPUT);
pinMode(41,OUTPUT);
Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
if (Serial.available()){
  int cmd=Serial.parseInt();
  if (cmd==1){
    speed=100;
    forward(10);
    speed=0;
    forward(10);
  }
  else{
    speed=0;
    forward(10);
  }
}  
}

```


### [Arduino 透過輸入數值 控制馬達 "倒退 Part" 2023/01/12](https://i.imgur.com/85mZaCW.png)
```c=
//設定的Part
void backward(int b){
analogWrite(2,speed); //speed
digitalWrite(38,LOW);
digitalWrite(39,HIGH);
analogWrite(3,speed); //speed
digitalWrite(40,LOW);
digitalWrite(41,HIGH);
delay(b*50);
}

//判斷式的Part
void loop() {
  // put your main code here, to run repeatedly:
if (Serial.available()){
  int cmd=Serial.parseInt();
    
  //前進
  if (cmd==1){
    speed=100;
    forward(10);
    speed=0;
    forward(10);
  }
    
  //後退
  if (cmd==2){
    speed=100;
    backward(10);
    speed=0;
    backward(10);
  }
    
  //暫停
  else{
    speed=0;
    forward(10);
  }
}  
}
```
### [Arduino 透過距離感測器回饋數值控制 馬達轉速 2023/01/12](https://i.imgur.com/4Iy2rfl.png)
```c=
int speed;

const byte TrigPin = 35;
const int EchoPin = 34;
float Time_Value;
float CM_Value;

void forward(int a){
analogWrite(2,speed); //speed
digitalWrite(38,HIGH);
digitalWrite(39,LOW);
analogWrite(3,speed); //speed
digitalWrite(40,HIGH);
digitalWrite(41,LOW);
}

void backward(int b){
analogWrite(2,speed); //speed
digitalWrite(38,LOW);
digitalWrite(39,HIGH);
analogWrite(3,speed); //speed
digitalWrite(40,LOW);
digitalWrite(41,HIGH);
}

void setup() {
  // put your setup code here, to run once:
pinMode(38,OUTPUT);
pinMode(39,OUTPUT);
pinMode(40,OUTPUT);
pinMode(41,OUTPUT);
Serial.begin(9600);
pinMode(TrigPin,OUTPUT);
pinMode(EchoPin,INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  //距離感測回饋
digitalWrite(TrigPin,LOW);
delayMicroseconds(5);
digitalWrite(TrigPin,HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin,LOW);
Time_Value=pulseIn(EchoPin,HIGH);
CM_Value=Time_Value/29/2;
Serial.println(CM_Value);
delay(500);

//距離躍進，速度越慢 ; 距離越遠，速度越快
speed=CM_Value;
forward(1);

}
```
### Arduino 電路板
![](https://i.imgur.com/g7ijg7r.png)

### Arduino 資料型態
![](https://i.imgur.com/Myp8n7b.png)


### Arduino 藍芽控制
```c=
int lspd;
int rspd;
int up;
int mode;

//前進參數設定
void forward(int a){
analogWrite(2,lspd); //speed
digitalWrite(38,HIGH);
digitalWrite(39,LOW);
analogWrite(3,rspd); //speed
digitalWrite(40,HIGH);
digitalWrite(41,LOW);
delay(a*100);
}

//後退參數設定
void backward(int b){
analogWrite(2,lspd); //speed
digitalWrite(38,LOW);
digitalWrite(39,HIGH);
analogWrite(3,rspd); //speed
digitalWrite(40,LOW);
digitalWrite(41,HIGH);
delay(b*100);
}

//面對距離感測器的左邊車速
void leftward(int c){
analogWrite(2,lspd); //speed
digitalWrite(38,HIGH);
digitalWrite(39,LOW);
delay(c*100);
}

//面對距離感測器的右邊車速
void rightward(int d){
analogWrite(3,rspd); //speed
digitalWrite(38,HIGH);
digitalWrite(39,LOW);
delay(d*100);
}

//車速設定覆蓋
void speed(int z){
  rspd=z;
  lspd=z;
}

void a_push(){
  rspd=rspd+25;
  lspd=lspd+25;  
  Serial.println(rspd);
  delay(50);
}


void b_push(){
  rspd=rspd-25;
  lspd=lspd-25;
  Serial.println(rspd);
  delay(50);
}


//左轉(前進)
void left(){
  speed(100);
  leftward(10);
  speed(0);
  leftward(2);
}

//右轉(後退)
void right(){
  speed(100);
  rightward(10);
  speed(0);
  rightward(2);
}

//停止
void stop(){
  speed(0);
  rightward(2);
  leftward(2);
}


void setup() {
  // put your setup c
  pinMode(38,OUTPUT);
  pinMode(39,OUTPUT);
  pinMode(40,OUTPUT);
  pinMode(41,OUTPUT);//de here, to run once:
  Serial3.begin(57600);
  Serial.begin(9600);

}

void loop() {
  // put your main code here, to run repeatedly:
  if (Serial3.available()){
    char cmd = Serial3.read(); //讀取藍芽針腳收到的信號
    Serial.println(cmd);
    switch (cmd){
            
      if (rspd>0){

          //前進的過程中，用A來控制加速
          case 'A':
          a_push();
          break;


          //前進的過程中，用B來控制減速
          case 'B':
          b_push();
          break;
      }
            
      if (rspd<0){
          speed(25);
          
          //後退的過程中，用A來控制減速
          case 'A':
          b_push();
          break;
          
          
          //後退的過程中，用B來控制加速 
          case 'B':
          a_push();
          break;
      }      

      //left
      case 'C':
      left();
      break;

        //right
      case 'D':
      right();
      break;
    }
  }
  delay(50);
}

```


### 跟車/車距恆定值/距離加.加速/距離減.減速
<font size=5>關於感測參數設定相關原理 & 詳解</font>
![](https://i.imgur.com/CAj7M4N.png)
code line 67-71
![](https://i.imgur.com/F7X5eF1.png)

```c=
int lspd;
int rspd;
int up;
int mode;

int length;

const int TrigPin = 35; //指定發射端的針腳(Pin腳)
const int EchoPin = 34;
float Time_Value;
float CM_Value;


//面對距離感測器的左邊車速
void leftward(int c){
analogWrite(2,lspd); //speed

// 真值表：跟馬達控制板L298N 相搭配的真值表，不同控制表的真值表其內容不一樣
//HIGH 跟 LOW 相互搭配，形成前進跟後退的功能
//H + L 前進
//L + H 後退
//H + H 停下(煞停)
//L + L 停下(緩停)
digitalWrite(38,HIGH);
digitalWrite(39,LOW);
delay(c*100);
}

//面對距離感測器的右邊車速
void rightward(int d){
analogWrite(3,rspd); //speed
digitalWrite(38,HIGH);
digitalWrite(39,LOW);
delay(d*100);
}

//車速設定覆蓋
void speed(int z){
  rspd=z;
  lspd=z;
  rightward(10);
  leftward(10);
}

void a_push(int a){
  speed(a); 
  Serial.println(rspd);
  delay(50);
}


//停止
void stop(){
  speed(0);
  rightward(2);
  leftward(2);
}

void setup() {
  // put your setup c
  pinMode(38,OUTPUT);
  pinMode(39,OUTPUT);
  pinMode(40,OUTPUT);
  pinMode(41,OUTPUT);//de here, to run once:
  Serial3.begin(57600);
  Serial.begin(9600);
  pinMode(TrigPin,OUTPUT);
  pinMode(EchoPin,INPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  //距離感測回饋值    
  digitalWrite(TrigPin,LOW); //確定訊號發射端一開使為關閉狀態
  delayMicroseconds(5);
  digitalWrite(TrigPin,HIGH); //將發射端的狀態 "打開" 10%秒
  delayMicroseconds(10);
  digitalWrite(TrigPin,LOW); // 訊號端發射完訊號後，將狀態確定為 LOW模式
    
  Time_Value=pulseIn(EchoPin,HIGH); //量測多久之後會收到回撥的脈衝訊號
    
  //藉由上一行量測到的時間，算出感測器跟障礙物間距離
  //距離 = (速度 * 時間) / 2 
  //海平面上，聲音的速率大約343 m/s，因此走完每花了約29分之一秒
  //CM_Value(距離)=Time_Value(量測到的時間) 乘 超音波感測器的速度(也就是 / 29) ，再 / 2
  CM_Value=Time_Value/29/2;
    
  Serial.println(CM_Value);
  delay(20);

  //距離躍進，速度越慢 ; 距離越遠，速度越快
  length=CM_Value;

    //距離恆定，車速恆定
    if (length>30 and length<35){
      a_push(100);
    }
    //距離拉大，車速加速
    if (length>35){
      a_push(200);
    }
    //距離減小，車速減速
    if (length<30){
      a_push(60);
    }

    //停車
    if (length<15){
      stop();
    }
}

```


# 職場談論

- 主旨
- 根據甚麼樣的人或是
- 想表達的目標
- 希望對方做甚麼/提供甚麼
- 是否有時間/地點的限制


## 活用職場文書 Part
### 被指派跟人，遭放生
#### 角色：主管、A君(公司老人、前輩、比你早進公司之人)

新工作就職後，進公司後被主管指派跟著A君做事，但對方不理，即便主動接觸，仍各種推託，一星期後被主管告知 不適任此項工作

==如何自保==
用信箱向A君詢問工作內容或可做事項，向主管發送副本回復工作指派內容回饋 (主旨：我是XXX，新人報到第一天工作內容指派事項//內容以條列式為主)，同時留下工作日誌(今日完成、代辦事項、明日目標)

>向主管報告只是第一天，當日及以後可活用收件者&副本
>※收件者和副本都可看到信件內容，但可以從這之中看出職階地位的差異

<p>　</p>
<p>　</p>

### 單獨告知工作內容

A君於會議室單獨(或其他情境之下)，告知將要進行的專案進度或分配的工作內容

==留下紀錄== 
可發信件告知專案組或合作人員自己將要負責的工作內容/將今日談話內容條列式整理，以收件人為A君、副本為主管的方式發送信件

> 會議紀錄可助你後續追蹤
> 若要將當事人參與的談話紀錄發給第三方，可先告知當事人(為了發而發)
> 若被拒，委婉點：我待會將專案的重點整理一下發給你、CC主管(CC指副本)，讓主管知道進度可以嗎?

<p>　</p>

==記錄&電話確認== 
> 若需要跨部門聯絡，也建議先發信件，兩分鐘左右後打電話告知(確認)
> 遇到急事，可先電話後信件 >> <font color="#FF79BC">先後順序可調，但該有要有</font>

<p>　</p>

==延伸：追蹤進度的方式==
>1.請問這件事情好了嗎?可不可以回報給我
2.請問這件事情好了嗎?可不可以回報給我，我主管需要回我回報
3.會議紀錄(白紙黑字) & 我主管在要(代表公事)

<p>　</p>
<p>　</p>

### 寄信後 仍被害
做好信件防守後還是被主管告知 工作不適任

==如何自保==　
談話完後..用會議路的方式丟問題給主管

▼ Email txt ▼
如同剛剛跟主管討稐，我不適任的原因有哪些...
以上有任何不正確的地方請主管幫忙指證
依照我在這段時間所做的紀錄和工作日報，請問裡面有我不適任的原因嗎

### <font color="#FF79BC">總結：說故事的能力</font>
- 1.目的性切入角度
- 2.敘事的邏輯>說話的內容
- 3.關鍵字/必要資訊

---

<p>　</p>

## Email Part

### 被委託調查部門的通訊錄
今天主管要你寫一封email，調查部門內部的通訊錄

==應對方式==
- 先問清問題細節
  - 請問主管過去有沒有過去通訊錄的範本或紀錄，我要找誰要最快
  (如果沒有紀錄資料，主動遞交格式詢問指教)
  - 請問主管何時需要
  - 了解完成這件事情後需要完成的動作
   
- 找紀錄
(在主管表示找B君後，跟B君接觸)
跟B君互相一下，發信件給B君 CC主管

- 尚方寶劍
寄信告知部門人員今早收到主管交辦任務，須調查通訊錄

---

<p>　</p>

## 溝通 Part (平行與跨部門溝通)
- 重要性
- 頻率
    > 對一個人一天不要超過三封信件
      若對主管亦天高過8次溝通 >> 1.延時 2.合併事項

<p>　</p>

### 上司的佈達 消防演習
今天主管要你傳達對隊部門內部每個人要傳達的訊息
今天下午3點要進行消防演習，請你對部門進行傳達，同時跟總務部門進行確認

==應對方式==

> 思路 >> 主管為何知道?是否有Email?
  詢問主管 請問這件事情是否有信件，能不能轉給我?
>
> <font color="#FF79BC" size=3>※在向主管詢問時，建議3題內問清楚</font>


- 是否有信件可看
- 確認消防演習要做的具體內容
- 如果沒有信件 > 可詢問或查詢是否有過去紀錄資料
- 再次跟總務對街窗口確認

<font color="#FF79BC" size=5>源頭來自於哪裡
為何主管要跟我說這件事情
主管預期我要做出甚麼反映</font>

<p>　</p>

### 上司的佈達 尾牙
上司告知你今晚6點尾牙
1. 沒告知地點 先問地點 
→ 老闆，地點決定了嗎/是不是我要訂好了再跟大家說
(拋磚引玉，用意不再詢問地點，而是告知老闆少傳達訊息)
> 通常主管要你去佈達的事項通常是因為缺少或需要確認甚麼事項

<p>　</p>

### <font color="#FF79BC">總結：說故事的能力</font>
- 1.用目標決定你的說話技巧，若沒有達到目標，試著想為麼沒有做到
- 2.台風 > 敘事的邏輯 > 說話的內容

<p>　</p>

## 稱讚 Part
稱讚來源不同：
副總的稱讚 (需要謹慎思考，是否需要你做甚麼事情，源頭為何)
同事的稱讚 (有求於你)

危險 >> 帶你的人跟你的直屬上司以外的高職階的人稱讚
解 >> 轉移：根據老闆的指示，跟老闆學習的結果

<p>　</p>

## 自我價值
> <font size=6>**晴天送傘，雨天收傘：建立自我價值**</font>
> 延伸思考問題：我在別人眼中會促成甚麼利用價值

<p>　</p>

## 面試談論思考
<font size=4>**在面試中如何透過問題或問的方式了解到自己的工作環境**</font>

> 主管我想確認一下，這個職缺，你開出來是在未來有甚麼規劃，希望達成甚麼事情? 
> 關鍵點　==1.前人為何走==　==2.是否為新職缺==

<font size=4>**About 此職位前人為何而走**</font>
- 家裡有事 → 裡面的人太機掰
- 身體不好 → 裡面壓迫感太重
- 搬家 → 這份工作沒有前景

<font size=4>**About 是否為新職缺**</font>
- 這個東西在先前有同事做過相關的文件 & 內容，你來是接手或完成相關事項等等..  → 接攤子
- 這個部門是新的規劃...  → 新職缺
- 你進來之後再說..
  - 1.壓根不會用你
  - 2.這個職缺有內情

>若錄取想推 >> 因為家中有事，如果貴公司能等我一個月那再說

<p>　</p>

# C語言程式基礎 :skull:


[C++ 基礎程式參考講義](https://reurl.cc/28dmZE) 大概是八年前的教材
C 語言 文件 標頭檔 關鍵字 --->  stdio.h、random、iostream
Linux 筆記 Google關鍵字 --->  "鳥哥"
About Python 編譯器 ---> Anaconda
[程式線上編譯器](https://www.onlinegdb.com/)
[練習題庫](https://zerojudge.tw/)
[C面試考題](https://hackmd.io/@a110605/By6DscbVM?type=view)
[ C++教學系列 Class](https://hackmd.io/@Mes/MinerT_Class#-C%E6%95%99%E5%AD%B8%E7%B3%BB%E5%88%97-Class)

[職業 技能樹](https://roadmap.sh/)
全端工程師[學習地圖（通用 + 前端）](https://reurl.cc/85gppj)

基礎程設 Python [範例試卷](https://reurl.cc/rZ7RRk)

[pip install ](http://alex9ufoexploer.blogspot.com/2017/10/python-pip.html)

[7個Python使用BeautifulSoup開發網頁爬蟲的實用技巧](https://www.learncodewithmike.com/2020/02/python-beautifulsoup-web-scraper.html)


2022/12/19 基礎程式設計
問答摘要:

### Q1. 怎樣的程度可以找程式相關工作 ?　　  :eyes:

    以正職來說, 至少要能半精通一種語言才比較好在職位上正常運作.

### Q2. 要挑什麼語言開始較佳?

    都可以, 以大部分工程師來說,會先將C/C++學習一階段, 理解基本程式運作以後, 做一些小專案後, 再去適應第二種語言.
老師的學習方向 C++ ->python(深度學習課使用) -> java


## 建議大家將程式當作一個可以加速作業的技能,而不是吃飯的飯碗, 加上有些東西會有數學的坎, 想當飯碗要磨練一陣子


  寫程式是說話, 專案只是日記, 開發者的話是小說家, 幾乎每天都要有一些產出, 

  以正規資工系的訓練為例: 

  > 計算機概論 -> 物件導向 -> 演算法 -> 作業系統
                資料結構
                (有個咚咚叫做STL但我不太記得他的歸類 & 哪一年學到的)                         .....真的是挺多的, 短時間內難以速成

  > 前端 (UI/UX 工程師(設計)) >>> 中端 >>>  後端 (SQL C#,資料庫)


* 以職業為例, 如果你是財金系, 懂一點python 或 R 可以整理資料、歸納出報表與儀表板、大數據分析, 加薪會還蠻有感的(至少前幾年是這樣啦) 


### Q3.How to start? 

    先從簡單的概念開始, 慢慢消化50行內的程式例題, 快的話三個月會有起色, 敝人我資質駑鈍, 半年才感受到....

範例要自己打, 我這堂課不太會出作業, 沒有驗收問題, 但是有打對於你的理解會有幫助

## 觀念
 - ###  運算元
可以變動的數字或文字, 切割記憶體當中的一部分區域做"配置", 配置的記憶體位址
	
	(1) 位址(地址):  0x0000001

	(2) 名稱

	(3) 資料型態(值) 3.3.1 int, float, char, string, bool

	(4) 作用範圍: 全域/區域

	(5) 延伸: 
		call by.......
		生命週期 (可以砍掉該變數使用的記憶體區)
		溢位
		補數

About call by value/reference：[說明參考](https://bit.ly/2Wn7dxN)

位址.變數名稱. 變數值的關係可參考:[參考資料](https://kopu.chat/c%E8%AA%9E%E8%A8%80-%E8%B6%85%E5%A5%BD%E6%87%82%E7%9A%84%E6%8C%87%E6%A8%99%EF%BC%8C%E5%88%9D%E5%AD%B8%E8%80%85%E8%AB%8B%E9%80%B2%EF%BD%9E/)



### 語法 -- 輸入與輸出
>> cout << 右到左儲存
cin >>  左到右儲存
>>
>> ==多個變數可以逗號區隔==
>> 
>> scanf("%d", &a)
printf("%s",b)
format
    
- ### 運算子
        一元、二元、三元(!)(回傳布林值)
	    算數 %, ++, --
	    == 比對兩邊是否一樣 3==2 ->F(0) 邏輯匝
	    !=

- ### 結構

	循序, 選擇, 迴圈
	->迭代,遞迴
    
- ### 選擇結構

	如果下雨, 就不要帶傘
	if (下雨){
		不帶傘
	}


	如果下雨, 就要帶傘;如果不下雨, 就不要帶傘
	if (下雨){
	   帶傘
	}
	else{
	   不帶傘
	}   
    
#### [流程圖的應用參考範例](https://aprilyang.home.blog/2020/01/08/make-a-simple-cpp-shooting-game/)


-----
    

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

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

線上講義 3.5.4/3.5.4
3.7.4 判斷質數
![](https://i.imgur.com/5hZ1G9J.png)
--
3.7.4 老師解法：
![](https://i.imgur.com/Bzlhjl2.png)

巢狀可思考思路 >> 男女結婚年齡分類 1.先分性別 2.男女適婚年齡

## 4.3 閏年判斷
![](https://i.imgur.com/vcehxlR.png)
![](https://i.imgur.com/M0BRO8k.png)
 巢狀式寫法
![](https://i.imgur.com/IyhC58H.png)


## 3.4.5 位數算法
![](https://i.imgur.com/ZYOWAbf.png)

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

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

## 5.4.2 米字星號金字塔
![](https://i.imgur.com/lPso3A8.png)

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

## Bubble sort 氣泡排序
[參考資料](https://www.geeksforgeeks.org/bubble-sort/) 優先參考C語言

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

參考資料範例
```c=
// C program for implementation of Bubble sort
#include <stdio.h>
 
void swap(int* xp, int* yp)
{
    int temp = *xp;
    *xp = *yp;
    *yp = temp;
}
 
// A function to implement bubble sort
void bubbleSort(int arr[], int n)
{
    int i, j;
    for (i = 0; i < n - 1; i++)
 
        // Last i elements are already in place
        for (j = 0; j < n - i - 1; j++)
            if (arr[j] > arr[j + 1])
                swap(&arr[j], &arr[j + 1]);
}
 
/* Function to print an array */
void printArray(int arr[], int size)
{
    int i;
    for (i = 0; i < size; i++)
        printf("%d ", arr[i]);
    printf("\n");
}
 
// Driver program to test above functions
int main()
{
    int arr[] = { 5, 1, 4, 2, 8 };
    int n = sizeof(arr) / sizeof(arr[0]);
    bubbleSort(arr, n);
    printf("Sorted array: \n");
    printArray(arr, n);
    return 0;
}
```

2023/01/16
TQC 好考證照：
1.網頁資料擷取與分析
2.基礎程式語言

※符合條件k=0 Or k=n 才納入計算
![](https://i.imgur.com/FiW5KQW.png)

※若不整除，n 要一直加下去，直到K(3) 先 n+1 在停止，所以是加兩次
K(0) 到 K(4)一個規律循環，100除4 >> 25個循環，每個循環的n值總和為25，25 * 100 = 250
![](https://i.imgur.com/HhVcgP1.png)

<p>　</p>

## 等差或等比數列填空練習。
- 填空練習的要求是：已知數列的前四項，填出第五項。因 為已經知道這些數列只可能是==等差或等比數列==，她決定寫一個程式來完成這些練習。

輸入說明：
- 第一行是數列的數目t（0 <= t <= 20）。 
- 以下每行均包含四個整數，表示數列的前四項。 
- 約定數列的前五項均為不大於105的自然數，等比數列的比值也是自然數。

輸出說明：
- 對輸入的每個數列，輸出它的前五項。

```c=

## //解法A// ##
#include <iostream>
using namespace std;
int main()
{
    int a1=0, a2=0, a3=0, a4=0, C=0; //C為題目數
    
    //for(輸入題目數;題目數的範圍;讓迴圈執行次數等於題目數)
    for(cin>>C; C>0&&C<=20; C=C-1)
    {
        cin >> a1 >> a2 >> a3 >> a4; //輸入數列前四個數 
        if((a3-a2)==(a2-a1)) //如果這數列為等差數列,則 
            cout << a1 << " " << a2 << " " << a3 << " " << a4 << " " << a4+(a2-a1) << endl;
        
        else //不然就是等比,所以 
            cout << a1 << " " << a2 << " " << a3 << " " << a4 << " " << a4*(a2/a1) << endl;
    }
    return 0;
}



## //解法B// ##
include<stdio.h>
using namespace std;
int main(){
    int num[20][5] ;
    int array ;
    scanf("%d",&array) ;
    
// 看有多少數列後先讀進所有數列
    for (int i = 0;i<array;i++){
        for (int j=0;j<4;j++){
            scanf("%d",&num[i][j]);
        }
    }
    
// 逐一處理所有數列 
    for (int i=0;i<array;i++){
        if(num[i][1]-num[i][0]==num[i][2]-num[i][1]){
            num[i][4]=num[i][3]+num[i][3]-num[i][2] ;
        }
        else { 
            num[i][4]=num[i][3]*num[i][3]/num[i][2] ;
        } 
        
   
// 印出所有數列
        for(int j = 0;j<5;j++){
            printf("%d ",num[i][j]);
        }
        printf("\n");
    } 
    
    return 0 ;
}
```


## 矩陣的翻轉
已知一(m x n)矩陣A，我們常常需要用到另一個將A中之行與列調換的矩陣。這個動作叫做矩陣的翻轉。

- 輸入說明：第一行會有兩個數字，分別為 列(row)<100 和 行(column)<100，緊接著就是這個矩陣的內容
- 輸出說明：直接輸出翻轉後的矩陣
※ a[i][j] >> a[列][行]

| 第一行//第一列 | 第二列   | 第三列 |
| -------- | --------- | --------- |
| 第二行//第一列 | 第二列 | 第三列 |

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

```C=
//解法
//C++ language
//solution link(含註解): 
 
#include<iostream>
#include<vector>
using namespace std;
int main(){
    int r,c;
    while(cin>>r>>c){
        vector<vector<int>>matrix(105,vector<int>(105));
        for(int i=0;i<r;i++){
            for(int j=0;j<c;j++){
                cin>>matrix[i][j];
            }
        }
        for(int i=0;i<c;i++){
            for(int j=0;j<r;j++){
                cout<<matrix[j][i]<<" ";  //注意是 [j][i] 不是 [i][j] !
            }
            cout<<"\n";
        }
    }
    return 0;
}
```

## Python 練習
![](https://i.imgur.com/KXgeTXD.png)
![](https://i.imgur.com/GnQtaDA.png)

```python=
#解法 1 
a=int(input('your stary：'))
b=int(input('your final：'))

Sum=0

for x in range(a,b+1):
  if(x % 2 == 0):
    Sum+=x

print(Sum)
```





```python=
#解法 2 ( 判斷 & While 迴圈)
a=int(input('輸入一個數(a<b)'))
b=int(input('輸入一個數'))
c=0
if a%2==0:
    while a<=b:
        c=c+a
        a=a+2
        print(a)
else:
    a+=1
    while a<=b:
        c=c+a
        a=a+2
        print(a)
print(c)
```

```python=
#解法 3 (陣列) 
a = int(input('請輸入a：'))
b = int(input('b：'))

L = list(range(a,b+1))
listSum = 0

for number in L:
    if(number%2==0):
        listSum += number
    
print(f"Sum of list -> {listSum}")
```

```python=
#解法 4 (變數4) 
print('請輸入a值及b值,且a<b')
a=int(input('a='))
b=int(input('b='))
c=0
t=0
for x in range (a,b,2):
   
    if(a%2==0):
         c+=2
    
    else:
        a+=1
        c+=2
    print(c) 
    t=t+c
print(t)
```

## 秘密差
![](https://i.imgur.com/xhEfRiW.png)

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

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

```c=
//C++解法//
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
using namespace std;

int main() {
    
    /*在C語言只有char儲存自原，所以用陣列去儲存字串*/
    char x[1000]; //輸入數值，1000代表可輸入1000個數字
    
    // "%s" 字串 /*scanf 輸入 same with "input"*/
    scanf("%s",x); //讓使用者輸入數值，可理解為 cin
    
    int A=0,B=0,i; //奇數和為A；.偶數合為B
    for(i=0;i<strlen(x);i++) //Strlen → 讀取字串的長度
    {
        if(i%2==0) //位數整除為偶數
        {
            //簡單來說 x[i] 為字元，要轉int型態，要相減ACSLL碼，得數
            B += x[i]-'0'; 
        }
        else
        {
            A += x[i]-'0';
        }
    }
    
    //"%d" 整數 // "\n" 換行 //abs取絕對值 
    printf("ans:%d\n",abs(A-B));
    
}
```

## python 攝氏 轉 華氏
```python=

#自訂一個函式 名叫做 CtoF1，攝氏溫度作為參數
def CtoF1(degreeC):
    #degreeF 是自訂函數內新增的變數
    degreeF = degreeC * 1.8 + 32
    print('攝氏',degreeC,'度可以轉換成華氏',degreeF,'度') #顯示或回傳直
   
    #eval 計算
temperatureC = eval(input('請輸入攝氏溫度：'))
CtoF1(temperatureC)
```

## Python 爬蟲
<font size=5>
python 官網下載 python

下載 anaconda

windows 設定 >> 進階系統設定

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


環境變數設定 >> "系統變數"欄位 新增 名稱'Path'
![](https://i.imgur.com/ZJMvZb8.png)

路徑取得方式：
在 python 裝好後 從C槽找到檔名為"pip3" 或者 pip 檔案路徑
> EX：C:\Users\user\anaconda3\Scripts

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

命令提示字元CMD 輸入 pip install BS4
![](https://i.imgur.com/mgCMY22.png)

open spider
![](https://i.imgur.com/4IVyCU9.png)

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

```python=
#
import requests
from bs4 import BeautifulSoup 

R = requests.get("https://travel.ettoday.net/category/%E6%A1%83%E5%9C%92/")
S = BeautifulSoup(R.text,"html.parser")


print(S.prettify()) #輸出排版後的HTML內容
#抓取網頁資料, 以text方式存成property , 再以html.parser解析氣去將內容印出
```

```python=
#changyu code
import requests
from bs4 import BeautifulSoup

R = requests.get("https://tw.stock.yahoo.com/quote/2451")

S = BeautifulSoup(R.text,"html.porser")

A=S.find("h3")
print(A)
```

```python=
#### 爬蟲基礎 ####
# -*- coding: utf-8 -*-
"""
Spyder Editor

This is a temporary script file.
"""
import requests

from bs4 import BeautifulSoup


response = requests.get("https://travel.ettoday.net/category/%E6%A1%83%E5%9C%92/")
S = BeautifulSoup(response.text, "html.parser")


'''find()'''
#只尋找第一個符合條件的節點
A = S.find("h3")
print(A)

'''find_all()'''
使用關鍵字參數(Keyword Argument)指定其屬性值
利用list 增加複數個節點名稱
find_all(["節點名1","節點名2"], itemprop = "屬性值", limit= 節點個數限制)
All = S.find_all("h3", itemprop="headline", limit=3)
print(All)

'''select搜尋多個子節點'''
#搜尋多個子節點
#<div>底下有許多<a>子節點, 將所有子節點內容以list輸出
result = S.find("div", itemprop="itemListElement")
print(result.select("a"))


'''select_one()搜尋單個子節點'''
result3 = S.find("h3", itemprop = "headline")
print(result3.select_one("a"))


'''get()取得屬性值'''
titles = S.find_all("h3", itmeprop="headline")
for title in titles:
    print(title.select_one("a").get("href"))
    
    
'''getText()取得連結文字'''
titles2 = S.find_all("h3", itemprop = "headline")
for title in titles:
    print(title.select_one("a").getText())
```


Out put
![](https://i.imgur.com/ufBs3ZZ.png)
</font>


## [C++] 指標與陣列(Pointer & Array)

程式語言就是跟電腦描述如何處理資料，所以要充分瞭解每個程式語言對資料型態的定義，C/C++因為更貼近記憶體的運作來設計，所以很多觀念在描述上略為抽象，在學習上需要格外費心。

建議手繪來幫助記憶。


### 複合資料型別 (compound type)
相較於基本型別int, double，C++還有一種複合資料型別。

其中很重要，會常用到的複合資料型別，就是參考(reference)、指標(pointer)、陣列(Array)

#### 參考(Reference)
1. 參考的定義

``` C++
#include <iostream>
using namespace std;

int main() {
  int i = 1, j = 2;
  int &r = i;       //i is referenced by r  

  cout << "address of r: " <<&r << endl;
  cout << "address of i: " <<&i << endl;

  return 0;
}

```

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


2. 參考本身不是一個物件，而是對於一個**已存在物件**取別的名稱

### 指標(Pointer)

1. 指標本身是一個物件，指向任何一個**已存在物件**，可以被指定或拷貝
- 指標宣告時，就要定義是指向哪種資料型態的物件
- 指標本身儲存的值，有三種情況
    - 指向一個物件，值裡面存放另一個物件的位址
    - 指向另一個物件尾端後的位置
    - 沒有指向任何物件，值即為null
``` C++
  int i = 42;
  int *p = &i;            //p指向i
```

2. 當一個指標指向一個物件，我們可以使用解參考(dereference)運算子*來存取物件

``` C++
#include <iostream>
using namespace std;

int main() {
  int i = 42;
  int *p = &i;            //p指向i
  cout << *p << endl;     //印出指標p所指向物件i的值，即42

  *p = 0;                //因為p指向i，所以實際是i的值被改變成0
  cout << i <<endl;      //印出指標p所指向物件i的值，即0
  return 0;
}

```

3. 關鍵觀念：*, &的符號多重意義
``` C++
#include <iostream>
using namespace std;

int main() {
  int i = 42;     
  int &r = i;       //& 跟在一個型別，且是宣告的一部份，所以r是一個reference
  int *p;           //* 跟在一個型別，且是宣告的一部份，所以p是一個pointer
  p = &i;           //& 被用在運算式中，做為address-of 運算子
  *p = i;           //* 被用在運算式中，做為dereference運算子
  int &j = *p;      //& 是宣告的一部分；* 是dereference運算子

  cout << "i: " << i << endl;
  cout << "&i: " << &i << endl;
  cout << "r: " << r << endl;
  cout << "&r: " << &r << endl;
  cout << "*p: " << *p << endl;
  cout << "p: " << p << endl;
  cout << "j: " << j << endl;
  cout << "&j: " << &j << endl;
  return 0;
}

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

4. void*指標：型別void*是一個特殊的指標型別，可以存放任何物件的位址



### 陣列(Array)

1. 陣列的定義：是一個複合資料型別，放置**單一型別**物件的容器，並且以位置來存取它們，有固定的尺寸

2. 宣告與初始化陣列
``` C++
int a[10];   //宣告一個10個int物件的陣列
int *p[10];  //宣告一個10個int指標的陣列
```
3. 指標算術
對一個指標做加減，會移動指向陣列中的位置

``` C++
#include <iostream>
using namespace std;

int main() {
  int a[] = {1,2,3,4,5};
  int *ip = a;          //等同於int *ip = &a[0]
  int *ip2 = ip + 4;    //ip2指向a[4]

  cout << ip2 << endl;

  return 0;
}

```

## 指標
[c語言-超好懂的指標，初學者請進～](https://reurl.cc/85kX8R)

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

<font size=5>==* 取值 // & 取址==</font>

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



> <font size=4>關於Line9：cout << "address of r：" << ==*r== << endl;
> ==*r==：對應到 i 的址，"*" 取值，所以取 i 的值　( A君理解 >> 取這個址的值)


> 關於Line11：cout << "address of r：" << ==*&r== << endl;
> ==*&r==：取r地址裡的值，而 ++r 的值為 i 的址++，所以結果為 i 的址
</font>

==指標重點註記==
int *p 指標變數(當作是一種特殊的變數)
*p = ??? 從後面指定位置取"值"(反查找值)
&c &取"址"

```c=
[雙重指標判讀標準 由右往左]
int a; // 一個整型數
int *a; // 一個指向整數的指標
int **a; // 一個指向指標的指標，它指向的指標是指向一個整型數
int a[10]; // 一個有10個整數型的陣列
int *a[10]; // 一個有10個指標的陣列，該指標是指向一個整數型的
int (*a)[10]; // 一個指向有10個整數型陣列的指標
int (*a)(int); // 一個指向函數的指標，該函數有一個整數型參數並返回一個整數
int (*a[10])(int); // 一個有10個指標的陣列，該指標指向一個函數，該函數有一個整數型參數並返回一個整數
```

```c=
[指標練習題 1]
判斷下列程式碼輸出結果
是/否包含位址 *c=&a / *c = a  (純取值)
No1.
int main()
{
  int a=17;
  int *c;
    *c = a;
    printf("c=%d ",*c); 	 //17
    printf("a=%d ",a);  	//17
    *c = *c +3; 		//20
    printf("c=%d ",*c);   //20
    printf("a=%d ",a);	//17
     a = a +5;		//22
    printf("c=%d ",*c); 	//20
    printf("a=%d ",a);	//22
}

```

```c=
[指標練習題 2]
No2.
int main()
{
  int a=17;
  int *c = &a;
    printf("c=%d ",*c); 	//17
    printf("a=%d ",a); 	//17
    
    *c = *c +3;		//20
    printf("c=%d ",*c); 	//20
    printf("a=%d ",a);  	//20
    
     a = a +5;		//25
    printf("c=%d ",*c); 	//25
    printf("a=%d ",a); 	//25
}

```

----

## 矩陣陣列練習 -- 小群體
![](https://i.imgur.com/J50Nkft.png)

```c=

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//設定變數 num=好友總數　count=0 記數總和
//設定變數陣列 Friend=好友編號　TF=判斷是否讀取過
//&num → 將輸入的值存入位址值
//當陣列位置=自己的數字→沒有其他朋友，則Count++
//變數Next的值存取Friend的陣列位置
//用 if & 
//再以Next的值存取Friend的好友編號
//Count++

int main(){
    int num,i,count = 0;    //num 人數 , i圈數, count 確認是否數過
    
    printf("輸入人數");
    scanf("%d",&num);
    int Friend[num], TF[num];
    
    
    //將使用者輸入的數
    //以陣列儲存
    
    for(i = 0;i < num;i++){
        printf("請輸入不重複的編號");
        scanf("%d",&Friend[i]);
        TF[i]=0;
    }
    
    //判斷群體數量
    for(i = 0;i < num;i++){
        //將有數過的人打勾勾
        TF[i]=1;
        
        //邊緣人自己一群Q_Q
        if(Friend[i]==i){
            count++;
        }
        
        //其他情況
        else{
            
            //讀取你的編號對應的好友編號是誰
            int next = Friend[i
            
            //如果他沒有被點名過
            if(TF[next]==0){
                
                //用while意思是 直到回圈封閉為止, 再把群體+1
               while(TF[next]==0){
                TF[next] = 1;   //把這一個冤家計次
                next = Friend[next];    //去抓她的下一個冤家是誰
                }
                
            count++;
            }
        }
        
        }
    printf("有%d個小圈圈",count);
    }
```

## 邏輯運算子
※此圖可在新分頁中開啟放大
![](https://i.imgur.com/XXwRedo.png)
```c=
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <vector>

using namespace std;


int main(){
    int a,b,c;
    while (cin >>a >> b >> c){
        bool found = false;
        if (a>0) a=1;
        if (b>0) b=1;
        if ((a&b) ==c) {
            cout << "AND" <<endl;
            found = true;
        }
        if ((a|b) == c) {
            cout << "XOR" <<endl;
            found = true;
        }
        if (!found) {
            //若AND OR XOR 都沒有
            cout << "IMPOSSIBLE" <<endl;
        }
    }
    }
```

## 二分搜尋法 Binary Search
### 題目 [Here](https://leetcode.com/problems/minimum-cost-to-cut-a-stick/)
```c=
class Solution {
public:
   //設定一自訂函數名稱是search 參數1使用者提供一整數陣列 參數二為目標數字
    int search(vector<int>& nums, int target) {                
//初始化索引值 左邊藉由索引0開始 右邊界數字為"個數-1" (因為編號從0開始)
            int left = 0;
            int right = nums.size() - 1;
            //左邊界<=右邊界才可進行搜尋, 否則指針會混亂
            while(left<=right){
                //計算中間的索引編號
                int middle = left +(right-left)/2;

                //如果中間編號的值大於目標數字 ]要移到中間數字的左邊(-1) EX: [02 63 ]67 69 72
                if (nums[middle]>target){
                    right= middle - 1;
                    
                }
                //如果中間編號的值小於目標數字 [要移到中間數字的右邊(+1) EX: 02 63 67[ 69 72]
                else if(nums[middle]<target){
                    left = middle +1;
                    
                }
                //如果中間編號的值等於目標數字 就是該索引值
                else{
                    return middle;
                }
            }
        //如果左右邊界交叉, 則代表找不到 回傳-1    
        return -1;
    }
};


//解二(切木頭要號多少力)
#include <bits/stdc++.h>
using namespace std;

int l, n, A[55], memo[55][55];
int opt[55][55];

int cut(int left, int right) {
    if (left+1 >= right) {
        opt[left][right] = right;
        return 0;
    }
    int &ans = memo[left][right];
    if (ans != -1) return ans;
    ans = 2e9;
    cut(left,right-1);
    cut(left+1,right);
    for (int i = opt[left][right-1]; i <= opt[left+1][right]; ++i) {
        int value = cut(left, i) + cut(i, right) + (A[right]-A[left]);
        if ( value < ans ) {
            ans = value;
            opt[left][right] = i;
        }
  }
  return ans;
}

int main() {
    while (scanf("%d", &l), l) {
        A[0] = 0;
        scanf("%d", &n);
        for (int i = 1; i <= n; ++i)
        scanf("%d", &A[i]);
        A[n+1] = l;
        memset(memo, -1, sizeof memo);
        memset(opt, -1, sizeof(opt));
        printf("The minimum cutting is %d.\n", cut(0, n+1)); // start with left = 0 and right = n+1
    }
    return 0;
}
```


## 字串轉成小寫
說明：請寫一程式，將字串 "Good Morning" 轉成小寫

```c=
#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
int main(){
int i=0;
char str[20]="Good Morning";
while(str[i]!='\0’){
printf("%c",tolower(str[i]));
i++;
}
system("pause");
}
```

## 二元樹

一個樹如果每個節點都有兩個子節點就叫做二元樹

- 完整(Complete)二元樹
    - 靠左中間沒有空隙的樹就是完整二元樹
    - 高度是$lg(n) + 1$，n是節點數量
    - 節點個數$2^{k-1} \le n \le 2^K - 1$，k是樹的高度
- 完滿(full)二元樹
    - 如果每一層的節點不是0就是$2^k$就是完滿二元樹
    - 是完整二元樹的子集

### 二元樹走訪

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

前序:

1,2,4,7,8,5,3,6,9,10

中序:

7,4,8,2,5,1,3,9,6,10

後序:

7,8,4,5,2,9,10,6,3,1

## 使用指標(含有鏈結串列) 建立二元樹
 - 需要兩個指標（一個指向左子樹、一個指向右子樹）。
 - 若子樹為空，設定為NULL。（走訪時若遇到NULL則倒退回去）

```c=
#include <bits/stdc++.h>
using namespace std;
struct node{				 //node p1 'A' 指向 node left 'B' 和 node right 'C'
	char data;
	struct node *left;	
	struct node *right;
};
void visit(node *p){
	if(p){
		cout << p->data << ' ';		//前序走訪, 使用單向鏈結陣列儲存樹
		visit(p->left);
		visit(p->right);
	}
}
int main(){
	node *root,*p1,*p2,*p3,*p4,*p5,*p7;
	p1 = new node;
	p2 = new node;
	p3 = new node;
	p4 = new node;
	p5 = new node;
	p7 = new node;
	
	p1->data = 'A'; root=p1;
	p2->data = 'B';  
	p3->data = 'C';
	p4->data = 'D';
	p5->data = 'E';	
	p7->data = 'F';
	
	p1->left = p2;
	p2->left = p4;
	p2->right = p5;
	
	p1->right = p3;
	p3->right = p7;
	p3->left = NULL;
	p4->left = NULL;
	p4->right = NULL;
	p5->left = NULL;
	p5->right = NULL;
	p7->left = NULL;
	p7->right = NULL;

	visit(root);
}

```


### About 二元搜索
LeetCode: 704-Binary Search [解題紀錄](https://clay-atlas.com/blog/2022/03/26/leetcode-704-binary-search/)


### 求二元樹根 & 最深子節點總和
![](https://i.imgur.com/dqJbkIG.png)

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

### 完整解
```c=
#include <iostream> 
#include <cstdio>
#include <queue>
#include <cstring>
#define MAX 100001		//定義100001的別稱 ex define 花媽 陳菊
using namespace std; 

int p[MAX], d[MAX], num[MAX];
/*p[]紀錄爸爸是誰
d[]紀錄深度(depth)
num[] 記錄子節點個數*/

deque<int> t;   //deque:雙向佇列

int main() {
    int n,k,c;
    long long int sum; //為了避免儲存長度不足1+2+3+......+100001 使用到的byte
    
    //使用者輸入
    while (scanf(%d,&n)!=EOF){
        sum = 0;
        memset(d, -1,sizeof(d));
        memset(p, 0, sizeof(p));
        memset(num, 0, sizeof(num));
        
        //使用編號紀錄每個子樹
        for(int i,i<=n;i++){
            scanf("%d",&k);
            
            //如果後面沒有人
            if(k==0){
                t.push_back(i);//push_back：把一個元素添加到尾端 (將葉節點放在尾端)
                d[i] = 0;      //最尾端的葉節點高度為0
            }
            
            //如果後面有子節點, 紀錄子代的父節點
            else{
                num[i] = k;
                for(int j =0; j<k ; j++){
                    scanf("%d",&c);
                    p[c] = i;
                }
            }
        }
    int node;
    

    //容量  empty：回傳是否為空 t.empty 回傳訊息:空的1, 非空0
    while(!t.empty()){
        node = t.front() //front：取得第一個的元素
        t.pop_front();   //pop_front：移除第一個元素(頭端)
        d[p[node]] = max(d[p[node],d[node]+1);
        /*p[node]父節點, d[p[node]]父節點目前的深度, d[node]子節點的深度+1就是父節點的深
度, 誰比較大就取他的值*/

        num[p[node]]--; //一開始記錄子節點個數, 已完成計算高度的子節點就刪除了 所以個數-1
        if(num[p[node]] == 0) //沒走過的子節點個數為0()都走完了
            t.push_back(p[node]); //push_back：把一個元素添加到尾端
        
    }
    for(int i= 1; i<=n; i++){
        sum+=d[i];
        
    }
    cout<<node<<endl; //最後一個取出來的會是根
    cout<<sum<<endl;

    }
}

```
### 解析
p[] 紀錄該節點的父代
t: 讀取紀錄深度(還有根)
num 子節點的個數
```c=
  for(int i =1;i<=n;i++){
            scanf("%d",&k);
            
            //如果後面沒有人
            if(k==0){
                t.push_back(i);//push_back：把一個元素添加到尾端 (將葉節點放在尾端)
                d[i] = 0;      //最尾端的葉節點高度為0
            }
            //如果後面有子節點, 紀錄子代的父節點
            else{
                num[i] = k;
                for(int j =0; j<k ; j++){
                    scanf("%d",&c);
                    p[c] = i;
                }
            }
        }

```

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

```c=
        //節點編號node
    int node;
    
    //容量  empty：回傳是否為空 t.empty 回傳訊息:空的1, 非空0
    while(!t.empty()){
        node = t.front() //front：取得第一個的元素
        t.pop_front();    //pop_front：移除第一個元素(頭端)
        d[p[node]]  = max(d[p[node]],d[node]+1);
        /*p[node]父節點, d[p[node]]父節點目前的深度, d[node]子節點的深度+1就是父節點的  
          深度, 誰比較大就取他的值*/

        num[p[node]]--;
        //一開始記錄子節點個數, 已完成計算高度的子節點就刪除了 所以個數-1
        if(num[p[node]] == 0) //沒走過的子節點個數為0()都走完了
            t.push_back(p[node]); //push_back：把一個元素添加到尾端
        
    }

```
t.empty 回傳訊息:空的1, 非空0 (False)
!(t.empty) 回傳訊息:空的0, 非空1(True)
memset(p, 0, sizeof(p));   p裡面的元素初始值皆為0
memset(d, -1,sizeof(d));   d裡面的元素初始值皆為-1
memset(num, 0, sizeof(num));

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




  - <font size=5>EOF: [C/C++中的結束輸入條件判斷](https://www.796t.com/content/1549363335.html)(scanf、EOF、getchar()、cin.get()、getline) </font>
 > 說明：輸入的測試樣例有多組，每組需要相同邏輯的處理
 > 處理方案：在C語言中可利用scanf("%d",&n)!=EOF，在C++中可以使用while(cin>>n
 > 例如：計算兩數之和，輸入可能有多組樣例。
 > ```c= 
 > #include <iostream>
 > using namespace std;
 > 
 > int main(){
 >    int a,b;
 >     while(scanf("%d %d",&a,&b)!=EOF){
 >        cout<<a+b<<endl;
 >     }
 >     return 0;
 > }
 > ```

 - <font size=5>memset(): [C/C++ memset 用法與範例](https://shengyu7697.github.io/cpp-memset/)</font>
   - 使用需引標頭檔cstring
   - 用法 memset ( 容器, 填入的初始值, 數量)
 > ```c=
 > void * memset(void * ptr, int value, size_t num);
 > ```

 - <font size=5>std::deque:[C++ std::deque 用法與範例](https://shengyu7697.github.io/std-deque/)</font>



## 費波那奇數列
```c=
遞迴: 自身函數內呼喚自身函數 時間複雜度通常為O(2n)
#include <iostream>
using namespace std;

//自訂函數:費波那奇數列 自身等於前兩項之和
int fib (int n){
    if (n==0) return 0;
    if (n==1) return 1;
    return fib(n-1)+fib(n-2);
}
int main(){
    int a,c;
    cin>>a;
    c = fib(a);		//在main主程式中執行副程式
    cout<<c;		
    return 0;
}
迭代: for O(n)
	(1)
#include <iostream>
using namespace std;

int fib(int n) {
    int pre = -1;
    int result = 1;
    int sum = 0;
    for (int i = 0; i <= n; i++) {
        sum = result + pre;
        pre = result;
        result = sum;
    }
    return result;
}
int main(){
    int a;
    cin>>a;
    cout<<fib(a);
    return 0;
}


(2) 迭代: 減少變數

#include <iostream>
using namespace std;

int fib(int n) {
    int pre = -1;	//前前一項的常數
    int i = n;		//使用者輸入引數(需要帶入方程式的參數)
			  為迴圈執行的次數
    n = 1;		//前一項
    int sum = 0;
    while(i>0){
        i--;
        sum = n+pre;
        pre = n;		//數列往後推移
        n = sum;		//將加總延續下去
    }
    return n;
}
int maim(){
    int a;
    cin>>a;
    cout<<fib(a);
    return 0;
}


```




