这是一个相对简单的程序。但我想得到一些关于如何改进这个程序(如果有的话)的反馈,例如,不必要的陈述?
#include<iostream>
#include<fstream>
using namespace std;
double Average(double*,int);
int main()
{
ifstream inFile("data2.txt");
const int SIZE = 4;
double *array = new double(SIZE);
double *temp;
temp = array;
for (int i = 0; i < SIZE; i++)
{
inFile >> *array++;
}
cout << "Average is: " << Average(temp, SIZE) << endl;
}
double Average(double *pointer, int x)
{
double sum = 0;
for (int i = 0; i < x; i++)
{
sum += *pointer++;
}
return (sum/x);
}
代码有效且程序运行正常。但我只是想听听你们的想法,因为你们大多数人都有比我更多的经验(我只是一个新生......哈哈)
感谢。
答案 0 :(得分:4)
修复内存泄漏。 即删除临时; 另外,检查文件是否已打开/创建..等等
理想情况下,您应该使用temp变量来操纵/遍历数组,而不是使用* array本身
答案 1 :(得分:4)
您没有正确初始化阵列。这句话:
double *array = new double(SIZE);
分配一个double并将其初始化为SIZE的值。你应该做的是使用数组分配:
double *array = new double[SIZE];
另一个普遍问题是您很少想要将动态分配的内存分配给原始指针。如果要使用基类型而不是std::vector
等更高级别的对象,则应始终使用智能指针:
boost::scoped_array<double> array(new double[SIZE]);
现在无论你如何离开你的范围(即从新添加的返回或异常),数组都将自动释放。
答案 2 :(得分:2)
由于我们讨论的是C ++,我建议使用STL容器和算法。我还发现在大多数情况下,最好使用引用或智能指针(例如boost :: shared_ptr)而不是原始指针。在这种情况下,根本不需要指针。
以下是编写程序的方法:
#include <fstream>
#include <vector>
#include <iostream>
#include <numeric>
#include <iterator>
using namespace std;
int main()
{
ifstream f("doubles.txt");
istream_iterator<double> start(f), end;
vector<double> v(start, end);
if (v.empty())
{
cout << "no data" << endl;
return 0;
}
double res = accumulate(v.begin(), v.end(), 0.0);
cout << "Average: " << res / v.size() << endl;
return 0;
}
答案 3 :(得分:1)
如果x
为0,则平均值将产生被零除错误。
答案 4 :(得分:0)
以下是一些“代码审核”评论:
在main()中:
size_
t”而不是int
double * temp = array;
inFile
无效或无法阅读,该怎么办?inFile
的项目数量少于SIZE,该怎么办?i
更改为size_t
。inFile
之前删除空白行。0
返回一些号码(例如main()
)。在平均值()中:
size_t
。确认:从其他答案中收集了一些积分。我尽可能地制作完整的清单。