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

看板C_and_CPP作者 (Losepacific)時間6年前 (2018/05/11 02:57), 編輯推噓0(001)
留言1則, 1人參與, 6年前最新討論串6/7 (看更多)
※ 引述《losepacific (Losepacific)》之銘言: : ※ 引述《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; : } 再修改: #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 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 39.9.170.26 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1525978650.A.560.html

05/11 21:06, 6年前 , 1F
求刪。
05/11 21:06, 1F
文章代碼(AID): #1Qz9OQLW (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Qz9OQLW (C_and_CPP)