Non-conformist> БАЦ, приехали: вместо while автор почему-то перескакивает на for, мотивируя это тем, что в случае известных границ (количества оборотов цикла), последний удобнее. Ну нафига... Есть же затвержденный кусок, который если не переварили, то по крайней мере вроде бы зажевали, ну не вали ты все в кучу... Можно ведь и через while максимум найти для первого раза, с целью упрощения усвоения материала, или я опять что-то не так понял? Потому что for действительно удобнее - сравни два куска, которые делают одно и то же, по высоте кода и лаконичности:
code text
int i;
/* первый вариант */
i=0; /* инициализация*/
while( i < 9 )
{
/* что-то тут делаем */
i++ /* увеличиваем счетчик */
}
/* второй вариант */
for ( i=0; i < 9; i++ )
{
/* что-то тут делаем */
}
Не согласен?
![:) :)](http://s.wrk.ru/s/smile.gif)
Второй вариант на две строчки короче и яснее - вся работа со счетчиком в одном месте.
Non-conformist> Легко сказать словами, труднее кодом, потому как не знаешь, как это написать! Объясняет на лету: делаем в три шага, с использованием дополнительной переменной для временного хранения одной из переставляемых переменных. Типа девать-то ее некуда! Non-conformist> Так, поменяли местами (хотя смотришь на эти три инструкции, и вся простота идеи моментально исчезает, непривычность синтаксиса эту самую простоту убивает моментально). Ну да. Рассмотрим более простой код:
int a,b;
А = 5;
B = 10;
Надо их поменять местами.
Как только ты написал A=B; то значение A ты потерял навсегда - операции присваивания пофиг что там было - у нее есть то, что туда нужно вставить. Поэтому чтобы его не потерять надо место, где запомнить что там было. И зачастую его обозначают как temp, tmp или что-то подобное, что означает temporary - временное. Представь, что в шкафу у тебя две коробки, которые все пространство занимают. Что ты делаешь, чтобы поменять их местами? Правильно - вытаскиваешь куда-то ( на пол, на стул и т.п. в общем - в tmp
![;) ;)](http://s.wrk.ru/s/wink.gif)
) одну, ставишь на ее место другую, а потом из tmp возвращаешь туда первую
![;) ;)](http://s.wrk.ru/s/wink.gif)
Точно так же и в компе. Места для переменных - шкаф, размер которого ты определяешь. И если тебе нужно нужно менять местами содержимое ты и определяешь дополнительную полку, на которую при передвижении будешь ставить
Non-conformist> Непонятно только, почему он офомляет цикл как Non-conformist> for(i=N-1; i>=1; i-) Non-conformist> а не Non-conformist> for(i=N-1; i=0; i-) Non-conformist> Т.е. тут целых два непонятных момента: почему идем до индекса "1" а не "0", т.е. до второго элемента, а не до первого; и почему ">=" а не "="? Ну во первых ( это ко второму вопросу ), потому что сортировка - это перестановочный алгоритм. А переставить можно минимум
два элемента. Если идти до "1" то переставить можно элементы 0 и 1. А если до 0 ( один элемент ) - что тут переставлять?
А во вторых - ты совершил типичную очень критичную ошибку ( даже две ) в своем варианте.
Во-первых операция "равно ли i нулю?" выглядит как i
== 0 - ДВА знака равенства. Один знак равенства - всегда присваивание. На этом народ горит, когда прога у них входит в бесконечный цикл
![;) ;)](http://s.wrk.ru/s/wink.gif)
А во вторых, у тебя идет уменьшение индекса и тогда уж надо писать i != 0 ( не равно нулю ).
Если ты напишешь for(i=N-1; i==0; i-) то прога будет работать так:
1. Присвоили i значение 26.
2. i равно нулю? - НЕТ!
3. Значит внутрь цикла входить НЕ НАДО, бо цикл исполняется до тех пор, пока i равно нулю.
Понятно?
Еще есть вопросики по приведенному коду?