Re: [問題] 請問初學C語言推薦書(文長

看板C_and_CPP (C/C++)作者 (Losepacific)時間7年前 (2018/05/11 01:06), 7年前編輯推噓-1(012)
留言3則, 2人參與, 7年前最新討論串5/7 (看更多)
※ 引述《Neisseria (Neisseria)》之銘言: : 不預先將陣列排序的話,大概就是 O(n) : 以下提供一個 C 的版本: : #include <assert.h> : #include <stddef.h> : // Yet another linear search. : #define max(sz, arr, out) do { \ : if (sz <= 1) { \ : out = arr[0]; \ : break; \ : } \ : out = arr[0]; \ : size_t i; \ : for (i = 1; i < sz; i++) { \ : out = arr[i] > out ? arr[i] : out; \ : } \ : } while (0); : int main(void) { : int arr_i[] = {4, 2, 5, 1, 3}; : int max_i; : max(5, arr_i, max_i); : assert(max_i == 5); : float arr_f[] = {2.2, 3.3, 1.1, 5.5, 4.4}; : float max_f; : max(5, arr_f, max_f); : assert(max_f == 5.5); : return 0; : } : 這是寫好玩的,考試不要這樣寫,這樣只是在搞自己 : 有寫過一些 C 的就知道原因 看了大大的程式碼才想到有可能會遇到小數。 所以修改了自己之前寫的程式碼,改完如下: #include <stdio.h> #include <stdlib.h> float max(char**, int); int main(int argc, char* argv[]){ printf("%f\n", max(argv+1, argc-1)); return 0; } float max(char** ap, int limit){ if (limit == 1) return atof(*ap) ; float tmp; return atof(*ap) > (tmp = max(ap+1, limit-1)) ? atof(*ap) : tmp; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.9.170.26 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1525971979.A.254.html

05/11 01:43, 7年前 , 1F
忘了考慮不給參數的狀況了!!
05/11 01:43, 1F

05/11 05:13, 7年前 , 2F
當你個版?
05/11 05:13, 2F

05/11 05:14, 7年前 , 3F
不會使用大E兩篇合在一起?
05/11 05:14, 3F
好喔。 我有試著刪多貼的文章,但這個版禁止個人自刪, 那先把下篇文章的內容謄過來這邊, 再麻煩板主們刪文了(寫在這邊會他們會看到嗎?) 下篇文章(多貼的): ======================== 再修改: #include <stdio.h> #include <stdlib.h> float max(char**, int); int main(int argc, char* argv[]){ if (argc > 1) printf("%f\n", max(argv+1, argc-1)); return 0; } float max(char** ap, int limit){ if (limit == 1) return atof(*ap) ; float a, b; int frontside = limit/2; int backside = limit-frontside; return (a=max(ap, frontside)) >= (b=max(ap+frontside, backside))?a:b; } 不過,浮點數很不可靠,測試的狀況如下: $ ./max 1 2 3 4.5 4 5 5.3 123213.131231 23.323 132424345655.6 132424343552.000000 =========================== 另外,後來還想到,如果把函數寫成返回指標, 輸出就可能保有原本參數的格式。 在想如果要提高精確度, 可能要把字串從小數點的部分切開, 小數點前轉成整數, 小數點後面轉成浮點數。 先比較整數部分,再比較小數部分。 或者小數點後面反轉字串存成整數, 從個位數開始比較。 ※ 編輯: losepacific (39.9.170.26), 05/11/2018 21:05:14
文章代碼(AID): #1Qz7mB9K (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Qz7mB9K (C_and_CPP)