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.
Ö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
@mrbw Tanımsız davranış tanımlanmamış. Herşey olabilir. Programın çalışmaya dahil olması. – Barry
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