2016-04-10 4 views
0

Новое на C++ и обучение. Эта программа вернет правильный результат. Я изменил прототип функции на void, чтобы изолировать и убедиться, что функция обеспечивает правильный вывод.Значение C++ double изменяется при возврате

#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 вместо массива, это было бы проще:

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

И теперь вы ни размера ограничены и не нужно беспокоиться о отслеживанием индекса ,

+0

Это было. Я не инициализировал значение перед циклом while. Из любопытства, почему он правильно работал до и после, когда значение было возвращено из-за инициализации? – mrbw

+1

@mrbw Неопределенное поведение не определено. Может произойти все, что угодно. Включая программу, которая работает. – Barry

+0

А так его просто компилятор делает свое собственное волшебство. Я обязательно проверю все инициализации с этого момента и не буду считать их автоматически 0 как int. Спасибо. – mrbw

Смежные вопросы