2009-06-09 31 views
5

Có cách nào mà không sử dụng mảng để viết những điều sau đây với một vòng lặp:thay đổi tên biến với một vòng lặp

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<<**????**<< 

Đây là rõ ràng không phải là những gì tôi cần phải làm nhưng là ví dụ đơn giản nhất tôi có thể nghĩ ra với cùng một vấn đề ... Vì vậy, những gì tôi muốn làm là thay đổi các biến trong vòng lặp, không phải đầu ra!

EDIT: Cảm ơn rất nhiều cho tất cả đầu vào, đây là một chút mã để giúp minh họa sự cố của tôi ... Im Sử dụng Cplex với C++. Các vòng lặp sẽ không kết thúc vào lúc bảy nhưng khi một tiêu chí dừng được đáp ứng

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); 
} 

Tôi muốn thêm các biểu thức để một mảng gọi là c đó sẽ là một đầu vào cho một mô hình trong cplex. Sau đó, sau khi tôi nhận được kết quả từ Cplex, tôi muốn thêm biểu thức c (i) và giải quyết lại ... Điều này cho đến khi tôi nhận được các giá trị tôi muốn ... IloExprArray cũng có thể được sử dụng bằng cách nào đó, nhưng sau đó tôi không biết làm thế nào để thêm những biểu hiện sử dụng phương pháp này:

for(i= 0,...) 
{ 
    c7 +=x[i]; 
} 
+1

Tại sao bạn không sử dụng mảng? Nếu các biến tạo thành một tập hợp một mảng (hoặc bộ sưu tập đếm số khác) có vẻ như là giải pháp đúng. – annakata

+0

Không bao giờ cần phải "thay đổi tên biến" trong C++, vì bạn có thể chỉ cần tạo một con trỏ tới bất kỳ biến nào khác mà bạn thích. – Wedge

+0

Tại sao bạn không tạo mã nguồn bằng bộ xử lý văn bản hoặc 'perl'? – mbx

Trả lời

10

Nếu tôi hiểu đúng, bạn đang cố gắng để tạo ra tên biến động. AFAIK điều này là không thể với C + +.

+0

Tôi đã sợ rằng ... Cảm ơn anyways –

+0

Vâng, ông có thể đặt một tuyên bố chuyển đổi lớn trong vòng lặp, nhưng nó là loại vô lý – annakata

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; 
} 
+1

Có lẽ tôi đang thiếu một cái gì đó, nhưng tại sao vòng lặp lên đến 7? –

+0

Sai lầm của tôi. Nó phải là chiều dài của mảng. –

+1

Thay đổi mã cho phù hợp. –

9

Tôi khuyên bạn nên sử dụng một mảng cho việc này. Bạn không nên chơi với tên biến động trong một ngôn ngữ biên dịch.

int c[] = {2, 5, 7, 9, 3, 4, 6, 5}; 
for (int i = 0; i < 8; i++) cout // and so on... 
0

Vâng, nếu bạn thực sự không thể đi với một mảng, tại sao không thử với một con trỏ. Tôi biết ví dụ sau về bản chất là một mảng, tuy nhiên nó hơi khác một chút nên có thể đáng để quay.

#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(); 
} 

Đây vẫn là mảng, tuy nhiên nó được sử dụng hơi khác và chỉ có thể là những gì bạn đang tìm kiếm. Nếu không, vui lòng làm rõ câu hỏi của bạn để chúng tôi có thể giúp bạn. Ngay cả khi đó là ví dụ đơn giản nhất bạn có thể nghĩ đến, hãy thử thêm một số chi tiết khác.

EDIT Tôi vừa thấy (trong nhận xét) bạn đang cố gắng tạo tên biến động. Theo như tôi biết điều đó là không thể, tuy nhiên bạn có thể thử thực hiện (hoặc sử dụng thư viện, tôi chắc chắn có rất nhiều ở đó) một HashMap. Sử dụng một hashmap bạn có thể liên kết một mục với một chuỗi (khóa) để bạn có thể liên kết một mục với một chuỗi tùy chỉnh, được nhập bởi người dùng (giả sử đó là những gì bạn cần cho).

0

Tôi luôn biết rằng nếu "biến variablenames" là asnwer bạn đặt câu hỏi sai. Nó có thể được giải quyết khác nhau.

1

Nếu bạn muốn làm bất cứ điều gì một cách ngớ ngẩn, bạn bị kẹt với macro. Xin hãy hiểu rằng đây là khủng khiếp và unmaintainable, nhưng nếu bạn nhấn mạnh, bạn có thể làm một cái gì đó như thế này:

#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); 

Điều này dẫn đến các mã:

do { b1 [i] = i; b2 [i] = i; b3 [i] = i; b4 [i] = i } while (0); 

Đã viết tất cả mà ra, xin hãy vui lòng đừng làm thế.Ngay cả khi bạn bao bọc nó trong nhiều macro hơn để làm cho nó dễ đọc, xin vui lòng cho cảm giác thông thường chiếm ưu thế và từ bỏ kế hoạch này.

0

Tính năng khai thác hoặc lập trình meta có được tính không?

#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>(); 
} 

Ngoài ra còn có khả năng tận dụng các phần mở rộng tiền xử lý tăng, vì vậy bạn có thể vòng một vĩ mô để tạo ra định danh.

0

Tôi đã sử dụng chức năng này và nó hoạt động tốt:

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); 
} 
Các vấn đề liên quan