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から出力されたときに前に()。私は配列の最初の要素の先頭アドレスを参照することが私と関係していると仮定します。 おそらく非常にシンプルですが、私の経験が限られているので、私はこの動作に苦しんでいます。私が間違っていることを学ぶことができるように助けてくれれば幸いです。ありがとうございました。
それでした。私はwhileループの前に値を初期化しませんでした。 初期化のために値が返されたときに、なぜ好奇心から外れたのはなぜですか? – mrbw
@mrbw未定義の動作は未定義です。なんでも起こる可能性がある。仕事をしているプログラムを含む。 – Barry
ああ、そのコンパイラは独自の魔法をやっています。私は今からすべての初期化を二重チェックし、自動的にintとして0であるとは仮定しません。ありがとうございました。 – mrbw