2012-12-12 67 views
0

這是一個問題: 編寫一個函數MINMAX有五個參數的定義。前三個參數是整數。最後兩個由函數設置爲前三個參數的最大值和最小值。該函數不返回值。指針,C++代碼...不工作

該功能可用於如下:

int a = 31, b = 5, c = 19, big, small; 
minMax(a, b, c, &big, &small); /* big is now 31; small is now 5 */ 

這是我的代碼:

void minMax(int x, int y, int z, int* big, int* small) 
{ 
    if (x < y && x < z) 

    *small = x; 

    else if (y < x && y < z) 

    *small = y; 

    else if (z < x && z < y) 

    *small = z; 

    if (x > y && x > z) 

    *big = x; 

    else if (y > x && y > z) 

    *big = y; 

    else if (z > x && z > y) 

    *big = z; 
    } 

這是我得到的錯誤:

您的功能並沒有改變值爲small。確保您在函數中取消引用它。

不知道有什麼問題嗎?

謝謝。

+0

的問題指出,你應該使用的簽名:'MINMAX(A,B,C,及大,小和)' – irrelephant

+0

@irrelephant,哎呀,沒趕上那一部分。我的眼睛不喜歡讀無格式的代碼。 – chris

+1

這編譯並給我所需的輸出.. – goji

回答

6

我看到一個立即問題。

當您通過數字117時,您認爲會發生什麼?

也許您可能要考慮使用<=>=而不僅僅是<>

由於該錯誤信息看上去一點也不像我以前見過的任何編譯器錯誤(和代碼有效的語法),我建議的消息是從一個測試工具這可能到來:

  • big/small的值設置爲除傳入的數字以外的數字(例如,-9999)。
  • 用測試數據調用函數(例如,1,1,7)。
  • 檢查輸出變量以確保它們已更改爲正確的值。

此外,它不是世界上最可讀代碼(沒有犯罪意圖)。如果你能夠以一目瞭然的方式構建你的代碼(包括適當的評論),那麼你將會有大量的未來程序員唱歌讚美你的名字:-)

這樣的事情顯示出比很多那些else if結構的意圖稍微清楚(IMNSHO):

// Populate big/small based on max/min of x, y and z. 

void minMax (int x, int y, int z, int *big, int *small) { 
    // Set by default to x, only change if others are bigger. 

    *big = x; 
    if (y > *big) *big = y; 
    if (z > *big) *big = z; 

    // Same for small but with reversed comparisons. 

    *small = x; 
    if (y < *small) *small = y; 
    if (z < *small) *small = z; 
} 
+0

+1。我本人即將提及這一點。 – jimhark

+0

我試過了,但仍然沒有工作 – Alti

+0

編輯:劃痕,我的格式已關閉。現在就工作,謝謝! – Alti

4

我不知道什麼是不工作的。這似乎基本上可以工作,但可以更好的結構。

也許是這樣的:

void minMax(int x, int y, int z, int* big, int* small) 
{ 
    *big = *small = x; 

    if (y > *big) 
     *big = y; 
    if (y < *small) 
     *small = y; 
    if (z > *big) 
     *big = z; 
    if (z < *small) 
     *small = z; 
    } 
+0

這也解決了paxdiablo答案的問題。 – goji

+1

-1它絕對*不好*爲家庭作業提供完整的代碼解決方案。答案也沒有解釋原始代碼有什麼問題。事實上,它說你不知道它有什麼問題,所以如果提供的代碼確實起作用,那就是碰巧。 –

+1

我想你錯過了那裏的幾件事,但無論如何。做你喜歡的事。 –

0

錯誤消息

您的功能沒有改變small值。確保您在函數中取消引用它。

&hellip;似乎來自您的老師提供給您的測試工具。

不管怎麼說,這是正確的:有,你可以選擇在您的函數將分配什麼*small值。

例如,abc相同價值,你的函數將什麼都不做。


反正

爲未來的問題,請提供證明這一問題的完整的示例程序

這樣人們就不必去猜測和使用不可靠的心靈感應。


此外,轉讓要求你實現與解精簽名功能。

它教壞的方式™設計功能。

這裏是一個可能的普通C++函數簽名:

void getMinAndMax(int& smallest, int& largest, int a, int b, int c) 

這裏是現代C++技術更加美好的簽名:

std::pair<int, int> minAndMax(int a, int b, int c) 

後者函數的名字沒有get前綴是因爲它是一種面向表達式的功能,如sincos(你不會寫getSingetCos,你會嗎?),而前綴的存在爲FIR st函數僅僅是使名稱勢在必行,以反映它不是一個面向表達的函數,而是一個行爲定向的函數。

當然,用C++ 11一個先給函數接受任何數量的參數。除此之外,Visual C++還沒有正確支持這一點。例如,這裏是std::min從C++ 11標準庫的簽名:

template<class T, class Compare> 
T min(initializer_list<T> t, Compare comp); 

用C++ 03一個能做到這一點通過接受單個容器參數模板類型的,某種程度的