2010-08-18 68 views
1

我對C++比較陌生,來自Python的開心世界。如何從C++中的char *獲取浮點數?

我決定編寫一組函數來查找一組數字的均值,中值,模式和範圍。爲了幫助計算中位數,我決定讓l2g(最小到最大)和g2l(最大到最小)。我知道我只會使用其中的一種,但爲了完整起見,我們只想使用其中之一。

我希望我的程序儘可能少依賴外部(甚至是標準)庫。原因是我很可能會使用我再次寫入的任何函數。它們將用於我正在基於BrokenThorn上的教程開發的操作系統。因此,我希望儘可能使代碼儘可能獨立,使用我編寫的函數而不是標準庫中的函數。

我有兩個問題:

  • 首先,我希望我的功能,能夠處理浮點值。用我之前創建的用戶輸入函數,我得到一個指向char數組的指針。我需要知道如何將其轉換爲浮點值。我在想,也許我可以創建一個包含char和float類型的兩個成員的聯合體,並在需要使用該值時引用float成員。我只是將用戶數據放入char成員中。但是,我不知道這種方法是否可行。我使用的教程並沒有深入地定義我自己的數據類型。
  • 我的第二個困境是我不知道如何創建l2g和g2l函數。我打算嵌套兩個for循環。我打算使用裏面的一個來尋找新數組中的下一個數字,而外面的數字要重複這個過程,直到它通過原始數組中的所有數字。然後該函數會在刪除第一個數組的動態內存後返回一個指向新數組的浮點數的指針。

另一個問題是,我想我需要返回一個數組的長度,當我返回一個指針。原因在於,要使用for循環遍歷數組的內容,我需要在數組中使用最高的位置,所以我不會被垃圾回收。我有一種方法可以通過創建一個具有兩個成員,長度和數組的結構來避免此問題。它看起來像這樣:

struct arrayLength { 
    int l; 
    float * p; 
} ; 

我希望下面的一組電話:

float * myArrayPointer; // I will change this to user input once I get the rest of the program working 
myArrayPointer = new float[5]; 
myArrayPointer[0] = 65.97; 
myArrayPointer[1] = 21.06; 
myArrayPointer[2] = 21.06; 
myArrayPointer[3] = 509.69; 
myArrayPointer[4] = -41.73; // Can floats be negative? 
cout << mean(myArrayPointer, 5); // Give function mean the pointer to array and number of elements 
cout << "\n"; 
cout << median(myArrayPointer, 5); 
cout << "\n"; 
cout << range(myArrayPointer, 5); 
cout << "\n"; 
cout << mode(myArrayPointer, 5); 
cout << "\n\n\n"; 
arrayLength myArrayPointerLG = l2g(myArrayPointer, 5); 
float * myArrayLGitem; 
for(int i=0;i<myArrayPointerLG.l;i++) { 
    myArrayLGitem = myArrayPointerLG.p[i]; 
    cout << myArrayPointerLGitem << "\n"; 
} 

將給予以下的輸出:

115.21 
21.06 
551.42 
21.06 

-41.73 
21.06 
21.06 
65.97 
509.69 

到目前爲止,我還沒有得到我的代碼編譯。 :/我想也許for循環有其自己的範圍...有人可以驗證這一點呢?下面是該代碼的鏈接引擎收錄:

Pastebin

而如果你想知道關於<iostream>包容......我將刪除這一點,如果我最終使用的打印功能,我寫的將其添加到我的操作系統。或者我可能只是定義std :: cout。我得到的錯誤是說,currentPosition和listOfNumbers在l2g中未聲明(未定義)。我使用MSVC++ 2008 Express Edition編譯器運行Windows 7 64位。提前感謝任何人的幫助!

+0

您的代碼沒有編譯,因爲它有大量的印刷錯誤。 - 順便說一句,你想避免任何庫函數,並且你正在使用'new(nothrow)'? – UncleBens 2010-08-18 21:44:31

+0

請學習如何使用段落。你的帖子幾乎是不可讀的。另外,使用標準庫;它們完全便攜。另外,浮動可能是負面的。唯一不能是無符號整數類型的數字類型。 – 2010-08-18 21:45:47

+0

你能總結一些具體的(較短的)問題嗎?從這篇較長的文章中解析您的問題很難 – Jay 2010-08-18 21:46:52

回答

1

如果你擡起限制使用圖書館,這兩項任務都非常簡單。

使用Boost.lexical_cast將char *轉換爲浮點很容易(請參閱http://www.boost.org/doc/libs/1_43_0/libs/conversion/lexical_cast.htm)。它提供任何兩種類型之間的類型安全轉換,只要它們定義「流」運算符(< <和>>)。

#include "boost/lexical_cast.hpp" 
... 
const char* string_value = "1.5"; 
float float_value = boost::lexical_cast<float>(string_value); 

標準庫的排序方法是訂購數組的最簡單方法。使用上面的示例:

float * myArrayPointer; 
myArrayPointer = new float[5]; 
myArrayPointer[0] = 65.97; 
myArrayPointer[1] = 21.06; 
myArrayPointer[2] = 21.06; 
myArrayPointer[3] = 509.69; 
myArrayPointer[4] = -41.73; // Can floats be negative? 
std::sort(myArrayPointer, myArrayPointer+5); //Sort lowest to highest 
std::sort(myArrayPointer, myArrayPointer+5, std::greater<float>()); //Sort highest to lowest 

如果您堅持在沒有任何庫幫助的情況下執行此操作,則必須爲自己實施排序算法。有很多選擇,每個給你不同的性能特點。選擇與您的用例最匹配的那個。見http://en.wikipedia.org/wiki/Sorting_algorithm有很多選擇。 Quicksort和Merge-sort是相當常見的,可以提供非常好的性能。

至於執行char *手動浮動轉換,您將基本上自己實現C的atof。爲此,您需要遍歷字符串中的每個字符,將其轉換爲其對應的整數值,並將它們累加到浮點數中。然後,您將使用小數點的位置來確定如何縮放所有值。例如,要將字符串「12.5」轉換爲浮點數,您必須將每個字符('1','2'和'5')轉換爲它們各自的整數,並將其縮放到1 * 10^1 + 2 * 10^0 + 5 * 10^-1。可能有更有效的方式來做到這一點,但這只是我能做到的簡單。

+0

謝謝!這個答案幫了很大忙。我在網絡上的其他地方看到了將字符轉換爲各自整數的方法。它表示只需從字符中減去字符「0」進行轉換即可。例如:c-'0'會返回高得多的c的ASCII值,而不是ASCII的零值。再次,非常感謝你的答案。它解決了我的問題。 – masonsbro 2010-08-19 01:52:45

6

一)學會使用STL容器,解密等 他們將讓生活更容易爲你

二)ÇFUNC ATOF會做什麼的問題標題問