2011-11-09 6 views
0

Я пытался преобразовать этот код из C в java, но не был успешным, главным образом потому, что я никогда не учился C. Для циклов меня путают ад.Преобразование кода из C в java

int a=10000,b,c=2800,d,e,f[2801],g; 
main(){ 
for(;b-c;)f[b++]=a/5; 
for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a) 
for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); 
} 

Я видел код на этом сайте, http://www.cs.uwaterloo.ca/~alopez-o/math-faq/mathtext/node12.html. Любая помощь будет высоко оценен. В частности, вторая и третья для циклов не имеют условных утверждений, где они должны быть.

+2

C очень похож на java .. почему бы вам не приложить некоторые усилия при рассмотрении некоторых принципов C? .. Если вы уже знаете Java, вам потребуется не более часа – Protostome

+1

Кажется, что вы получаете доступ к 'b 'перед его инициализацией. –

+0

Петли очень похожи между Java и C. Если вы знаете Java, вы подберете ее очень быстро – bernie

ответ

4

В C для циклов могут отсутствовать оговорки.

Если вы знаете это, а также знаю, что for является:

for (initialization ; condition ; increase) 
{ 
    code; 
} 

//is actually 

initialization; 
while (condition) 
{ 
    increase; 
    code; 
} 

это на самом деле просто:

for(;b-c;)f[b++]=a/5; 

эквивалентно

while (b-c) 
{ 
    f[b++] = a/5; 
} 

Второй:

for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a) 

эквивалентно:

while (d=0, g=c*2) 
{ 
    //the order in which the following are executed might be different 
    c-=14; 
    printf("%.4d",e+d/a); 
    e=d%a; 
} 

Наконец, третий:

for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); 

эквивалентно:

b=c; 
while (d+=f[b]*a, f[b]=d%--g, d/=g--, --b) 
{ 
    D*=b; 
} 

Однако код действительно действительно некрасиво, вам лучше начать с нуля.

EDIT:

далее

Одно из объяснений - для условия, состоящего из выражений, разделенных запятыми, только последнее отношение к петле:

while (a, b, c) 
{ 
} 

будет цикл до c оценивается в ложь. Однако на каждой итерации выполняются a и b. Поэтому, если c будет оцениваться до false, другое выражение в выражении условия все равно выполняется, тогда как выражения в выражении увеличения не являются (что, вероятно, является целью здесь).

+1

И целые числа действуют как булевы, чего нет в Java. (0 означает false в C) –

+0

, значит, это означает, что цикл должен выглядеть так? while (d == 0 логический оператор g == c * 2) { c- = 14; printf ("%. 4d", e + d/a); e = d% a; } –

+0

Фактически только последнее выражение тех, которые разделены запятыми, относится к условию прерывания. Подробный ответ. –

Смежные вопросы