[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Вложение циклов
Han
С языка Delphi я помню , что такое вложенные цыклы друг в друга. В данном случае я столкнулся с вложением цыкла for в цыкл for (классический случай).
Немогу понять как он работает и и опять же немогу понять зачем приводить такие примеры в самоучителе для начинающих чтобы обьяснить вложение цыклов


Итак имеем скрипт (нахождение простых чисел)

PHP
<?php
for 
($i = 2; $i < 100; $i++)
{
 for ($j = 2; $j < $i; $j++)
 {
  if (($i%$j)!=0) continue;
  else
  
{
   $flag = true;
   break;
  }
 }
 if(!$flag) echo $i." ";
 $flag = false;
}

Результат работы скрипта

2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97

Разбираем скрипт.

Итак обявляем цыкл for счётчик которог от 2 до 99 и увеличиваем каждый раз переменную $i на 1.

Далее влаживаем в этот цыкл еще один цыкл for счётчик которого считает от 2 до значение переменной $i-1. переменную $j увеличиваем на 1.

далее во внутренем цыкле пользуемся оператором if и если деление по модулю переменной $i и $j не равно 0 , то переходим в начало цыкла, иначе переменной $flag присваиваем значение true и прерываем внутрений цыкл.

Далее во внешнем цыкле идёт проверка и если инверсия переменной $flag вернет истину то печатаем переменную $i и устанавливаем $flag в значение ложь.

Парадоксальность в том, что во внутренем цыкле
PHP
for ($j = 2; $j < $i; $j++)
 {
  if (($i%$j)!=0) continue;
  else
  
{
   $flag = true;
   break;
  }

переменной $flag будет всегда присвоенно значение истина потому ,что если при делении по модулю получаеться число больше 0 , то цыкл переходит в нало и так до тех пор покамисть деление не станет 0 либо покамисть не выполниться условие $j => $i. тоесть переменой $flag будет всегда присвоенно значение истина и следую из кода дальше оператор echo $i." "; некогда не выполинться потому, что проверка if(!$flag) всегда будет возращять результат false.

Второй парадокс в том , что в результате скрипта на первом месте стоит число 2. Чтобы напечатать число 2 нужно чтобы переменная $i была равна 2, а так как в самом начале внешнего цыкла эта переменная увеличиваеться на 1

PHP
for ($i = 2; $i < 100; $i++)
то как так может случиться?



Спустя 24 минуты, 47 секунд (2.05.2009 - 00:17) kirik написал(а):
Цитата (Han @ 1.05.2009 - 15:52)
Чтобы напечатать число 2 нужно чтобы переменная $i была равна 2, а так как в самом начале внешнего цыкла эта переменная увеличиваеться на 1

Не совсем верно. Так как при первом проходе цикла переменная $i равна двум, а уже при втором проходе она увеличивается на 1:
PHP
$i = 1;
echo $i++;
echo '<br />';
echo $i;


Цитата (Han @ 1.05.2009 - 15:52)
тоесть переменой $flag будет всегда присвоенно значение истина

Почему это вдруг? Попробуй к каждому из чисел что вывелись найти делитель, который будет больше 2, но меньше самого числа. Нету? Именно поэтому эти числа и вывелись (тоесть else во втором цикле не сработал).

Спустя 4 минуты, 35 секунд (2.05.2009 - 00:21) Han написал(а):
разве при обьявлении параметров цыкла

PHP
for ($i 2$i 100$i++)


Увелечение на 1 $i++ делаеться не сразу? а потом после этого когда $і ,будет равно 3 выполняеться тело цыкла

Спустя 4 минуты, 11 секунд (2.05.2009 - 00:25) Han написал(а):
Цитата
Почему это вдруг? Попробуй к каждому из чисел что вывелись найти делитель, который будет больше 2, но меньше самого числа. Нету? Именно поэтому эти числа и вывелись (тоесть else во втором цикле не сработал).


Так смотри если число не равно 0 то оператором continue переходим на начало цыкла опять если иначе то $flag = true;

Спустя 2 минуты, 10 секунд (2.05.2009 - 00:28) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:21)
Увелечение на 1 $i++ делаеться не сразу? а потом после этого когда $і ,будет равно 3 выполняеться тело цыкла


$i = 2; выполняется в самом начале цикла и только один раз
$i < 100; это условие будет выполняться в начале каждой новой итерации (повторения)
$i++ будет выполняться в конце каждой итерации

Спустя 4 минуты, 20 секунд (2.05.2009 - 00:32) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:25)
Так смотри если число не равно 0 то оператором continue переходим на начало цыкла опять если иначе то $flag = true;

Да, но если остаток деления так и не стал равным 0, то вложенный цикл заканчивается, а if(!$flag) срабатывает (к первому числу срабатывает потому что $flag еще не определен, а следовательно false; а к последующим числам этот false достается от предыдущей итерации, так как в любом случае в конце цикла $flag устанавливается в false).

Спустя 1 минута, 40 секунд (2.05.2009 - 00:34) Han написал(а):
PHP
$i++ будет выполняться в конце каждой итерации.


Тоесть выполняеться после выполнения тела цыкла?

Спустя 1 минута, 23 секунды (2.05.2009 - 00:35) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:34)
Тоесть выполняеться после выполнения тела цыкла?

Ну выходит что так smile.gif А разве в делфях по-другому?

Спустя 51 секунда (2.05.2009 - 00:36) Han написал(а):
Ты мне столько тонкостей расказываеш( Я в шоке от своего самоучителя. Повезло что есть у кого спросить!

Спустя 2 минуты, 42 секунды (2.05.2009 - 00:38) Han написал(а):
PHP
Ну выходит что так  А разве в делфях по-другому?


там счётчик не так работает например for i:=1 to 10 do тело цыкла

тоесть я чётко знаю что у меня пройдёт 10 итераций и переменная i увеличиваеться в начале цыкла.

Спустя 1 минута, 59 секунд (2.05.2009 - 00:40) kirik написал(а):
Да это как бы не тонкости smile.gif Это все описано на php.net (Просто в поиске вводи что интересует, например "for"), а самомучитель и вправду какой-то странный smile.gif

Спустя 2 минуты, 37 секунд (2.05.2009 - 00:43) Han написал(а):
У меня с английским не очень. А ты свободно можеш читать английский справочник? я пользуюсь php.su

Спустя 1 минута, 49 секунд (2.05.2009 - 00:45) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:38)
там счётчик не так работает например for i:=1 to 10 do тело цыкла

тоесть я чётко знаю что у меня пройдёт 10 итераций и переменная i увеличиваеться в начале цыкла.

Понятно. Не, тут вот немного по-другому. Тоесть если тебе нужно сделать 10 итераций, то есть несколько вариантов:
1 - for($i = 0; $i < 10; $i++) (когда $i начинается с 0)
2 - for($i = 1; $i < 11; $i++) (когда $i начинается с 1)
3 - for($i = 1; $i <= 10; $i++) (когда $i начинается с 1)

Спустя 4 минуты, 23 секунды (2.05.2009 - 00:49) Han написал(а):
Это у меня написано я понял. Просто я не смог разобрать скрипт потому что не знал , что увеличение на 1 происходит после тела цыкла тоесть в конце и не знал что необьявленная переменная будет иметь значение ложь.

запись вида

for($i = 0; $i < 10; ++$i)

тоже вполне рабочая?

Спустя 29 секунд (2.05.2009 - 00:50) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:43)
У меня с английским не очень. А ты свободно можеш читать английский справочник?

Да, у меня нет проблем с английским smile.gif
А вот если ты чаще будешь читать/переводить то через месяц уже сможешь понимать о чем в тексте идет речь smile.gif

php.su тоже не плох, но я не раз замечал что в английской версии более подробно разбираются некоторые моменты, а в русской версии их просто нет.

Живой пример: file() на русском и file() на английском. Как видно в русской не описан параметр $flags.

Спустя 1 минута, 51 секунда (2.05.2009 - 00:52) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:49)
запись вида

for($i = 0; $i < 10; ++$i)

тоже вполне рабочая?

Да, конечно smile.gif Забыл про такой случай.

Спустя 35 секунд (2.05.2009 - 00:52) Han написал(а):
Цитата
А вот если ты чаще будешь читать/переводить то через месяц уже сможешь понимать о чем в тексте идет речь


Согласись всё равно для этого нужно выучить синтаксис английскоко языка. Построение предложение, времена, неправельные глаголы. А я тут по русски не могу понять с самоучителя для новичков.

Спустя 7 минут, 19 секунд (2.05.2009 - 00:59) Han написал(а):
А вот еще вопрос такой очень меня интересующий. Я сейчас дошел уже до перечесления функция разных и по мере изучения книги я начинаю забывать по неможку старое например цыкл while немного подзабыл (в принцыпи чётко помню как он работает но без книжки не смогу сейчас написать скрипт с его использованием). Тоесть по мере изучения книги я начинаю забывать мелочи которы были прочитаны страниц 30-50 назат. Как с этим ты боролся когда начинал учить PHP? Например я знаю только , что нужно много практики тогда всё чётко запоминаеться но пркатики нету потому ,что канкретных задач нету. тоесть я не знаю что мне можно написать такое. Когда я учил делфи то помню к каждому зыклу давалось по 5 задач для решения с использованием в разных вариацыях толька , что прочитаного цыклаи это мне очень помогало всё яётко запомнить. Долго у тебя ушло на изучение PHP , чтобы более менее можно было что то писать серьезное.?

Спустя 19 минут, 26 секунд (2.05.2009 - 01:19) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:59)
Как с этим ты боролся когда начинал учить PHP?

Я с этим ни как не боролся smile.gif Я просто учился не по книжке, а разбирая готовые скрипты методом тыка. Конечно у меня были какие-то понятия о языке программирования (еще со школы), что есть переменная, константа, и прочие начальные определения.

Конечно без практического применения ты будешь забывать как что-то работает, но на самом деле и не нужно помнить вообще все smile.gif Цикл while говорит сам за себя (слово while переводится как "пока"). Тоесть "пока(условие в скобочах верно) { выполняем тело }".

Не занимайся сухой теорией. Напиши что-нибудь простенькое (очень любят писать гостевые книги как первую программку). А потом по мере изучения чего-то более сложного дописывай гостевуху до форума, итд smile.gif

Цитата (Han @ 1.05.2009 - 16:59)
Долго у тебя ушло на изучение PHP , чтобы более менее можно было что то писать серьезное.?

Первое что я написал (а точнее собрал по кускам и заставил работать) это была банерокрутилка(на БД), которая не показывала на одной странице одинаковые баннеры. Потом прикрутил к ней админку. Но "с чистого листа" не мог писать наверное где-то полгода.

Спустя 3 минуты, 24 секунды (2.05.2009 - 01:22) kirik написал(а):
Цитата (Han @ 1.05.2009 - 16:52)
Согласись всё равно для этого нужно выучить синтаксис английскоко языка. Построение предложение, времена, неправельные глаголы.

Тебе не нужны ни времена ни неправильные глаголы. Ты ведь не собираешься пока писать/говорить. А для того чтобы понимать смысл предложения достаточно запомнить некоторое количество слов smile.gif

Спустя 7 минут, 18 секунд (2.05.2009 - 01:30) Han написал(а):
Цитата
не занимайся сухой теорией. Напиши что-нибудь простенькое (очень любят писать гостевые книги как первую программку). А потом по мере изучения чего-то более сложного дописывай гостевуху до форума, итд


Понимаеш дело в том что мне не хватит моих нынешних знаний чтобы написать гостевуху я из книги не понял как работает метод GET и POST. Понял только что этот метод передаёт переменные введенные в форму в масив $_GET и $_POST. Так же не понял как работать с формой. Поєтому хотелось бы что то написать чтобы всё это закрепить но не могу так как нечего.

Ты когда пишеш скрипты книгами пользуешся?

Спустя 6 минут, 39 секунд (2.05.2009 - 01:36) kirik написал(а):
Цитата (Han @ 1.05.2009 - 17:30)
не понял как работает метод GET и POST

Как совет - не ходи дальше, пока не разберешься до конца с тем, что изучаешь.

Цитата (Han @ 1.05.2009 - 17:30)
Понял только что этот метод передаёт переменные введенные в форму в масив $_GET и $_POST.

Ну да, как-то так smile.gif

Цитата (Han @ 1.05.2009 - 17:30)
Так же не понял как работать с формой.

Разберись обязательно. Ничего сложного нет, но это использыется всегда и везде.

Цитата (Han @ 1.05.2009 - 17:30)
Ты когда пишеш скрипты книгами пользуешся?

Не. Максимум чем пользуюсь - php.net, и то когда забываю какие-нибудь функции.

Спустя 5 минут, 7 секунд (2.05.2009 - 01:41) Han написал(а):
Цитата
Как совет - не ходи дальше, пока не разберешься до конца с тем, что изучаешь.


У меня внешние переменные описываються вначале книги сразу после установки апач.

Я со всем разбераюсь в принцыпи нормально и уверенно единственная проблема что начинаю подзабывать мелочи.

И если я сейчас и смогу что то написать то буду подглядівать по главам на форму записи того или иного и вариации записи.

Спустя 2 минуты, 24 секунды (2.05.2009 - 01:44) kirik написал(а):
Цитата (Han @ 1.05.2009 - 17:41)
единственная проблема что начинаю подзабывать мелочи.

Эт фигня smile.gif Главное ты разобрался, а потом вспомнить - уже не составит проблем.

Спустя 7 минут, 43 секунды (2.05.2009 - 01:52) Han написал(а):
ладно спасиб за хорошие советы буду идти спать, на часах 2 ночи.

Спустя 1 день, 20 часов, 30 минут, 56 секунд (3.05.2009 - 22:22) sergeiss написал(а):
Цитата (Han @ 2.05.2009 - 00:38)
PHP
Ну выходит что так  А разве в делфях по-другому?


там счётчик не так работает например for i:=1 to 10 do тело цыкла

тоесть я чётко знаю что у меня пройдёт 10 итераций и переменная i увеличиваеться в начале цыкла.

В дельфях тоже в конце цикла будет увеличение, т.е. в твоем примере переменная i будет равна 1 на первом проходе через тело цикла. А по твоим словам получается, что вовсе не так дело обстоит...
И в языке Си, и в Си++, и даже в Бейсике на первом проходе цикла переменная цикла равна начальной величине! И язык ПХП не является исключением.

Что касается описалова на русском - см. ссылку в моей подписи, качай оттуда и изучай.


_____________
Никогда не бойся делать то, что ты пока не умеешь. Помни, Ковчег был построен любителем. Профессионалы построили "Титаник".
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.