看板 C_and_CPP 關於我們 聯絡資訊
因為有人推文認為我在酸人 我只好一行一行來解釋你的 code 有哪些問題 ※ 引述《seedpk5079 (fhcrc 99th ooxx)》之銘言: : #include<stdio.h> : #include<string.h> : #include<stdlib.h> : typedef struct big_number{ : int number; : big_number(){ : int number[50]={}; : } : }; 首先這邊讓人搞不太清楚你是在寫 C 或是在寫 C++。 若你要用 C,就不能寫 constructor,因為那是 C++ 才有的功能。 若你要用 C++,就別再用舊式的 C 寫法,C++ 不需要針對每個 struct 去 typedef。 然後 stdio.h、string.h、stdlib.h 改成 cstdio、cstring、cstdlib 會比較標準。 再來,你的 number 到底是陣列還是單純的整數? 從你後面的 code 來看,number 應該要宣告成陣列,所以你的定義應該改成: #include <algorithm> struct big_number { int number[50]; big_number() { std::fill(number, number+50, 0); } }; 我們沒辦法直接用等號來清空陣列的全部元素,所以用 std::fill 來把每個元素 填為 0。這個做法會比用 memset 好一點。 : int b; : struct big_number dp[120]; : struct big_number *w,*e; 像 b、w、e 這類沒有意義的名稱,絕對不應拿來宣告為全域變數。 : void first(void){/*進行費氏最初2項初始化*/ : dp[0].number[0]=1; : dp[1].number[0]=1; : } : int *t,*tt,ll,*replace,*rr; : int get_number(int *t){ : int v; : for(v=0;t[v]!=0;++v){} : return v; : } : void give(int* replace,int *rr){ : int z; : for(z=0;z<50;++z){ : rr[z]=replace[z]; : } : } 你把 t、tt、ll、replace、rr 都宣告為全域變數, 然而又用相同的名稱去宣告函式的參數, 我看不出你這樣做的用意何在。 : int * string_reversal(int *tt,int ll){ : int ttt[50]={},tttt=0; : if(tt[ll]==0){ : ll--; : } : for(;ll>=0;ll--){ : ttt[tttt]=tt[ll]; : tttt++; : } : return ttt; : } 這邊是個明顯的錯誤,ttt 並非靜態變數,它的生命週期在 return 後就會 結束。回傳 ttt 將導致未定義的結果 (通常是你的變數內容莫名奇妙被毀)。 : int * add(int *w,int *e){ : int total[50]={},i,j,k,h,m,l=0; : i=get_number(w); : j=get_number(e); : i--;j--; : give(string_reversal(w,i),w); : give(string_reversal(e,j),e); : k=((i>=j)?i:j); : for(m=0;m<=k;++m){ : total[l]=w[m]+e[m]+total[l]; : if(total[l]>=10){ : total[l+1]=total[l]/10; : total[l]=total[l]%10; : } : l++; : } : give(string_reversal(total,l),total); : return total; : } 這邊的錯誤和前面一樣,total 是區域變數陣列,你不應該拿來回傳。 另外因為你的變數名稱幾乎都沒有意義,我很難看出這段 code 是否有錯誤。 : int* Fibonacc(int b){ : if(b==1||b==2){ : return dp[0]->number; : } : else if(dp[b].number[0]<10&&dp[b]->number[0]>0){ : return dp[b]->number; : } : else{ : give(add(Fibonacc(b-1),Fibonacc(b-2)),dp[b]->number); : return dp[b]->number; : } : } 這邊 return dp[b]->number 是可以的,因為 dp 是全域變數。 但這樣做不是好的設計,因為接受端很容易誤用得到的記憶體。 : int main(){ : int n; : while(scanf("%d",&n)!=EOF ){ : int day=0,number=0,u,*o,mm[50]={},cc[50]={}; : first(); : mm[0]=9;mm[1]=2;cc[0]=1;cc[1]=9; : o=add(mm,cc); : printf("\n"); : for(u=0;u<50;++u){ : printf("%d",o[u]); : } : } : return 0; : } 最後的問題,程式碼最好進行縮排,這樣也容易讓你一眼就看出程式結構。 上面的 main 經過適當排版後如下: int main(){ int n; while(scanf("%d", &n) != EOF){ int day = 0, number = 0; int mm[50] = {9, 2}; int cc[50] = {1, 9}; first(); int* o = add(mm, cc); printf("\n"); for(int u = 0; u < 50; ++u){ printf("%d", o[u]); } } return 0; } 這樣看起來會比較清楚。當然你的程式還是有問題,最主要出在你把區域陣列 直接回傳的部份。雖然我可以直接寫一個 big_number 的 class 出來讓你當正 確答案參考,但這樣對你沒有幫助。建議你還是再重頭念一次你的 C++ 教科書, 了解之前的 code 錯在哪裡,再繼續寫這支程式。 : 以上是我寫的程式碼 : 內容是要把費氏數列做大數跟DP : 可是我現在卡在紅色那幾行 : 到底要怎麼做才能把結構裡的陣列抓出來用啊... : 希望會的人能幫忙解答一下XD -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 124.9.6.2
green0924:我收回我之前說的話,l大願意這樣詳細地幫忙解說的精神, 04/27 17:43
green0924:很值得大家的尊敬~:) 04/27 17:43
ledia:基本上, 貼上難以閱讀的 code 本身就是一種不禮貌 04/27 17:51
ledia:就算我很常幫人看 code 解決問題, 看到這種的還是難以下手 04/27 17:51
green0924:倒也不能這樣說,畢竟學程式的人,不見得每個都是科班訓練 04/27 18:01
green0924:出來的,太過苛責,反而顯得肚量太小. 04/27 18:02
adrianshum:不是科班訓練? 這是單純發問的禮貌, 要科班訓練才會有 04/27 18:11
adrianshum:禮貌? 這是什麼道理?... 04/27 18:11
ledia:貼無法閱讀的程式碼就跟貼注音文的文章差不了多少 04/27 18:19
green0924:樓上的不要硬凹,我不相信你剛學程式時,就用正規的變數命 04/27 18:19
ledia:當然如果你閱讀注音文無礙, 那我也無話可說 04/27 18:19
green0924:名方式,而不會用a b c這些東西. 04/27 18:20
ledia:那如果我說是, 你又要怎麼回答呢 04/27 18:20
green0924:= = 我要說的是樓樓上,樓上的自動對號入座了. 04/27 18:20
adrianshum:很不幸, 我也是. 第一天學寫程式, 就有教命名要有意思 04/27 18:22
adrianshum:況且, 我說的是禮貌. 問人, 要讓別人看得懂你問什麼, 04/27 18:23
ledia:不過就算命名取得沒意義... 這排版也不會花你很多時間呀 04/27 18:23
adrianshum:這是禮貌, 我管你自己寫的時候用什麼命名, 但出來發問, 04/27 18:23
green0924:那是因為你們是科本出身的,有人告訴你們要用正規命名法. 04/27 18:24
adrianshum:就要把你的程式簡化整理得別人看得懂, 這就是禮貌 04/27 18:24
stonehomelaa:一開始沒學到這些 那代表你的書本或老師有問題 04/27 18:24
green0924:自己看書學的,很多書上不會特別說明變數要好好命名,況且 04/27 18:24
adrianshum:還要硬凹嗎? 我就不算是本科出身的, 我讀 BBA 的 04/27 18:24
vocaloid:爛書還扯那麼多 04/27 18:25
green0924:有很多人英文不夠好,要他們用英文幫變數命名不太容易 04/27 18:25
adrianshum:況且, 把發問的東西寫得別人看得明白, 這種基本禮貌 04/27 18:25
adrianshum:也要別人教嗎? 04/27 18:25
green0924:爛書也是學資訊出身的人寫出來的爛書啊,你怪讀者就不對 04/27 18:26
poga:英文不好不能當理由... 04/27 18:26
ledia:怪讀者就不對 XD 可以轉 joke 嗎? XDXD 04/27 18:26
adrianshum:英文不好, 也至少要有意識, tt t rr ll 這些能用英文差 04/27 18:26
ledia:看來我聯考考不好只好怪書編得爛了 XD 04/27 18:27
adrianshum:做藉口嗎?? 別再凹了好不好? 04/27 18:27
green0924:寫爛書,然後還怪讀者自己不懂得變通,讀者要是有分辨好壞 04/27 18:30
green0924:的能力,我想就不至於選爛書來看了吧? 04/27 18:30
vocaloid:所以大家都不要鞭, 繼續沉迷在爛書中而不自知 04/27 18:33
vocaloid:你是這個意思? 04/27 18:33
green0924:我在五樓時已經說得很清楚了,是一堆資訊出身的要高高在 04/27 18:35
green0924:上,硬凹自己肚量大. 04/27 18:35
ledia:資訊出身不是原罪呀, 我開始寫程式也才高中, 還不是自己學 04/27 18:35
ledia:雖然那時寫 QB, 一樣也知道變數名亂取, 隔天自己就看不懂自 04/27 18:36
ledia:己到底寫的是什麼鬼了 04/27 18:36
vocaloid:沒人說自己肚量怎樣,都直接嗆爛書了 04/27 18:37
vocaloid:什麼英文不好這也算理由,那註解不會寫是不是中文不好阿 04/27 18:37
ledia:如果你不是想認真去做一件事, 當然可以處處都馬馬虎虎 04/27 18:38
ledia:如果你是認真想學, 認真想問, 多努力點不會蝕本的 04/27 18:38
ledia:好習慣養成不容易, 提早開始總是有幫助的 04/27 18:39
green0924:這會又牽拖到認不認真的問題了..╮(╯▽╰")╭ 04/27 18:40
green0924:各位有時間在那邊酸別人,怎不學學littleshan大那樣無私 04/27 18:41
green0924:教導新手的精神呢? 04/27 18:41
ledia:啊 言盡於此, 要怪我牽託我也無所謂, 反正損失的又不是我 XD 04/27 18:41
ledia:你可以搜看看我寫過多少篇教學 :) 04/27 18:42
green0924:各位要不要乾脆建議板主多加一條板規,濫用變數命名者永 04/27 18:42
ledia:而我的貢獻算很少的了 04/27 18:42
green0924:久水桶呢?這樣才於法有據啊~至少人家注音文是板規有說的 04/27 18:43
ledia:從頭到尾沒人說你不能這麼做. 只說這樣比較沒禮貌而已 04/27 18:43
ledia:沒禮貌就要永久水桶嗎 ? 這還是你提出來的新概念呀 04/27 18:44
vocaloid:他算是被你噹出來的還在那說嘴,那嘴臉轉得實在相當硬 04/27 18:46
vocaloid:他原來的推文就已經講到重點了 04/27 18:46
green0924:我想你們的行為已經說明了一切了,濫用變數,看爛書者要被 04/27 18:48
green0924:眾人酸到死,不是嗎? 04/27 18:48
vocaloid:不是吧,如果有人po了不當示範還有別人在擁護 04/27 18:49
vocaloid:這個板還能正常討論嗎? 04/27 18:50
vocaloid:其他像你說的非本科進去一看: "別人也是這樣子嘛~" 04/27 18:52
green0924:我有沒有擁護,看我的推文就會知道,一堆自以為了不起的人 04/27 18:53
green0924:在酸人這種行為就不可取~ 04/27 18:53
poga:這年頭直接講出問題核心還會被說成酸到死呢 04/27 18:53
green0924:這年頭見義勇為的人也真難當耶~ 04/27 18:54
vocaloid:你就回原篇看你尊敬的littleshan大大的推文哪一點酸好了 04/27 18:54
VictorTom:見義勇為, 你做到的充其量是和路人對嗆而已.... 04/27 18:55
VictorTom:還是有人以為幫原po講兩句話出口氣就算幫到忙了(笑XD) 04/27 18:56
green0924:不好意思~人家littleshan大就是硬比你有肚量又肯教多了~ 04/27 18:56
vocaloid:你不要迴避問題,我上面就說我沒肚量 04/27 19:00
vocaloid:你把你酸的標準講一下,不然很難講下去 04/27 19:01
Song6Lin:推一個littleshan的耐性。 04/27 19:05
adrianshum:明明littleshan 大在原本的推文中, 說得平和中肯, 04/27 19:07
adrianshum:有人就要跳出來說 "你幹嗎酸人", 把同樣的論點, 寫得 04/27 19:09
adrianshum:清清楚楚, 某人又變成說肚量大. 現在答新手非得要像 04/27 19:10
adrianshum:教小孩一句一句教才是應分? 答簡單一點就是酸? 04/27 19:10
adrianshum:看到發問的人有問題, 也不可以嚴厲的語氣告知? 04/27 19:11
adrianshum:這什麼世界 04/27 19:11
MOONRAKER:還滿好笑的 04/27 20:10
MOONRAKER:我剛開始學電腦語言的時候的確沒有用完整單字來取變數名 04/27 20:10
MOONRAKER:不過那是因為電腦只承認變數的前兩個字母,畫面只有40個 04/27 20:13
MOONRAKER:字寬度,不能續行,修改要打行號 04/27 20:14
MOONRAKER:g先生先嫌本科系的人都高高在上,掰不下去了就改口罵書 04/27 20:15
MOONRAKER:爛,認為別人都不照他的主題在討論,卻一個爛書例子都吐 04/27 20:16
MOONRAKER:不出來,實在是非常幽默! 04/27 20:16
green0924:樓上的沒看清楚就亂吐可笑極了,是誰先嫌書爛,請看清楚再 04/27 20:19
green0924:發言吧~ 04/27 20:19
green0924:我想說的還是我在5F時說的那些,吐再多只嫌你們肚量很差. 04/27 20:20
green0924:可惜了littleshan這篇好文被你們的推文弄成戰文. 04/27 20:21
green0924:對我個人有意見,歡迎用合法或非法手段來找我,總之,我就 04/27 20:29
green0924:是看不慣有一群人對程式新手那樣不友善的態度,不願意幫 04/27 20:30
green0924:忙回答問題就算了,也請不要酸別人,任何人都有新手的時候 04/27 20:30
Peruheru:戰的最多不就是你嗎...大家都講一樣的事情,有沒有專門發 04/27 20:30
Peruheru:表一篇說明文章就會造成被你戰的差異... 04/27 20:31
Peruheru:不管是不是本科系出身,你為何非得看成那是酸文? 04/27 20:31
saxontai:綠九二四兄要不要按 a 查查 ledia 跟 adrianshum 熱心回 04/27 20:32
saxontai:答過多少問題呀?而您綠九二四兄又回答過多少問題了呀? 04/27 20:32
saxontai:ledia 兄熱心到會圖文並茂咧!(  ̄ c ̄)y▂ξ 04/27 20:34
green0924:笑話~以前做好事,那我很欽佩,但不代表以後還是會做好事. 04/27 20:35
green0924:至少在這一篇文我沒有看到有任何建設性的回覆原po的部份 04/27 20:35
Peruheru:自打嘴巴.... 04/27 20:36
green0924:只看到無意義的酸原po而已.人家littleshan至少很認真的 04/27 20:36
green0924:回答問題所在,而不是只會嘲弄別人寫的程式不好看. 04/27 20:37
saxontai:那 green0924 您的建設性回覆在哪呢?(笑) 04/27 20:37
Peruheru:所以說你為何非得要認為那「無意義」又是「酸」?很主觀呢 04/27 20:37
green0924:喔~那你呢?自打嘴巴~ 04/27 20:38
green0924:我沒有幫回答,因為我沒有那麼像littleshan那麼熱心,可至 04/27 20:40
green0924:少我不會去嘲笑新手!! 04/27 20:40
vocaloid:基本上大家都在笑你 04/27 20:41
Peruheru:就跟你說了,或許根本只有你一人認為那是嘲笑 04/27 20:42
Peruheru:其他人認為那是「建議」 04/27 20:42
Peruheru:有提出具體不正確之處,而不是「爛死了,學什麼程式」這 04/27 20:43
green0924:喔~是啊~就群眾暴力嘛~你們這些人就這樣,只會笑別人而已 04/27 20:43
Peruheru:種嘲笑的沒建設性發言 04/27 20:43
Peruheru:你自己想想看為啥從頭到尾都是你一人在支持嘲笑說好了 04/27 20:44
Peruheru:群眾暴力也出來了...不是跟你說不要把那個當嘲笑就好了? 04/27 20:45
Peruheru:你確定發問的原PO真的認為自己被嘲笑? 04/27 20:46
Peruheru:要是連發問者怎麼認為都還不知道就自顧自的認為「你被嘲 04/27 20:51
Peruheru:笑了!」,那或許你才是那個用高姿態看人的人。 04/27 20:51
seedpk5079:感謝指導 小弟會再去想辦法研讀 04/27 21:21
Yshuan:推這篇的原po 命名跟縮排是很基本的觀念 變數章節一定有講 04/27 21:58
seedpk5079:樓上講的我在仿間電腦書上沒看過... 04/28 12:41
VictorTom:變數的命名(無誤的話)基本上不影響程式的執行結果.... 04/28 12:44
VictorTom:但是對於後續的開發維護有非常舉足輕重的影響.... 04/28 12:45
VictorTom:大底來說大家都會說取個有意義/合適的名字, 但是我相信 04/28 12:45
VictorTom:許多人或許多派都有自己的style或主張, 比如可以去goo 04/28 12:45
VictorTom:一下"匈牙利命名法"; 其實如果code只有自己看, 那麼變數 04/28 12:46
VictorTom:你想怎麼取就取吧, 但是要給別人看或者是co-work的時候 04/28 12:46
VictorTom:變數的命名是否有意義, 是否follow組織裡慣用的規則就很 04/28 12:47
VictorTom:重要. (甚至是每個變數後面的註解與用法可能都是關鍵) 04/28 12:48
VictorTom:小弟我的程度沒辦法說明/推薦什麼樣的命名才好, 事實上 04/28 12:48
VictorTom:就算是'匈'這種應該也有人認為太過繁複冗長(沒記錯的話) 04/28 12:49
VictorTom:argu你的書有沒有講這個沒什麼意義, 不過style各有不同, 04/28 12:50
VictorTom:但大家應該都同意好的變數命名習慣很重要; 至於怎樣才算 04/28 12:50
VictorTom:不錯的, 等其他的大大推荐參考資料或書籍再看看吧:) 04/28 12:50
sunneo:記得以前我們寫大數的時候有個笑話 04/28 13:31
sunneo:有個同學抱怨`英文字母不夠多` 因為他變數取 a0~zzz 04/28 13:32
sunneo:程式碼已經2000多行了 一個基本的操作都還沒完成 04/28 13:33
sunneo:一個for迴圈都沒有 全部用if/else 跟難看的變數硬幹 04/28 13:33
sunneo:過沒多久他就直接複製網路上的版本了,說「太長了 看不懂」 04/28 13:35
sunneo:自己都看不懂了 怎麼期待幫忙改的人看的懂呢 04/28 13:35
sunneo:最後這個同學跑去做VHDL的專題 04/28 13:36
leonjye:耐心強者L大 <(_._)> 04/28 14:08
tinabjqs:L大真是佛心~而且回答的很仔細耶 04/28 17:53