有没有办法不使用数组用循环编写以下内容:
cout<<"This variable c1 ="c1
cout<<"This variable c2 ="c2
cout<<"This variable c3 ="c3
for(i=1,i<8,i++)
cout<<"This variable c%d =",i<<**????**<<
这显然不是我需要做的事情,但这是我能想到同样问题的最简单的例子...... 所以我想做的是改变循环中的变量,而不是输出!
编辑: 非常感谢所有输入, 这里有一些代码来帮助说明我的问题......我在C ++中使用Cplex。 循环不会在7结束,但是当满足停止标准时
static void populatebyrow (IloModel model, IloNumVarArray x, IloRangeArray c)
{
IloExpr c1(env);
IloExpr c2(env);
IloExpr c3(env);
IloExpr c4(env);
c.add(c1>=n);
c.add(c2>=n); ...
model.add(c);
}
我想将这些表达式添加到名为c的数组中,该数组将作为cplex中模型的输入。 然后我从Cplex得到一个结果后,我想添加一个表达式c(i)并再次解决它... 直到我得到我想要的价值...... IloExprArray也可以某种方式使用,但后来我不知道如何使用这种方法添加表达式:
for(i= 0,...)
{
c7 +=x[i];
}
答案 0 :(得分:10)
如果我理解正确,您正在尝试动态创建变量名称。 AFAIK使用C ++是不可能的。
答案 1 :(得分:9)
我建议使用数组。您不应该使用编译语言来使用动态变量名称。
int c[] = {2, 5, 7, 9, 3, 4, 6, 5};
for (int i = 0; i < 8; i++) cout // and so on...
答案 2 :(得分:6)
int* varArray[] = {&c1, &c2, &c3};
int size = sizeof( varArray) / sizeof(int*);
for( int i = 0; i < size; ++i)
{
std::cout << "This variable c"<< i+1 << " = " << *varArray[i] << std::endl;
}
答案 3 :(得分:1)
如果你想在词汇上做任何事情,你就会陷入困境。请理解这是可怕且不可维护的,但如果你坚持,你可以做这样的事情:
#define Q(a) a
#define DO_THING(a, expr) do { Q(a)1 expr; Q(a)2 expr; Q(a)3 expr; Q(a)4 expr } while (0)
DO_THING(b, [i] = i);
这导致代码:
do { b1 [i] = i; b2 [i] = i; b3 [i] = i; b4 [i] = i } while (0);
写完所有内容后,请不要这样做。即使你将它包装在更多的宏中以使其具有准可读性,请以常识为准并放弃此计划。
答案 4 :(得分:0)
如果你真的不能使用数组,为什么不尝试使用指针。我知道以下示例本质上是一个数组,但它稍有不同,所以它可能值得一试。
#include <iostream>
#include <conio.h>
#define N 10
using namespace std;
int main() {
int * a = new int[N];
for (int i = 0, * b = a; i < N; i++, b++) {
*b = i;
}
for (int i = 0, * b = a; i < N; i++, b++) {
cout << *b << endl;
}
getch();
}
这仍然是一个数组,但它的使用略有不同,可能就是你想要的。如果不是,请澄清您的问题,以便我们为您提供帮助。即使这是您能想到的最简单的例子,也可以尝试添加更多细节。
编辑我刚看到(在评论中)您试图动态创建变量名称。据我所知,这是不可能的,但你可以尝试实现(或使用一个库,我相信那里有很多)a HashMap。使用散列映射,您可以将项目链接到字符串(键),这样您就可以将项目链接到用户输入的自定义字符串(假设您需要这样做)。
答案 5 :(得分:0)
我总是了解到,如果“变量变量名称”就是答案,那么你就会问错误的问题。它可以用不同的方式解决。
答案 6 :(得分:0)
利用或元编程计算?
#include <iostream>
template<unsigned U>
struct Fac{ enum { value = U * Fac<U-1>::value};};
template<>
struct Fac<0>{ enum { value = 1};};
template<unsigned U>
struct Fib{ enum {value = (Fib<U-1>::value + Fib<U-2>::value)};};
template<>
struct Fib<0>{ enum {value = 0};};
template<>
struct Fib<1>{ enum {value = 1};};
template<unsigned U>
void show(){
show<U-1>();
std::cout << "Fib(" << U << ")=" << Fib<U>::value << "\t" << "Fac(" << U << ")=" << Fac<U>::value << std::endl;
}
template<>
void show<0>(){}
int main(int argc, char** argv){
show<12>();
}
还可以使用boost预处理器扩展,因此您可以循环宏来生成标识符。
答案 7 :(得分:0)
这是使用预处理器运算符##和宏在c / c ++中执行此操作的方法 在此链接上有使用示例 http://msdn.microsoft.com/en-us/library/09dwwt6y(v=vs.80).aspx
答案 8 :(得分:0)
我使用过这个功能,效果很好:
IloNumVarArray x(env, 10);
for(i=0; i<10; i++){
x[i] = IloNumVar(env, 0, IloInfinity);
// Code for change the name of each variable
char index[2];
sprintf(index, "%d", i);
char variable_name[6] = "x";
strcat(variable_name, index);
x[i].setName(variable_name);
}