返回

时间:2016-04-10 23:06:02

标签: c++ arrays return median

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()中生成的数组元素。我假设它与我引用数组第一个元素的起始地址有关。 可能很简单,但凭借我有限的经验,我对这种行为感到茫然。任何帮助,以便我可以了解我做错了什么将不胜感激。谢谢。

1 个答案:

答案 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);
}

现在你既没有尺寸限制,也不必担心跟踪索引。