yacc: Все сообщения за 20 Октября 2008 года

 
ПнВтСрЧтПтСбВс
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

yacc

старожил
★★★
Non-conformist> БАЦ, приехали: вместо while автор почему-то перескакивает на for, мотивируя это тем, что в случае известных границ (количества оборотов цикла), последний удобнее. Ну нафига... Есть же затвержденный кусок, который если не переварили, то по крайней мере вроде бы зажевали, ну не вали ты все в кучу... Можно ведь и через while максимум найти для первого раза, с целью упрощения усвоения материала, или я опять что-то не так понял?
Потому что for действительно удобнее - сравни два куска, которые делают одно и то же, по высоте кода и лаконичности:
code text
  1. int i;
  2.  
  3. /* первый вариант */
  4.  
  5. i=0; /* инициализация*/
  6. while( i < 9 )
  7. {
  8. /* что-то тут делаем */
  9. i++ /* увеличиваем счетчик */
  10. }
  11.  
  12. /* второй вариант */
  13. for ( i=0; i < 9; i++ )
  14. {
  15. /* что-то тут делаем */
  16. }

Не согласен? :) Второй вариант на две строчки короче и яснее - вся работа со счетчиком в одном месте.

Non-conformist> Легко сказать словами, труднее кодом, потому как не знаешь, как это написать! Объясняет на лету: делаем в три шага, с использованием дополнительной переменной для временного хранения одной из переставляемых переменных. Типа девать-то ее некуда!
Non-conformist> Так, поменяли местами (хотя смотришь на эти три инструкции, и вся простота идеи моментально исчезает, непривычность синтаксиса эту самую простоту убивает моментально).
Ну да. Рассмотрим более простой код:
int a,b;
А = 5;
B = 10;
Надо их поменять местами.
Как только ты написал A=B; то значение A ты потерял навсегда - операции присваивания пофиг что там было - у нее есть то, что туда нужно вставить. Поэтому чтобы его не потерять надо место, где запомнить что там было. И зачастую его обозначают как temp, tmp или что-то подобное, что означает temporary - временное. Представь, что в шкафу у тебя две коробки, которые все пространство занимают. Что ты делаешь, чтобы поменять их местами? Правильно - вытаскиваешь куда-то ( на пол, на стул и т.п. в общем - в tmp ;) ) одну, ставишь на ее место другую, а потом из tmp возвращаешь туда первую ;) Точно так же и в компе. Места для переменных - шкаф, размер которого ты определяешь. И если тебе нужно нужно менять местами содержимое ты и определяешь дополнительную полку, на которую при передвижении будешь ставить ;)

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 - ДВА знака равенства. Один знак равенства - всегда присваивание. На этом народ горит, когда прога у них входит в бесконечный цикл ;) А во вторых, у тебя идет уменьшение индекса и тогда уж надо писать i != 0 ( не равно нулю ).
Если ты напишешь for(i=N-1; i==0; i-) то прога будет работать так:
1. Присвоили i значение 26.
2. i равно нулю? - НЕТ!
3. Значит внутрь цикла входить НЕ НАДО, бо цикл исполняется до тех пор, пока i равно нулю.
Понятно? :)

Еще есть вопросики по приведенному коду? ;)
 2.0.0.72.0.0.7

yacc

старожил
★★★
yacc>> На этом народ горит, когда прога у них входит в бесконечный цикл ;)
umbriel> Результат операции присваивания равен тому, что было присвоено, в данном случае 0/ложь - не будет ни одного цикла.
umbriel> На низком уровне (кстати к изучения сначала асма) это связано с установлением флага нуля ZF после последней операции, например cmp, dec, mov
И это типичное бажное место.
 6.06.0

yacc

старожил
★★★
Кстати, я догадываюсь, почему ты не понимаешь, что там делается - тов. Крупник не подумал, что для начинающих лучше расставить скобки, чтобы было понятно что происходит.
Сейчас я их расставлю :

code text
  1. int dig[6] = {5,3,2,4,6,7};
  2. int i,j,N,mm,tmp;
  3. N=6;
  4.  
  5. for(i=N-1; i>=1; i-)
  6. {
  7.    /*находим индекс локального максимума и запоминаем его в mm */
  8.    mm=0;
  9.    for(j=1; j<=i; j++)
  10.    {
  11.       if(dig[j]>dig[mm])
  12.       {
  13.         mm=j;
  14.       }
  15.    }
  16.  
  17.    /* перемещаем локальный максимум в конец, меняя его местами с конечным элементом */
  18.    tmp=dig[i];
  19.    dig[i]=dig[mm];
  20.    dig[mm]=tmp;
  21. }


Так понятнее? ;)
 6.06.0

yacc

старожил
★★★
Non-conformist> Вот, нашел дополнительные (а может наоборот - основные) учебные материалы по Си:
Non-conformist> Язык Си: учебник и практический курс для начинающих: сайт Константина Полякова
Non-conformist> Почитаю, интересно сравнить доходчивость объяснений разных авторов. Хотя сортировка в оглавлении явным образом вроде и не указана...
Ну... сортировка бывает разной, но чаще всего пользуются быстрой - qsort или алгоритм Хоара. Сам со временем придешь, что проще пользоваться библиотечной функцией qsort ( описана в stdlib.h ) нежели чем писать каждый раз свою, но для этого тебе надо сначала научиться бить код на функции, что тебе сильно дело упростит и сделает код гораздо более читаемым.
Кстати, о коде - глянул я твою ссылку... Так вот, есть разные стили оформления, но мой тебе совет - не ленись лишний раз поставить фигурные скобки и сделать отступ - читать легче будет. Пример ( программка печатает совпадение индексов верхнего и вложенного цикла ):
code text
  1. int i, j, M, N;
  2. M = 10;
  3. N = 10;
  4.  
  5. /* Это один из распространенных стилей - нижняя скобка ставится на той же позиции, что и начало оператора, раньше я пользовался именно таким */
  6. for( i = 0; i < N ; i++ ) {
  7.     for ( j = 0; j < M ; j++ ) {
  8.         if ( i == j ) {
  9.            printf ( "Match for i = j = [%d] \\n",i );
  10.         }
  11.     }
  12. }
  13.  
  14. /* Сейчас я пользуюсь таким - ИМХО более читаемый */
  15. for( i = 0; i < N ; i++ )
  16. {
  17.     for ( j = 0; j < M ; j++ )
  18.     {
  19.         if ( i == j )
  20.         {
  21.            printf ( "Match for i = j = [%d] \\n",i );
  22.         }
  23.     }
  24. }
  25.  
  26. /* В приведенной тобой книге автор использует такой */
  27. for( i = 0; i < N ; i++ )
  28.    {
  29.    for ( j = 0; j < M ; j++ )
  30.       {
  31.       if ( i == j )
  32.           {
  33.           printf ( "Match for i = j = [%d] \\n",i );
  34.           }
  35.       }
  36.    }
  37.  
  38. /* А лентяй Крупник записал бы это так  */
  39. for( i = 0; i < N ; i++ )
  40.    for ( j = 0; j < M ; j++ )
  41.       if ( i == j )
  42.          printf ( "Match for i = j = [%d] \\n",i );
  43.  
  44. /* Но ничто не мешает это и в одну строку записать :)))) */
  45. for(i=0;i<N;i++) for(j=0;j<M;j++) if(i==j) printf("Match for i = j = [%d] \\n",i);

Какой выбрать тебе - решай сам. Но Крупниковский удобнее для опытных, а последний служит источником потенциальных алгоритмических ошибок - труднее потом ее найти. ;)
 6.06.0

yacc

старожил
★★★
SkyDron> 2 EvgenyVB : предлагаю сначала прочитать ВСЕ , потом отвечать. А то из пустого в порожнее...
Э... невыполнимое требование - уж на что говорят, что я пишу длинными постами, но твой я ниасилил :P Поэтому и напишу мало...

SkyDron> Как и всегда - бросать нагрузку , маневрировать , ставить помехи , контратаковать.
SkyDron> И у Су-24 тут шансов куда меньше чем у нормального высокоманевренного многоцелевого истребителя , коим можно считать Су-34.
Как сказать... ;) Ну скинул я нагрузку, поставил помехи, что AIM-120 уже не навести, а ОЛС у противника нет... Ну и вперед! Я просто ставлю крылышки на макс.стреловидность и несусь 900 без форсажа у земли. Чтобы воевать против меня пушками надо в хвост зайти и это возможно на истребителе 4-го поколения на малой высоте только на форсаже/максимале - быстренько горючку на малой высоте на этом режиме поистратишь, в отличии от Су-24. А вот Су-34 с тем же Миг-29 будут по потреблению тут примерно равны так что шансов у истребителя будет больше. А если висят кучевые на 400-1000м - вообще найди меня сначала визуально ;)

SkyDron> Не "клиника" , а ситуация которая может возникнуть.
SkyDron> Если самолет может активно вести воздушный бой , то нередко гораздо безопасней контратаковать противника чем пытаться оторваться подставив хвост.
SkyDron> Другое дело что Су-24 , Ф-111 или какому-нибуть А-6 остаеться только последнее...
SkyDron> В этом одно из кардинальных отличий в концепции.
А у Су-34 типа лучше? ;) А летчики на нем обучены воздушному бою против матерых истребителей? ;) Что у Су-24, что у Су-34 обзора ЗПС визуального почти нет. Для истребителя в контрбою он будет котенком - что тот, что другой ;)
 6.06.0

yacc

старожил
★★★
yacc>> Какой выбрать тебе - решай сам. Но Крупниковский удобнее для опытных, а последний служит источником потенциальных алгоритмических ошибок - труднее потом ее найти. ;)
Mishka> Почти мой стиль. :) Кстати, я не согласен, что Крупниковский (на самом деле, это Керниган-Ричи стиль) лучше для опытных. :) Ни фига не лучше. Дело привычки.
Я не говорил "лучше". Я сказал "удобнее" ;) Сие означает, что новичку лучше им не пользоваться - быстрее запутается. Например вот тут лишние скобки не обязательны ( типичный прием ) :

code text
  1.  
  2. int some_func()
  3. {
  4.   int rc;
  5.  
  6.   for(;;)
  7.   {
  8.      rc = func1();
  9.      if ( 0 != rc )
  10.        break;
  11.  
  12.      rc = func2();
  13.      if ( 0 != rc )
  14.        break;
  15.  
  16.      rc = func3();
  17.      if ( 0 != rc )
  18.        break;
  19.  
  20.      rc = func4();
  21.      break;
  22.   }
  23.  
  24.   return rc;
  25. }
 6.06.0

yacc

старожил
★★★
yacc>> Есть такая тема:
Mishka> Вот скажи, разве можно постить такие вещи человеку, который только начинает учить С? :lol:

Какие? Стиль оформления? - ПРОСТО НУЖНО! ;)
 6.06.0

yacc

старожил
★★★
yacc>> Как сказать... ;) Ну скинул я нагрузку, поставил помехи, что AIM-120 уже не навести,
Dio69> Это ещё почему НЕ навести??? :(
Потому что помехи мощные ;) Мне нужны два основных сектора - вперед и назад. Могу и сконцентрировать мощность. Даже скорее вперед - ты еще догони меня на МВ... ;)

Dio69> Зачем здесь пушки-то??!! И ЗАЧЕМ в хвост???!
А что у тебя остается, если РЛ-ракеты не навести? - нет захвата. ;) Только по-старинке - в ближний бой с пушками ;)

Dio69> Перехватчика на тя наводят. А в хвост это - значит двоешник наводчик. Зачем тогда АВАКСы покупать...
Dio69> РЛ-ракетами как раз в лоб стреляют.
Ну навели. См. выше. Что будем делать? ;)
 6.06.0

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru