看板 C_and_CPP 關於我們 聯絡資訊
各位好,我是目前還在學習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
james732:我看不懂 if(*(arr+i) < *(arr+min_odd) ) 是什麼... 05/02 02:03
james732:另外你可以單純的寫兩個數字交換的程式碼出來嗎? 05/02 02:04
james732:譬如交換 arr[0] 跟 arr[1] 你會怎麼寫? 05/02 02:04
交換的話 int temp; temp=arr[0]; arr[0]=arr[1]; arr[1]=temp;
VictorTom:還沒看出來0怎麼冒出來的, 但是第二個for很明顯少個else 05/02 02:05
VictorTom:他應該是把min_odd不小心既當arr index記錄又當成值的記 05/02 02:06
VictorTom:錄了; 看起來原本應該是想記錄值, 然後最後直接取代arr 05/02 02:07
VictorTom:的內容. 05/02 02:07
james732:你的交換是對的,那麼只要你找出兩數的index,交換何難? 05/02 02:07
james732:你的 min_odd, min_even 是存index還是存值呢? 05/02 02:08
VictorTom:odd/even兩變數要想清楚用途, 要嘛拿來記index, 要嘛拿 05/02 02:09
VictorTom:來記錄值:) 05/02 02:09
VictorTom:無論記值或index, 記得要給予一個合適的初值@_@" 05/02 02:10
我一開始是將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 出來的
james732:不是要找最大偶數與最小奇數嗎?為什麼都是跟0比呢? 05/02 02:22
我是想說 一開始將那兩個先設為0 如果比他大(小) 就會替換掉 因為有for,所以arr[i]的值應該是一直會往下輪吧@@ (EX:arr[0] arr[1] arr[2].....這樣下去 直到迴圈結束這樣)
loveme00835:沒有把演算法想好就直接寫程式了, 所以問題變成在改程 05/02 02:26
loveme00835:式而不是改演算法, 所以自己出了啥錯也不清楚 05/02 02:26
loveme00835:用紙筆寫出一段和 C語言無關的敘述來完成題目, 你很快 05/02 02:28
james732:我建議原po先用紙筆想清楚流程吧,目前問題真的挺多的 05/02 02:28
loveme00835:就會知道問題出在哪邊 05/02 02:28
james732:喔喔我跟板主想的一樣耶 XDDD 05/02 02:28
james732:我本來想給一些提示,但寫一寫發現整個答案都冒出來了orz 05/02 02:29
我的想法是 應該要先判斷出陣列中的 奇數&偶數 → 然後找出最大偶數&最小奇數 →最後將兩者的位置互換 →回傳後得到答案 不知道這樣有沒有錯
VictorTom:推樓上j大與板主XD 原po再仔細想想, 你的odd/even的用途 05/02 02:30
VictorTom:是不是錯亂了; Ex: odd=0? *(arr+odd)? odd=arr[i]? 05/02 02:33
james732:你目前的想法是對的,再想細膩一點 05/02 02:37
loveme00835:你的敘述還沒有到能轉成程式碼的程度, 還需要拆解 05/02 02:42
先在外圍用一個迴圈(for)→然後用一個if來判斷奇數、一個if判斷偶數→接著在判斷 奇數的if裡面再多一個if用來判斷最小的奇數、 偶數的if裡面也多用一個if來判斷最大的偶數 然後…如果要互換位置的話 就要用類似上面的一開始打出來的那種互換方法 但是到這裡好像就卡住了~"~ ※ 編輯: koei6200 來自: 125.230.77.156 (05/02 02:52)
zhengdavy:你min_odd都設0了arr+i怎麼可能在比他小? 05/02 03:44