Program Talk

程式設計是內容管理流程中重要的一環, 本頁面專門提供與內容管理有關的程式列表及討論.


CMSimple 程式執行問題:

2013.09.03 - 使用頁面管理存檔後, 網站會以 port 443 跳到錯誤頁面.

 


分組程式算不算內容管理系統或電腦輔助設計流程中的一環?

程式說明:

60 位學員, 被指派計有 19 個題目的繪圖工作, 每一單獨的繪圖內容都必須分別使用三套不同軟體, 而且每一零件都必須由至少三位設計人員同時完成繪圖工作, 因此總工作任務共有 19*3*3 = 171 項, 而必須由 60 位學員以至少每組 6 人的分組加以完成, 以下就是配合的分組程式, 以 Python 3 編寫.

主要的程式流程為:

1. 逐行讀取學員名單, 分割學號姓名後, 以數列儲存, 然後再將所有學員的學號姓名資料納入另一個數列中.

2. 利用亂數將數列弄亂後, 再以每 6 人為一組的順序讀出數列內容, 即可完成分組.

3. 根據所要分配的任務, 以 19 個題目, 三種套件, 三人繪圖等數列, 以迴圈拼湊模式, 將工作存入數列.

4. 當上述分組學員順序確立後,  以每位學員取特定數量任務的迴圈, 完成所有工作的指派與列表.

5. 由於工作總數量無法平均分配給所有學員, 因此若達到工作內容完成分配後, 則以亂數從工作中篩選特定工作分配給最後的幾位學員.

import random
import math
'''
grouping4.py cadpw5 分組程式第四版
目前的程式版本無法讓每一位學員都有任務, 希望可以設法改善此一問題,
與 grouping3.py 的差異在 36-44 行
'''
檔案 = open("stud_list.txt", "r", encoding="utf-8")
#數列 = list()
數列 = []
for 每一行 in 檔案:
    # 利用 strip() 將每一行最後的跳行符號刪除
    # 利用 split() 將各行資料再分割
    各行資料 = 每一行.strip().split("\t")
    # 逐一將各行已經隔開的資料, 依序壓到數列中
    數列.append(各行資料)
# 使用 shuffle() 以亂數方式弄亂數列內容
random.shuffle(數列)
# 利用 len() 取得數列內容總數後, 依序列出數列內容
組別 = 0
寫檔案 = open("group_result.txt", "w", encoding="utf-8")
寫檔字串 = ""
確認選項 = ["第一人", "第二人", "第三人"]
題目選項 = ["第"+str(x)+"題" for x in range(1,20)]
套件選項 = ["creo", "solvespace", "solidedge"]
工作 = []
for 確認 in 確認選項:
    for 題號 in 題目選項:
        for 套件 in 套件選項:
            工作.append([確認, 套件, 題號])
random.shuffle(工作)
每人分配量 = math.ceil(len(工作)/len(數列))
分配索引 = 0
補足數列 = []
# 以下在補足總工作量無法讓每一人都有相同工作的問題
for 補數 in range(每人分配量*len(數列) - len(工作)):
    # 以亂數取工作數列中的特定項
    索引值 = random.randint(0, len(工作)-1)
    補足數列 = 工作[索引值]
    # 因為補足數列所抓取的工作已經有三人同時進行, 因此在下一行註記"第四人"
    補足數列[0] = "第四人"
    工作.append(補足數列)
#print(len(工作), len(數列))
for 索引 in range(len(數列)):
    # 依據索引列出數列元素
    if 索引%6 == 0:
        組別 += 1
        寫檔字串 += "第"+str(組別)+"組:\n"
        print("第",組別,"組:")
    寫檔字串 += str(數列[索引])+"\n"
    # 每人取特定的工作數量
    for 分配 in range(每人分配量):
        寫檔字串 += "    "+ str(工作[分配+分配索引])+"\n"
    分配索引 += 每人分配量
    print(數列[索引])
寫檔案.write(寫檔字串)
檔案.close()
寫檔案.close()
# 列出數列內容
#print(數列)

練習題目:

import random
import math
from time import time
# 為了因應問題 2, 最簡單的方式就是增強亂數的"亂"度
'''
grouping5.py cadpw5 分組程式第五版
1. 目前的程式版本無法讓每一位學員都有任務, 希望可以設法改善此一問題.
2. 又找到邏輯上的一個問題, 由於並沒有特別區分所謂的同一零件的三個人都必須是不同的學員
因此還要再設法處理, 可能將同一零件的同一套件之三個人中有重複分配給同一人的問題.
2-1 可能的解決方法為, 第一次分配完成後, 逐一進入各成員的分配項目中檢查, 若有同一零件同一繪圖套件的三人
同時指派給同一人, 則設法與其他人的內容更換...
2-2 或者採取, 工作項目中採用取某一工作後, 設法將取出的工作從數列中刪除, 然後若取出
的工作與現有的工作產生同一零件同一套件的第一二三人重複指定給同一人, 則取到符合條件為止
先決條件則是, 必須設法儲存分配過程中, 各組員所分配到的內容.
3. 若從學習的角度來看, 應該每一位學員都要分別使用三套繪圖套件,  考量是否可以讓分配滿足此條件?
4. 決定每個人畫六題, 則可以解決 3 的問題?
'''
檔案 = open("stud_list.txt", "r", encoding="utf-8")
#數列 = list()
數列 = []
for 每一行 in 檔案:
    # 利用 strip() 將每一行最後的跳行符號刪除
    # 利用 split() 將各行資料再分割
    各行資料 = 每一行.strip().split("\t")
    # 逐一將各行已經隔開的資料, 依序壓到數列中
    數列.append(各行資料)
# 使用 shuffle() 以亂數方式弄亂數列內容
random.shuffle(數列)
# 利用 len() 取得數列內容總數後, 依序列出數列內容
組別 = 0
寫檔案 = open("group_result.txt", "w", encoding="utf-8")
寫檔字串 = ""
確認選項 = ["第一人", "第二人", "第三人", "第四人", "第五人", "第六人"]
題目選項 = ["第"+str(x)+"題" for x in range(1,20)]
套件選項 = ["creo", "solvespace", "solidedge"]
#random.shuffle(確認選項)
random.shuffle(題目選項)
#random.shuffle(套件選項)
工作 = []
for 題號 in 題目選項:
    for 確認 in 確認選項:
        for 套件 in 套件選項:
            工作.append([確認, 套件, 題號])
random.seed(time())
random.shuffle(工作)
每人分配量 = math.ceil(len(工作)/len(數列))
分配索引 = 0
補足數列 = []
# 以下在補足總工作量無法讓每一人都有相同工作的問題
for 補數 in range(每人分配量*len(數列) - len(工作)):
    補足數列 = 工作[補數]
    # 因為補足數列所抓取的工作已經有六人同時進行, 因此在下一行註記"第七人"
    #補足數列[0] = "第七人"
    工作.append(補足數列)
#print(len(工作), len(數列))
for 索引 in range(len(數列)):
    # 依據索引列出數列元素
    if 索引%6 == 0:
        組別 += 1
        寫檔字串 += "第"+str(組別)+"組:\n"
        print("第",組別,"組:")
    寫檔字串 += str(數列[索引])+"\n"
    # 每人取特定的工作數量
    for 分配 in range(每人分配量):
        寫檔字串 += "    "+ str(工作[分配+分配索引])+"\n"
    分配索引 += 每人分配量
    print(數列[索引])
寫檔案.write(寫檔字串)
檔案.close()
寫檔案.close()
# 列出數列內容
#print(數列)

 

tkinter 簡單動畫

from tkinter import *
window = Tk()
canvas = Canvas(window, width = 400, height = 300)
canvas.pack()
x0 = 10		# initial left-most edge of ball
y0 = 50		# initial top-most edge of ball
x1 = 60		# inital right-most edge of ball
y1 = 100	# you've probably got the idea by now.
dx = 2
dy = 3
# create ball:
which = canvas.create_oval(x0,y0,x1,y1,fill="blue", tag='blueBall')
while True:
    canvas.move('blueBall', dx, dy)
    canvas.after(20)
    canvas.update()
# the next 4 if statements check if the ball hits a wall: if it hits
# a floor/ceiling its y-velocity reverses and it if hits a left/right 
# wall its x-velocity reverses
    if x1 >= 400:
        dx = -2
    if y1 >= 300:
        dy = -3
    if x0 < 0:
        dx = 3
    if y0 < 0:
        dy = 3
    x0 += dx
    x1 += dx
    y0 += dy
    y1 += dy
window.mainloop()