• Страница 1 из 1
  • 1
Модератор форума: [east_side]_trane, drifter-dron, valych, admin  
Форум » Pawno » Уроки » Урок №23 (Работа с циклами)
Урок №23 (Работа с циклами)
adminДата: Понедельник, 25.10.2010, 20:07:12 | Сообщение # 1

Группа: Администраторы
Сообщений: 3869
Как мы все прекрасно видим, уроков реально по скриптингу мало, а также я заметил, что некоторые не умеют обращаться с циклами. О том, что многие здесь даже не ведают об операторах continue и break, я вообще промолчу. Думаю, данный урок будет им полезен. Постарался изложить все доступным языком.
Сперва узнаем - что же такое цикл?
Цикл - это конструкция, позволяющая выполнить определенное действие n-ное количество раз (пока указанное условие истинно).
Циклы могут избавить программиста от очень муторной работы. Сравним коды, выполняющие одинаковую задачу:
Code

      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");   
      PHP код:
      new a;
      while(a++ < 10)
      {
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      }

Какой вариант лучше? Думаю, очевидно, что второй.
Существует три вида циклов в Pawn:

* while
* for
* do..while

Также здесь будет рассказано о переключателе switch..case.
1. Цикл while.
Цикл while выполняет действие, пока указанное условие является истинным. Конструкция цикла:

Code

      while(условие)
      {
      инструкции (говоря проще, операции)
      }

То, что расположено внутри фигурных скобок, называется телом цикла.
Пример цикла:
Code

      new a; //Объявляем переменную a
      while(a < 10)
      {
      printf("%d", 10);
      a ++;
      }

В результате цикл выведет в консоль числа от 1 до 10.
Этот код еще можно сократить. В результате мы получим:
Code

      new a; //Объявляем переменную a
      while(a++ < 10)
      {
      printf("%d", a);
      }

2. Цикл for.
Это, по сути, упрощенный цикл while. Его можно использовать, к примеру, для проверки данных всех игроков. Заменить пример цикла while, который я писал выше, циклом for, можно так:
Code

      for(new a; a < 10; a++)
      {
      printf("%d", a);
      }

Конструкция:
Code

      for(переменные; условие; операция с переменной-счетчиком)
      {
      инструкции
      }

3. Цикл do..while.
Цикл do..while похож на цикл while, но есть отличие. В чем же, спросите вы, оно заключается? А в том, что сначала выполняются инструкции, а потом проверяется условие. В цикле while все с точностью до наоборот. Конструкция цикла:
Code

      do
      {
      инструкции
      }
      while(условие);   
      Опять же, пример скрипта, выводящего в консоль цифры:
      PHP код:
      new a;
      do
      {
      printf("%d", a);
      a ++;
      }
      while(a < 10);

Первое число выведет вне зависимости от того, меньше ли оно десяти. То есть, если a будет равно, скажем, 17, в консоль это число все равно выведет, но остальные - нет.
4. Переключатель switch..case.
Оператор switch перебирает значения указанной переменной. Конструкция:
Code

      switch(переменная)
      {
      case значение:
      {
      инструкции
      }
      case второе_значение:
      {
      инструкции
      }
      default: //Если значение переменной не равно ни одному (из тех, что в case)
      {
      инструкции
      }

Пример цикла:
Code

      new a = 12;
      switch(a)
      {
      case 3:
      {
      print("a = 3");
      }
      case 7:
      {
      print("a = 7");
      }
      case 12:
      {
      print("a = 12");
      }
      default:
      {
      print("a не равняется ни одному из значений");
      }
      }

Также в switch можно указывать диапазон значений. Диапазон указывается точками. К примеру:
Code

      new a = 12;
      switch(a)
      {
      case 3:
      {
      print("a = 3");
      }
      case 7:
      {
      print("a = 7");
      }
      case 9..15: //Если значение переменной a от 9 до 15
      {
      print("a = 12");
      }
      default:
      {
      print("a не равняется ни одному из значений");
      }
      }

То есть (в третьем кейсе), если значение a от 9 до 15, как и в первом примере, в консоль выведет: "a = 12". Также в одном кейсе можно указывать несколько значений. Пример:
Code

      new a = 12;
      switch(a)
      {
      case 7, 12, 18: //Если a равно 7, 12 или 18
      {
      print("a = 7 || a = 12 || a = 18");
      }
      case 5..10, 16..18: //Если значение a от 5 до 10, либо от 16 до 18
      {
      print("a = 5 || a = 6 || a = 7 || a = 8 || a = 9 || a = 10 || a = 16 || a = 17 || a = 18");
      }
      }

В кейсах может быть и проверка на символы. Они заключаются в одиночные скобки.
5. Операторы для работы с циклами.
Для работы с циклами есть два специальных оператора - continue и break. Сейчас разберемся, как они работают.
5.1. Оператор continue.
Допустим, у нас выполняются действия, и вдруг появляется необходимость переключить цикл на следующую итерацию. Что же в таком случае нужно делать? Использовать оператор continue. Этот оператор не выполняет оставшиеся действия текущей итерации, мгновенно переключая на следующую. Посмотрим, как его использовать, на примере. Предположим, у нас под таймером стоит цикл на всех игроков, где идут различные проверки, но тут (в одной из итераций) игрока нужно кикнуть. Цикл, вне зависимости от того, кикнут или не кикнут игрок, продолжит выполнение текущей итерации. Возьмем для этого цикл for:
Code

      for(new a; a < 50; a++) //Проверяем первые 50 игроков
      {
      if(GetPlayerSpecialAction(a) == 2) Kick(a);
      new b;
      b ++;
      }

В этом случае после кика переменная b все равно будет объявлена и увеличится на 1 (повторяю, это только пример. Инструкций может быть гораздо больше). А в этом примере экономится время, и сразу после кика выполняется переход к следующей итерации:
Code

      for(new a; a < 50; a++) //Проверяем первые 50 игроков
      {
      if(GetPlayerSpecialAction(a) == 2)
      {
      Kick(a);
      continue;
      }
      new b;
      b ++;
      }

То есть здесь после кика переменная b не объявится, и не выполнится инкрементация, а будет проверять уже следующего игрока.
5.2. Оператор break.
К примеру, у нас есть бесконечный цикл (немного о них можно почитать в п. 6), и нужно выйти из цикла до его "естественного" окончания. Для этого можно использовать оператор break.
Оператор break завершает цикл до окончания выполнения всех инструкций. Допустим, у нас, опять же, есть цикл на проверку пятидесяти игроков. Если значение денег десятого игрока равно $100, мы остальных игроков не проверяем (то есть завершаем цикл):
Code

      for(new a; a < 50; a++)
      {
      if(a == 10 && GetPlayerMoney(a) == 100) //Если у игрока под ID 10 имеется ровно 100 долларов
      {
      break; //Завершаем действие цикла
      }
      }

6. Бесконечные циклы.
Циклы, конечно же, могут выполняться бесконечно. Проще всего делать бесконечные циклы, используя конструкцию for. Выглядеть это будет так:
Code

      for(; <img src="http://s106.ucoz.net/sm/1/wink.gif" border="0" align="absmiddle" alt="wink">
      {
      инструкции
      }

Автор:Andrew
Источник



zm-jail.ru

Разработка сайта samp-pawno.ru


 
СообщениеКак мы все прекрасно видим, уроков реально по скриптингу мало, а также я заметил, что некоторые не умеют обращаться с циклами. О том, что многие здесь даже не ведают об операторах continue и break, я вообще промолчу. Думаю, данный урок будет им полезен. Постарался изложить все доступным языком.
Сперва узнаем - что же такое цикл?
Цикл - это конструкция, позволяющая выполнить определенное действие n-ное количество раз (пока указанное условие истинно).
Циклы могут избавить программиста от очень муторной работы. Сравним коды, выполняющие одинаковую задачу:
Code

      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      SendClientMessage(playerid, 0xFFFFFFFF, "");   
      PHP код:
      new a;
      while(a++ < 10)
      {
      SendClientMessage(playerid, 0xFFFFFFFF, "");
      }

Какой вариант лучше? Думаю, очевидно, что второй.
Существует три вида циклов в Pawn:

* while
* for
* do..while

Также здесь будет рассказано о переключателе switch..case.
1. Цикл while.
Цикл while выполняет действие, пока указанное условие является истинным. Конструкция цикла:

Code

      while(условие)
      {
      инструкции (говоря проще, операции)
      }

То, что расположено внутри фигурных скобок, называется телом цикла.
Пример цикла:
Code

      new a; //Объявляем переменную a
      while(a < 10)
      {
      printf("%d", 10);
      a ++;
      }

В результате цикл выведет в консоль числа от 1 до 10.
Этот код еще можно сократить. В результате мы получим:
Code

      new a; //Объявляем переменную a
      while(a++ < 10)
      {
      printf("%d", a);
      }

2. Цикл for.
Это, по сути, упрощенный цикл while. Его можно использовать, к примеру, для проверки данных всех игроков. Заменить пример цикла while, который я писал выше, циклом for, можно так:
Code

      for(new a; a < 10; a++)
      {
      printf("%d", a);
      }

Конструкция:
Code

      for(переменные; условие; операция с переменной-счетчиком)
      {
      инструкции
      }

3. Цикл do..while.
Цикл do..while похож на цикл while, но есть отличие. В чем же, спросите вы, оно заключается? А в том, что сначала выполняются инструкции, а потом проверяется условие. В цикле while все с точностью до наоборот. Конструкция цикла:
Code

      do
      {
      инструкции
      }
      while(условие);   
      Опять же, пример скрипта, выводящего в консоль цифры:
      PHP код:
      new a;
      do
      {
      printf("%d", a);
      a ++;
      }
      while(a < 10);

Первое число выведет вне зависимости от того, меньше ли оно десяти. То есть, если a будет равно, скажем, 17, в консоль это число все равно выведет, но остальные - нет.
4. Переключатель switch..case.
Оператор switch перебирает значения указанной переменной. Конструкция:
Code

      switch(переменная)
      {
      case значение:
      {
      инструкции
      }
      case второе_значение:
      {
      инструкции
      }
      default: //Если значение переменной не равно ни одному (из тех, что в case)
      {
      инструкции
      }

Пример цикла:
Code

      new a = 12;
      switch(a)
      {
      case 3:
      {
      print("a = 3");
      }
      case 7:
      {
      print("a = 7");
      }
      case 12:
      {
      print("a = 12");
      }
      default:
      {
      print("a не равняется ни одному из значений");
      }
      }

Также в switch можно указывать диапазон значений. Диапазон указывается точками. К примеру:
Code

      new a = 12;
      switch(a)
      {
      case 3:
      {
      print("a = 3");
      }
      case 7:
      {
      print("a = 7");
      }
      case 9..15: //Если значение переменной a от 9 до 15
      {
      print("a = 12");
      }
      default:
      {
      print("a не равняется ни одному из значений");
      }
      }

То есть (в третьем кейсе), если значение a от 9 до 15, как и в первом примере, в консоль выведет: "a = 12". Также в одном кейсе можно указывать несколько значений. Пример:
Code

      new a = 12;
      switch(a)
      {
      case 7, 12, 18: //Если a равно 7, 12 или 18
      {
      print("a = 7 || a = 12 || a = 18");
      }
      case 5..10, 16..18: //Если значение a от 5 до 10, либо от 16 до 18
      {
      print("a = 5 || a = 6 || a = 7 || a = 8 || a = 9 || a = 10 || a = 16 || a = 17 || a = 18");
      }
      }

В кейсах может быть и проверка на символы. Они заключаются в одиночные скобки.
5. Операторы для работы с циклами.
Для работы с циклами есть два специальных оператора - continue и break. Сейчас разберемся, как они работают.
5.1. Оператор continue.
Допустим, у нас выполняются действия, и вдруг появляется необходимость переключить цикл на следующую итерацию. Что же в таком случае нужно делать? Использовать оператор continue. Этот оператор не выполняет оставшиеся действия текущей итерации, мгновенно переключая на следующую. Посмотрим, как его использовать, на примере. Предположим, у нас под таймером стоит цикл на всех игроков, где идут различные проверки, но тут (в одной из итераций) игрока нужно кикнуть. Цикл, вне зависимости от того, кикнут или не кикнут игрок, продолжит выполнение текущей итерации. Возьмем для этого цикл for:
Code

      for(new a; a < 50; a++) //Проверяем первые 50 игроков
      {
      if(GetPlayerSpecialAction(a) == 2) Kick(a);
      new b;
      b ++;
      }

В этом случае после кика переменная b все равно будет объявлена и увеличится на 1 (повторяю, это только пример. Инструкций может быть гораздо больше). А в этом примере экономится время, и сразу после кика выполняется переход к следующей итерации:
Code

      for(new a; a < 50; a++) //Проверяем первые 50 игроков
      {
      if(GetPlayerSpecialAction(a) == 2)
      {
      Kick(a);
      continue;
      }
      new b;
      b ++;
      }

То есть здесь после кика переменная b не объявится, и не выполнится инкрементация, а будет проверять уже следующего игрока.
5.2. Оператор break.
К примеру, у нас есть бесконечный цикл (немного о них можно почитать в п. 6), и нужно выйти из цикла до его "естественного" окончания. Для этого можно использовать оператор break.
Оператор break завершает цикл до окончания выполнения всех инструкций. Допустим, у нас, опять же, есть цикл на проверку пятидесяти игроков. Если значение денег десятого игрока равно $100, мы остальных игроков не проверяем (то есть завершаем цикл):
Code

      for(new a; a < 50; a++)
      {
      if(a == 10 && GetPlayerMoney(a) == 100) //Если у игрока под ID 10 имеется ровно 100 долларов
      {
      break; //Завершаем действие цикла
      }
      }

6. Бесконечные циклы.
Циклы, конечно же, могут выполняться бесконечно. Проще всего делать бесконечные циклы, используя конструкцию for. Выглядеть это будет так:
Code

      for(; <img src="http://s106.ucoz.net/sm/1/wink.gif" border="0" align="absmiddle" alt="wink">
      {
      инструкции
      }

Автор:Andrew
Источник


Автор - admin
Дата добавления - 25.10.2010 в 20:07:12
sk47Дата: Среда, 10.11.2010, 14:51:06 | Сообщение # 2

Группа: Пользователи
Сообщений: 28
автор Andrew (pawno.ru)

Готово
 
Сообщениеавтор Andrew (pawno.ru)

Готово

Автор - sk47
Дата добавления - 10.11.2010 в 14:51:06
bongpong1337Дата: Четверг, 02.03.2017, 20:37:57 | Сообщение # 3

Группа: Пользователи
Сообщений: 1
Сделаю небольшую поправочку.

     
Код
new a; 
      while(a < 10) 
      { 
          SendClientMessage(playerid, 0xFFFFFFFF, ""); 
      }
      a++;
 
СообщениеСделаю небольшую поправочку.

     
Код
new a; 
      while(a < 10) 
      { 
          SendClientMessage(playerid, 0xFFFFFFFF, ""); 
      }
      a++;

Автор - bongpong1337
Дата добавления - 02.03.2017 в 20:37:57
Форум » Pawno » Уроки » Урок №23 (Работа с циклами)
  • Страница 1 из 1
  • 1
Поиск:
Загрузка страницы, займет меньше минуты...
Загрузка...

Статистика Форума
Последнии темы Читаемые темы Лучшие пользователи Новые пользователи
Система телефонов поломалась
Не в себе
фильм скалайн
Трансформеры 3
форсаж 6
Ищу [FS]Для админок на сервер
нужны координаты карты для отметки зон...
Помогите найти мод
pawno урок автоматические ворота
обращение к скриптерам.
Вопросы по скриптингу
Ваши ошибки при компиляции GM/FS

Вопросы по скриптингу

(1081)

Считаем до 1000

(274)

Ваши ошибки при компиляция gm

(260)

Набор в команду

(80)

Ваши ошибки при компиляции GM/FS

(71)

вопроосы по скриптингу от 22.04.2013

(64)

Баннеробмен

(64)

несколько команд на samp 0.3 c

(64)

Оценки сайта samp-pawno.ru

(55)

Заказ хостинга

(51)

Набор в команду(форум)

(45)

Урок №61 по созданию системы авто для GodFather

(45)

admin

(3869)

[east_side]_trane

(443)

TWiX

(316)

valych

(501)

drifter-dron

(477)

danik_rok

(317)

Dimka_71rus

(360)

Drifter96

(300)

MaNb9K

(220)

[MTA]MaPeR5518

(181)

Dima_Tkach

(107)

Nik_Ull

(184)

system32xzxz

(Четверг 09:25:24)

torbin169

(Суббота 23:09:29)

kuchuk_00

(Суббота 17:10:14)

artem_boyko_3

(Суббота 15:57:37)

greggelbak

(Среда 18:29:37)

vladisvlavs

(Среда 13:51:57)

add02102002

(Понедельник 22:37:15)

Диман221

(Понедельник 18:12:45)

almas051004

(Воскресенье 11:05:32)

megasuccessms

(Суббота 14:15:36)

nawe

(Пятница 22:25:23)

swoysb

(Пятница 14:55:29)

Вверх
14:45:43
ОбновитьСмайлыУправление мини-чатом
ЧАТ-PAWNO
2010-2024

vkontakte :samp-pawno.ru: