Главная | Комментарии | О проекте
Чтение RSS
Суперсайт
Главная Контакты Карта сайта Добавить в избранное
  • Кто OnLine

    Всего на сайте: 9
    Гостей: 7
    Пользователи: Vladik
    Роботы: crawl Bot

    Опрос пользователей

    Для какого мода Вы пишите плагины?

    • Популярное

    Рекомендуем

    • AMX Mod X
    • up.org.ua

    Наши друзья


  • Автор: Admin Дата: 10-12-2011, 15:03 Просмотров: 22322

    Урок 6. Циклы. Какие бывают циклы. (Что такое for,while,do while)

    Что такое циклы.

    Если по простому, то это регулярно повторяющиеся события.
    Например Недельный цикл.
    В каждой недели 7 дней которые повторяются из недели в неделю.
    В PAWN`e практически все тоже самое, главное разобраться как работает каждый из циклов.

    Цикл - это выполнение одного и того же кода определенное количество раз.

    Зачем нужны циклы.

    1. Они необходимы когда появляется Необходимость выполнить функцию для каждого игрока непосредственно в данный момент.
    2. Выполнить какой то код необходимое количество раз - например составление топ 15 (он же составляется построчно).


    Какие бывают циклы.

    В Pawn циклы бывают трех видов:
    • For - Цикл со счетчиком. Необходимо использовать когда мы знаем количество итераций цикла ( итерация - повторное выполнение функции)
    • While - Цикл с предусловием. Будет выполняться пока условие верно
    • do while - Цикл с постусловием. Будет выполниться первый раз и проверит условие и если оно верно выполниться снова и так дока условие будет верно


    Синтаксис и примеры циклов.

    Синтаксис цикла for следующий
    for(оператор_инициализация; условие; поститерационная_команда ) Х             //Тело цикла    }
    Как он работает: Перед первой итерацией ( проходом ) выполняется оператор инициализации, обычно это инициализация счетчика цикла. Затем проверка условия, и если оно истинно ( к пример 1=1), то выполняется тело цикла, а после того как оно выполнено - поститерационная команда. Вот как это работает наглядно:
    for( new i = 1; i <= 10; i++) {             
    server_print("For: %d",i)    
    }
    • new i = 1 - объявили новую переменную и сказали что она равно единице
    • i <= 10 - Объявили условие что цикл должен выполниться если i меньше или равна дести.
    • Далее начинается работа цикла он проверяет это условие и так как i равна 1 то выполняется тело цикла которое заключено в фигурные скобки { server_print("For : %d",i) }
    • После того как тело выполнено, наступает очередь поститерационной команды i++, в ней мы к i добавляем 1, то есть i у нас теперь становиться равной 2.
    • Так как цикл не закончил свою работу, он заново проверяет условие i<=10 у нас i равно теперь двум это тоже подходит под условие и все идет далее по кругу, до того момента пока i не станет равно 11 и условие i <=10 будет не верно, ( 11 <= 10 это же не правильно ) и цикл прекратит свою работу.
    Вот так работает данный цикл. Результат работы цикла будет в виде 10 сообщений в консоли сервера:
    For:1
    For:2
    For:..  
    For:10


    Синтаксис цикла while.
    Цикл while называют цклом с предусловием потому что сначала проверяется условие, и если оно верно, то выполняется тело цикла.
    while(условие){
             //Тело цикла
    }

    Как он работает, тут все проще:
    new i = 1
    while( i <= 10){
             server_print("For: %d",i)
            
             i++
    }

    Результат будет точно такой же как и от прошлого цикла, но принцип работы разный:
    • new i = 1 Вне цикла объявлена переменная и присвоено значение
    • while( i <= 10) проверка условия цикла: если i ( мы же помним что оно равно 1) меньше или равна 10,условие верно по этому выполняется тело цикла. (следующий пункт)
    • {
               server_print("For: %d",i)
              
               i++
      }

      в теле которого мы к переменной i прибавляем по единице при каждом проходе цикла.
    • После того как прохождение по телу цикла закончено, процесс возвращается к проверке условия и если оно верно повториться.
      И так будет продолжаться пока условие будет верно, как условие станет не верным, цикл прекратиться.
    • Что-бы пропустить елемент используется continue;:
      while(i<=10){
          i++;
          if( i % 2)
              continue;

          server_print("%d парное!",i);
      }

      В данном примере цикл пропустит все варианты где i парное число.
    • Что-бы прекратить цикл используют break;
      while(i < 4){
          server_print("[%d]",i);
          i++;
          break;
      }

      В данном примере цикл начнет выполнятся и прервется как только дойдет до оператора break


    Данный цикл лично я использую для работы с результатами запросов к базе данных и в некоторых других случаях.

    И последний цикл do-while.
    Как вы уже наверное догадались, это практически такой же цикл как и while, но с одним серьезным отличием, в данном цикле тело цикла выполниться хотя бы 1 раз, так как проверка условия происходит не до, а после итерации.
    Синтаксис:
    do
    {
        // тело цикла
    }
    while( условие )


    Небольшой примерчик:
    new i = 1
    do
    {
             server_print("For: %d",i)
          
             i++
    }
    while( i <= 10 )


    Думаю вы и сами догадались как работает данный цикл и что результат будет опять таким же как и в прошлых циклах.
    Но если мы изменим условие во всех циклах на заведомо не верное, то в этом цикле в отличие от остальных пройдет одна итерация.
    Данный цикл крайне редко встречается в плагинах, по этому не имеет смысла на нем заострять внимание.

    Задачка для самоконтроля и закрепления материала:
    Напишите цикл в котором будет проверяться каждый игрок, живой он или нет.
    Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
    Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.
    Урок 6. Циклы. Какие бывают циклы. (Что такое for,while,do while)
    Maf1a

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Ну вот тебе цикл на проверку игрока

    for(i = 1; i <= get_maxplayers ( ); i++){
    if(is_user_alive(i)){
      new name[32]
      get_user_name(i,name,31)
      server_ptint("%d жив!",name)
    }
    }
    HoLLyWooD

    26.09.2011
    ICQ: 8272341
    Публикаций: 3
    Комментариев: 10
    Репутация: -  0  +

    droper,
    Те циклы как примеры служат. Для полного выхода из цикла либо пропуска текущего прохода.
    uNkez

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Цитата: Maf1a

    for(i = 1; i <= get_maxplayers ( ); i++)
    {
     if(is_user_alive(i)){
      new name[32]
      get_user_name(i,name,31)
      server_ptint("%d жив!",name)
      }
    }

      server_ptint("%d жив!",name)

    =>

    server_print(0,%d - жив!, name)

    Я могу ошибаться , но я попробывал исправить его ошибки)
    DeMNiX

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    Цитата: uNkez
    server_print(0,%d - жив!, name)


    ===>

    Цитата: uNkez
    server_print(0,"%d - жив!", name)


    Ковычки потерял)
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

    http://www.amxmodx.org/funcwiki.php?search=server_print&go=search
    server_print ( const message[], [ ... ] )

    Читайте синтаксис функций....
    --------------------
    lailador

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    do while - Цикл с постусловием. Будет выполниться первый раз и проверит условие и если оно верно выполниться снова и так дока условие будет верно

    "дока"

    Не придираюсь просто думал что такое дока, так как программированием тут занимаемся, на обычные словечки памяти не хватает)))
    hummer

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    for( new i = 1; i <= 10; i++) {
    server_print("For: %d",i)
    }

    После того как тело выполнено, наступает очередь поститерационной команды i++, в ней мы к i добавляем 1, то есть i у нас теперь становиться равной 2.

    А как к i добавляется 1 ? и что значит ++ после i
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

    Научись читать внимательно и пользоваться поиском.
    i++ - пост итерационная команда
    i++ = i+1
    --------------------
    adidas

    --
    ICQ: --
    Публикаций: 0
    Комментариев: 0
    Репутация: -  0  +

    так я не понял чем они (for,while,do while) отличаются
    Admin

    30.07.2011
    ICQ: 980500
    Публикаций: 507
    Комментариев: 333
    Репутация: -  58  +

    перечитай все еще раз и разбери каждый цикл по отдельности, может тогда поймешь.
    --------------------

    Информация

    Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
Наверх

Реклама