За последние 24 часа нас посетили 22716 программистов и 1224 робота. Сейчас ищут 743 программиста ...

Помощь начинабщему №2 (Практикум)

Тема в разделе "PHP для новичков", создана пользователем Alukard, 14 авг 2006.

  1. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    Учитывая вышестоящие рекомендации:
    Код (Text):
    1. <?
    2. function my_sort(&$arr){
    3.     $sz = count($arr);
    4.     for ($i=1; $i < $sz; $i++){  
    5.         if ($arr[$i-1] > $arr[$i]){      //Если текущий эл-т меньше предыдущего, то...
    6.            $temp = $arr[$i-1];           //..."Меняем местами ".$arr[$i-1]." и ".$arr[$i]."
    7.            $arr[$i-1] = $arr[$i];
    8.            $arr[$i]   = $temp;
    9.            $i--;$i--
    10.         }
    11.     }
    12.     return $arr;
    13. }
    14. ?>
    Значит так... алгоритм.... хорошо, попробуем...
    1. Начинаем проверять с второго элемента, он имеет индекс "1"
    Если второй элемент больше первого, то:
    1.1. меняме их местами
    1.2. Смещаем индекс $i на две единицы влево... Получаем к примеру 0
    2. Цикл пошел на второй круг... скрипт увеличил индекс на 1, получилось $i == 1
    3. Опять сравнили: второй элемент больше ли первого...
    мы помним, что в прошлый раз мы проверили эти два элемента и уже поменяли их местами, значит пропускаем участок кода и переходим на третий круг.
    4. Обнаружили например, что третий элемент больше второго:
    4.1. Поменяли их местами,
    4.2 Уменьшили индекс на два ($i == 1)
    5. При переходе на следующий, четвертый круг опять увеличится индекс на 1 ($i == 2)
    ...

    Может быть не совсем понятно объясняю, но вроде так... Как видим, за пределы массива мы не выходим...

    2Raa
    Прости, что нечетко формулирую мысли: "не согласен" - с тем, что приемлемо начинать программировать с php... не знаю, может кто и начал с него, но для меня эта ситуация выглядит жутко

    2Raa
    А что такое нотисы? ;)
     
  2. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Если у тебя $i = 1, и ты смешаешь указатель влево на 2 единицы, то получишь к примеру не 0, а -1 :))

    Включи нотисы в PHP, а то ты не видишь ошибок в своем коде.

    php.ini
    Код (Text):
    1. error_reporting = E_ALL
     
  3. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Я этого не говорил.
     
  4. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    2Raa
    да... понял... выглядит жутко... опять промазал :(

    ничего не вижу кроме:
    Код (Text):
    1.  
    2. for ... {
    3.     $i = ($i==0)?1:$i;
    4. ...
    :(
     
  5. Петр

    Петр Активный пользователь

    С нами с:
    20 мар 2006
    Сообщения:
    1.253
    Симпатии:
    0
    Адрес:
    Центр Вселенной
    Прочитал тут фамилию Фаронов.

    НОВИЧКИ!!! Не спутайте учебник по паскалю с книгой TURBO PASCAL 7.0 Практика программирования этого же автора!!!

    В этой книжке сложно разбираться.
     
  6. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Ну, то что мы вышли за пределы массива - это мы уже увидили :) Алгоритм, в общем, ясен. Только это не доказательство его работоспособности :)
    По-моему, это не пузырьковый метод. Это больше похоже на "линейную" сортировку. Только здесь вместо того, чтобы находить минимальный (максимальный) элементы и ставить их по порядку, берется следующий по порядку элемент и ставится на свое место среди ранее отсортированных. Плюс курсор еще постоянно пробегает по уже отсортированной части массива, что явно излишне.
     
  7. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Если интересно - думай, как изменить алгоритм, чтобы курсор не делал лишнюю беготню взад-вперед. Маленька подсказка-проверка на результат: здесь на самом деле два цикла: один вложен в другой. Просто ты развернул их в один. Сделаешь с двумя - все будет проще выглядеть, и проблема с выходом за границы массива должна решиться.
     
  8. karatist

    karatist Активный пользователь

    С нами с:
    15 авг 2006
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Орел
    вот что получилось с учетом замечаний:

    PHP:
    1. <?php
    2. $ar = array (1,12,334,5,66,7,9,0);
    3.  
    4.     foreach ($ar as $value) {
    5.         echo $value;
    6.         echo "\n<br>";
    7.     }
    8.  
    9. function sorting(&$arr){
    10. // This function use "SelectSort" method.
    11.     $size = count($arr);
    12.     for ($i = 0; $i < $size; $i++) {
    13.         $min = $arr[$i];
    14.         $key = $i;
    15.         for ($j = $i+1; $j < $size; $j++) {
    16.             if ( $arr[$j] < $min ) {
    17.                 $key = $j;
    18.                 $min = $arr[$j];
    19.             }
    20.         }
    21.         $arr[$key] = $arr[$i];
    22.         $arr[$i] = $min;
    23.     }
    24.     return $arr;
    25. }
    26.     echo "<br><br>";
    27.     foreach (sorting($ar) as $value) {
    28.          echo $value;
    29.          echo "\n<br>";
    30.     }
    31.  
    32. ?>
    33.  
     
  9. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Ну, все круто. Только направление сортировки вообще куда-то исчезло. И результат теперь не пойми с какой стороны ловить. Если я пишу вот так
    PHP:
    1. <?php
    2. $aSource = (1,3,2);
    3. $aResult = sorting($aSource);
    4. ?>
    то имею в итоге два одинаковых массива, а исходный массив потерян. Зачем тогда возвращать значение, если ты массив по ссылке принимаешь?

    Кстати... А как ты так преобразовал код, что у тебя даже метод сортировки изменился? А где ж пузырек? Или тебя обломало его оптимизировать, и ты решил по-тихому воспользоваться другим методом? :)))
     
  10. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    print('<pre>');
    print_r($ar);
    var_dump($ar);
     
  11. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Или вот так

    echo implode(', ', $ar).'<br>';

    :)
     
  12. karatist

    karatist Активный пользователь

    С нами с:
    15 авг 2006
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Орел
    var_dump пользовал.
    про implode видел ссылочку в мануале по var_dump, но руки не дошли.

    вообще отладочными функциями не занимался.
    и соответственно выводом пока не заморачивался.
     
  13. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    +1

    тормоза придумали трусы (c)
     
  14. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
  15. karatist

    karatist Активный пользователь

    С нами с:
    15 авг 2006
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Орел
    согласен - баг.

    зашел разговор про алгоритмы - было как-то стыдно пузырьковый применять после таких супер оптимизаторов как topas.
    :roll:
     
  16. karatist

    karatist Активный пользователь

    С нами с:
    15 авг 2006
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Орел
    ага, смешно. :oops:
     
  17. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Ой, да ладно тебе! :) Нашел чего стыдиться. Имхо, интереснее было бы оптимизировать пузырек, чем заменить его линейной сортировкой, не менее известной, но не с таким смешным названием :)

    Кстати, народ, а кто-нибудь в курсе, как называется метод, который реализовал topas?
     
  18. karatist

    karatist Активный пользователь

    С нами с:
    15 авг 2006
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Орел
    пардон, за оффтоп, но как мне это сделать?

    у меня на FreeBSD только
    ls -al /var/db/pkg | grep php
    drwxr-xr-x 2 root wheel 512 10 окт 2005 mod_php4-4.4.0,1
    drwxr-xr-x 2 root wheel 512 10 окт 2005 php4-mysql-4.4.0


    только mod_php

    ls -al /usr/local/etc/ | grep php
    drwxr-xr-x 2 root wheel 512 10 окт 2005 php
    -r--r--r-- 1 root wheel 96 10 окт 2005 php.conf
    -r--r--r-- 1 root wheel 38652 10 окт 2005 php.ini-dist
    -r--r--r-- 1 root wheel 39482 10 окт 2005 php.ini-recommended


    php.ini ни разу не использоватлся.

    куды бечь?
     
  19. Alukard

    Alukard Активный пользователь

    С нами с:
    27 июн 2006
    Сообщения:
    110
    Симпатии:
    0
    Е мае куда я попал ..... что вы сделали с моей темкой главное тема называлась "помощь начинающЕМУУУУУ (ед.число) теперь х. поймешь что да как:))
    Вот моя сортировочка
    PHP:
    1. <?
    2.  
    3. $arr=array(3,9,2,6,8,4,0,1,5);
    4.  
    5. for($i=0; $i<count($arr); $i++) {
    6.  for ($ii=count($arr)-1; $ii>$i; $ii--) {
    7.     $m=$ii-1;
    8.  
    9.   if($arr[$m]>$arr[$ii]) {
    10.  
    11.       $mem=$arr[$m];
    12.       $arr[$m]=$arr[$ii];
    13.       $arr[$ii]=$mem;
    14.   }
    15.  }
    16. }
    17. foreach ($arr as $key=>$value) {
    18.     print "$key = $value<br>";
    19. }
    20.  
    21. ?>
    Ну теперь займусь заданием Raa если некто непротив :)
     
  20. karatist

    karatist Активный пользователь

    С нами с:
    15 авг 2006
    Сообщения:
    23
    Симпатии:
    0
    Адрес:
    Орел
    не знаю. мне кажется это что-то из неизданного :)
    не верю я что он работает. не верю(с)
    я сегодня штудировал http://algolist.manual.ru/sort/ так вот такое отютение что такой простой код был бы самым оптимальным.
    там ребята такие вещи крутят. математику прикручивают.

    опять же если в цикле счетчик туда сюда возможно зацикливание...
     
  21. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Оххх... Вот чего не знаю - того не знаю. Посмотри php.conf - мож это он? Если нет, попробуй созда php.ini на основе php.ini-recommendedю Если не поможет, попробуй создай в каталоге сайта файл .htaccess и впиши туда такую строку:

    php_value error_reporting 2047

    или прямо в коде PHP напиши такое (обычно делает в общем инклуде)

    error_reporting(E_ALL);


    ЛоЛ. А я вот только вспоминал тебя: "а где же автор темы?" :))

    Я тоже не уверен, что это где-то издано :) Однако, логика прослеживается, и лично мне не странно, что оно работает. Хоть и нотисы сыпятся :)
     
  22. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Великолепно. Только ничего не понятно. Неужто трудно поместить внутрь тэга [ php ], чтобы подсветочка была, и отступы расставить? :-(
     
  23. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    помог товарисчу ...
     
  24. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
  25. Raa

    Raa Активный пользователь

    С нами с:
    28 июл 2006
    Сообщения:
    209
    Симпатии:
    0
    Та вот попробуй теперь найди, где это было :))))

    Вот оно. Нашел.
    http://php.ru/forum/viewtopic.php?t=142 ... c&start=50
    Только там вместо $i-- нужно поставить $i-=2. И еще там указатель вылазит за границы массива. Но худо-бедно с нотисами работает :))))

    Походу, вероятно, автор реализовал алгоритм, известный под названием "Сортировка вставками". Только у него два цикла развернуто в один за счет возврата указателя, и лишние пробежки указателем по уже отсортированной части массива.

    http://algolist.manual.ru/sort/insert_sort.php