C ++和学习新手。该程序返回正确的输出。我将函数原型更改为void以隔离并确保函数提供正确的输出。
#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
当我删除void并用double替换它以返回main()时,中值如下。
#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()输出之前返回时,它移动了main()中生成的数组元素。我假设它与我引用数组第一个元素的起始地址有关。 可能很简单,但凭借我有限的经验,我对这种行为感到茫然。任何帮助,以便我可以了解我做错了什么将不胜感激。谢谢。
答案 0 :(得分:3)
问题是你的输入循环:
int i;
// ... snip ...
while(i < SIZE && infile >> array[i])
i++;
您永远不会初始化i
,因此这是未定义的行为。也许它的工作原理可能并非如此。
如果您使用std::vector
而不是数组,则会更容易:
std::vector<int> values;
int next;
while (infile >> next) {
values.push_back(next);
}
现在你既没有尺寸限制,也不必担心跟踪索引。