English Deutsch Français Italiano Español Português 繁體中文 Bahasa Indonesia Tiếng Việt ภาษาไทย
所有分類

我想將陣列中的值利用函式加個數
可是我寫出來的變成只有最後一個數加上
請教各位一下
程式碼如下
#include
int f(int x[]);
void main()
{
int w,a[]={2,1,7,9,5,6};
for(w=0;w<6;w++)
{printf("%d \n",f(a));

}
}
int f(int x[])
{int s,i;
for (s=0;s<6;s++)
{x[s]=x[s]+10;
i=x[s];
}
return i;
}

2007-01-13 14:08:25 · 2 個解答 · 發問者 Jack 2 in 電腦與網際網路 程式設計

To:藍色水瓶
為什麼是用f(a,w)而不是f(a)呢?
麻煩替我這個阿呆解答一下@@
感謝兩位的回答^^

2007-01-15 02:57:56 · update #1

2 個解答

int f(int x[],int s)
{
x[s]=x[s]+10;
return x[s];
}
printf("%d\\n",f(a,w));

2007-01-15 08:44:38 補充:
每次進入函式 迴圈都會執行一輪
出來的結果只有陣列的最後一個
所以把函式內的迴圈拿掉
反正沒用到

2007-01-13 19:04:35 · answer #1 · answered by poolqa 3 · 0 0

#include
#include

void f(int x[])
{int s;
for (s=0; s<6; s++)
x[s] += 10;
}

void main()
{ int w, a[]={2,1,7,9,5,6};
f(a);
for(w=0; w<6; w++)
printf("%d\\n", a[w]);
system("pause");
}
你錯在:
你印出的是副程式傳回值。
 而副程式每次都把 a從第0個到第5個都加10,
 而傳回值 i 是第5個 a 加10的值。

2007-01-14 00:24:34 補充:
這種寫法不太好,一不小心,就會算超過足標的大小。

如:你將來把 a[] 改成了 {2, 1, 7, 9} (少了 5, 6兩個值),
而你只記得改主程式 w<4,忘了改副程式 s<4!

方法一:藍色水瓶的方法。副程式只處理主程式指定的那一個值。
優點:簡單,而且絕不會有副程式漏改的問題。
缺點:1. 多傳一個參數,較慢。
   2. 現代的CPU和Compiler往往可以幫你加速。
    你例子剛好就可。
    但藍色水瓶法,Compiler沒辦法幫你加速。

2007-01-14 00:24:56 補充:
方法二:Jacob Lee 法。沒有藍色水瓶法的缺點,但有Lori法的危險!
解決之道:請Compiler幫你處理!
 方法 1. 設個全域變數 (Global Variable, GV):
    int array_size;
    副程式用 s     主程式加 array_size = sizeof(a) / sizeof(*a); // 加 f(a)之前
       改 w   缺點:1. 資料曝光:這是 GV 的缺點!
     2. 程式較慢一小點:GV的速度〝有時候〞會比區域變數慢一小點!

2007-01-14 00:28:43 補充:
 方法 2. 用 OO。OO沒有方法 1. 的缺點。
  缺點:1. 個人認為OO較難學。
     2. OO的程式較難Compiler,因此程式較大,且執行速度較慢。
  OO人的說法:正確性遠比那一點速度差別重要。
  個人觀點:因程式大小不同,慎選該用 OO 或 非 OO 語言。

2007-01-15 08:39:50 補充:
藍色水瓶把你的副程式改寫成一次只算你要算的那一個 element 的值,
 而不是算整個陣列的值。

所以,要告訴副程式:我現在要算哪一個。

2007-01-13 19:10:49 · answer #2 · answered by ? 7 · 0 0

fedest.com, questions and answers