C ++中用户定义的大小数组

时间:2014-07-14 08:24:43

标签: c++ arrays

所以到目前为止我已经这样做了。该程序适用于任何数量的客户。我可以通过更改变量NumOfCustomers来更改客户数量。但我希望用户输入客户数量。当我通过执行NumOfCustomers=Num来尝试这个时,它会给出一个NumOfCustomers必须具有常量值的错误。

有没有办法在不使用动态数组的情况下执行此操作?如果没有,那么请解释我的情况下如何使用动态数组,因为我发现它们很难理解。

#include <iostream>

void calculateCharges(int);

int main(){

int Num;
std::cout<<"Enter Number of customers: ";
std::cin>>Num;
calculateCharges(Num);
}

void calculateCharges(int Num){

const int NumOfCustomers = 3;
double hrs[NumOfCustomers], charges[NumOfCustomers];
double Total_hrs=0;
double Total_charges=0;

for(int i=0;i<NumOfCustomers;i++){
std::cout<<"Enter hours parked: ";
std::cin>>hrs[i];
}

for(int i =0;i<NumOfCustomers;i++){
if(hrs[i]<=3) charges[i]=2;
else if(hrs[i]>3) charges[i]=2+((hrs[i]-3)*.5);
if(charges[i]>10) charges[i]=10;
}

std::cout<<"Car\tHours\tCharge\n";
for(int i=0;i<NumOfCustomers;i++){
    std::cout<<i+1<<"\t"<<hrs[i]<<"\t"<<charges[i]<<"\n";
}

for(int i=0;i<NumOfCustomers;i++){
    Total_hrs += hrs[i];
    Total_charges += charges[i];
}

std::cout<<"Total\t"<<Total_hrs<<"\t"<<Total_charges<<"\n";
}

5 个答案:

答案 0 :(得分:2)

更改

double hrs[NumOfCustomers], charges[NumOfCustomers];

std::vector<double> hrs(NumOfCustomers), charges(NumOfCustomers);

其他一切都可以保持不变。您可能需要#include <vector>

检查std::cin>>hrs[i];是否失败是个好主意,这样如果此人没有输入数字,您就不会出现奇怪的行为。

答案 1 :(得分:1)

这是修改过的程序。希望你喜欢!

#include <iostream>

void calculateCharges(int);

int main(){

int Num;
std::cout<<"Enter Number of customers: ";
std::cin>>Num;
calculateCharges(Num);
}

void calculateCharges(int Num){

int NumOfCustomers = Num;
double *hrs, *charges; // placeholder for dynamic array
hrs = new double[NumOfCustomers];
charges = new double[NumOfCustomers];
double Total_hrs=0;
double Total_charges=0;

for(int i=0;i<NumOfCustomers;i++){
std::cout<<"Enter hours parked: ";
std::cin>>hrs[i];
}

for(int i =0;i<NumOfCustomers;i++){
if(hrs[i]<=3) charges[i]=2;
else if(hrs[i]>3) charges[i]=2+((hrs[i]-3)*.5);
if(charges[i]>10) charges[i]=10;
}

std::cout<<"Car\tHours\tCharge\n";
for(int i=0;i<NumOfCustomers;i++){
    std::cout<<i+1<<"\t"<<hrs[i]<<"\t"<<charges[i]<<"\n";
}

for(int i=0;i<NumOfCustomers;i++){
    Total_hrs += hrs[i];
    Total_charges += charges[i];
}

std::cout<<"Total\t"<<Total_hrs<<"\t"<<Total_charges<<"\n";
delete [] hrs;
delete [] charges;

}

答案 2 :(得分:1)

您可以使用std::vector,这是一个可以启用高效可变长度数组的类,可以减轻您的手动分配(您仍然可以使用double hrs = new double[NumOfCustomers]; delete [] hrs,但这需要手动内存管理而您不需要想要它。)

您甚至可以使用单个结构:

struct CustomerData {
  double hrs;
  double charges;
}

std::vector<CustomerData> data(NumOfCustomers);
..

std::for_each(data.begin(), data.end(), [](CustomerData &item) {
  item.charges = std::min(10, item.hrs <= 3 ? 2 : 2 + ((item.hrs-3)*.5));
});

答案 3 :(得分:0)

您不能拥有可变宽度的数组。在编译期间应该知道数组大小。它们需要是常数或某些定义参数。

int a[10]

OR

`define A_SIZE 10
int a [A_SIZE]

std :: vector是一个STL容器,就像一个数组,但可以动态地改变它的大小。

对载体的参考。

http://www.cplusplus.com/reference/vector/vector/

答案 4 :(得分:0)

可以使用c ++完成一个简单的动态内存分配。让我展示一个有关动态内存分配的小片段。为指针变量分配一个带有 new 关键字的整数数组。然后删除内存分配完成所需的过程后。注意:动态内存分配使用堆内存部分。

#include <iostream>
using namespace std;

int main()
{

    int size;

    cout<<"enter ur array size "<<endl;

    cin >> size;
    int *ash;
    ash = new int[size];
    for (int i=0;i<size;i++){
        cin >> ash[i];

    }

    for (int j=0;j<size;j++){
        cout << ash[j]<<endl;
    }
    delete[] ash;
}