###### 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

---
### Print A & B To Get A * B 解1 ( 2023/01/10

---
### ▲▲▲ After Module >> Get A * B (main code)

#### (module of part A & B)
 
### Return value

---
### Print A & B To Get A * B 解2 ( 2023/01/10 -- by Changyu



---
### Guess number ( 2023/01/10 -- by changyu

---
### Guess number ( 個位數 & 十位數 比較 ( 2023/01/13
>思路:將答案 和 猜數 的 個位數 & 十位數分別存取,在
main code

answer md 定義答案

guess md 定義參數

vs1 比較十位數

vs2 比較個位數

zero 參數歸零

guess zero 猜數歸零

---
### 終極密碼 ( 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

answer part

大於答案

輸入0繼續

小於答案

a值

b值

---
# (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 更改登入後台網址 ( 資安

- UpdraftPlus - Backup/Restore >> 備份

-----
一頁式 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:評估-測試-取得證書
### 專案的五大流程

### About 開發成本
藍色段 >> 產品生命週期 (開發成本)
營運成本:製作成本30%、行銷成本30%、營運成本30%、稅&手續費10%
營運成本先訂定價 > 製作成本 除 0.3 會落在價格區間
執行、監控:進度(時間) / 錢(成本) / 品質(規範)


### About 定價


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

- 若定價未知:先網上查詢參考價
EX:$3000為例,3000*0.3 約 1000,則$1000為製作成本
以行車紀錄器為主題,我方提供雲服務方面要開單一帳號的成本$100,故為$1100
再以 $1100 / 0.3 = $3666 此為我方定價
$3666 * 1.3 = $4766 為終端建議售價,則3666 至 4766 為價格把控區間

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
---

---
## Arduino
### [軟體下載安裝](https://www.arduino.cc/en/software) // [上課參考講義](https://reurl.cc/lZmL2E)// [Arduino 程式語法](https://reurl.cc/YdgloO)
### Arduino 軟體起始設定

接上主機板後,從裝置管理員確認要選擇的COM



---
### 4個 led燈 同時閃爍

---
### 4個 led燈 依序亮起(前燈不滅) 然後暗掉/ 循環

---
### 4個 led燈 依序亮起(前燈滅) 然後暗掉/循環

---
### 4個 led燈 暗 > 半亮 > 亮 三個 去 循環

---
### 4個 led燈 暗 > 半亮 > 亮 > 半亮 > 暗 循環後

---

---
### 單一led呼吸燈跑完後遞增循環

#### 程式解二

---
### 矩陣 --2023/01/11


### 矩陣應用題目 --2023/01/11

#### 矩陣題目解 --2023/01/11

---
### 蠟燭燈 --2023/01/11

---
### 結合距離感測器後 的語法

### [下方回饋距離感測數值](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 電路板

### Arduino 資料型態

### 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>

code line 67-71

```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


線上講義 3.5.4/3.5.4
3.7.4 判斷質數

--
3.7.4 老師解法:

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


巢狀式寫法

## 3.4.5 位數算法



## 5.4.2 米字星號金字塔


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

參考資料範例
```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 才納入計算

※若不整除,n 要一直加下去,直到K(3) 先 n+1 在停止,所以是加兩次
K(0) 到 K(4)一個規律循環,100除4 >> 25個循環,每個循環的n值總和為25,25 * 100 = 250

<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[列][行]
| 第一行//第一列 | 第二列 | 第三列 |
| -------- | --------- | --------- |
| 第二行//第一列 | 第二列 | 第三列 |

```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 練習


```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)
```
## 秘密差



```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 設定 >> 進階系統設定

環境變數設定 >> "系統變數"欄位 新增 名稱'Path'

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

命令提示字元CMD 輸入 pip install BS4

open spider

coding

```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

</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;
}
```

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;
}
```

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)

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

> <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
}
```
----
## 矩陣陣列練習 -- 小群體

```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);
}
```
## 邏輯運算子
※此圖可在新分頁中開啟放大

```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$就是完滿二元樹
- 是完整二元樹的子集
### 二元樹走訪

前序:
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/)
### 求二元樹根 & 最深子節點總和


### 完整解
```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;
}
}
}
```

```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));


- <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;
}
```