2017-03-24 60 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个值。