+ Задача № 45. Проверить, является ли последовательность строго монотонной

Задача решена для любых видов последовательностей.

<?php
 
/* Последовательность является строго монотонной , если каждый 
последующий член последовательности строго  больше предыдущего или
строго меньше предыдущего 
- это нестрогое определение монотонной последовательности , по сравнению с
определением в математическом анализе. */

// Как нам записать последовательность на языке php ?
// Используем функцию array (1,4,435,234432,435345,435345543,...., other figure,...etc...)
// Создаём массив чисел 
$massive = array (5,4,3,2,1,0,2);
 // Можем вывести для лучшего понимания хода 
// решения , количество элементов в массиве 
 echo count($massive) ,"<BR>" ;
// Можете с помощью echo вывести любой элемент массива . 
// Нумерация идёт от нуля . 
// echo $massive [3] ;
// Выведется число 12 из ряда . 
 // Далее используем функцию foreach -функцию перебораэлементов массива 
  $i=0;
  
	while ( ($massive [$i]>$massive[$i+1]) )
	{	
          $i++;
	   if ($i==count($massive)-1) 
		 {
			 break;
		 }
		 echo "<BR>","Значение счётчика: ",$i ,"<BR>";
	}	
echo "<BR>","Чему равно \$i=" , $i ,"<BR>";	
 
if ($i == count($massive)-1)
 {
	 echo "Последовательность строго монотонна убывающая" ;
 }
 else 
 {
// Может быть ,что цикл не выполнится ни разу -значит , 
// последовательность может быть возрастающей
// Обнуляем счётчик , для выполнения цикла еще раз
	    $i=0;
		 while ( ($massive [$i]<$massive[$i+1]) )
		{	
	     // Здесь хорошо виден принцип последовательности  
             // Имеется ввиду , сначала выполняется инкремент 
            // счётчика , потом выполнение условия 
	     // echo $massive [$i]  ,"<BR>" ;
			 $i++;
			 
			 if ($i==count($massive)-1) 
			 {
				 break;
			 }
			 echo "<BR>","Значение счётчика: ",$i ,"<BR>";
			 
		}	 
		if ($i == count($massive)-1)
		 {
			 echo "Последовательность строго монотонна возрастающая" ;
		 }
	   else  
                 /* Если в последовательности идёт возрастание , а потом резко  
                     убывание или убывание , а потом резко возрастание , 
                   значит последовательность 
                    не монотонная. Хочу заметить -  если речь 
                    идёт в задаче о строгой монотонности , то одинаковые 
                    элементы не должны присутствовать 
                    в последовательности , иначе 
                    последовательность - не строго монотонная*/
		 {
			 echo "Последовательность немонотонна " ;
		 }	 
 }
?>
vedro-compota's picture

Если задача решена на ваш взгляд, то ставьте в начале, до кода:

Задача решена:

а если не решена то:

Задача в процессе решения:

_____________
матфак вгу и остальная классика =)

fgh's picture

Хорошо. Хотел сделать - не сделал. Задача решена теперь . Правильно ли всё с оформлением задачи ? Табулирование выполнено правильно ?

vedro-compota's picture

Оптимальнее обходить массивы так:

   $high = true; // предположим, что возрастает
    
   foreach($massive as $key => $val) {
       
       if ($massive [$key]>$massive[$key+1]) { // встретили убывание?
           $high = false; // не возрастает 
           break;
       }     
   }
   
   if ($high) {
       echo 'монотонно возрастает!';
   }

_____________
матфак вгу и остальная классика =)

fgh's picture

 <?php
$massive = array (1,2,3,4,5,6,7);
$high = true; // предположим, что только возрастает
// Далее используем функцию foreach -функцию перебораэлементов массива 
foreach($massive as $key => $val) { // Здесь перебор идёт по парным ключам (индексам) массива
     if ($massive [$key]>$massive[$key+1]) { //а на самом деле убывает
	// присваиваем переменной $high значение ложь
        $high = false;  
       // echo $key,"и",$key+1,"<BR>";	
		/*
		Если условие истинно, 
		то мы прекращаем перебор 
		элементов массива оператором 
		break (он прерывает работу всего 
		цикла*/
        break;		
   }
 }
    if ($high==true){
   echo "Posledovatelnost vozrastaet";
}
	else{
       // Если не возрастает, значит либо немонотонна либо только убывает, нужно определить,что именно
    
	foreach($massive as $key => $val) {
	if ($massive [$key]>$massive[$key+1]) {
      $high=true;
	}
	else {
	 $high=false;
	 // Прекращаем работу всего цикла перебора элемента массива foreach
	 break;
	}
   }
   if ($high==true){
   echo "Posledovatelnost ybyvaet";

	}
	else
	{
	 echo "Posledovatelnost ny vozrastaet ny ybyvaet";
	}
	}
?>
vedro-compota's picture

Предлагаю обратить внимание вот на этот фрагмент из вашего решения:

 // Если не возрастает, значит либо немонотонна, либо только убывает, нужно определить,что именно
     
    foreach($massive as $key => $val) {
    if ($massive [$key]>$massive[$key+1]) {
      $high=true;
    }
    else {
     $high=false;
     // Прекращаем работу всего цикла перебора элемента массива foreach
     break;
    }
  }

Что бы я заметил:

  1. Во-первых форматирование -- то есть ваш фрагмент должен выглядеть как-то так:
        foreach($massive as $key => $val) {
    		if ($massive [$key]>$massive[$key+1]) {
    		  $high=true;
    		}
    		else {
    		 $high=false;
    		 // Прекращаем работу всего цикла перебора элемента массива foreach
    		 break;
    		}
        }
    
    
  2. Во-вторых, подобно проверке на на возрастание, при проверке на убывание логичнее было бы ожидать отрицательного результата (в условном операторе -- по аналогии с первым циклом), то есть написать так
    + тут же имеет смысл завести отдельную переменную - так как high означает "вверх", а мы тут проверяем убывание, то есть нам нужно использовать переменную с другим именем (дополнительную), либо же в обоих циклах использовать одну переменную, но с более нейтральным именем, например flag(флаг, признак), например используем отдельную переменную (имена переменных важны, так как они несут информационную нагрузку):
    $low = true;// признак убывания
    foreach($massive as $key => $val) {
    	if ($massive [$key]<$massive[$key+1]) { // если всё же не убывает
    	  $low=false;
    	  break; // Прекращаем работу всего цикла перебора элемента массива foreach
    	}
    }
    
    if ($low) {
    	 echo('монотонно убывает');
    } else { // (с учетом того, что проверка на монотонное возрастание уже не удалась)
    	echo('не мононотонна!');
    }	
  3. Третий момент -- большое число вложенных блоков, сразу перепишите с использованием двух функций -- одна будет проверять массив на монотонное возрастание, а другая на монотонное убывание. Это позволит избежать излишней вложенности блоков (что есть плохая практика для программирования)

_____________
матфак вгу и остальная классика =)

fgh's picture

Прошу Вас проверить, как записан код, с учётом всех сделанных вами замечаний. Были сделаны следующие изменения: 1) Использованы функции, на выходе которых, мы имеем логическое выражение; 2) Изменен стиль записи кода; 3) Изменены комментарии к похожим строчкам кода.

 <?php
/************************************** Вводим пользовательские функции определения возрастания и убывания*******************/
//Определение функции на возрастание
function funct_high() {
// Далее используем функцию foreach -функцию перебораэлементов массива 
 foreach($massive as $key => $val) { // Здесь перебор идёт по парным ключам (индексам) массива
     if ($massive [$key]>$massive[$key+1]) { //Условие убывания верно
	// присваиваем переменной $flag значение ложь
	// Важно !!! учесть, что в здесь переменная $flag не глобальна!!! а имеет смысл только в данной функции funct_high()
        $flag = false;  
		/*
		Если условие истинно, 
		то мы прекращаем перебор 
		элементов массива оператором 
		break (он прерывает работу всего 
		цикла for*/
        break;		
   } 
 }
// конструкция return возвращает значение логической переменной flag
  return $flag;
}
// Определение функции на "ни возрастание ни убывание"
function funct_less() {
 foreach($massive as $key => $val) { // Здесь перебор идёт по парным ключам (индексам) массива
     if ($massive [$key]<$massive[$key+1]) { //
        $flag = true;	 
	// Если условия выполняется, то значение переменной $flag - снова истинно, это означает,что последовательность не возрастает ни убывает
        /*
		Так если условие истинно, 
		то мы прекращаем перебор 
		элементов массива оператором 
		break (он прерывает работу всего 
		цикла*/
            break;		
   }
 }
return $flag;
}
/* ******************************************Сама задача ******************************************************* */
// Начальное логическое условие
 $flag=true; // Считаем, что $flag=true, т.к. последовательность возрастает (предполагаем изначально) 
 $massive = array (1,2,3,4,5,61,7);
// Функция должна выводить значение флага, которое записывается в переменную $a
 $a = funct_high();
// Проверка условия флага
   if ($a == true){
      echo "Posledovatelnost vozrastaet";
    }
	else{
       // Если не возрастает, значит либо монотонно убывает либо немонотонна
   $b = funct_less();
      if ($b == false){
        echo "Posledovatelnost ybyvaet";
	    }
	      else {
	       echo "Posledovatelnost ny vozrastaet ny ybyvaet";
	    }
	
	  }
?>

Привет!
Запустил я этот скрипт в консоли.
Выполняется он не без замечаний, и ответ выдаёт неверный:

PHP Notice:  Undefined variable: massive in /home/math2/php/Задача№45.php on line 6
PHP Warning:  Invalid argument supplied for foreach() in /home/math2/php/Задача№45.php on line 6
PHP Notice:  Undefined variable: flag in /home/math2/php/Задача№45.php on line 21
PHP Notice:  Undefined variable: massive in /home/math2/php/Задача№45.php on line 25
PHP Warning:  Invalid argument supplied for foreach() in /home/math2/php/Задача№45.php on line 25
PHP Notice:  Undefined variable: flag in /home/math2/php/Задача№45.php on line 38
Posledovatelnost ybyvaet
vedro-compota's picture

Запустил я этот скрипт в консоли.
Выполняется он не без замечаний, и ответ выдаёт неверный:

ну да...массив-то в функцию не передаётся...))

_____________
матфак вгу и остальная классика =)