作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [語法] 關於陣列裡的陣列
時間Mon Apr 27 17:36:33 2009
因為有人推文認為我在酸人
我只好一行一行來解釋你的 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
1F:推 green0924:我收回我之前說的話,l大願意這樣詳細地幫忙解說的精神, 04/27 17:43
2F:→ green0924:很值得大家的尊敬~:) 04/27 17:43
3F:推 ledia:基本上, 貼上難以閱讀的 code 本身就是一種不禮貌 04/27 17:51
4F:→ ledia:就算我很常幫人看 code 解決問題, 看到這種的還是難以下手 04/27 17:51
5F:推 green0924:倒也不能這樣說,畢竟學程式的人,不見得每個都是科班訓練 04/27 18:01
6F:→ green0924:出來的,太過苛責,反而顯得肚量太小. 04/27 18:02
7F:→ adrianshum:不是科班訓練? 這是單純發問的禮貌, 要科班訓練才會有 04/27 18:11
8F:→ adrianshum:禮貌? 這是什麼道理?... 04/27 18:11
9F:推 ledia:貼無法閱讀的程式碼就跟貼注音文的文章差不了多少 04/27 18:19
10F:推 green0924:樓上的不要硬凹,我不相信你剛學程式時,就用正規的變數命 04/27 18:19
11F:→ ledia:當然如果你閱讀注音文無礙, 那我也無話可說 04/27 18:19
12F:→ green0924:名方式,而不會用a b c這些東西. 04/27 18:20
13F:→ ledia:那如果我說是, 你又要怎麼回答呢 04/27 18:20
14F:→ green0924:= = 我要說的是樓樓上,樓上的自動對號入座了. 04/27 18:20
15F:→ adrianshum:很不幸, 我也是. 第一天學寫程式, 就有教命名要有意思 04/27 18:22
16F:→ adrianshum:況且, 我說的是禮貌. 問人, 要讓別人看得懂你問什麼, 04/27 18:23
17F:推 ledia:不過就算命名取得沒意義... 這排版也不會花你很多時間呀 04/27 18:23
18F:→ adrianshum:這是禮貌, 我管你自己寫的時候用什麼命名, 但出來發問, 04/27 18:23
19F:推 green0924:那是因為你們是科本出身的,有人告訴你們要用正規命名法. 04/27 18:24
20F:→ adrianshum:就要把你的程式簡化整理得別人看得懂, 這就是禮貌 04/27 18:24
21F:推 stonehomelaa:一開始沒學到這些 那代表你的書本或老師有問題 04/27 18:24
22F:→ green0924:自己看書學的,很多書上不會特別說明變數要好好命名,況且 04/27 18:24
23F:→ adrianshum:還要硬凹嗎? 我就不算是本科出身的, 我讀 BBA 的 04/27 18:24
24F:→ vocaloid:爛書還扯那麼多 04/27 18:25
25F:→ green0924:有很多人英文不夠好,要他們用英文幫變數命名不太容易 04/27 18:25
26F:→ adrianshum:況且, 把發問的東西寫得別人看得明白, 這種基本禮貌 04/27 18:25
27F:→ adrianshum:也要別人教嗎? 04/27 18:25
28F:→ green0924:爛書也是學資訊出身的人寫出來的爛書啊,你怪讀者就不對 04/27 18:26
29F:→ poga:英文不好不能當理由... 04/27 18:26
30F:推 ledia:怪讀者就不對 XD 可以轉 joke 嗎? XDXD 04/27 18:26
31F:→ adrianshum:英文不好, 也至少要有意識, tt t rr ll 這些能用英文差 04/27 18:26
32F:→ ledia:看來我聯考考不好只好怪書編得爛了 XD 04/27 18:27
33F:→ adrianshum:做藉口嗎?? 別再凹了好不好? 04/27 18:27
34F:推 green0924:寫爛書,然後還怪讀者自己不懂得變通,讀者要是有分辨好壞 04/27 18:30
35F:→ green0924:的能力,我想就不至於選爛書來看了吧? 04/27 18:30
36F:→ vocaloid:所以大家都不要鞭, 繼續沉迷在爛書中而不自知 04/27 18:33
37F:→ vocaloid:你是這個意思? 04/27 18:33
38F:推 green0924:我在五樓時已經說得很清楚了,是一堆資訊出身的要高高在 04/27 18:35
39F:→ green0924:上,硬凹自己肚量大. 04/27 18:35
40F:推 ledia:資訊出身不是原罪呀, 我開始寫程式也才高中, 還不是自己學 04/27 18:35
41F:→ ledia:雖然那時寫 QB, 一樣也知道變數名亂取, 隔天自己就看不懂自 04/27 18:36
42F:→ ledia:己到底寫的是什麼鬼了 04/27 18:36
43F:→ vocaloid:沒人說自己肚量怎樣,都直接嗆爛書了 04/27 18:37
44F:→ vocaloid:什麼英文不好這也算理由,那註解不會寫是不是中文不好阿 04/27 18:37
45F:→ ledia:如果你不是想認真去做一件事, 當然可以處處都馬馬虎虎 04/27 18:38
46F:→ ledia:如果你是認真想學, 認真想問, 多努力點不會蝕本的 04/27 18:38
47F:→ ledia:好習慣養成不容易, 提早開始總是有幫助的 04/27 18:39
48F:推 green0924:這會又牽拖到認不認真的問題了..╮(╯▽╰")╭ 04/27 18:40
49F:→ green0924:各位有時間在那邊酸別人,怎不學學littleshan大那樣無私 04/27 18:41
50F:→ green0924:教導新手的精神呢? 04/27 18:41
51F:推 ledia:啊 言盡於此, 要怪我牽託我也無所謂, 反正損失的又不是我 XD 04/27 18:41
52F:→ ledia:你可以搜看看我寫過多少篇教學 :) 04/27 18:42
53F:→ green0924:各位要不要乾脆建議板主多加一條板規,濫用變數命名者永 04/27 18:42
54F:→ ledia:而我的貢獻算很少的了 04/27 18:42
55F:→ green0924:久水桶呢?這樣才於法有據啊~至少人家注音文是板規有說的 04/27 18:43
56F:→ ledia:從頭到尾沒人說你不能這麼做. 只說這樣比較沒禮貌而已 04/27 18:43
57F:→ ledia:沒禮貌就要永久水桶嗎 ? 這還是你提出來的新概念呀 04/27 18:44
58F:→ vocaloid:他算是被你噹出來的還在那說嘴,那嘴臉轉得實在相當硬 04/27 18:46
59F:→ vocaloid:他原來的推文就已經講到重點了 04/27 18:46
60F:推 green0924:我想你們的行為已經說明了一切了,濫用變數,看爛書者要被 04/27 18:48
61F:→ green0924:眾人酸到死,不是嗎? 04/27 18:48
62F:→ vocaloid:不是吧,如果有人po了不當示範還有別人在擁護 04/27 18:49
63F:→ vocaloid:這個板還能正常討論嗎? 04/27 18:50
64F:→ vocaloid:其他像你說的非本科進去一看: "別人也是這樣子嘛~" 04/27 18:52
65F:推 green0924:我有沒有擁護,看我的推文就會知道,一堆自以為了不起的人 04/27 18:53
66F:→ green0924:在酸人這種行為就不可取~ 04/27 18:53
67F:→ poga:這年頭直接講出問題核心還會被說成酸到死呢 04/27 18:53
68F:→ green0924:這年頭見義勇為的人也真難當耶~ 04/27 18:54
69F:→ vocaloid:你就回原篇看你尊敬的littleshan大大的推文哪一點酸好了 04/27 18:54
70F:→ VictorTom:見義勇為, 你做到的充其量是和路人對嗆而已.... 04/27 18:55
71F:→ VictorTom:還是有人以為幫原po講兩句話出口氣就算幫到忙了(笑XD) 04/27 18:56
72F:→ green0924:不好意思~人家littleshan大就是硬比你有肚量又肯教多了~ 04/27 18:56
73F:→ vocaloid:你不要迴避問題,我上面就說我沒肚量 04/27 19:00
74F:→ vocaloid:你把你酸的標準講一下,不然很難講下去 04/27 19:01
75F:推 Song6Lin:推一個littleshan的耐性。 04/27 19:05
76F:→ adrianshum:明明littleshan 大在原本的推文中, 說得平和中肯, 04/27 19:07
77F:→ adrianshum:有人就要跳出來說 "你幹嗎酸人", 把同樣的論點, 寫得 04/27 19:09
78F:→ adrianshum:清清楚楚, 某人又變成說肚量大. 現在答新手非得要像 04/27 19:10
79F:→ adrianshum:教小孩一句一句教才是應分? 答簡單一點就是酸? 04/27 19:10
80F:→ adrianshum:看到發問的人有問題, 也不可以嚴厲的語氣告知? 04/27 19:11
81F:→ adrianshum:這什麼世界 04/27 19:11
82F:→ MOONRAKER:還滿好笑的 04/27 20:10
83F:→ MOONRAKER:我剛開始學電腦語言的時候的確沒有用完整單字來取變數名 04/27 20:10
84F:→ MOONRAKER:不過那是因為電腦只承認變數的前兩個字母,畫面只有40個 04/27 20:13
85F:→ MOONRAKER:字寬度,不能續行,修改要打行號 04/27 20:14
86F:→ MOONRAKER:g先生先嫌本科系的人都高高在上,掰不下去了就改口罵書 04/27 20:15
87F:→ MOONRAKER:爛,認為別人都不照他的主題在討論,卻一個爛書例子都吐 04/27 20:16
88F:→ MOONRAKER:不出來,實在是非常幽默! 04/27 20:16
89F:推 green0924:樓上的沒看清楚就亂吐可笑極了,是誰先嫌書爛,請看清楚再 04/27 20:19
90F:→ green0924:發言吧~ 04/27 20:19
91F:→ green0924:我想說的還是我在5F時說的那些,吐再多只嫌你們肚量很差. 04/27 20:20
92F:→ green0924:可惜了littleshan這篇好文被你們的推文弄成戰文. 04/27 20:21
93F:推 green0924:對我個人有意見,歡迎用合法或非法手段來找我,總之,我就 04/27 20:29
94F:→ green0924:是看不慣有一群人對程式新手那樣不友善的態度,不願意幫 04/27 20:30
95F:→ green0924:忙回答問題就算了,也請不要酸別人,任何人都有新手的時候 04/27 20:30
96F:推 Peruheru:戰的最多不就是你嗎...大家都講一樣的事情,有沒有專門發 04/27 20:30
97F:→ Peruheru:表一篇說明文章就會造成被你戰的差異... 04/27 20:31
98F:→ Peruheru:不管是不是本科系出身,你為何非得看成那是酸文? 04/27 20:31
99F:推 saxontai:綠九二四兄要不要按 a 查查 ledia 跟 adrianshum 熱心回 04/27 20:32
100F:→ saxontai:答過多少問題呀?而您綠九二四兄又回答過多少問題了呀? 04/27 20:32
101F:→ saxontai:ledia 兄熱心到會圖文並茂咧!(  ̄ c ̄)y▂ξ 04/27 20:34
102F:推 green0924:笑話~以前做好事,那我很欽佩,但不代表以後還是會做好事. 04/27 20:35
103F:→ green0924:至少在這一篇文我沒有看到有任何建設性的回覆原po的部份 04/27 20:35
104F:推 Peruheru:自打嘴巴.... 04/27 20:36
105F:→ green0924:只看到無意義的酸原po而已.人家littleshan至少很認真的 04/27 20:36
106F:→ green0924:回答問題所在,而不是只會嘲弄別人寫的程式不好看. 04/27 20:37
107F:推 saxontai:那 green0924 您的建設性回覆在哪呢?(笑) 04/27 20:37
108F:→ Peruheru:所以說你為何非得要認為那「無意義」又是「酸」?很主觀呢 04/27 20:37
109F:→ green0924:喔~那你呢?自打嘴巴~ 04/27 20:38
110F:推 green0924:我沒有幫回答,因為我沒有那麼像littleshan那麼熱心,可至 04/27 20:40
111F:→ green0924:少我不會去嘲笑新手!! 04/27 20:40
112F:→ vocaloid:基本上大家都在笑你 04/27 20:41
113F:→ Peruheru:就跟你說了,或許根本只有你一人認為那是嘲笑 04/27 20:42
114F:→ Peruheru:其他人認為那是「建議」 04/27 20:42
115F:→ Peruheru:有提出具體不正確之處,而不是「爛死了,學什麼程式」這 04/27 20:43
116F:推 green0924:喔~是啊~就群眾暴力嘛~你們這些人就這樣,只會笑別人而已 04/27 20:43
117F:→ Peruheru:種嘲笑的沒建設性發言 04/27 20:43
118F:→ Peruheru:你自己想想看為啥從頭到尾都是你一人在支持嘲笑說好了 04/27 20:44
119F:→ Peruheru:群眾暴力也出來了...不是跟你說不要把那個當嘲笑就好了? 04/27 20:45
120F:→ Peruheru:你確定發問的原PO真的認為自己被嘲笑? 04/27 20:46
121F:推 Peruheru:要是連發問者怎麼認為都還不知道就自顧自的認為「你被嘲 04/27 20:51
122F:→ Peruheru:笑了!」,那或許你才是那個用高姿態看人的人。 04/27 20:51
123F:→ seedpk5079:感謝指導 小弟會再去想辦法研讀 04/27 21:21
124F:推 Yshuan:推這篇的原po 命名跟縮排是很基本的觀念 變數章節一定有講 04/27 21:58
125F:→ seedpk5079:樓上講的我在仿間電腦書上沒看過... 04/28 12:41
126F:推 VictorTom:變數的命名(無誤的話)基本上不影響程式的執行結果.... 04/28 12:44
127F:→ VictorTom:但是對於後續的開發維護有非常舉足輕重的影響.... 04/28 12:45
128F:→ VictorTom:大底來說大家都會說取個有意義/合適的名字, 但是我相信 04/28 12:45
129F:→ VictorTom:許多人或許多派都有自己的style或主張, 比如可以去goo 04/28 12:45
130F:→ VictorTom:一下"匈牙利命名法"; 其實如果code只有自己看, 那麼變數 04/28 12:46
131F:→ VictorTom:你想怎麼取就取吧, 但是要給別人看或者是co-work的時候 04/28 12:46
132F:→ VictorTom:變數的命名是否有意義, 是否follow組織裡慣用的規則就很 04/28 12:47
133F:→ VictorTom:重要. (甚至是每個變數後面的註解與用法可能都是關鍵) 04/28 12:48
134F:→ VictorTom:小弟我的程度沒辦法說明/推薦什麼樣的命名才好, 事實上 04/28 12:48
135F:→ VictorTom:就算是'匈'這種應該也有人認為太過繁複冗長(沒記錯的話) 04/28 12:49
136F:→ VictorTom:argu你的書有沒有講這個沒什麼意義, 不過style各有不同, 04/28 12:50
137F:→ VictorTom:但大家應該都同意好的變數命名習慣很重要; 至於怎樣才算 04/28 12:50
138F:→ VictorTom:不錯的, 等其他的大大推荐參考資料或書籍再看看吧:) 04/28 12:50
139F:→ sunneo:記得以前我們寫大數的時候有個笑話 04/28 13:31
140F:→ sunneo:有個同學抱怨`英文字母不夠多` 因為他變數取 a0~zzz 04/28 13:32
141F:→ sunneo:程式碼已經2000多行了 一個基本的操作都還沒完成 04/28 13:33
142F:→ sunneo:一個for迴圈都沒有 全部用if/else 跟難看的變數硬幹 04/28 13:33
143F:→ sunneo:過沒多久他就直接複製網路上的版本了,說「太長了 看不懂」 04/28 13:35
144F:→ sunneo:自己都看不懂了 怎麼期待幫忙改的人看的懂呢 04/28 13:35
145F:→ sunneo:最後這個同學跑去做VHDL的專題 04/28 13:36
146F:推 leonjye:耐心強者L大 <(_._)> 04/28 14:08
147F:推 tinabjqs:L大真是佛心~而且回答的很仔細耶 04/28 17:53