2017-03-24 98 views
0

我在排序我的數組時遇到問題,並且找不到輸入文件中數據的計算代碼。任何幫助將不勝感激。我搜索了互聯網,並且仍然有很多麻煩。初學者需要幫助排序數組並計算

該數組正在讀取一個包含1,000個數字的data.txt文件。該陣列應該只讀取這些數字中的100個,並對該試驗結果進行計算。

任何幫助將不勝感激!

#include <iostream> 
#include <iomanip> 
#include <fstream> 
#include <cmath> 

using namespace std; 

// Declare global constants 
const char* IN_FILE_NAME = "stats.txt"; 
const char* OUT_FILE_NAME = "results.txt"; 
const int ELEMENTS = 100; 

// Function Prototypes 

double findMean(double* elementArray, int ELEMENTS);  // sum of numbers/how many numbers 
double findMedian(double* elementArray, int ELEMENTS); // middle number 
double findMinimum(double* elementArray, int ELEMENTS); //smallest number in the array 
double findMaximum(double* elementArray, int ELEMENTS);  //largest number in the array 
double findStdDev(double* elementArray, int ELEMENTS);  // sqrt(Sum * | x - mean |^2)/number of arrays 
bool getTrialElements(std::ifstream& inFile, double* elementArray, int ELEMENTS); 
double printTrialResults(std::ofstream& outFile, int trialNumber, double elementArray[], int ELEMENTS); //print to output file 
void sortArray(); 

// This program performs basic statistics on a large set of data points 
int main() 
{ 
    // Declare variables 
    ifstream inFile; 
    ofstream outFile; 
    int trialNumber = 0; 
    double elementArray[ELEMENTS]; 

    // Open input and output files 
    inFile.open(IN_FILE_NAME); 
    outFile.open(OUT_FILE_NAME); 

    // Loop through all of the data sets in the input file 
    while(getTrialElements(inFile, elementArray, ELEMENTS)) 
    { 
     // Keep track of the number of data sets processed 
     trialNumber++; 
     // Output the results to the output file 
     printTrialResults(outFile, trialNumber, elementArray, ELEMENTS); 
    } 

    // Close input and output files 
    outFile.close(); 
    inFile.close(); 

    return 0; 
} 

// Function definitions 
double findMean(double elementArray[], int ELEMENTS) 
    //Find the mean of the array 
    { 
     double sum = 0; 

     for(int ELEMENT = 0; ELEMENT < 100, ELEMENT++) 
     { 
      sum = sum + elementArray[ELEMENT]; 
     } 
     return sum/ELEMENTS; 
    } 

double findMedian(double elementArray[], int ELEMENTS) 
    { 

    } 

double findMinimum(double elementArray[], int ELEMENTS) 
    { 

    } 

double findMaximum(double elementArray[], int ELEMENTS) 
    { 

    } 

double findStdDev(double elementArray[], int ELEMENTS) 
    { 

    } 

bool getTrialElements(std::ifstream& inFile, double* elementArray, int ELEMENTS) 
    { 
     //Read inFile in to elementArray 

     //for ELEMENTS 

     //if can't read or no more elements to read, return false, else return true 

     while(getTrialElements(inFile, elementArray, ELEMENTS)) 
     { 
      if(ELEMENTS < 99) 
      { 
       cout << "No more elements available." << endl; 
      } 

      return 0; 
     } 


    } 

double printTrialResults(std::ofstream& outFile, int trialNumber, double elementArray[], int ELEMENTS) 
    { 
      // 
    } 
void sortArray() 
    { 

    } 
+1

所以你搜索了整個互聯網,發現沒有辦法排序原始數字的數組?好的:D – xander

+1

你的問題太廣泛了。刪除/註釋掉代碼,直到您編譯並運行一些代碼,然後開始添加代碼。一次處理一個問題。 – Svaberg

回答

0

好的,如果只是關於排序,比C++ 11有一些工具。

  1. std::beginstd::end作品與陣列
  2. std::sort完成所有其他工作

所以:

int array[ELEMENTS]; // look for std::array<int, ELEMENTS> 

... // fill array with values 

std::sort(std::begin(array), std::end(array)); // sort full array 

閱讀:

  1. std::array
  2. std::sort
  3. std::qsort

的原始指針:

void sortArray(int *begin, size_t size) 
{ 
    std::sort(begin, begin + size); 
} 
+0

我很肯定OP不允許使用STL,無論如何,如果數組衰減到一個指針,它將不會在'sortArray'函數內部工作。 – xander

+0

我讚賞答案!我沒有覆蓋數組的std :: sort,所以我不相信我可以使用它。 – mrwhit

+0

如果他不允許的話,爲什麼他會寫'using namespace std;'反正std :: qsort可以用C語言來編寫 – user5821508

0

這看起來像某種功課,因此它可能是更好的給不給你一個完整的實現,但我會給你一些提示。 我假設您對排序算法不太熟悉,所以請考慮查看bubbleSortselectionSortinsertionSort,而不是使用該語言中構建的內容。 對數據進行排序後,發現中位數可以通過返回中間元素(第100個元素數組的第50個元素)來完成。 最大值和最小值也可以從排序數組中找到(第一個和最後一個元素),或者您可以選擇一個元素作爲最小/最大元素,而不是將它與所有其他元素進行比較。如果元素值小於/大於您選擇的值,則將採集的值更改爲元素的值。

int min = arr[0]; 
for(int i = 0;i < SIZE ;i++){ 
    if(min > arr[i]){ 
    min = arr[i]; 
} 
+0

非常感謝。我不知道這些是什麼,但我會做我的研究,希望能找到答案。這不是爲了家庭作業,我只是想做很多項目來幫助我理解語言(我聽說它是​​最難的)。所以我從這裏開始確保我對所有概念有透徹的理解。 – mrwhit

+0

泡泡和插入排序是最慢但最容易理解的。 合併排序在中間,也很容易理解。對每一半進行排序,然後繼續從任一半中取最低值,直到沒有剩下的值。輸出列表是完整的排序列表。您最初可以使用Bubble Sort來使排序的一半進行合併排序工作。然後,稍後重寫它,以使用合併排序本身,並使其遞歸。 –

0

迭代開發:

開始通過使一個數組來保存所有的1000個號碼,然後讀取文件到該數組,並從陣列打印出來。

然後,在100倍循環中,滾動從0到999的隨機數,並將相關值放入較小的數組中。您需要進行一些檢查,確保相同的值永遠不會被執行兩次。你可以創建一個1000個布爾值「array_used」的數組,如果使用了特定的輸入,則將它們設置爲true,如果兩次獲取相同的輸入,則使用while循環重新滾動。

當你在數組中有100個數據後,你想對它進行排序。 Bubble Sort是最基本的排序類型,從0到98遍歷列表(0:99範圍)。查看每個相鄰的值對,並將最高的值交換到右邊。這導致最高值在單程中「滲透」到頂端。然後你做第二次傳球,但停止一次短傳,第三次傳球停止兩次,等等,直到你比較0和1的比較值。

但是Bubble Sort非常緩慢。另一種容易理解的排序類型是合併排序。在合併排序中,您將例如你的100個號碼分成兩個50個,每個50個(可以通過Bubble Sort或合併排序)。然後,使兩個索引指向每個排序的一半的開始。無論哪一個較低,將其移至輸出並推進該索引。結果是一次通過輸出全部100個數字的數據。

合併排序可以通過價值互換完全實現。或者你可以創建另一個數組並填充它,這樣可以避免不必要地交換值的開銷。

順便說一句Bubble排序對100個項目進行排序,比較大約100 x 100/2 = 5000個比較。與合併排序合併最終列表(100項)花費100比較,合併一半(2x50)也花了100,季度(4x25)花了另外100,8ths(8x〜12.5)花了100,16十六(16x〜6.25) 100,第32個結果(32x〜3.125)花了100分。在那之下,你打到了分割點的第32個分割點,只有第1-2個元素的第64個分割點,所以當它們大小一致時, 3-4,再給100比較左右。

這裏的規則是合併排序在O(n * log-n)時間內起作用。由於2^7 = 128,合併排序將在大約100 * 7 = 700比較中排序100個值。