[問題] 關於函數、陣列 互換問題

看板C_and_CPP (C/C++)作者 (雲牙刃)時間15年前 (2011/05/02 02:01), 編輯推噓3(3022)
留言25則, 4人參與, 最新討論串1/3 (看更多)
各位好,我是目前還在學習C語言的新手 最近我碰到了一個問題 題目是:讀入一維整數陣列元素(元素個數<=5,陣列中至少各有一個奇數和偶數) 再自行定義一個函數void MyOddEven(int *arr) 以求出一維陣列arr中最大偶數與最小奇數並將位置調換 請在主程式中呼叫MyOddEven ( )函數並輸出最後的結果 範例: 輸入:12 90 81 17 輸出:12 17 81 90 void MyOddEven(int *arr) { int min_odd=0, min_even=0, i; for(i=0;i<count;i++) { if( *(arr+i) %2 != 0) { if(*(arr+i) < *(arr+min_odd) ) { min_odd = *(arr+i); } } if( *(arr+i) %2 == 0) { if(*(arr+i) > *(arr+min_even) ) { min_even = *(arr+i); } } } for(i=0;i<count;i++) { if( *(arr+i)==min_odd ) *(arr+i)=min_even; if( *(arr+i)==min_even ) *(arr+i)=min_odd; } } main裡面的東西 如果有需要我在附上 上面的是只有另外的函數的程式碼 我自己打出來的是這樣 偵錯的時候是沒問題 但是實際執行的時候 輸出卻是:12 0 81 17 題目是限定要用函數的 有點不知道該怎麼改 想請教板上的大大幫忙 有想過另外多宣告一個TEMP之類的 然後用互換的方式下去改 但是不知道要怎麼下手 感謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.230.77.156

05/02 02:03, , 1F
我看不懂 if(*(arr+i) < *(arr+min_odd) ) 是什麼...
05/02 02:03, 1F

05/02 02:04, , 2F
另外你可以單純的寫兩個數字交換的程式碼出來嗎?
05/02 02:04, 2F

05/02 02:04, , 3F
譬如交換 arr[0] 跟 arr[1] 你會怎麼寫?
05/02 02:04, 3F
交換的話 int temp; temp=arr[0]; arr[0]=arr[1]; arr[1]=temp;

05/02 02:05, , 4F
還沒看出來0怎麼冒出來的, 但是第二個for很明顯少個else
05/02 02:05, 4F

05/02 02:06, , 5F
他應該是把min_odd不小心既當arr index記錄又當成值的記
05/02 02:06, 5F

05/02 02:07, , 6F
錄了; 看起來原本應該是想記錄值, 然後最後直接取代arr
05/02 02:07, 6F

05/02 02:07, , 7F
的內容.
05/02 02:07, 7F

05/02 02:07, , 8F
你的交換是對的,那麼只要你找出兩數的index,交換何難?
05/02 02:07, 8F

05/02 02:08, , 9F
你的 min_odd, min_even 是存index還是存值呢?
05/02 02:08, 9F

05/02 02:09, , 10F
odd/even兩變數要想清楚用途, 要嘛拿來記index, 要嘛拿
05/02 02:09, 10F

05/02 02:09, , 11F
來記錄值:)
05/02 02:09, 11F

05/02 02:10, , 12F
無論記值或index, 記得要給予一個合適的初值@_@"
05/02 02:10, 12F
我一開始是將min_odd & min_even都=0 然後再用for判斷奇數&偶數 接著是讓他們來讓 arr[i]和min_odd & min_even 比大小 如果條件符合 那 min_odd & min_even 就會 =arr[i] 另外想請問一下 第二個for 少了else 會出問題嘛 因為我之前寫程式的時候 都沒有用else 然後關於arr的數,是用讀檔+fscanf出來的 輸出則是用 for+printf 出來的

05/02 02:22, , 13F
不是要找最大偶數與最小奇數嗎?為什麼都是跟0比呢?
05/02 02:22, 13F
我是想說 一開始將那兩個先設為0 如果比他大(小) 就會替換掉 因為有for,所以arr[i]的值應該是一直會往下輪吧@@ (EX:arr[0] arr[1] arr[2].....這樣下去 直到迴圈結束這樣)

05/02 02:26, , 14F
沒有把演算法想好就直接寫程式了, 所以問題變成在改程
05/02 02:26, 14F

05/02 02:26, , 15F
式而不是改演算法, 所以自己出了啥錯也不清楚
05/02 02:26, 15F

05/02 02:28, , 16F
用紙筆寫出一段和 C語言無關的敘述來完成題目, 你很快
05/02 02:28, 16F

05/02 02:28, , 17F
我建議原po先用紙筆想清楚流程吧,目前問題真的挺多的
05/02 02:28, 17F

05/02 02:28, , 18F
就會知道問題出在哪邊
05/02 02:28, 18F

05/02 02:28, , 19F
喔喔我跟板主想的一樣耶 XDDD
05/02 02:28, 19F

05/02 02:29, , 20F
我本來想給一些提示,但寫一寫發現整個答案都冒出來了orz
05/02 02:29, 20F
我的想法是 應該要先判斷出陣列中的 奇數&偶數 → 然後找出最大偶數&最小奇數 →最後將兩者的位置互換 →回傳後得到答案 不知道這樣有沒有錯

05/02 02:30, , 21F
推樓上j大與板主XD 原po再仔細想想, 你的odd/even的用途
05/02 02:30, 21F

05/02 02:33, , 22F
是不是錯亂了; Ex: odd=0? *(arr+odd)? odd=arr[i]?
05/02 02:33, 22F

05/02 02:37, , 23F
你目前的想法是對的,再想細膩一點
05/02 02:37, 23F

05/02 02:42, , 24F
你的敘述還沒有到能轉成程式碼的程度, 還需要拆解
05/02 02:42, 24F
先在外圍用一個迴圈(for)→然後用一個if來判斷奇數、一個if判斷偶數→接著在判斷 奇數的if裡面再多一個if用來判斷最小的奇數、 偶數的if裡面也多用一個if來判斷最大的偶數 然後…如果要互換位置的話 就要用類似上面的一開始打出來的那種互換方法 但是到這裡好像就卡住了~"~ ※ 編輯: koei6200 來自: 125.230.77.156 (05/02 02:52)

05/02 03:44, , 25F
你min_odd都設0了arr+i怎麼可能在比他小?
05/02 03:44, 25F
文章代碼(AID): #1DlP_iaL (C_and_CPP)
文章代碼(AID): #1DlP_iaL (C_and_CPP)