2016-04-10 34 views
0

C++ ve öğrenmeye yeni. Bu program doğru çıktıyı verir. Fonksiyon prototipini izole etmek ve fonksiyonun doğru çıktıyı sağladığından emin olmak için değiştirdim.C++ değeri döndürüldüğünde çift değeri değiştirilir

#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; 
} 

Çıktı:

6 
5 
3 
1 
2 
4 

1 
2 
3 
4 
5 
6 

3.5 

Ben geçersiz kaldırıp (ana geri dönmek için çift ile değiştirin) böyle medyan değer.

#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); 
} 

Bozuk Çıkış:

1 
6 
5 
3 
1 
2 

1 
1 
2 
3 
5 
6 

2.5 

onun ana oluşturulur dizi elemanlarını hareket döndü() zaman sadece ArraySortToMedian çıkarılan zaman önce(). Dizinin birinci elemanının başlangıç ​​adresini referans olarak göstermesi gerektiğini düşünüyorum. Muhtemelen çok basit ama sınırlı tecrübemle bu davranışta bir kayıp yaşıyorum. Yanlış yaptığım şeyi öğrenebilmem için herhangi bir yardım takdir edilecektir. Teşekkür ederim.

cevap

3

Sorun giriş döngü: Asla i başlatılıyor ediyoruz

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

, bu nedenle bu tanımsız davranıştır. Belki de işe yaramıyordur.

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

Ve şimdi boyut sınırlı biri değiliz ne de bir dizin takip endişelenmenize gerek yaparken size bir dizinin bir std::vector yerine kullandıysanız


, bu daha kolay olurdu .

+0

Öyleydi. While döngüsünden önce değeri başlatmamıştım. Merak etmeden önce, neden başlangıçtan önce değer döndüğünde değil, neden doğru bir şekilde çalışıyordu? – mrbw

+1

@mrbw Tanımsız davranış tanımlanmamış. Herşey olabilir. Programın çalışmaya dahil olması. – Barry

+0

Ah bu yüzden sadece derleyici kendi sihirbazlığını yapıyor. Bundan sonra tüm başlatmaları iki kere kontrol etmeyi ve otomatik olarak 0'ın int olarak olduğunu varsaymamayı taahhüt edeceğim. Teşekkür ederim. – mrbw