[Matematica pura, fisica, chimica, ecc.: problemi di allenamento del cervello non legati in alcun modo al commercio - pagina 234

 
Mathemat >>:

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

In C, di sicuro (e d ne è testimone), per controlla la verità dell'ultima espressione.

 
Decompilazione di 2 cicli :)
 
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.

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

per il primo ciclo, b = c = 2800. (il ciclo sarà "for(;0;)") Ma il ciclo verrà comunque eseguito una volta. Allora il numero a/5 o 2000 sarà scritto nella cella f[2800] (b=2800). Dopo che b aumenta di uno, b diventa 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.

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

Concentriamoci invece sul ciclo interno. Quindi:

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

A partire da b=c,

alle condizioni

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

viene eseguito.

d*=b

Soprattutto capire le condizioni, perché sono tutti operatori di assegnazione.

 

MetaDriver писал(а) >>

// In realtà parlando for(; g=c*2; ) sarebbe molto meglio in questa versione: for( g=c*2; g !=0; )

No, non funziona così. g=c*2 - dovrebbe essere ricalcolato in ogni ciclo.

Prossima versione:

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;

}

 

Non hai un solo se, non funziona così.

Ancora una volta, bisogna capire le condizioni, questa è la cosa principale. Non ho idea di dove trovare questo nel libro di testo.

 
Mathemat >>:

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

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

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

при условиях

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

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

La condizione è una, tutto il resto viene riscritto verso l'esterno.

 
Mathemat >>:

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

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

Leggi "operatore virgola". :)

 

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

E dov'è lo scarto di tutti tranne l'ultimo?

Anche:

Nel linguaggio SI, un'assegnazione è anche un'espressione, e il valore di tale espressione è il valore che viene assegnato.

È quello che sto dicendo, un sacco di assegnazioni sono espressioni, valutate in base alla loro posizione, cioè vero/falso.

2 C-4: La tua interpretazione dell'operando b-c nel primissimo ciclo come un'assegnazione non mi è chiara.

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

In questo contesto, secondo = ultimo. La definizione formale è ricorsiva, cioè il secondo operatore può essere composto (e contenere di nuovo una virgola).

Motivazione: