我真的需要帮助学习如何将不同类型的数组转换为双精度(short,long,float)。我不确定如何更好地提出这个问题。这是为了学校的任务。我知道作业并不完整,我只需要在继续为短篇和长篇做数组之前学会这样做。
Assignment Description:
我们将扩展程序以考虑不同的原语。该实现将实现程序2中描述的所有8个功能作为模板。为了显示这一点,main函数将声明包含10个值的4个不同数组。不同的数组将被声明为short,long,float和double。每个数组都将填充来自随机数生成器的随机值。将打印阵列,然后将调用8个函数中的每个函数并将结果打印给用户。为了提供容器,每个函数都将成为名为“MathHelper”的类的一部分,该类具有使用公共访问修饰符和静态修饰符声明的所有函数。
MathHelper.h
#pragma once
class MathHelper
{
public:
static double calculateSum(const double numbers[], const int& count);
static double calculateAverage(const double numbers[], const int& count);
static int highestNum(const double numbers[], const int& count);
//int lowestNum(const int numbers[], const int& count);
//int numRange(const int numbers[], const int& count);
//double standardDeviation(const int numbers[], const int& count);
//int smallestFactorial(const int numbers[], const int& count);
};
MathHelper.cpp
#include "MathHelper.h"
MathHelper::MathHelper()
{
}
double MathHelper::calculateSum(const double numbers[], const int& count)
{
if (count <= 0)
return 0;
double total = 0;
for (int i = 0; i < count; i++)
total += numbers[i];
return total;
}
double MathHelper::calculateAverage(const double numbers[], const int& count)
{
if (count <= 0)
return 0;
return static_cast<double>(calculateSum(numbers, count)) / count;
}
int MathHelper::highestNum(const double numbers[], const int& count)
{
if (count <= 0)
return 0;
int highest = numbers[0];
for (int i = 1; i < count; ++i)
if (highest < numbers[i])
highest = numbers[i];
return highest;
}
MathHelper::~MathHelper()
{
}
Program4.cpp
// Program4Fix.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "MathHelper.h"
#include <iostream>
#include <cmath>
#include <ctime>
#include <iomanip>
int main()
{
const int size = 10;
double* myDoubles = new double[size];
float* myFloats = new double[size];
srand((unsigned)time(NULL));
// double fill
std::cout << std::endl;
std::cout << "Double Array: \n";
for (int i = 0; i < size; i++)
{
*(myDoubles + i) = rand() / double(RAND_MAX)*50.f + 1.f;
std::cout << i << ": " << std::setprecision(4) << *(myDoubles + i) << std::endl;
}
std::cout << std::setprecision(5) << "The sum of the numbers is: " << MathHelper::calculateSum(myDoubles, size) << "\n";
std::cout << std::setprecision(5) << "The average of the numbers is: " << MathHelper::calculateAverage(myDoubles, size) << "\n";
// long fill
std::cout << "Float Array: \n";
for (int i = 0; i < size; i++)
{
*(myFloats + i) = rand() / float(RAND_MAX)*50.f + 1.f;
std::cout << i << ": " << std::setprecision(4) << *(myFloats + i) << std::endl;
}
std::cout << std::setprecision(5) << "The sum of the numbers is: " << MathHelper::calculateSum(myFloats, size) << "\n";
std::cout << std::setprecision(5) << "The average of the numbers is: " << MathHelper::calculateAverage(myFloats, size) << "\n";
return 0;
}
我想我真正的问题是,无论如何使用double *类型的值来初始化float *类型的实体?
const int size = 10;
double* myDoubles = new double[size]; // this works
float* myFloats = new double[size]; // this doesn't work, is there a way to do this similar to the one above?
答案 0 :(得分:0)
由于您在询问C ++,请不要使用隐式转换
double d = 1.5;
int i = d;
也不要使用c风格的演员:
double d = 1.5;
int i = (int)d;
使用适当的铸造
int i = static_cast<int>(d);
你可以阅读为什么,有很多理由可以使用C ++进行转换。
要转换数组,您需要创建一个新数组,然后迭代现有数组,逐个转换,然后将它们分配给新数组。
对于C ++ 11,您可以使用std :: transform()函数。
答案 1 :(得分:0)
我想你应该做的是将MathHelper中的函数概括为模板函数,这些函数可以用于double
以外的其他类型。我会得到一本不错的C ++书籍并阅读有关模板函数的内容,例如:在A Tour of C++或Programming -- Principles and Practice Using C++中。您可以从isocpp.org获取Tour of C ++的前四章,第二章介绍模板。
最后,您应该拥有类似
的代码class MathHelper
{
public:
template<typename T> static double calculateSum(const T numbers[], const int& count);
};
作为一般性评论,发布的代码看起来非常C-ish意味着它使用C构造,其中C ++具有更好的替代方案,例如手动管理的数组而不是std::vector
。你应该避免这种情况。
答案 2 :(得分:-1)
从float
,int
或long
转换为double就像将源变量分配给声明为double
的变量一样简单。
例如:
int a = 1
long b = 2;
float c = 3.0f;
double result;
result = a;
result = b;
result = c;
在最后3个陈述中,这些值将转换为双倍。
您也可以通过投射转换其他方式。
const int size = 10;
double* myDoubles = new double[size];
float* myFloats = new float[size];
InitializeArray(myDoubles); // You'll have to start with some values
for(int i = 0; size > i; ++i)
{
myFloats[i] = (float) myDoubles[i];
}