За последние 24 часа нас посетили 16739 программистов и 1694 робота. Сейчас ищут 868 программистов ...

Помогите логически решить

Тема в разделе "PHP для новичков", создана пользователем lemonl, 27 сен 2016.

  1. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Помогите пожалуйста решить логическую задачу ... Есть массив с данными, нужно вывести и просуммировать числа, а именно после первого отрицательного числа второе не учитываем

    Я немного сделал, но это коряво и немного не правильно

    PHP:
    1. $sdda = array(-5,-9,23,-14,-42,-8,11,-12,14,-32,3,42,33,33,28,73,-27,-26,-6,14,-3,-20,-4,15,18,20,3,12,-32,-15,23,-26,-41,-19,-1,17,-25,30,26,-5,43,21,-28,-32,15,26,-1,7,-17,19,-3,-10);
    2.  
    3. for($z=0; $z<count($sdda); $z++) {
    4.      if($sdda[$z]<0 && $sdda[$z+1]<0 && $sdda[$z-1]<=0 || $z-1<0) {
    5.      echo $sdda[$z+1]." | ";
    6. $sums += $sdda[$z+1];
    7.      }
    8.      if($sdda[$z]<0 && $sdda[$z+1]>0) {
    9.      echo $sdda[$z+1]." | ";
    10. $sums += $sdda[$z+1];
    11.      }
    12.      if($sdda[$z]>0 && $sdda[$z+1]<0) {
    13.      echo $sdda[$z+1]." | ";
    14. $sums += $sdda[$z+1];
    15.      }
    16.      if($sdda[$z]>0 && $sdda[$z+1]>0) {
    17.      echo $sdda[$z+1]." | ";
    18. $sums += $sdda[$z+1];
    19.      }
    20. }
    какие числа должны быть :
    -9 | 23 | -14 | -8 | 11 | -12 | 14 | -32 | 3 | 42 | 33 | 33 | 28 | 73 | -27 | -6 | 14 | -3 | -4 | 15 | 18 | 20 | 3 | и так далее ...
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Каким же образом у тебя -9 оказалась в результате на первом месте? Она же идет после -5 и должна быть отброшена.

    Ладно, ты что-то даже сам сделал, это уже похвально, но...умеешь же ты простые вещи решать сложными средствами:)
    Ларчик открывается чуть проще. Написано за 10 минут. В онлайн-редакторе пыхи, на коленке. Обрати внимание, что логика кода явно следует из него самого. Его можно читать вслух буквально как текст, и будет понятно, что он делает. У тебя же происходящее в коде крайне неочевидно... А еще он сыплет нотисами, это плохо.

    Держи:
    PHP:
    1. <?php
    2.  
    3. $sdda = array(-5,-9,23,-14,-42,-8,11,-12,14,-32,3,42,33,33,28,73,-27,-26,-6,14,-3,-20,-4,15,18,20,3,12,-32,-15,23,-26,-41,-19,-1,17,-25,30,26,-5,43,21,-28,-32,15,26,-1,7,-17,19,-3,-10);
    4.  
    5. function myFunc($array){
    6.     $previousIsNegative = false;
    7.     $result = '';
    8.     foreach ($array as $number){
    9.      
    10.         if (($previousIsNegative) && ($number<0))    {
    11.             $previousIsNegative = false;
    12.             continue;
    13.         }
    14.      
    15.         if ($number<0){
    16.             $previousIsNegative = true;
    17.         } else{
    18.             $previousIsNegative = false;
    19.         }
    20.      
    21.         $result .= $number.'|';    
    22.     }
    23.     return $result;
    24. }
    25.  
    26. echo myFunc($sdda);
    27. //-5|23|-14|-8|11|-12|14|-32|3|42|33|33|28|73|-27|-6|14|-3|-4|15|18|20|3|12|-32|23|-26|-19|17|-25|30|26|-5|43|21|-28|15|26|-1|7|-17|19|-3|
    --- Добавлено ---
    И да, на будущее. Так не пиши:
    Ты на каждой итерации дергаешь функцию count.
    Так правильнее:
    PHP:
    1. for($i = 0, $size = count($sdda);  $i < $size ; $i++)
    Итератор я с z заменил на i. Так принято. Во вложенных циклах окромя i используют с каждым уровнем вложенности j, k, l, m, n и т.д. Но именно от i. Это помогает очень при чтении кода.
     
    lemonl нравится это.
  3. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Громадное вам спасибо ! Я тут пересмотрел и выявил некоторую неточность. Я наверно не правильно объяснил и не правильно делал ... здесь же сравнивается в цикле текущее число с предыдущим (То-есть .... если тек.число отриц. и предыдущ. число отриц то берем след. число ... и если тек.число полож. а предыдущ. число отриц то берем текущ. число ... )

    должно быть так:

    -5,23,-14,-8,11,-12,-32,42,33,33,28,73,-27,-6,14,-3,-4,15,18,20,3,12,-32,23,-26,-19,-1,17,30,26,-5,21,-28,15,26,-1,-17,19,-3
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Нет, не так. Ты с ошибкой ряд составил. Должно быть так, как считает мой код. Почти как то, что ты насчитал, да, но точнее.
    Для этого тут есть кнопка "лайк". Не стесняйся.
     
    lemonl нравится это.
  5. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    Вот мы идем ро ряду массива, пор.номер 0 равен -5, значит следующие пор.номер 1 равен -9 не учитываем, а берем пор.номер 2 равен -23.

    а вот если возьмем ряд .... 12,-32,-15,23,-26,-41,-19,-1,17,-25 .... то в нас выводит следующие
    12|-32|23|-26|-19|17|-25|
    а должно
    12|-32|23|-26|-19| - 1| 17|-25|

    выходит что -1 пропустили
     
  6. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Нет, это ты ошибся. А мой код - нет.

    Смотри:
    12,-32,-15,23,-26,-41,-19,-1,17,-25
    А теперь подсветим каждое второе отрицательное число:
    12,-32,-15,23,-26,-41,-19,-1,17,-25
    А теперь выбросим их:
    12,-32,23,-26,-19,17,-25

    И именно такой ответ выдает мой код.
    Не цепляйся к порядковым номерам. Глянь в мой код, там вообще нет порядковых номеров. Они вообще никак не учитываются. Он простой как топор.
    --- Добавлено ---
    Не знаю, может так понятнее будет. С небольшим рефакторингом:

    PHP:
    1. <?php
    2. $sdda1 = array(-5,-9,23,-14,-42,-8,11,-12,14,-32,3,42,33,33,28,73,-27,-26,-6,14,-3,-20,-4,15,18,20,3,12,-32,-15,23,-26,-41,-19,-1,17,-25,30,26,-5,43,21,-28,-32,15,26,-1,7,-17,19,-3,-10);
    3. $sdda2 = array(12,-32,-15,23,-26,-41,-19,-1,17,-25);
    4. function myFunc($array){
    5.     $previousIsNegative = false;
    6.     $result = '';
    7.  
    8.     foreach ($array as $number){  
    9.         if ($number<0){            
    10.             if ($previousIsNegative){
    11.                 $previousIsNegative = false;
    12.                 continue;
    13.             }          
    14.             $previousIsNegative = true;          
    15.         } else{          
    16.             $previousIsNegative = false;
    17.         }  
    18.         $result .= $number.'|';  
    19.     }
    20.  
    21.     return $result;
    22. }
    23. echo myFunc($sdda1),'<br><br>',myFunc($sdda2);
    В любом случае, он работает, хоть там и нет тысяч проверок индексов, спереди, сзади, и так и сяк и через голову. Потому что это ничего не нужно. Нужно просто идти по массиву и помнить, был ли предыдущий элемент отрицательным. Только и всего.
     
    lemonl нравится это.
  7. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    после первого отрицательного числа второе не учитываем не зависимо от того если оно положительное или отрицательное... (не каждое второе отрицательное)

    Смотри:
    12,-32,-15,23,-26,-41,-19,-1,17,-25
    А теперь подсветим каждое второе отрицательное число (другими словами мы уже знаем что каждое второе отрицательное ):
    12,-32,-15,23,-26,-41,-19,-1,17,-25

    а должно быть
    12,-32,-15,23,-26,-41,-19, -1,17,-25
     
  8. RainBowDash

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

    С нами с:
    22 июл 2013
    Сообщения:
    220
    Симпатии:
    8
    сложна , как понять кто прав , а кто нет ?
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Забавно, что это нигде ранее сказано не было. Чтож, тебе карты в руки, мой код не сложно подправить под это дело. Вперед.

    Ну и да, все равно я не могу понять твою логику. По какой причине -1 не отбрасывается? Я вот могу сказать, почему отбрасываю ее - она идет сразу после отрицательного числа. А почему ее не отбрасываешь ты?
     
  10. lemonl

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

    С нами с:
    10 июн 2009
    Сообщения:
    164
    Симпатии:
    0
    после первого отрицательного числа второе не учитываем не зависимо от того, оно положительное или отрицательное... + после этого выводим все числа аж до первого положительного числа... таким образом выходит что:

    -19,-1 выводим аж до положительного числа, это у нас 17
     
  11. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    У тебя показания меняются от поста к посту, скажу я тебе. И, чувствую, это еще не конец. Но мой код легко под это правится. Действуй, я в тебя верю. Халява имеет свойство заканчиваться.
     
  12. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Ещё вариант решения:
    PHP:
    1. $a = [12,-32,-15,23,-26,-41,-19,-1,17,-25];
    2. $action = 1;
    3. foreach($a as $k=>$v) {
    4.     if($action == 1 and $v < 0) {
    5.         $action = 3;
    6.     } elseif($action == 2 and $v > 0) {
    7.         $action = 1;
    8.     } elseif($action == 3) {
    9.         unset($a[$k]);
    10.         $action = 2;
    11.     }
    12. }