追蹤者

2019年10月16日 星期三

圖解C++(二)

第四章 陣列與字串

4-1-4 二維陣列
只允許第一維可以省略不用定義,其餘的要
ex:
int arr [][3] = {{1,2,3},{2,3,4}} //合法
int arr [2][] = {{1,2,3},{2,3,4}} //不合法

4-2-1 字串特性與宣告
字串必須用空字元('\0')來代表每一個字串的結束。
宣告方式有二:
方式1 : char 字串變數[字串長度] = "初始字串";//會自動在結尾加上\0
方式2 : char 字串變數[字串長度] = {'字元1','字元2',...'字元n','\0'}

字串可經由指標來宣告與操作:
char *指標變數 = "字串內容";

4-2-2 輸出與輸入功能
cin 時若有空白字元,則空白後的資料會被刪除
C++中的 getline()函數會讀取使用者所輸入的每個字元(包含空白字元),直到按下ENTER
使用方式:
cin.getline(字串變數, 輸入長度, 字串結束字元);

4-3-1 宣告String 類別
C++字串宣告方式:
#include<string>
string 字串名稱;
string 字串名稱 = "字串";
string 字串名稱("字串");



2019年10月15日 星期二

圖解C++(一)

第一章 C++簡介
1-1-1 高階語言分類

  • 編譯式:使用編譯器將原始程式區分為數個階段轉換為機器可讀的可執行檔的目的程式
  • 直譯式:利用直譯器對高階語言程式碼做逐行解譯不需要產生目的檔或機器語言,解釋完一行才會解釋下一行。
1-1-4 物件導向設計特點
  • 封裝性(Encapsulation) : 利用"類別"來實作抽象化資料型態(ADT),其中抽象化讓使用者只能接觸到這些方法(函數),無法直接使用資料,也符合資訊隱藏的意義。
  • 繼承性(Inheritance) : 類似遺傳,允許我們去定義新的類別來繼承既有類別,進而使用或修改繼承而來的方法,並可在子類別中加入新的資料成員與函數成員。
  • 多形性(Polymorphism) : 可讓軟體在發展和維護時,有充分延展性。可讓具有繼承關係的不同類別物件,可以呼叫相同名稱的成員函數

第二章 資料處理概說
2-1-1 變數配置與宣告
C++屬於 靜態儲存配置的程式語言,必須在編譯時期配置記憶體空間給變數。

2-2-1 常數識別字與宣告
  • 方法1 : #define 常數名稱 常數值
  • 方法2 : const 資料型態 常數名稱 = 常數值(注意:若宣告時未設定初值,之後也不能再設值)
      ex : const float PI = 3.14159

2-3 基本資料型態
C++ 屬於 強制型態式語言(strongly typed),當宣告變數時,一定要同時指定資料型態

2-3-1 整數(int)
儲存時保留4個bytes(32bits)的空間。
八進位表示法:數字前加數值0,例如 073 為 10進位的 59。
十六進位: 數字前加0x

注意修飾詞:short 、long、 signed、 unsigned
2-3-2 浮點數(floating point)
分單精度浮點數(float)、倍精確度浮點數(double)、長倍精確浮點數(long double)
表示範圍不同:
float 4 bytes、double 8 bytes、long double 12bytes
浮點數並無有號與無號之分,皆為可表示正負小數的有號資料。
通常浮點數預設的資料型態為double,因此在指定浮點常數值時,可以在數值後方加上F或 f轉成float型態或加L轉成long double。
7645.8 //7645.8預設為倍精浮點數
7645.8F // 標示 7645.8為單精浮點數
2-3-3 字元
佔一byte,有正負之分。
對照ACSII 
宣告方式:
char 變數名稱 = ASCII碼;
char 變數名稱 = '字元'

2-5-6 位元運算子
<< 左移
>> 右移
正變負:
0 0 0 0 1 1 0 0  = 12
取1補數(0、1互換)
1 1 1 1 0 0 1 1
取二補數(+1)
1 1 1 1 0 1 0 0 = -12

A.求 -12 << 2
解:
1 1 1 1 0 1 0 0  = -12
左移2bits ,右空補0
1 1 0 1 0 0 0 0
減1
1 1 0 0 1 1 1 1 
取1補數
0 0 1 1 0 0 0 0 = 48
但原數為負 ,得知 12 <<2 為 -48
B. 求 -12 >> 2
解:
1 1 1 1 0 1 0 0 = -12
右移2bits,左空補1
1 1 1 1 1 1 0 1
減1
1 1 1 1 1 1 0 0
取1補數
0 0 0 0 0 0 1 1 = 3
但原數為負,得知 12>>2為-3

2-5-7 遞增與遞減運算子
前置型
如 b = ++a;//a = a + 1 , b = a;
後置型
如 b = a++;//b = a, a = a + 1;

2-6-2 強制型態轉換
int a,b;
c = (float)(a+b)/2;


2019年7月3日 星期三

用 Python 做商管程式設計(一)第五周練習







#---code---
import math
c = int(input()) #單價成本 2
r = int(input()) #單位售價 10
N = int(input()) #購買可能數 10
s = int(input()) #單位殘值 1

pb = []
for i in range(N+1):
pb.append(float(input()))

pf = 0 # 預期利潤
pmax = -1.0
pnow = 0.0
bestQ = -1
pbs = 0.0
#print(c,r,N,s,pb)
for q in range(N+1):
#print('q='+str(q))
pf = 0
if q==0:
pf= 0
else :
pbs = 0.0
for i in range(q+1):
#print('i='+str(i)+',r='+str(r)+',c='+str(c)+',q='+str(q)+',s='+str(s))
if i != q:
pnow = (r * i - c * q + s * (q-i)) * pb[i]
pbs += pb[i]
else :
pnow = (r * i - c * q + s * (q-i)) * (1-pbs)

pf += pnow
#print(q,pf)
if pf > pmax:
pmax = pf
bestQ = q
print(bestQ,int(pmax))
#---code---

2019年7月2日 星期二

用 Python 做商管程式設計(一)第五周作業






--- code ---
import math
init = []
init = input().split() #輸入
townNum = int(init[0]) #城市數 n
baseNum = int(init[1]) #基地台數 p
d = int(init[2])    #可涵蓋半徑 d
#print(townNum,baseNum,d)
'''
2≤n≤1000
2≤p≤n
−100≤x ≤100
−100≤y ≤100
1≤Pi ≤100
不會有兩個城鎮落在同一個地點。
'''
if townNum < 2 or townNum > 1000:
print('n number error')
if baseNum < 2 or baseNum > townNum :
print('p number error')

dst = []
unvisited = []
hasBuilt = []
covered = []

for i in range(townNum):
dst.append(input().split())
unvisited.append(i) #初始化未蓋城市
for j in range(3):
dst[i][j] = int(dst[i][j])
if int(dst[i][0]) > 100 or int(dst[i][0]) < -100 :#範圍確認
print('x number error in town :'+str(i))
if int(dst[i][1]) > 100 or int(dst[i][1]) < -100 :
print('y number error in town :'+str(i))
if int(dst[i][2]) > 100 or int(dst[i][2]) < 1 :
print('people number error in town :'+str(i))

for i in range(townNum):
for i in range(townNum):
if i==j:
continue
if dst[i][0] == dst[j][0] and dst[i][1] ==dst[j][1]:#座標重複確認
print('two town have same coordinate ERROR')
#print(dst)
'''
dst[0][0] : town 1.x
dst[0][1] : town 1.y
dst[0][2] : town 1.population
dst[7][0] : town 8.x
'''
# find the first base to build
maxppl = -1
firstBase = -1
ppln = 0
cvrppl = 0 #總涵蓋人口
for i in range(townNum):
ppln = dst[i][2]
for j in range(townNum):
if i==j:
continue
if math.sqrt(pow((dst[i][0]-dst[j][0]),2)+pow((dst[i][1]-dst[j][1]),2)) <= d:
ppln += dst[j][2]

if ppln > maxppl:
maxppl = ppln
firstBase = i

#print(firstBase,maxppl)
hasBuilt.append(firstBase) #已建造
covered.append(firstBase)   #涵蓋範圍
unvisited.remove(firstBase)#尚未建造
cvrppl = maxppl        #可被涵蓋之居民總數
#point first covered    #第一選址後涵蓋區域
for i in unvisited:
if math.sqrt(pow((dst[i][0]-dst[firstBase][0]),2)+pow((dst[i][1]-dst[firstBase][1]),2)) <= d:
covered.append(i)

#print('covered'+str(covered))
#find next base to build



for k in range(baseNum-1):
ppln = 0
maxppl = -1
nextBase = -1
for i in unvisited: #在尚未蓋基地的城市中
if i not in covered: #若該城市不在目前可涵蓋範圍內
ppln = dst[i][2] #可新增人口數定為該城市人口數
else:
ppln = 0 #若該城市已在涵蓋範圍內,則並無新增涵蓋人口
for j in range(townNum):
if i==j:
continue
if math.sqrt(pow((dst[i][0]-dst[j][0]),2)+pow((dst[i][1]-dst[j][1]),2)) <= d:
if j not in covered: #若 j 城市 與  j 城市 距離小於半徑   d ,且 j 尚未列入涵蓋區域
ppln += dst[j][2]#可新增人口加入 j 城市之人口
if ppln > maxppl:
maxppl = ppln
nextBase = i #更新可新增人口數最多之城市

hasBuilt.append(nextBase)

for i in unvisited:
if math.sqrt(pow((dst[i][0]-dst[nextBase][0]),2)+pow((dst[i][1]-dst[nextBase][1]),2)) <= d:
cvrppl += dst[i][2]#更新可涵蓋總人口
covered.append(i) #更新covered
unvisited.remove(nextBase)

#print('covered'+str(covered))
for i in range(baseNum):
print(hasBuilt[i]+1, end=' ')
print(cvrppl)




---code ---

2019年6月30日 星期日

用 Python 做商管程式設計(一) Week 5e

05-e01 旅行者問題
Logistics and transportation 物流與運輸
Travelling salesperson problem(TSP)
定義 : 從某點出發,經過每個點恰好一次,且回到原點,找最短距離。


greedy 走法 :
在一開始先往距離最近點出發,
在每一個點都往尚未走過且最近的點移動,
重複直到走回原點。

05-e02 TSP實作
---code
# set up the distance matrix
numLoc  = 5
dst = [[0, 9, 6, 7, 4],
              [9, 0, 5, 9, 6],
     [6, 5, 0, 3, 1],
     [7, 9, 3, 0, 4],
     [4, 6, 1, 4, 0]]

origin = 0
# tour : a list that will contain the solution
# tourLen : the total distance of the solution
# unvisited : a list that contains those unvisited locations at any time
tour = [origin]
tourLen = 0
unvisited = []

for i in range(numLoc):
unvisited.append(i)

unvisited.remove(origin)

# print(tour,tourLen,unvisited)

cur = origin
for i in range(numLoc-1):
# find the next location to visit
next = -1
minDst = 999
for j in unvisited:
if dst[cur][j] < minDst:
next = j
minDst = dst[cur][j]
# update tour, unvisited, tourLen, cur
tour.append(next)
cur = next
unvisited.remove(next)
tourLen += minDst
print(tour,tourLen)
#back to origin
tour.append(origin)
tourLen += dst[cur][origin]
#print
print(tour,tourLen)

---
05-e03 用檔案輸入資料
同上TSP,使用者自己輸入距離
code 部分 numLoc , dst 做修正
---code
numLoc = int(input())
dst = []
for i in range(numLoc):
dst.append(input().split()) #空格切開,以list形式append
for j in range(numLoc):
dst[i][j] = int(dst[i][j])
---
用檔案輸入
同目錄下新增一個檔案 : TSP_in.txt
輸入測試檔案,例如:
3
0 3 8
3 0 5
8 5 0

打開cmd ,移動到該目錄,python xxx.py < TSP_in.txt
" < " 這個符號,即可讓檔案讀入右方檔案資料



用 Python 做商管程式設計(一) Week 5d

05d-01 存貨政策與自動訂補貨
(Q,R) policy
定義 : 若現貨量 I < Q 則 補貨R件
(s,S) policy
定義 : 若現貨量 I < s  則 補貨至 S 件

Optimizing the (Q,R) policy
    決定 Q 和 R
考量下列 costs
- Inventory cost :  買東西堆在庫房而浪費掉的投資機會
- Ordering cost : 處理貨物的成本
- Shortage cost : 因為沒有賣出去而損失的銷售

例題:
Q = 30 ,一單位貨品買入價1000元,年利率 7.3%,
一次訂貨成本 200,一個顧客來卻缺貨虧 2元,
過去20天需求量如下,20天前的存貨量 為 20件。
求 R 使得總成本最小?
---  code (此程式並沒有加入訂貨成本)
# past sales 
salesStr = "14,23,26,17,17,12,24,19,10,18,22,31,19,16,22,28,20,27,20,32"
sales = salesStr.split(',')
for i in range(len(sales)):
sales[i] = int(sales[i])

#given information 
stgCost = 2
invCost = 1000*0.073/365
Q = 30
I = 20

#finding the best R
bestR = 0
costOfBestR = 1000000000
for R in range(Q):
totalStgCost = 0
totalInvCost = 0

#finding the total cost of this R 
for s in sales:
I -=s
if I < 0 :
totalStgCost += -I * stgCost
I += Q
elif I < R:
I += Q
totalInvCost += I * invCost

#update bestR when necessary
totalCost = totalStgCost + totalInvCost
if totalCost < costOfBestR:
bestR = R
costOfBestR = totalCost
print(R, totalStgCost, totalInvCost, totalCost)
print(bestR)
---

2019年6月28日 星期五

找工作建議

1.想想我是誰? 瞭解自己:

人天天都跟自己相處在一起,但可能這一輩子最不了解的就是自己。

把每天自己完成的事是值得鼓勵/開心的事寫下來,另一邊寫今天不開心/做不好的事,

從中去分析自己的優點/缺點/喜歡的/討厭的。


例如:

O:我今天跟朋友一起聚餐,跟很熟悉的朋友在一起的那種無拘束感真好~ (分析: 我喜歡無拘束感) 。

X:預定今天要寫的心得還是沒寫。 (分析: 做事情總是拖延)


2.我想要甚麼? 我的人生價值觀/工作價值觀/我的座右銘 :

從你有記憶開始回想,你喜歡看的卡通是甚麼卡通? 甚麼電影吸引我? 甚麼樣的書我覺得好看?  小時候在做甚麼事的時候最開心?
對甚麼有興趣? 也回想一下小時候,作文"我的志願"/"我的夢想",長大了變成喜歡甚麼,為何有此轉折/改變。


例如: 我喜歡看超人卡通,我喜歡看警匪片,心理學的書很吸引我,小時候學畫畫/作陶藝/玩樂高時最開心,
對學甚麼東西都很有興趣,我的志願好像是甚麼總統/警察/老師/太空人之類的。



超人卡通/警匪片: 公平/正義

心理學: 喜歡觀察人/探究人心/想幫助別人

小時候學畫畫/作陶藝/玩樂高: 喜歡有自主意見的操縱感/完成一樣作品的滿足感。

對學甚麼東西都很有興趣:有好奇心/喜歡新鮮感/喜歡不同的挑戰

老師:教育為重。總統/警察:服務人民,對社會有貢獻。太空人:一個很稀奇的職業,喜歡探索未知。


結論:我想要,一個可以幫助人/對社會有貢獻/能夠發揮自己所能/有新鮮感多變化的工作。



我的人生價值觀:做一個有用的人且對社會有貢獻

我的工作價值觀:工作時間有自由度/有自主性/用自己的能力創造價值

我的座右銘:人有無限的可能



(以上的概念都可能重複,而重覆性越高,代表你的志向越明確)



3.尋找搭配自己熱誠興趣的工作:

從上述,我找到了一個工作頗適合,觀護人。


觀護人算是一個講求公平正義的職業。對於被觀護人有好奇心,想觀察他/幫助他解決困難融入社會,如果幫到忙會很有成就感,
也算是對社會有貢獻。 不同的人帶來不同的新鮮感,不一樣性格的人有著不一樣的挑戰。


4.瞭解如何從事這樣職業,這項職業需要具備甚麼能力?

EX.如何考觀護人/需要具備哪些能力?

觀護人為司法四等特考,需要考許多的科目,涵蓋的範圍有法律/心理/社工,是個相對其他公職考試不容易考的職務,
且每年徵求的人數不多。要具備 同理心/觀察力/整合力/口說能力等.... 要讀的書是哪些等....


5.確認目標:我真的要做這個嗎? 我能勝任嗎? 做這項工作的優點缺點? 挑戰和困難? 現實與理想?

(略)

如果沒確認此目標,就在重新找一個。


6.再重新尋找/不斷尋找/持續思考



     人生本來就是這樣在一個不確定的情況下尋找人生的答案。答案,要自己尋找。

偉人也不是一出生就知道自己要做甚麼,有成就的人也是一步一步的了解自己到完成目標。

     有空就思考,我想學的東西/我有興趣的東西/我的理想/我的夢想/我覺得此生一定要做的事等,各自列出一個表,
你可以從中去定自己的目標。找到目標之後就設個大目標>中目標>小目標。

大目標是一個狀態,例如,考上研究所。

中目標是一個方向,例如,考研究所要讀書,要讀甚麼甚麼書....等。

小目標就是可執行/有可行性的方法,例如, 一天讀九小時,分成早中晚,各時段3HR,哪一個小時讀啥科目等





阿魏之獨門方法: 刪去法



如果想不到甚麼事情自己最喜歡,那就倒過來,寫出自己不喜歡的。

例如: 我不喜歡跟別人推銷東西>>>不適合做業務/直銷

        我不喜歡天天重複做同樣的事情>>> 適合有挑戰/有新鮮感/多變化的工作



以上是綜合我看過的書和個人經驗和大家分享,在尋找自己時我發現最有用的就是書和自己。

我覺得夢想就像是在一張白色圖畫紙上繪圖,在紙上構想你的夢想是如何如何,

如果不去執行/努力,終究就只是一張圖畫紙!

套一位歌手說的,謝和弦:"夢想只是一個名詞,你要想辦法把他變成動詞。"


方法歸方法,如果不去思考和執行,建議永遠都只是紙上談兵。

真的還是自己要有決心去思考和尋找,共勉之~~~~~

2019年6月27日 星期四

用 Python 做商管程式設計(一) Week 5b

05-b01 作業管理與演算法
Operation Management (OM)
利用程式解OM問題-演算法

演算法 Algorithm
    A detailed description of actions such that action is doable.

Scheduling 
Makespan 最小化

  • m 台機器
  • n  個 jobs
  • job j 的 processing time
    •  一台機器完成 job j 共需要 pj 時間
    • Complete time C = Sj(開始時間) + pj
要分配這些jobs  給所有 機器 使得 最後的 completing time  最小

Longest processing time first (LPT)
  • jobs 的 processing time 降冪排列
  • 分配job 給目前最早完成時間之機器
--- code ---
# read and prepare n,m,p
n = int(input("Number of jobs: "))
m = int(input("Number of machines: "))
pStr = input("Processing times: ")

p  =  pStr.split(' ')
for i in range(n):
p[i] = int(p[i])

#sort and reverse
#p.sort()
#p.reverse()

# machine complete times 
loads  =  [0] * m
assignment = [0]  * n
#in iterarion j , assign job j to the least loaded machine 
for j in range(n):
#find the least loaded machine
leastLoadedMachine = 0
leastLoad = loads[0]
for i in range(1,m):
if loads[i] < leastLoad:
leastLoadedMachine = i
leastLoad = loads[i]
#schedule a job
loads[leastLoadedMachine] +=p[j]
assignment[j] = leastLoadedMachine + 1
#check the process
print(str(p[j]) + ": " + str(loads))
#the result 
print("Job assignment: "+str(assignment))
print("Machine loads: "+str(loads))

-------------
heuristic 不能保證得到最佳解

11




用 Python 做商管程式設計(一) Week 5a

05-a01 字串切割成清單
---
   gradeStr = input() #1 2 3 4 5
   grade = gradeStr.split() #用空白切開,若要用comma切開則: split(',')
   print(grade) # grade 是一個list
---
List 
是一個 ordered container
字串內元素(item)可用index 操作
如上例:print(grade[0]) #1 , print(grade[2]*2) #33

len() 可得 listlist長度
print(len(grade)) #5

List 宣告
aList = [0] * 3 # [0,0,0]

append() 可新增Items 到 List
ex:
    gradeStr = input() #1 2 3 4 5
    grade = gradeStr.split()
    grade.append(-1)
    print(grade) # ['1','2','3','4','5',-1]
    grade.append([9,7,5])
    print(grade) # ['1','2','3','4','5',-1,[9,7,5]] , list裡面可以加list
    print(grade[6][1]) #7 , grade[6]為list ,可存取該list的元素

List 內  string  string  轉 int
ex:
    gradeStr = input()
    gradeList = gradeStr.split()
    print(gradeList)
    grades = []

    for g in gradeList: 
    grades.append(int(g))

    print(grades) #[1,2,3,4,5]
    #for 迴圈那邊可以替換成
    #for i in range(len(gradeList)):
    #    grades[i] = int(graedList[i])

range 複習
>>>range(10) # 从 0 开始到 10 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>> range(1, 11) # 从 1 开始到 11 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

05-a03 List 相關函數

lst = [3,1,4,1,5,9]
lst.append(2)
print(lst)# [3, 1, 4, 1, 5, 9, 2], 新增2

lst.sort()

print(lst)# [1, 1, 2, 3, 4, 5, 9],list內數值排序

lst.reverse()

print(lst) # [9, 5, 4, 3, 2, 1, 1],list 內 item 翻轉

print(lst.index(4)) # 2 


lst.insert(4,"Hi")

print(lst)#[9, 5, 4, 3, 'Hi', 2, 1, 1] ,在第4個index位插入""

print(lst.count(1))# 2 , 數字1出現幾次


lst.remove(1)

print(lst)# [9, 5, 4, 3, 'Hi', 2, 1] ,移除掉第一個出現的 1

print(lst.pop(3))# 3 ,把 3 拿出來



print(lst)# [9, 5, 4, 'Hi', 2, 1]

List Copying
ex:
aList = [1,2,3]
bList = aList
bList[0] = 5
print(bList) #[5,2,3]

Why?
Python 中 list variable 是一個 reference
Copying a list is just copying the reference ,not those values

順序:
1.aList 參照 [1,2,3]
2.aList 的內容 copy 到 bList,有兩個list分別寫著[1,2,3]這塊地的地址
3.aList 和 bList並非兩個lists, 而是一個list的兩個名字
4.若要做到兩個lists 使用 append 把item 依序 複製進去