作者tropical72 (藍影)
看板C_and_CPP
標題Re: [問題] 泡泡排序法 用double定義資料型態 無法 …
時間Sat Aug 13 14:07:49 2011
用推的沒很方便,發個文修一下
※ 引述《Adee (Adee)》之銘言:
: 當我改回用float來定義資料型態時
可能要了解 double / float 在 printf / scanf 時的引數型態
double x;
scanf("%lf", &x), printf("x=%lf\n", x);
上面是小寫的 LF,而非 ONE-F。
float y;
scanf("%f", &y), printf("y=%f\n", x);
-----
我沒記錯的話,scanf 才有必要區分 %lf 與 %f
printf 可不必區分,但認為好的習慣是,不論 printf / scanf 都用 %lf / %f 區分。
----
原本的程式碼有不少問題,(扣掉 VLA 方式使用是個爭議點),全都犯在同一點:
當宣告為 int A[100] 時,實際可以用的範圍是 A[0]~A[99],不可用到 A[100]
也就是說,當宣告成 double num[SIZE] 時,可用範圍是 num[0]~num[SIZE-1],
所以 loop 、array index 邊界通常會再特別注意到,
下面有問題的地方標過
scanf("%d", &SIZE);
double num[SIZE];
for(k=1; k<=SIZE; k++) scanf("%f", &num[k]);
/* 這段全錯 */
/* 改成這樣 - for(k=0; k<SIZE; k++) scanf("%lf", &num[k]); */
for(i=1; i<=SIZE; i++)
for(j=i; j<SIZE; j++)
if(num[i]>num[j+1]) num[i] = num[i];
/* i=SIZE 時,num[SIZE] 違規 */
else {
temp = num[j+1];
/* j=SIZE-1時 num[j+1] 違規 */
num[j+1]=num[i];
/* j=SIZE-1時 num[j+1] 違規 */
num[i]=temp;
}
不知是不是我誤會,我以為這比較像 Select Sorting,
Bubble Sorting 是相鄰兩個元素在做比較方式排序。
----
原程式碼有些動作雖有些多餘,此處一起改過
修改後大致如下
scanf("%d", &SIZE);
double num[SIZE];
for(k=0; k<SIZE; k++) scanf("%lf", &num[k]);
for(i=0; i<SIZE-1; i++)
for(j=i+1; j<SIZE; j++)
if(num[i] < num[j]) {
/* 只要寫一個 if 就行了 */
temp = num[i];
/* 做交換動作 */
num[i] = num[j];
num[j] = temp;
}
一開始不熟的話,我建議把 i, j 邊界值都帶入 array 裡面,看有沒有超界。
i=0 , num[i]=num[0] , 合法
i=SIZE-2 , num[i]=num[SIZE-2] , 合法
j=i+1 , num[j]=num[i+1]
if i=0 , num[i+1]=num[1] , 合法
if i=SIZE-2 , num[i+1]=num[SIZE-1], 合法
其他排序法邏輯若有問題,就先看看書吧。
--
When I saw the turth of love,
I feel the pain which the world brings to me.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 180.177.78.41
→ Favonia:不用區分的原因是因為float用在那裡會自動轉型成double xD 08/13 14:11
→ Favonia:也就是說實際上都是傳double但printf會幫你轉回來。類似的 08/13 14:11
→ Favonia:東西還有%c也是要幫你轉回來,因為實際上不是傳char... 08/13 14:12
→ tropical72:F大說的應是printf那不區分,個人習慣是即使做printf還 08/13 14:12
→ tropical72:是區分,不然到時 trace 很不方便. 08/13 14:12
※ 編輯: tropical72 來自: 180.177.78.41 (08/13 14:13)
→ Favonia:我同意你的看法。我個人覺得這種轉型只是為了跟以前相容xD 08/13 14:14
推 Adee:真是太感謝T大了!!我完全沒注意到陣列是從A[0]開始... 08/13 14:32
→ Adee:還有%lf=>double ; %f=>float 我也都忘記了... 08/13 14:33
→ Adee:感謝前輩們花時間替小弟看程式碼~ 08/13 14:33
→ firejox:其實這是select sort沒錯XD 08/13 22:37