返回时更改 double 的 C++ 值
C++ value of double is changed when returned
C++ 新手和学习者。这个程序 return 是正确的输出。我将函数原型更改为 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 到 return 到 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
当 return 移动在 main() 中生成的数组元素时,之前我只是从 ArraySortToMedian() 输出。我假设它与我引用数组第一个元素的起始地址有关。
可能非常简单,但以我有限的经验,我对这种行为不知所措。任何帮助我了解我做错了什么的帮助将不胜感激。谢谢。
问题是你的输入循环:
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);
}
现在您既没有大小限制,也不必担心跟踪索引。
C++ 新手和学习者。这个程序 return 是正确的输出。我将函数原型更改为 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 到 return 到 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
当 return 移动在 main() 中生成的数组元素时,之前我只是从 ArraySortToMedian() 输出。我假设它与我引用数组第一个元素的起始地址有关。 可能非常简单,但以我有限的经验,我对这种行为不知所措。任何帮助我了解我做错了什么的帮助将不胜感激。谢谢。
问题是你的输入循环:
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);
}
现在您既没有大小限制,也不必担心跟踪索引。