[Archivo] Matemáticas puras, física, química, etc.: problemas de entrenamiento cerebral no relacionados con el comercio de ninguna manera - página 234

 
Mathemat >>:

А вот дальше непонятка. В первой шапке (внешнем цикле) условие d=0 как-то напрягает. Это ж всегда true?

En C, seguramente (y d es testigo de ello), para comprobar la verdad de la última expresión.

 
Descompilación de 2 ciclos :)
 
int a=10000, b, c=2800, d, e, f[2801], g;
int main(void){
 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);
}

Цикл выполняется до тех пор, пока выражение b - c оценивается как true. Что такое true в Си? Кажись, любой не нуль. Значит, цикл увеличения b от нуля и заполнения массива f[] выполняется до тех пор, пока b не сравняется с с, т.е. до 2800. Массив f[] заполняется одинаковыми числами 10000/5 = 2000.

Пока не сильно ошибся?

para el primer ciclo, b = c = 2800. (el bucle será "for(;0;)") Pero el bucle seguirá ejecutándose una vez. Entonces el número a/5 o 2000 se escribirá en la celda f[2800] (b=2800). Después de que b aumente en uno, b se convertirá en 2801.
 

http://www.languagec.info/oper_for.php:

for ( выражение 1 ; выражение 2 ; выражение 3 ) тело

Выражение 1 обычно используется для установления начального значения переменных, управляющих циклом. Выражение 2 - это выражение, определяющее условие, при котором тело цикла будет выполняться. Выражение 3 определяет изменение переменных, управляющих циклом после каждого выполнения тела цикла.

Схема выполнения оператора for:

1. Вычисляется выражение 1.

2. Вычисляется выражение 2.

3. Если значения выражения 2 отлично от нуля (истина), выполняется тело цикла, вычисляется выражение 3 и осуществляется переход к пункту 2, если выражение 2 равно нулю (ложь), то управление передается на оператор, следующий за оператором for.

Существенно то, что проверка условия всегда выполняется в начале цикла. Это значит, что тело цикла может ни разу не выполниться, если условие выполнения сразу будет ложным.

Concentrémonos en cambio en el ciclo interno. Así que:

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

Empezando por b=c,

en las condiciones

d+=f[b]*a,f[b]=d%--g,d/=g--,--b

se ejecuta.

d*=b

Sobre todo entender las condiciones, porque todos son operadores de asignación.

 

MetaDriver писал(а) >>

// En realidad for(; g=c*2; ) quedaría mucho mejor en esta versión: for( g=c*2; g !=0; )

No, no funciona así. g=c*2 - debe recalcularse en cada bucle.

Próxima versión:

while( g!= 0)
{
d=0;
b= c-1;
   while( b!=0)
{
b--;
d += f[ b] * a;
g
--;
 f[ b] = d % g;
 d /= g;
g--;
d*= b;
}
c-=14;
g= c*2:
 
printf("%.4d", e+ d/ a);
e= d% a;

}

 

No tienes un solo si, no funciona así.

Una vez más, hay que entender las condiciones, eso es lo principal. No tengo ni idea de dónde encontrar esto en el libro de texto.

 
Mathemat >>:

http://www.languagec.info/oper_for.php:

Давай лучше на внутреннем цикле сосредоточимся. Итак:

Начиная с b=c,

при условиях

d+=f[b]*a,f[b]=d%--g,d/=g--,--b
выполняется

Особо надо понять условия, т.к. это все операторы присваивания.

La condición es una, todo lo demás se reescribe hacia fuera.

 
Mathemat >>:

У тебя нет ни одного if, так не пойдет.

Еще раз, нужно разобраться в условиях, это главное. Я никак не пойму, где это найти в учебнике.

Léase "operador coma". :)

 

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

¿Y dónde está el descarte de todos menos el último?

También:

En el lenguaje SI, una asignación es también una expresión, y el valor de dicha expresión es el valor que se asigna.

Eso es lo que digo, muchas asignaciones son expresiones, evaluadas según su posición, es decir, verdadero/falso.

2 C-4: Tu interpretación del operando b-c en el primer bucle como una asignación no me queda clara.

 
Mathemat >>:
Операция последовательного вычисления обозначается запятой (,) и используется для вычисления двух и более выражений там, где по синтаксису допустимо только одно выражение. Эта операция вычисляет два операнда слева направо. При выполнении операции последовательного вычисления, преобразование типов не производится. Операнды могут быть любых типов. Результат операции имеет значения и тип второго операнда. Отметим, что запятая может использоваться также как символ разделитель, поэтому необходимо по контексту различать, запятую, используемую в качестве разделителя или знака операции.

En este contexto, segundo = último. La definición formal es recursiva, es decir, el segundo operador puede ser compuesto (y contener de nuevo una coma).

Razón de la queja: