今天是統一發票開獎的日子,於是就趁這個機會來分享一下我寫的統一發票對獎程式

基本上我是大一上的時候寫這個程式的,當時從成大回台中的時候我大姐就問我可不可以寫一個統一發票的對獎程式,這樣以後不管是她或是老媽在對獎的時候都比較方便

我一開始還不確定我寫不寫得出來,畢竟當時才剛開始接觸程式

不過仔細思考之後發現以我當時的能力應該是寫得出來,只要有基本的輸入與字串比對應該就ok了

加上當時大姐說可以"談"一下酬勞,於是在金錢的誘惑之下(雖然最後是沒有收錢啦)

就寫了這樣的一個統一發票對獎程式,各位有興趣的話可以看一下

不過當時才大一上,功力不夠深厚,可能有人會覺得我的寫法很可笑,也請多多包涵囉

另外因為我希望大家都能夠看懂,所以註解會寫得蠻冗長的

想法:將輸入的數字,以字串的方式進行字串比對,根據結果不同印出不同的金額

/*統一發票對獎程式

作者:Tube

語言:C

日期:忘了,去年的某一天

編譯方式:存成.c檔,直接丟給編譯器編譯即可*/

 

 

 

執行結果(以下號碼都是亂打)

對獎執行結果              

 

基本上應該還蠻容易看懂這份程式碼的,比較有問題得應該是fgets和strcmp的部分

首先是fgets,他跟scanf最大的不同就是他不會忽略空格,用法是

fgets(陣列名稱,允許字串長度,輸入位置)

舉個例子:

char str[20]; //設一個字串陣列str可裝20個字元

如果我們執行

scanf("%s",&str);

printf("%s",str);

此時我們輸入"hello tube",那麼程式只會印出"hello",因為scanf讀到空格時就會停止讀取

但是如果我們把scanf那行改成

fgets(str,20,stdin); //從鍵盤(stdin,一般情況都是打stdin)輸入字串(最長20個)到str陣列裡

此時我們輸入"hello tube",程式就會乖乖印出"hello tube",因為fgets不會忽略空格

這樣大家應該清楚fgets的用法了吧

接下來是strcmp,顧名思義,他的意思是字串比對(STRing CoMPare)

用法如下

假設有2個字串str1和str2

strcmp(str1,str2); //比對整個str1和str2,如果完全一樣的話就回傳"0"

所以 if (strcmp(number,te1)==0)  的意思就是"如果兩個字串一模一樣的話,就執行下列程式"

至於strncmp的話比較麻煩,其意思是比較特定的字元,直接舉例比較快

strncmp(str1,str2,3);  //從str1和str2的第1個字元開始往後比3個字元

所以如果str1是"26635"而str2是"26689"的話就會回傳0,因為前3個字元一樣

而如果是這樣寫:

strncmp(&str1[5],&str2[0],3); //從str1的第6個字元(陣列是從0開始算)和str2的第1個字元開始往後比對3個字元

所以如果str1是"123456789"而str2是"789"的話就會回傳0,因為str1的第6,7,8個字元和str2的第1,2,3個字元都是789

這也就是增開六獎的寫法

這樣相信大家也學會了如何比對字串了

大家再回頭看看對獎程式的程式碼,相信應該都看得懂我在寫啥了吧

不過老實說這程式的實用性不大,我發現我老媽自己對比用這份程式對還要快

無論如何,還是給大家做個參考,有問題歡迎大家一起討論

 

*2011/7/2補上程式載點,有興趣的人可以下載來玩玩看

bit.ly/2hCkm0O

(exe檔, 沒有病毒請放心)

 

 

 

創作者介紹

Tube's World

Tube 發表在 痞客邦 PIXNET 留言(6) 人氣()


留言列表 (6)

發表留言
  • KuoE0
  • 推~ 建議直接給個.exe檔讓人下載,不是每個人都知道要compileXDD
  • 是強者e0學長0.0!!快拜<(_ _)>
    不過關於exe檔的部分有個問題困擾了我很久,就是如果我開C::B編譯在執行的話是可以執行沒錯,但是如果我離開C::B,單獨執行exe檔的話,會發生錯誤欸@_@ http://ppt.cc/Hq4z 所以我想現階段應該還是無法單獨執行程式,下載下來應該也不能用@@

    Tube 於 2011/05/27 00:59 回覆

  • KuoE0
  • 其實我很弱啦= =",真的別以為我很強...

    在win環境下,用gcc編看看,安裝mingw,在設定環境變數,就可以直接在cmd下用gcc了。我個人對這種單一檔案的code都還滿喜歡用gcc編就好,專案才用IDE,純粹個人習慣XD。

    至於離開C::B不能用應該是你compile時的設定是設定debug模式???看有沒有release模式,我沒用過C::B所以也不太清楚@@

  • 浩哲
  • 恩...單純提一個應用上的意見XD
    就是啊,如果用讀檔的話,應該會比較好用?
    就是讀取所有自己要對的發票號碼,
    然後可以快速知道自己中獎的情形。
    (還要找是哪張中啦,不過這應該有辦法在輸出結果的時候讓使用者比較好找,
    不然...有金錢的誘惑要找中獎的發票應該也很快嘛XDD)
  • 不過我覺得這樣就輸入的速度上來說應該沒差吧@@?因為到時候還是要將發票號碼一個一個輸入到要讀的檔案裡,除非發明一種機器能夠讀"發票號碼"的話那就另當別論,要不然基本上都還是需要讓使用者自己輸入發票號碼

    Tube 於 2011/05/30 00:17 回覆

  • 浩哲
  • 恩...我是以自己的習慣啦,
    我會覺得一口氣把所有的資料輸進去效率比較高,
    尤其是一個一個對的話搞不好對到一半就把程式跟發票丟著,
    跑去tetris battle(大誤)

    不過我覺得當務之急應該還是先發明一台獨發票號碼的機器XD(?
  • 發明一"台獨"發票號碼的機器
    浩哲話中有話(?)XD

    Tube 於 2011/05/30 18:17 回覆

  • 浩哲
  • 沒有,我沒發現字錯了XD
    噢~Tube你...XDD
  • ask123
  • 建議可以加error方面的指示
    像是輸入超過8碼的時候,就print"發票號碼只有8碼,請重新輸入"這樣
    還有輸入發票號碼的時候,可以先輸3碼,如果中了就要求輸入前5碼
    這樣能更增加程式舒適度