2016-04-10 12 views
0

C++の新機能と学習。このプログラムは正しい出力を返します。関数のプロトタイプをvoidに変更して、関数が正しい出力を提供していることを確認しました。返されたときにdoubleのC++値が変更される

#include <iostream> 
#include <fstream> 

void ArraySortToMedian(int x[], int numElem); 

using namespace std; 

int main() 
{ 
    ifstream infile; 
    infile.open("numbers.txt"); 

    const int SIZE = 6; 
    int array[SIZE]; 
    int i; 

    if(!infile) 
    { 
     cout << "couldn't find 'numbers.txt'"; 
     return 1; 
    } 

    while(i < SIZE && infile >> array[i]) 
     i++; 

    infile.close(); 

    for(i = 0; i < SIZE; i++) 
     cout << array[i] << "\n"; 

    ArraySortToMedian(array, SIZE); 

    return 0; 
} 

void ArraySortToMedian(int x[], int numElem) 
{ 
    bool swap; 
    int temp, i; 
    double m; 

    do 
    { 
     swap = false; 
     for(i = 0;i < (numElem - 1); i++) 
     { 
      if(x[i] > x[i + 1]) 
      { 
       temp = x[i]; 
       x[i] = x[i + 1]; 
       x[i + 1] = temp; 
       swap = true; 
      } 
     } 
    } 
    while (swap); 
    cout << "\n"; 
    for(i = 0; i < numElem; i++) 
     cout << x[i] << "\n"; 

    m = (x[numElem/2] + x[numElem/2]-1)/(double)2; 
    cout << "\n" << m; 
} 

出力:

6 
5 
3 
1 
2 
4 

1 
2 
3 
4 
5 
6 

3.5 

私は、ボイド削除し、(メインに戻るには、二重に交換してください)。このような中央値。

#include <iostream> 
#include <fstream> 

double ArraySortToMedian(int x[], int numElem); 

using namespace std; 

int main() 
{ 
    ifstream infile; 
    infile.open("numbers.txt"); 

    const int SIZE = 6; 
    int array[SIZE]; 
    int i; 
    double median; 

    if(!infile) 
    { 
     cout << "couldn't find 'numbers.txt'"; 
     return 1; 
    } 

    while(i < SIZE && infile >> array[i]) 
     i++; 

    infile.close(); 

    for(i = 0; i < SIZE; i++) 
     cout << array[i] << "\n"; 

    median=ArraySortToMedian(array, SIZE); 

    cout<< "\n" << median << "\n"; 
    return 0; 
} 

double ArraySortToMedian(int x[], int numElem) 
{ 
    bool swap; 
    int temp, i; 
    double m; 

    do 
    { 
     swap = false; 
     for(i = 0;i < (numElem - 1); i++) 
     { 
      if(x[i] > x[i + 1]) 
      { 
       temp = x[i]; 
       x[i] = x[i + 1]; 
       x[i + 1] = temp; 
       swap = true; 
      } 
     } 
    } 
    while (swap); 
    cout << "\n"; 
    for(i = 0; i < numElem; i++) 
     cout << x[i] << "\n"; 

    m = (x[numElem/2] + x[numElem/2]-1)/(double)2; 
    return(m); 
} 

歪出力は:

1 
6 
5 
3 
1 
2 

1 
1 
2 
3 
5 
6 

2.5 

その主に生成される配列の要素を移動戻ったとき()ときに私は単にArraySortToMedianから出力されたときに前に()。私は配列の最初の要素の先頭アドレスを参照することが私と関係していると仮定します。 おそらく非常にシンプルですが、私の経験が限られているので、私はこの動作に苦しんでいます。私が間違っていることを学ぶことができるように助けてくれれば幸いです。ありがとうございました。

答えて

3

問題は、あなたの入力ループです:

int i; 
// ... snip ... 
while(i < SIZE && infile >> array[i]) 
    i++; 

あなたはiを初期化することはありませんしているので、これは未定義の動作です。たぶんそれはうまくいかないかもしれません。

std::vector<int> values; 
int next; 
while (infile >> next) { 
    values.push_back(next); 
} 

そして今、あなたはどちらのサイズが制限されているにもあなたは、インデックスを追跡する心配する必要はない:あなたは、配列の代わりにstd::vectorを使用した場合


することは、これは容易になるだろう。

+0

それでした。私はwhileループの前に値を初期化しませんでした。 初期化のために値が返されたときに、なぜ好奇心から外れたのはなぜですか? – mrbw

+1

@mrbw未定義の動作は未定義です。なんでも起こる可能性がある。仕事をしているプログラムを含む。 – Barry

+0

ああ、そのコンパイラは独自の魔法をやっています。私は今からすべての初期化を二重チェックし、自動的にintとして0であるとは仮定しません。ありがとうございました。 – mrbw

関連する問題