2017-03-24 6 views
0

配列をソートし、入力ファイルのデータを使って計算のためのコードを見つけるのに問題があります。どんな助けでも大歓迎です。私はインターネットを磨き、まだ多くのトラブルを抱えています。初心者の助けが必要です。配列をソートして計算する

アレイでは、1000個の数値を持つ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

あなたはインターネット全体を検索し、プリミティブな数値の配列をソートする方法が見つからなかったでしょうか? ok:D – xander

+1

あなたの質問は広すぎます。コンパイルして実行するものがあるまで、コードを削除/コメントアウトしてから、追加し直してください。一度に1つの問題を処理してください。 – Svaberg

答えて

0

大丈夫ですが、ソートについてのみの場合、C++ 11にはいくつかのツールがあります。配列

  • std::sort

    1. std::beginstd::end作品だから、他のすべての作業

    を行います。

    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. を生のポインタのための
    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

    もし彼が許可されていなければ、なぜ 'namespace std;を使って書くの?'とにかくCのstd :: qsortを使うことができます – user5821508

    0

    あなたのI'LLが、全体の実装を与えないために、おそらく優れているので、これは宿題のいくつかの種類のように見えますいくつかのヒントを教えてください。 ソートアルゴリズムに慣れていないと仮定していますので、言語で構築されたものを使用する代わりに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回forループで、0から999までの乱数をロールし、関連する値を小さな配列に入れます。同じ値が決して2度取られないことをいくつか確認する必要があります。 1000のbool配列を "value_used"にして、特定の入力が使用されている場合はtrueに設定し、同じループを2回取得する場合はwhileループを使用してリロールすることができます。

    100個の配列を作成したら、それを並べ替える必要があります。 Bubble Sortは、ソートの最も基本的なタイプです。0から98までのリスト(0:99範囲)を移動します。隣接する各値のペアを見て、最も高いものを右にスワップします。これにより、最高値が1回のパスでトップに「浸透する」ようになります。次に、2回目のパスを行いますが、1つのショートを止め、3つ目のパスは2つのショートを止めるなど、値0と1を比較するまで続きます。

    バブルソートは非常に遅いです。並べ替えの種類の1つとして、Merge Sortがあります。マージソートでは、あなたの100の数字を50の2つのロットに入れ、50の各セットをソートします(これは、バブルソートまたはマージソート自体を介して行うことができます)。次に、各ソートされた半分の先頭を指す2つのインデックスを作成します。どちらが下がっていても、それを出力に移動し、そのインデックスを前進させます。その結果、ソートされた100個の数値すべてを出力するデータを1回通過します。

    マージソートは、バリュースワップを使用して完全に実装できます。あるいは、別の配列を作成してそれを埋めて、不必要に値をスワップするオーバーヘッドを避けることができます。

    バブルソートを100回実行すると、約100×100/2 = 5000を比較する100アイテムになります。マージソートでは、最終リスト(100アイテム)をマージすると100個の比較が行われ、半分のマージ(2x50)も100をとり、4分の25は100をとり、8番目(8x~12.5)は100をとり、16番目(16x~6.25) 100、32nds(32x〜3.125)は100をとりました。以下では、32thを分割すると64番目の要素が1〜2要素になるようなカットオフポイントを打つので、サイズになったら値をバブルソートするのが速くなります3-4、別の100の比較を与えるまたはそう。

    ここでのルールは、マージソートがO(n * log-n)時間で機能することです。 2^7 = 128なので、マージソートは約100 * 7 = 700の比較で100個の値をソートします。

    関連する問題