看板 C_and_CPP 關於我們 聯絡資訊
用推的沒很方便,發個文修一下 ※ 引述《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