iT邦幫忙

0

C++_決戰21點--誰能幫我精簡一下程式碼

C++_決戰21點--誰能幫我精簡一下程式碼

程式碼為下列網址連結:
http://goo.gl/xY1I

這是老師出的作業,我已經寫完了,應該都符合需求,只是程式碼感覺很新手

不知道有沒有更好的寫法,請指導

請各位會寫程式的先進們,指導一下,我想精簡我的(好笑的)程式碼

真的是新手上路,請多多幫忙。

12
海綿寶寶
iT邦大神 1 級 ‧ 2009-12-29 12:16:14
最佳解答

一個小建議和兩個大建議

小建議:
Line89-101有另一種寫法
先將0-51的值依序填入card陣列
接下來產生兩個0-51的亂數(假設是3,12)
然後就將card[3]和card[12]的值互換
重覆這個「產生」「互換」的動作n次(n自己決定)
n次之後card陣列就是不重覆的0-51的數字陣列
這麼做可以去除「檢查重覆」的動作
程式的執行時間較為固定(依n而定)

大建議:
main()不宜太長

大建議:
Line107-132
Line140-165
Line184-209
Line214-239
Line263-288
Line318-343
程式碼重覆
務必另外獨立寫成一個function供使用

因回應字數有限制
請自己對照原始程式碼的列數

感謝海棉寶寶大大讓我的程式從392行瘦身到242行
太感謝了
1.可是我覺得在印AJQK這段Line65-89,是不是有更好的寫法~
2.下定義的部份我想減少定義的數量Line101
3.Line107我想抓毫秒初始化亂數表
4.是不是還能再精簡程式碼行數
請各位先進再次指導~

更新頁面: http://goo.gl/uHzq

6
marshuang
iT邦新手 1 級 ‧ 2009-12-30 09:05:15

void Stack::print(int temp) {
j = temp%13+1;
switch(j){
case 1:
x1 = 'A';
printf("[%c", temp/13+3);
cout << " " << x1 << "] ";
這個function內的printf...到 cout那兩行全都可以搬到switch外, default內改一下將j轉型給x1即可.

看更多先前的回應...收起先前的回應...

1.請問要怎麼搬,「printf...到 cout」後有一個break;我的想法是:【如果搬到switch外「printf...到 cout」就notwork】,請大大指導一下~我不會搬~
2.請問「j轉型給x1」要如何做?
3.我想改變「printf("[%c", temp/13+3);cout << " " << x1 << "] "; 」,寫法
因為他太長輸出方法又不一致,請問大大有沒有方法可以指導一下。
新手上路,請多多指導,非常感謝!

marshuang iT邦新手 1 級 ‧ 2009-12-30 10:40:58 檢舉

switch(j){
case 1: x1 = 'A'; break;
case 11: x1 = 'J'; break;
case 12: x1 = 'Q'; break;
case 13: x1 = 'K'; break;
default: x1 = j ; break;
}
printf("[%c", temp/13+3);
cout << " " << x1 << "] ";

marshuang iT邦新手 1 級 ‧ 2009-12-30 11:08:11 檢舉

printf("[%c", temp/13+3);
cout << " " << x1 << "] ";
上述兩行指令可改成一行:
cout << "[" << char(temp/13+3) << " " << x1 << "] ";

1.大大不好意思:
x1 = j;
這一段因為char x1跟int j所以直接這樣轉,
我沒辦法完成輸出時為int輸出,
因為【cout << " " << x1 << "] "】印出char
沒辦法變成我要的在default時為int輸出,所以印出來的東西會沒辦法顯示,我不知道你的compiler有沒有給他過。
我的compiler出來是沒有數字或2的話是笑臉圖示【我用Dev-C++】
2.
我試著把printf-cout改成
cout << "[" << char(temp/13+3) << " " << x1 << "] ";
同上印出怪怪的東西
沒有辦法印出我想要的圖示
3.請大大再次給予指導~

感謝大大:
【(條件式) ? true : fault】
z = ((x > 10) ? 10 : x) + ((y > 10) ? 10 : y)
這段C++是可行的
我試過沒問題~
非常感謝您的指導~

marshuang iT邦新手 1 級 ‧ 2009-12-31 10:59:25 檢舉

我用線上compilr是有過,但依你compiler要調整轉型問題。
我專長在數學最佳化及碼的最佳化,對此case暫不涉入重調架構或邏輯層面,僅先對碼的等價或BigO做小幅調整而已,語法或函式要查一下,或請大家幫忙你找合適的做法。
精簡的用意有很多面向,有的是為了效能,有的是為了好看易瞭,有的是為了資源的配置及大量長時的考量,所以才會去考量程式碼耗CPU Time而做調整,沒什麼牛刀不牛刀的問題。
至於邏輯判斷或switch case,也有人代入卡諾圖去做化簡後再代回表示式。

不好意思 這位大大
請問一下你編譯的時候~印花跟數字~都有出現嗎~
我用Dev-C++編譯的時候~印花跟數字不會出現ㄝ~
我想精簡讓程式好看易維護~
請大大在幫幫忙唷~

marshuang iT邦新手 1 級 ‧ 2010-01-04 08:39:27 檢舉

請問問題解決了嗎?
印花會變相對印的字碼, 沒有出現四種花色
數字有正確出線.
以上部份不論是你的程式片段或我建譯更改部份代入online compiler去看, 結果相同.
所以,我只驗證"等價"的部份.

6
leohuang
iT邦新手 5 級 ‧ 2009-12-31 10:35:46

簡化建議:
1.class Stack對於本CASE有點殺雞使用牛刀,練習功力就另當別論了.
2.card[]直接放入rand()%52之不重複數值.
3.再將card[]內之值轉成1~13或是1~10之數值==>數值11~13都當作10計算使用時,則將card[]內之值轉成1~10==>將card[]內數值都%13,再將>10都轉成10.
4.card[]內之值簡化後,相關程式處理邏輯就簡單了.
5.莊家與對手處理程式碼,可挪到外面,簡化main()==>即main()內部只留3個函式呼叫即可==>亂數牌產生,對手處理相關,莊家處理相關等3個主要函式.

我要發表回答

立即登入回答