За последние 24 часа нас посетили 22465 программистов и 1130 роботов. Сейчас ищут 704 программиста ...

вывод максимального значения в заданном диапазоне

Тема в разделе "PHP для новичков", создана пользователем LevCheb, 21 ноя 2019.

Метки:
  1. LevCheb

    LevCheb Новичок

    С нами с:
    21 ноя 2019
    Сообщения:
    20
    Симпатии:
    0
    Подскажите плиз почему у меня максимальное число не выводит на экран в данном случае это "0" а выводит -500? В интервале 2 элементов! 0 и -500. Показывает что максимальное число -500 но это не так максимальное число будет 0. Объясните пожалуйста в чем именно подвох? Объясните без кода а объясните словами плиз. я понимаю что проблема в условии но не могу понять в чем именно!

    $arr =[5,1,70,900,300,0,-500,-300,-100,1,];

    $n =2;
    $max =0;

    $left =5;
    $right =0;

    $right = $n + $left;

    for($i = $left; $i < $right; $i++){

    if($max < $arr[$i]|| $max ==0)
    $max = $arr[$i];
    }

    echo $max;
     
  2. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
  3. LevCheb

    LevCheb Новичок

    С нами с:
    21 ноя 2019
    Сообщения:
    20
    Симпатии:
    0
    Прочитайте еще раз вопрос задачи) Как вы собираетесь искать с помощью функции max максимальное число в диапазоне заданных значений?)
     
  4. LevCheb

    LevCheb Новичок

    С нами с:
    21 ноя 2019
    Сообщения:
    20
    Симпатии:
    0
    Ну можно и так сказать! Обучает наставник.
     
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @AlexandrS, наверное учебная задачка ;)
    --- Добавлено ---
    @LevCheb, ты нафига второе сравнение в условие ветвления добавил?
    --- Добавлено ---
    Короче считай, что ты написал: если max==0, то max=-500.

    И при поиске максимума переменную max инициализируют минимально возможным (либо еще меньшим) значением или значением первого элемента диапазона (и обход в этом случае начинают обычно со второго).
     
  6. LevCheb

    LevCheb Новичок

    С нами с:
    21 ноя 2019
    Сообщения:
    20
    Симпатии:
    0
    и что тогда нужно сделать получается поменять условие?я к сожаления чуток не понял что вы имели ввиду во втором написанном вами текстом.(
     
  7. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    PHP:
    1. <?php
    2.  
    3. $arr =[5,1,70,900,300,0,-500,-300,-100,1,];
    4.  
    5. $max = 0;
    6.  
    7. for($i = 0; $i < 10; $i++){
    8.  
    9.     echo ($max < $arr[$i]) ? 'true' : 'false';
    10.     echo "<br>";
    11. }
    12.     echo "<br>";
    13.     echo "<br>";
    14.  
    15. for($i = 0; $i < 10; $i++){
    16.  
    17.     echo ($max < $arr[$i] || $max==0) ? 'true' : 'false';
    18.     echo "<br>";
    19. }
    20.  
    21.  
    22. ?>
     
  8. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Говорю, проблемы у тебя в коде тут и тут:
    В первом фрагменте нужно присваивать -100500, а во втором нафиг убрать сравнение вместе со связкой ИЛИ.
    --- Добавлено ---
    P.S. И обращайся (средствами форума) к тому, с кем ты разговариваешь. Я не отслеживаю темы в песочнице этом разделе.
     
  9. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    @LevCheb
    вот еще наглядно:

    С || $max ==0

    PHP:
    1. <?php
    2.  
    3. $arr =[5,1,70,900,300,0,-500,-300,-100,1,];
    4.  
    5. $n =2;
    6. $max =0;
    7.  
    8. $left =5;
    9. $right =0;
    10.  
    11. $right = $n + $left;
    12.  
    13.     for($i = $left; $i < $right; $i++){
    14.  
    15.         if($max < $arr[$i] || $max ==0){
    16.         echo "$max < {$arr[$i]} or  $max == 0 ::: TRUE ";
    17.         echo "<br>";
    18.         $max = $arr[$i];
    19.         }else{
    20.          
    21.         echo "$max < {$arr[$i]} or  $max == 0 ::: FALSE ";  
    22.         echo "<br>";
    23.         $max = $arr[$i];
    24.         }
    25.  
    26.     }
    27.  
    28. ?>
    Без || $max ==0

    PHP:
    1. <?php
    2.  
    3. $arr =[5,1,70,900,300,0,-500,-300,-100,1,];
    4.  
    5. $n =2;
    6. $max =0;
    7.  
    8. $left =5;
    9. $right =0;
    10.  
    11. $right = $n + $left;
    12.  
    13.     for($i = $left; $i < $right; $i++){
    14.  
    15.         if($max < $arr[$i]){
    16.         echo "$max < {$arr[$i]} or  $max == 0 ::: TRUE ";
    17.         echo "<br>";
    18.         $max = $arr[$i];
    19.         }else{
    20.          
    21.         echo "$max < {$arr[$i]} or  $max == 0 ::: FALSE ";  
    22.         echo "<br>";
    23.         $max = $arr[$i];
    24.         }
    25.  
    26.     }
    27.  
    28. ?>
    В первом варианте возвращается последнее значение записанное в цикле в переменную $max т.к. всё true
    Во втором варианте, возвращается ноль, только этот ноль не из массива, а тот, который был изначально присвоен переменной $max до цикла. (т.е. строка #6) т.к. в массиве в условиях было false
     
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @AlexandrS, ТС не смог норм. объяснить появление второго сравнения. Нафиг уделять ЭТОМУ столько внимания? Лучше обрати внимание на вторую указанную мной ошибку ;)
    --- Добавлено ---
    Или ты думаешь, что у него осн. задача – расписать поведение с учетом этого бредового сравнения?
     
  11. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Печь про это :
    ???
     
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
  13. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Я думаю ТС просто экспериментирует. Т.к. если ему нужно выдернуть максимальное значение из заданного диапазона, то, как бы тут
    array_slice() + max()

    PHP:
    1. <?php
    2.  
    3. $arr =[5,1,70,900,300,0,-500,-300,-100,1,];
    4.  
    5. echo max(array_slice($arr, 5, 2));
    6.  
    7. ?>
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @AlexandrS, я тебе про это уже писал:
    Человек походу учится основам, а не использованию стандартных для пыха ф-ций.
     
    AlexandrS нравится это.
  15. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Ну так когда начинал, тоже много интересного писал, да и сейчас бывает :D, а потом, когда узнавал, что есть уже готовая функция, или что-то проще, удивлялся - "А чЁ так можно было?!" o_O
    PS: Одни бесконечно в поисках менторов, другие просто начинают, ставить себе какие-то задачки и начинают их решать и с этого начинают свое познание и изучение. Иногда полезно наступить на грабли, чтоб узнать как они работают :D
     
  16. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Т.е. если бы сразу узнал про ф-цию, забил бы на алгоритм нахождения максимума? :)

    У нас на форуме уже имеется один такой «специалист» :D
     
  17. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Нет. Если бы я изначально не знал, а в процессе узнал, то всё-равно нашел бы решение, но пользовался бы уже тем, что нашел (т.е. то что уже есть в функционале, не велосипедом :) ). В любом случае нахождение решений это уже практика и познание.
     
  18. LevCheb

    LevCheb Новичок

    С нами с:
    21 ноя 2019
    Сообщения:
    20
    Симпатии:
    0
    Пока что обучение идёт без освоения готовых функций PHP.
    --- Добавлено ---
    По этому и стараюсь понять как все это работает
     
  19. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Учитесь отлаживать, выводя промежуточные шаги, а ещё лучше - настроив XDebug
    0 как начальное значение не очень хорош в данном случае. Поскольку у нас не типизированный язык, мы можем воспользоваться значением null и операцией ===. Поскольку в массиве могут быть числа, которые заведомо меньше нуля, и тогда алгоритм будет всегда возвращать ноль
    PHP:
    1. <?php
    2. $arr =[5,1,70,900,300,0,-500,-300,-100,1,];
    3.  
    4. $n =2;
    5. $max = null;
    6.  
    7. $left =5;
    8.  
    9. $right = $n + $left;
    10.  
    11. for($i = $left; $i < $right; $i++){
    12.  
    13.     if($max === null || $max < $arr[$i])
    14.         $max = $arr[$i];
    15.     }
    16.  
    17. echo $max;
    18.  
    19. ?>
    Смотри в моей подписи, как вставляют код на форум
     
  20. LevCheb

    LevCheb Новичок

    С нами с:
    21 ноя 2019
    Сообщения:
    20
    Симпатии:
    0
    @mkramer Спасибо большое за помощь) Не могли бы более развернуто объяснить почему при значение null программа работает?
     
  21. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.554
    Симпатии:
    1.754
    Так уже объяснили - срабатывало при значении -500 часть условия с нулём. А null - совершенно особое значение, null !== 0
    --- Добавлено ---
    P.S. обрати ещё внимание на строгое равенство, в php два оператора проверки на равенство