[Tutorial] Циклы while, for и условия.
#1

Цикл — разновидность управляющей конструкции в высокоуровневых языках программирования, предназначенная для организации многократного исполнения набора инструкций. Также циклом может называться любая многократно исполняемая последовательность инструкций, организованная любым способом. © wikipedia

_________________________________________________
Цикл for

Пример использования

pawn Code:
for(new i = 0; i < MAX_PLAYERS; i++)
{
Kick(i);
}
Этот цикл кикнет всех игроков.
Это же удобнее, чем писать 500 раз Kick(playerid)?

pawn Code:
new i = 0;
Здесь мы создаём переменную i и присваиваем ей значение 0.
pawn Code:
i < MAX_PLAYERS
Далее мы создаём условие. В нашем случае, цикл прекратиться, когда i станет 500
pawn Code:
i++
Задаём действие(инкремент). Оно будет выполняться, пока заданное нами условие не станет верным.

_________________________________________________

Инкремент - добавление к числу единицы.
Декремент - вычитание из числа единицы.

_________________________________________________

Quote:

Виды условий в языках программирования(самые основные)

!= - не равно.
== - равно
> - больше
< - меньше
>= - больше или равно
<= - меньше или равно.

Если вы зададите невыполнимый цикл, то сервер упадёт в ближайщее время.(На циклах for не проверял, но на while 100%)
Вот пример невыполнимого цикла:

pawn Code:
for(new i = 0; i < -1; i++)
{
Kick(i);
}
В данном случае, действие инкремента, когда условие что переменная будет меньше -1. Цикл идёт в обратную сторону.


_________________________________________________

Цикл while.

pawn Code:
new a = 0;
while(a < 100000)
{
printf("While: %d",a);
a++;
}
Тоже цикл, только заданная переменная изменяется внутри цикла.
В скобках задаётся условие

_________________________________________________

Условие if и оператор else

Используется так, к примеру.

pawn Code:
if(GetPlayerMoney(playerid) < 500)
{
SendClientMessage(playerid,COLOR_YELLOW,"У вас меньше 500$");
}else{
SendClientMessage(playerid,COLOR_YELLOW,"У вас больше 500$");
}
if - задаётся условие,
else - если наоборот.


Другие варианты задания условий

Пример 1

pawn Code:
if((checkpointid == 2 || checkpointid == 3) && IsPlayerAdmin(playerid))
{
SendClientMessage(playerid,COLOR_YELLOW,"Привет администратор!");
}
Что я говорю в этом условии? Если id чекпоинта 2 или 3 и игрок администратор, то отображает надпись
Условие чекпоинтов помещено в ещё одни скобки, иначе бы условие было бы нелогичным.
Quote:

|| - или
&& - и
! - неверно ли?

Пример 2

pawn Code:
if(!IsPlayerAdmin(playerid))
{
Kick(playerid);
}
Этим условием я сообщаю что если игрок не администратор - кикнуть его.
! может быть применён как к функциям так и к переменным.

Другой вариант записи, делает тоже самое.
pawn Code:
if(IsPlayerAdmin(playerid) == 0)
{
Kick(playerid);
}

_________________________________________________

switch и case

Я эти элементы использую крайне редко, но всё таки попытаюсь объяснить на примере:

Пример 1

pawn Code:
new class = 5;

if(class == 0) { Действие }
if(class == 1) { Действие }
if(class == 2) { Действие }
if(class == 3) { Действие }
if(class == 4) { Действие }
if(class == 5) { Действие }

Пример 2

pawn Code:
new class = 5;
switch(class)
{
case 0: { Действие }
case 1: { Действие }
case 2: { Действие }
case 3: { Действие }
case 4: { Действие }
case 5: { Действие }
}
Два последних примера действуют одинаково. Вывод сделаете сами.

_________________________________________________

Совет:
Для оптимизации цикла и быстроты его выполнения используйте переменную, которая при каждом коннекте или дисконнекте игрока, даёт переменной значение GetHighestID()+1 - эту функцию можно найти в Полезных фунцкиях. И тогда вместо MAX_PLAYERS ставит переменную которой мы задали значение максимального ID.

Когда шустрите циклом по игрокам, делая им какое-то действие, всегда задавайте условие - IsPlayerConnected(i) и если да, то выполнять действие.


_________________________________________________


С вами был Faus, спасибо за внимание. Если есть какие-то непонятки или вопросы - спрашивайте.

30 / 03 / 2010
Reply
#2

добавь switch,case
Reply
#3

добавил, только не знаю как всё это объяснить пограмотнее.
Reply
#4

цикл на goto ещё добавь
Reply
#5

goto - оператор безусловного перехода, а не цикл.
ПС: рубильник круче чем условные операторы, раз так в 100500, почему - гуглите сами. (если интересно)
Reply
#6

Цикл SWITCH:

- в case можно указывать только числа, отдельные символы и диапазоны чисел/отдельных символов
- в switch можно указать только число или отдельный символ

Code:
switch ( число )
{
  case 0 : {}
  case 1, 3 : {}
  case 6..9 : {}
  case 10..20, 32, 50..100 : {}
  case 'a' : {}
  case 'a', 'b', 'z' : {}
  case 'a'..'z' : {}
  case 'a'..'z', '_', 'A'..'Z', '[', ']' : {}
}
- все циклы можно досрочно прервать оператором break;
- в циклах while/for можно перепрыгивать итерации с помощью оператора continue;
Reply
#7

switch/case - гораздо быстрее if/else
Reply
#8

я говорю на goto...
:whil
if () goto whil;
Reply
#9

[JIeXa],
Это твоя извращённая фантазия.

В switch можно указывать не только числа, но и выражения
Reply
#10

Ребята, я написал самое основное. Больше новичкам посещающим данные раздел - не пригодиться.
Reply
#11

Кстати, забыли про do {} while
Reply
#12

можно по подробнее про while и какие нибуть примеры по больше
Reply
#13

Набери в поиск слово while.
Reply
#14

насчет частоты использования остальных не знаю, но for самый часто используемый. Да и более гибкий он, т.к. можно в нем создавать локальные переменные " for ( new abc = 0; ; )", которые уходят из стека сразу после окончания цикла
Reply
#15

про do while надо запилить
Reply
#16

замечу что в цикле switch лучше использовать условия по порядку если связано с числами

switch(7)
{
case 1: break;
case 2: break;
case 3: break;
case 4: break;
case 5: break;
case 6: break;
case 7: printf("case 7");
}
Reply
#17

Quote:
Originally Posted by Romanius
замечу что в цикле switch лучше использовать условия по порядку если связано с числами

switch(7)
{
case 1: break;
case 2: break;
case 3: break;
case 4: break;
case 5: break;
case 6: break;
case 7: printf("case 7");
}
Это не так важно для самого switch.

Зато бывают моменты, когда первым case нужно сделать именно то значение, которое по логике должно совпасть быстрее. Есть моменты, где и наоборот.

Поэтому лучше логически вычислять наиболее ожидаемые варианты, и ставить их раньше остальных.
Reply
#18

pawn Code:
switch(pTeam) //pTeam из массива enum
{case 1:
 {GivePlayerWeapon(playerid,24,999);}
{case 2:
{GivePlayerWeapon(playerid,29,999);}
будет работать*?
Reply
#19

Quote:
Originally Posted by DiSE
View Post
pawn Code:
switch(pTeam) //pTeam из массива enum
{case 1:
 {GivePlayerWeapon(playerid,24,999);}
{case 2:
{GivePlayerWeapon(playerid,29,999);}
будет работать*?
pawn Code:
switch(pTeam) //pTeam из массива enum
{
case 1: GivePlayerWeapon(playerid,24,999);
case 2: GivePlayerWeapon(playerid,29,999);
}
Reply
#20

ну ладно, вопрос в другом был.
Говорили что case/switch работает с числовыми значениями, или опять до меня не правильно дошло?
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)