c++的取中間值問題

2009-09-23 7:58 am
取最大最小我都會

取中間值呢?

回答 (5)

2009-09-24 5:39 am
✔ 最佳答案
#include <iostream>
using namespace std;
int main()
{
const int max = 13;
int counti, countj, buffer = 0;
int low=0, high=max-1, middle;
int number[max] = {37,5,84,92,10,49,56,81,63,21,75,52,13};
cout << "排序前:";
for (counti = 0; counti < max; counti++)
cout << number[counti] << '\0';
///////////////////////////////
for (counti = 0; counti < max-1; counti++)
for (countj = counti; countj < max; countj++)
if (number[counti] > number[countj])
{
buffer = number[counti];
number[counti] = number[countj];
number[countj] = buffer;
}
cout << "\n排序後:";
for (counti = 0; counti < max; counti++)
cout << number[counti] << '\0';
cout<<endl;
do
{
if ((low + high) % 2 > 0.5)
{
middle = (low + high) / 2 + 1;
cout << "無中間值" << endl;
break;
}
else if((low + high) % 2 == 0)
{
middle = (low + high) / 2;
cout << "中間值為:" << number[middle];
cout<<endl;
break;
}
}while(low <= high);
system("pause") ;
return 0;
}

我是用二分搜尋法的概念去修改的
有問題可以補充喔~
參考: 我&C++
2009-09-24 4:34 am
回答者用 #define / 0 製造 NaN,有多重缺點!

1. NaN 至少分二大類!
  / 0 的, r == r !另一類的 r != r
 要小心!

2. 兩類 NaN 都會引發 exception,會使程式變慢!
 非必要,不要用 NaN 做錯誤訊號!


其它較不重要的不良,就不挑毛病了。
在這裡指出,只是要讓大家小心 NaN 的使用,
不是要與人樹敵/給人難堪。

2009-09-24 07:22:13 補充:
NaN 基本上分可續繼和不可續繼(有更正確的說法,懶得查)二類。
可〝視〞為 無限大 (0 / 0) inf 和 無定義 ( sqrt (-1) ) ind,各又分 正負。
它們都稱為 NaN: Not A Number
印象中,
 inf + 1 = inf
 inf - 1 = inf
 inf == inf
 ind != inf
 ind != ind
這些小細節,在使用上,要小心。

2009-09-24 07:22:33 補充:
這四〝個〞 NaN,在 float 或 double 上,各有數萬個值被定義成它們!

因為 IEEE 對 NaN 並沒有做唯一性的定義!
所以,各 compiler 可能會有差異!
當存成 bin 傳檔時,可能會有問題!
非必要,不建議使用。


會變慢的原因,在 IEEE 定義它們為 exception!
程式/FPU 是經由 exception handling 來處理它們的!
所以,會繞一圈再回來,並設定 errno!


要用它,建議用
int i = 0;
double inf = 1. / i; // 或加上 const
讓它一定被定義處理,不要用 define 每次繞!

= = = =

2009-09-24 07:22:48 補充:
正確:
 qSortCop 在非整數時,不可直接相減就傳回!!
 比較的順序是對的!!

不良,如:
qSortCmp 應該用一個 double 記下相減值,再用那值去比。

a[0] 〝可〞用 *a

sizeof 盡量用 變數,不要用 形態

/ 2 盡量用 >>1

% 2 盡量用 &1

printf 裡 %lf 等於 %f,用 %f 就好

2009-09-24 07:48:25 補充:
還有,是不是本科系,不會很重要!

就算是本科系,那又怎樣?大學四年+碩士三年,才七年!
就一定能贏非本科系二十年?
別痴人作夢!


重點是:有沒有心學、是不是這方面的白痴!

我就是個中文白痴!上大學前,一半以上的時間是在讀中文!
結果,
 高中聯考,國文 滿分 200,才考 108!
 大學考考,忘了,好像在 30左右!
 插班四所國立大學,物理、微積分,都在 95以上,英文也在 80以上!
  不過,那偉大的國文,都在 10分左右!
像我這種頂級中文白痴,要找到還不太容易!

2009-09-24 07:48:40 補充:
這個版面還很活動、程式能力和我各有千秋的人中,
我知道非本科系的,至少有三人!
(目前腦中另外至少有二位,不知是否本科系,還有一位是本科系)



本科系的輸人,那才叫丟臉!
本科系弄了超過 27年才贏人這麼半點,也很丟臉!!

2009-09-24 08:01:39 補充:
= = = =(以下與回答者無關)

一個程式師若只有心寫小程式,那就別把自己定位為高手!

沒有任何一個高速、高品質的演算法,適用在小地方的!
同樣,沒有任何一個簡單的做法,拿到中/大/巨型程式裡,可以見人!

從來不練習、思考中/大/巨型程式的人,只能做井底蛙!


不少公司,發展初期,都用小東西的做法(再加上向錢看!)!
一但發展大了,程式動彈不得!
才會有〝如何重構程式〞的問題!
公司內部再來吵翻天!


短視近利,必遭未來大痛!

2009-09-24 11:32:55 補充:
忘了一件事,感謝東大提醒:
0 / 0 是 Ind
1 / 0 是 Inf

所以,這題用的是 Ind,可以處理;

但,無論如何,使用 NaN 都要很小心!

2009-09-24 11:54:52 補充:
忘了說:我很懶!
Inf 對我而言,是一種 NaN
所以,
NaN 本身分 Singal 和 Quiet兩類!
加上我把它混進的 Inf,計至少三類。

除非要鑽研 Inf, sNaN, qNaN,不然,沒事不要用

2009-09-24 12:23:17 補充:
你是用 define 的!
所以, r != r → (0/0) != (0/0):至少二次!


而 ind != ind 會不會引發 excep? 應該不會!
所以我才說要用
i = 0;
double = 0 / i;

之後,就不會

= = = =

但 inf sNaN, qNaN 都是例外!
只要它們一出現,compiler 本身就要繞路!
(如: ind != ind!正常哪有這東西?)

所以,沒事不要主動製造/使用 inf, sNaN, qNaN!
會有問題!
不小心用到,算了。
2009-09-24 2:38 am
我也是覺得先排序,演算法搞得太複雜可能不太好…。
2009-09-24 12:46 am
另有不排序求得中位數之法。
方法一:二分逼近,有QuickSort的影子。
方法二:用MaxHeap。

2009-09-23 19:34:35 補充:
演算法是否複雜,就像酸甜苦辣的感覺各人的感受度不同。亦如排列組合,對國小生很複雜,但對某種程度以上者可能不算什麼。

002 所揭二法,個人便覺得一點也不複雜 ,道理簡單,平均效率比排序(含 QSort )的好。

物盡其用,各適其所。初學者當然用排序法比較易懂。

但有心進取者,或可把它當成一個修鍊的題材,就像對ACM的挑戰即是一例。演算法不當者,常會逾時。
理由是:程式寫到一定程度時,若不鑽研演算法,很難跨越「高原」障礙!

另,動輒合理化,也會成為追求進步的跘腳石!
2009-09-23 11:36 pm
先排序吧

2009-09-23 15:36:46 補充:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>

#define err (0.0/0.0) /*定義err為無定義*/

int intcmp(const void* a,const void *b) /*比較double資料型態大小的函數,供qsort函數使用*/
{
if(*(double*)a > *(double*)b)
return 1;
if(*(double*)a < *(double*)b)
return -1;
return 0;
}
double GetMid(double a[],size_t size) /*回傳中間值函數,若為雙數資料回傳最中間的兩個平均值,若發生錯誤回傳err*/
{
if(size==0)
return err;
if(size==1)
return a[0];
double *b=(double*)malloc(sizeof(double)*size);
double result;
if(b==NULL)
return err;
memcpy(b,a,sizeof(double)*size);
qsort(b,size,sizeof(double),intcmp);
if(size%2==0)
result=((double)(b[size/2]+b[size/2-1]))/2.0;
else
result=(double)b[size/2];
free(b);
return result;
}
int main()
{
double a[]={4,17,9,87,58}; /*單數個資料*/
double b[]={4,8,6,3,5,7}; /*偶數個資料*/
printf("陣列a之中間值為%8.2lf\n",GetMid(a,sizeof(a)/sizeof(double)));
printf("陣列b之中間值為%8.2lf\n",GetMid(b,sizeof(b)/sizeof(double)));
printf("以下嘗試傳一個沒資料的陣列...\n");
double r;
r=GetMid(a,0);
if(r!=r) /*無定義的特色在自己不等於自己*/
printf("陣列a沒有元素或程式錯誤\n");
else
printf("陣列a之中間值為%8.2lf\n",r);
printf("請按enter結束...");
getchar();
return 0;
}

2009-09-23 23:44:20 補充:
恩,其實我也是今天才知道有NaN這玩意兒的
不過還是不知道該回傳什麼值比較好…

可以偷偷問一下1.0/0.0這種正無限大也會讓程式變慢嗎?
是否可考慮用來當錯誤回傳值?

2009-09-23 23:48:39 補充:
其他不良處也歡迎指教
我雖非本科系學生但對這部分感興趣

2009-09-24 12:00:46 補充:
類nan都會引發exception
那我想問:
double a=0.0/0.0;
double b=a;
if(a==b)printf("Equal");
這段會引發幾次exception阿?

其實是想知道一些nan作運算時是否每個運算都會引發exception

例如 = 這個運算
他其實只要複製記憶體的內容就可以了
應該不用考慮exception吧?

還有==運算,一般來說也是比較記憶體內容
但是inf跟ind是有很多數對應到的,所以會引發exception

不知道我上面的想法對不對

2009-09-24 12:01:34 補充:
上面第一個字是多打的


收錄日期: 2021-04-27 17:15:31
原文連結 [永久失效]:
https://hk.answers.yahoo.com/question/index?qid=20090922000010KK09555

檢視 Wayback Machine 備份