[Archives] Mathématiques pures, physique, chimie, etc. : problèmes d'entraînement cérébral sans rapport avec le commerce. - page 234

 
Mathemat >>:

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

En C, à coup sûr (et d en est le témoin), for vérifie la vérité de l'expression LAST.

 
Décompilation 2 cycles :)
 
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.

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

pour le premier cycle, b = c = 2800. (la boucle sera "for(;0 ;)") Mais la boucle sera toujours exécutée une fois. Ensuite, le nombre a/5 ou 2000 sera écrit dans la cellule f[2800] (b=2800). Après que b ait augmenté de un, b deviendra 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.

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

Concentrons-nous plutôt sur le cycle interne. Donc :

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

En commençant par b=c,

dans les conditions

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

est exécuté.

d*=b

Comprenez surtout les conditions, car ce sont toutes des opérateurs d'affectation.

 

MetaDriver писал(а) >>

// En fait, for(; g=c*2; ) serait beaucoup mieux dans cette version : for( g=c*2; g !=0 ; )

Non, ça ne marche pas comme ça. g=c*2 - doit être recalculé dans chaque boucle.

Version suivante :

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;

}

 

Vous n'avez pas un seul si, ça ne marche pas comme ça.

Encore une fois, vous devez comprendre les conditions, c'est l'essentiel. Je ne sais pas où trouver cela dans le manuel.

 
Mathemat >>:

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

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

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

при условиях

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

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

La condition est unique, tout le reste est réécrit vers l'extérieur.

 
Mathemat >>:

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

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

Lire "virgule opérateur". :)

 

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

Et où est la mise au rebut de tous les éléments sauf le dernier ?

Aussi :

Dans le langage SI, une affectation est également une expression, et la valeur d'une telle expression est la valeur qui est affectée.

C'est ce que je dis, beaucoup d'affectations sont des expressions, évaluées en fonction de leur position, c'est-à-dire vrai/faux.

2 C-4 : Votre interprétation de l'opérande b-c dans la toute première boucle comme une affectation n'est pas claire pour moi.

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

Dans ce contexte, deuxième = dernier. La définition formelle est récursive, c'est-à-dire que le deuxième opérateur peut être composé (et contenir à nouveau une virgule).