2012年1月29日 星期日

py2exe 的使用方法 教學

    以下這篇文章是從網路別人的文章改(抄、複製)過來的,這裡是記錄我所找過的資料,以便下次可以不用再找尋,如有侵犯的地方請告知,謝謝!!
參考網址:
http://ez2learn.com/index.php/python-tutorials/advance-tutorials/176-py2exepythonexe
http://www.chinaunix.net/jh/55/608594.html
http://jimmynote.blogspot.com/2010/03/using-py2exe.html

--------------------------------------------------------------------------------------------------
py2exe 使用 教學

介紹
py2exe是一個工具程式,可以將python程式轉換成為單一的執行檔案。
初級篇
1.官網下載py2exe程式

2. 安裝py2exe

3. 在你要打包的檔案同一個目錄下,新增一個名為setup.py的檔案,內容為:
from distutils.core import setup  
import py2exe  

setup(console=['???.py'])
   其中, ???.py 就是你要打包的檔案名稱,例如 hello.py

4. 完成後存檔

5. 接著 開始 -> 執行 -> cmd

6. 切換到你要打包的檔案的目錄下,EX:
    在cmd裡輸入 cd /d G:\program\python\src
    其中 cd 是進入資料夾的指令
             /d  是可以切換到其它磁碟的參數

7. 在cmd裡再輸入 python setup.py install

8. 在cmd裡再一次輸入 python setup.py py2exe
    如果有發現缺少什麼dll檔,可以參考這篇,或是其他問題,請參考參考網址的第一個網站!

9. 然後你可以發現有build和dist兩個資料夾在你的目錄下,其中dist的???.exe就是我們要的執行檔,以步驟3為例就是hello.exe囉!

    PS:如果想要將程式移到沒有安裝Python直譯器的環境下執行,只要將dist下的所有檔案複製過去然後再執行.exe檔就可以了

10.***密技***不知道各位有沒有覺得每次再做5-8的步驟的時候都感覺好麻煩,有沒有更快的方法呢?當然有拉,只要把以下的程式存成bat檔,點2下bat檔就可以執行5-8的步驟囉!
@echo off
echo 開始編譯程式
cd /d G:\program\python\src
python setup.py install
python setup.py py2exe
pause
當然第3行要改成你自己的目錄。另外如果檔名不知道怎麼取的話就取"make.bat"吧!

進階篇
1. 一般的情況下都是用console,如果我今天是用wxpython做視窗的話,那我的console就要改成windows
setup(windows=['???.py'])

2. 若要一次產生多個執行檔,只要將多個 script 檔名以 list 方式傳給 setup() 即可:
setup(console=["hello.py", "hello1.py", "hello2.py"])

3. 亦可以同時產生 console 和 windows 程式:
setup(console=["hello.py", "hello1.py"], windows=["hello2.py"])

4. 應用程式有時會使用到一些外部檔案,例如設定檔,字型或是圖檔,透過 setup() 的 data_files 參數,可以將這些額外的檔案加入發佈目錄中。將一個或多個 (目的目錄, [來源檔 1, 來源檔 2...來源檔 n]) 形成的 tuple,包裝成 list 指派給 data_files參數即可:
setup(console=["hello.py", "hello1.py"], windows=["hello2.py"],
     data_files=[("img",
                  [r"d:\documents\matrix.jpg",
                   r"d:\documents\Batman.jpg"]),
                 ("xml",
                  [r"D:\tmp\mypaint.xml",
                   r"D:\tmp\mypuzzle.xml",
                   r"D:\tmp\mypuzzle1.xml"])])
  產生之後的 dist 目錄中,應該會有一 img 目錄,內含 matrix.jpg 和 batman.jpg 兩個檔案,以及 xml 目錄,內含三個 xml 檔案。
  另外 py2exe 還提供了包裝成 windows service 和 COM server 的功能,由於目前有用到所以有研究。另外 Python 的 GUI toolkit - Tkinter 亦可正常使用,只是包裝後會多出 2MB 多的 Tkinter runtime,讓程式瞬間增肥許多...但,誰管這麼多呢?能夠讓別人也用用自己寫的 Python 程式,肥一點也無所謂囉!

5. 壓縮檔案,如wxpython的lib,可以參考官方文件

6. 更多的範例與使用http://www.dev.idv.tw/mediawiki/index.php/Py2exe%E7%B0%A1%E4%BB%8B

2012年1月22日 星期日

d681: BinaryCount

內容 :
    對一個二進位的數字每一個位元進行 & 、| 運算
    運算規則如下
    1 & 1 = 1
    1 & 0 = 0
    0 & 1 = 0
    0 & 0 = 0
    1 | 1 = 1
    1 | 0 = 1
    0 | 1 = 1
    0 | 0 = 0

輸入說明 :
    輸入為一個二進位字串加上運算子 and 或 or
    輸入的二進位字串<32 (5 bit)
    且保證每個二進位字串長度一樣(5bit)
    在每一行的最後會有一個空白
    例如
    10001 or 10000 and 11101 and 01001
         ^    ^      ^      ^       ^      ^       ^
    依序是一個運算元+空白+運算子+空白+運算元+...最後是運算元+一個空白
    每個運算元的長度都是5bit ,但不一定都是5個運算元+4個運算子

輸出說明 :
    輸出轉換後的運算式 與答案

範例輸入 :
10001 or 10000 and 11101 and 01001
10111 or 10111 or 10010 or 00101
01000 and 01001 or 10011 and 11101
10111 and 00011 or 10010 or 11011
01001 and 10110 or 10010 and 11101

範例輸出 :
10001||10000&&11101&&01001 = 00001
10111||10111||10010||00101 = 10111
01000&&01001||10011&&11101 = 11001
10111&&00011||10010||11011 = 11011
01001&&10110||10010&&11101 = 10000

程式碼 :
#include <stdio.h>

int main()
{
    int i,check;
    char s[2][6],operate[5],nouse[2];
    
    while(scanf(" %s%2c",&s[0],nouse)==2)
    {
        printf("%s",s[0]);
        while(nouse[1]!='\n')
        {
            scanf(" %s %s",operate,s[1]);
            check=0;
            if(operate[0] == 'n')
                check=1;
            if(check)
            {
                printf("&&%s",s[1]);
                for(i=0;i<5;i++)
                    s[0][i] &= s[1][i];
            }
            else
            {
                printf("||%s",s[1]);
                for(i=0;i<5;i++)
                    s[0][i] |=  s[1][i];
            }
            scanf("%2c",nouse);
        }
        printf(" = %s\n",s[0]);
    }   
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=d681

d658: 11636 - Hello World!

內容 :
    當你剛學程式印出「Hello World!」時,你總是很高興因為你還不曉得以後還會碰到多難多複雜的程式和演算法。現在,假設你還不知道迴圈,要印出7行的「Hello World!」,你只好使出最後的絕招──複製、然後貼上。如果你夠聰明的話,你知道輸出7行的「Hello World!」只要複製貼上3次就夠了。 如圖1所示,當我們複製1行「Hello World!」然後貼上你可以得到2行「Hello World!」,當你複製這2行然後再次貼上可以得到4行,最後再複製3行貼上就可以得到上述輸出7行的答案(圖4)。所以複製貼上3次就是我們想要的答案。 現在要你輸出若干行的「Hello World!」,請回答出最少要複製貼上幾次才能達到你要的數量。當然,你複製貼上的「Hello World!」不能被刪除掉。


Figure 1
Figure 2
Figure3
Figure 4



輸入說明 :
    有若干行輸入測資,每行包括一個正整數N(0 < n < 10001)代表要印出的「hello world!」數量。當n為負數時代表輸入結束,這行不用做處理。

輸出說明 :
    對於每行測資請輸出一行,格式為「Case X: Y」,X代表第幾筆測資,Y代表最少要複製貼上的次數。

範例輸入 :
2
10
-1

範例輸出 :
Case 1: 1
Case 2: 4

出處 :
    UVa 11636

程式碼 :

#include<stdio.h>

int main()
{
    int n,i,judge,count=0,arr[17]={1};
    for(i=1;i<17;i++)
        arr[i] = arr[i-1]*2;
    while(scanf("%d",&n)==1)
    {
        if(n<0)
            break;
        for(i=0;n>arr[i];i++);
        printf("Case %d: %d\n",++count,i);
    }
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d658

d649: 數字三角形

內容 :
    小米是個喜歡畫三角形的小朋友
    上課時小米覺得無聊都會在課本的一角畫三角形
    首先畫了
    *

    接著是
    *
    **

    再來
    *
    **
    ***

    就這樣一直畫到下課
    但是這樣太簡單而且太無聊了
    小米想:為何我不向右對齊呢?
    但就在下一節課小米嘗試畫出新三角形時
    小米怎麼樣也沒辦法向右對齊
    就請大家幫小米這個忙吧!

輸入說明 :
    輸入一數字 N (0 ≤ N ≤ 1000)
    代表小米想畫出高度為 N 的三角形
    當 N 為 0 時結束程式,不需處理這行輸入

輸出說明 :
    請輸出一個高為 N ,底也為 N 的三角形
    每組輸出請用空行隔開
    空白請用 '_' 代替
    星號請用 '+' 代替

範例輸入 :
3
5
0

範例輸出 :
__+
_++
+++

____+
___++
__+++
_++++
+++++

提示 :
    背景知識: 雙層迴圈
    ¤ 雙層迴圈練習題
    ¤ 有問題盡量問,這裡不是知識+不會扣點XD (雖然回答也沒有解答贈點)
    ¤ 小挑戰: 你可以用一個字元陣列解決問題嗎?
    ¤ 因應 JAVA 使用者將每測資點時限改為 10 s 並修改測資 (感謝 liouzhou_101)
    ¤ 2010/07/13 修改測資,並重測

程式碼 :
#include <stdio.h>

int main()
{
    int i,j,k,n;
    
    while(scanf(" %d",&n)==1 && n!=0)
    {
        for(i=0;i<n;i++)
        {
            for(j=0;j<(n-i-1);j++)
                printf("_");
            for(k=i+1;k>0;k--)
                printf("+");
            printf("\n");
        }
    }   
    return 0;
}




http://zerojudge.tw/ShowProblem?problemid=d649

d635: 幸運777?luck

內容 :
    你說什麼?777=511?怎麼可能…?
    因為這裡是八進位的777轉換成10進位的511了~(好爛ˇ)
    給你十進位的數字,請你把他們轉成八進位好嗎?

輸入說明 :
    每個測資點有多筆測資,請以EOF作為結束。
    每組測資一行,有整數n(0<=n<=511),表示要轉換成八進位的數字 最後出現小於0的整數表示測資結束。 <所有出現的整數皆可以signed 32-bits int儲存>

輸出說明 :
    對於每一行測資請輸出整數n的八進位表示。
    對於最後一個小於0的整數,請輸出-1。

範例輸入 :
277
511
123
456
-1

範例輸出 :
425
777
173
710
-1

提示 :
    背景知識: 流程控制
    1.進位制轉換
    2.共三個測資點30%、35%、35%,
    第一個測資點即範例測資。

程式碼 :
#include<stdio.h>

int main()
{
    int i;
    while(scanf("%d",&i)==1)
    {
        if(i<0)
        {
            printf("-1\n");
            break;
        }
        printf("%o\n",i);
    }
    return 0;
}



http://zerojudge.tw/ShowProblem?problemid=d635

2012年1月8日 星期日

a054: 電話客服中心

內容 :
    很多銀行及公司設立了電話客服中心來服務他們的客戶。為了加速身分的查核,常常會要求打電話進來的客戶輸入他的身分證號碼。可是電話上只有數字鍵,要輸入身分證號碼的第一個字母有點麻煩,因此有的語音系統會要求來電者輸入後 9 碼,再根據後 9 碼來推算可能的英文字母。
    很多人都知道,身分證號碼的最後一碼是「檢查碼」,它是用前 9 碼所推算出來的,其推算的規則如下:
    先依照下表將英文字母轉換為 2 位數字,再加上第 2 到第 9 位的 8 位數字一共有 10 位數字。
台北市 A 10    彰化縣 N 22
台中市 B 11    新竹市 O 35
基隆市 C 12    雲林縣 P 23
台南市 D 13    嘉義縣 Q 24
高雄市 E 14    台南縣 R 25
台北縣 F 15    高雄縣 S 26
宜蘭縣 G 16    屏東縣 T 27
桃園縣 H 17    花蓮縣 U 28
嘉義市 I  34    台東縣 V 29
新竹縣 J  18    金門縣 W 32
苗栗縣 K 19    澎湖縣 X 30
台中縣 L 20    陽明山 Y 31
南投縣 M 21   連江縣 Z 33
    由左至右,第一位乘 1,第二位乘 9,第三位乘 8,第四位乘 7...,以此類推,最後一位乘 1。
    求各位相對數字乘積的總和 s。
    求 s 的個位數 m。
    檢查碼 c = 10 - m 。
    假設某人的身份證號碼前 9 碼為 F13024567,那麼他的最後一位檢查碼的計算過程如下:

     F        1   3     0      2      4      5       6   7
  1   5      1    3     0      2      4      5       6   7
×1 ×9   ×8  ×7   ×6    ×5    ×4    ×3    ×2  ×1
1 + 45 + 8 + 21 + 0 + 10 + 16 + 15 + 12 + 7 = 135
檢查碼 = 10 - (135 % 10) = 5

    根據上面的規則,A12345678、M12345678 和 W12345678 這三個號碼的檢查碼都是 9。因此,如果在電話上所輸入的後 9 碼是 123456789 時,它的第一位英文字母可能是 A,也可能是 M 或 W。

輸入說明 :
    輸入有若干筆測試資料,每筆一行,含有一個身份證號碼的後 9 碼。

輸出說明 :
    對於每筆測試資料,將可能的第一位大寫字母依字母順序輸出於一行。

範例輸入 :
130245675
123456789

範例輸出 :
FS
AMW

程式碼 :
#include<stdio.h>

int main()
{
    int i,n,check,id[8],add_id_num,add_all;
    int city[26] = {10,11,12,13,14,15,16,17,34,18,19,20,21,22,35,23,24,25,26,27,28,29,32,30,31,33};

    while(scanf("%d",&n)==1)
    {
        check = n % 10;
        n = n / 10;
        for(i=0; i<8; i++)
        {
            id[7-i] = n % 10;
            n = n / 10;
        }
        
        add_id_num = 0;        
        for(i=0; i<8; i++)
            add_id_num += id[i]*(8-i);
        for(i=0; i<26; i++)
        {
            add_all = city[i]/10 + city[i]%10*9 + add_id_num;
            if(((10-(add_all%10))%10) == check)
                printf("%c",'A'+i);
        }
        printf("\n");
    }
    return 0;
}


http://zerojudge.tw/ShowProblem?problemid=a054