Начал изучать php. Решаю разные задачи с задачнике. По мере выполнения буду добавлять их в эту тему. Просьба указать на правильность решения, возможные поправки. Спасибо --- Добавлено --- Напишите скрипт, который будет находить корни квадратного уравнения. Для этого сделайте 3 инпута, в которые будут вводиться коэффициенты уравнения. PHP: <?php if (isset($_POST['sub'])) { function sqrFunction($a,$b,$c = 0) { $x1 = 0; $x2 = 0; $d = ($b*$b) - (4*$a*$c); if($d > 0){ $x1 = ((-$b) - sqrt($d))/2*$a; $x2 = ((-$b) + sqrt($d))/2*$a; echo 'X1 = '. $x1 . '<br>'; echo 'X2 = '.$x2 . '<br>'; } elseif($d == 0) { $x2 = ((-$b) + sqrt($d))/2*$a; echo 'X1 = '.$x2 . '<br>'; }else { echo "D = $d < 0, уравнение не имеет действительных корней"; } } if(isset($_POST['a']) and isset($_POST['b']) and isset($_POST['c'])) { $a = $_POST['a']; $b = $_POST['b']; $c = $_POST['c']; echo sqrFunction($a,$b,$c); } }else{ ?> <form action="" method="post"> <p>Введите a: <input required="" type="number" name="a"></p> <p>Введите b: <input required="" type="number" name="b"></p> <p>Введите c: <input required="" type="number" name="c" value="0"></p> <input type="submit" name="sub"> <input type="reset"> </form> <?php } ?>
В новичках эта тема полезнее будет, и быстрее откликнутся. Ну ничего код, в принципе. Можно придраться, что на сервере не проверяешь, то ли тебе прислали, и не проверяешь случаи, если тебе нулевой коэффициент введут. К примеру, если a=0 квадратное уравнение вырождается в линейное. И в реальной жизни обработчик POST ничего не выводит, а делает редирект, но тут не страшно, что нету редиректа, в принципе, сойдёт. С операцией and поосторожнее, там запара с приоритетами, лучше писать сишный вариант &&. Хвалю, редкий тут человек, который учится программированию на правильных задачах, а не пытается сразу ваять соц. сети. Функцию нахождения решения я бы вынес из под if-a. И лучше переписать её так, чтоб она возвращала корни, а не выводила их сама. Хороший тон в программировании. Так, если тебе в другой программе потребуется найти корни и что-то с ними сделать, ты сможешь перенести туда эту функцию без изменений и использовать повторно, а в текущем варианте придётся модифицировать.
Спасибо за придирки. Немного помучился с глобальной переменной $_SERVER['SCRIPT_NAME'] но всьо Ок. PHP: <?php if (!isset($_REQUEST['sub'])) { ?> <form action="<?=$_SERVER['SCRIPT_NAME']?>"> <p>Введите A: <input required="" type="number" name="a"></p> <p>Введите B: <input required="" type="number" name="b"></p> <p>Введите C: <input required="" type="number" name="c" value="0"></p> <input type="submit" name="sub"> <input type="reset"> </form> <?php } else{ function sqrFunction($a,$b,$c = 0) { $x1 = 0; $x2 = 0; $d = ($b*$b) - (4*$a*$c); if($d > 0){ $x1 = ((-$b) - sqrt($d))/2*$a; $x2 = ((-$b) + sqrt($d))/2*$a; echo 'X1 = '. $x1 . '<br>'; echo 'X2 = '.$x2 . '<br>'; } elseif($d == 0) { $x2 = ((-$b) + sqrt($d))/2*$a; echo 'X1 = '.$x2 . '<br>'; }else { echo "D = $d < 0, уравнение не имеет действительных корней"; } } if(isset($_REQUEST['a']) && isset($_REQUEST['b']) && isset($_REQUEST['c'])) { $a = $_REQUEST['a']; $b = $_REQUEST['b']; $c = $_REQUEST['c']; if ($a != 0) { echo sqrFunction($a,$b,$c); }else { echo "Коэффициент A = 0 <br>"; } } }
Ты про массивы уже читал? Сделай всё-таки, чтоб функция нахождения корней занималась своим делом, т.е. находила корни, а не выводила их. Приучайся задачу делить на как можно более изолированные друг от друга части, в будущем пригодится. --- Добавлено --- Вернуть можно в массиве все корни. Если массивы пока не знаешь, отметь где-нибудь, вернись к задаче, когда прочитаешь про них. --- Добавлено --- Оба, а вот это-то неверно. Формула-то выглядит так: А твой код a переместил в числитель (у деления и умножения одинаковый приоритет, поэтому код выполнится слева направо, сначала поделит на 2, потом умножит на a. Так что додумай сам, как исправить. И проверил бы, не так сложно руками решить квадратное уравнение.
Исправил. Если я правильно понял то код решения будет такой: PHP: <?php if (!isset($_REQUEST['sub'])) { ?> <form action="<?=$_SERVER['SCRIPT_NAME']?>"> <p>Введите A: <input required="" type="number" name="a"></p> <p>Введите B: <input required="" type="number" name="b"></p> <p>Введите C: <input required="" type="number" name="c" value="0"></p> <input type="submit" name="sub"> <input type="reset"> </form> <?php } else{ function oneX($a,$b,$c = 0,$d){ $var1 = ((-$b) - sqrt($d))/(2*$a); $var2 = ((-$b) + sqrt($d))/(2*$a); return array($var1, $var2); } if(isset($_REQUEST['a']) && isset($_REQUEST['b']) && isset($_REQUEST['c'])) { $a = $_REQUEST['a']; $b = $_REQUEST['b']; $c = $_REQUEST['c']; if ($a != 0) { $d = ($b*$b) - (4*$a*$c); if($d > 0){ list($x1,$x2) = oneX($a,$b,$c,$d); echo 'X1 = '. $x1 . '<br>'; echo 'X2 = '. $x2 . '<br>'; } elseif($d == 0) { list($x2)=oneX($a,$b,$c,$d); echo 'X1 = '. $x2 . '<br>'; }else { echo "D = $d < 0, уравнение не имеет действительных корней"; } }else { echo "Коэффициент A = 0 <br>"; } } }
ОК, лучше. Но лично я бы сделал, чтоб функция возвращала массив, если корня два, число - если корень один, и null - если корней нет. И дискриминанта, конечно, должна считаться внутри функции, а не отдельно. Т.е. мне бы хотелось функцию, в которую бы я передал a, b и с, а она дала результат. Я не хочу считать дискриминанту руками. Вообще, когда пишешь функцию, смотри на неё с точки зрения другого человека. Т.е. так, я вызываю функцию, но мне надо самому считать дискриминанту. Что-то я бы матюкнулся на этого программиста Какой версией php пользуешься? Сейчас есть ** для возведения в степень, краткий синтаксис для массивов [].
php 7.3.3 Я так сразу и думал сделать. Но Я не верно тебя понял, и не переспросил, подумал функция должна возвращать только корни PHP: <?php if (!isset($_REQUEST['sub'])) { ?> <form action="<?=$_SERVER['SCRIPT_NAME']?>"> <p>Введите A: <input required="" type="number" name="a"></p> <p>Введите B: <input required="" type="number" name="b"></p> <p>Введите C: <input required="" type="number" name="c" value="0"></p> <input type="submit" name="sub"> <input type="reset"> </form> <?php } else{ function oneX($a,$b,$c = 0){ $d = ($b*$b) - (4*$a*$c); $var1 = ((-$b) - sqrt($d))/(2*$a); $var2 = ((-$b) + sqrt($d))/(2*$a); return array($var1, $var2, $d); } if(isset($_REQUEST['a']) && isset($_REQUEST['b']) && isset($_REQUEST['c'])) { $a = $_REQUEST['a']; $b = $_REQUEST['b']; $c = $_REQUEST['c']; if ($a != 0) { list($x1,$x2,$d) = oneX($a,$b,$c); if($d > 0){ echo 'X1 = '. $x1 . '<br>'; echo 'X2 = '. $x2 . '<br>'; } elseif($d == 0) { echo 'X1 = '. $x2 . '<br>'; }else { echo "D = $d < 0, уравнение не имеет действительных корней"; } }else { echo "Коэффициент A = 0 <br>"; } } }
Даны 3 селекта и кнопка. Первый селект - это дни от 1 до 31, второй селект - это месяцы от января до декабря, а третий - это годы от 1990 до 2025. С помощью этих селектов можно выбрать дату. По нажатию на кнопку выведите на экран день недели, соответствующий этой дате, например, 'воскресенье'. Как решить проблему если в месяце нет 31 дня? Через if-и ? PHP: <?php date_default_timezone_set('Europe/Kiev'); $d = range(1,31); $m = range(1,12); $y = range(1990,2025); function selectD($c){ foreach ($c as $key => $value) { echo '<option value="'.$value.'">'. $value.'</option>'; } } if (!isset($_REQUEST['sub'])) { ?> <form action="<?=$_SERVER['SCRIPT_NAME']?>"> <p>Выберете дату: </p> <a>День: </a> <select name="day[]"> <?php selectD($d) ?> </select> <a>Месяц: </a> <select name="month[]"> <?php selectD($m) ?> </select> <a>Год: </a> <select name="year[]"> <?php selectD($y) ?> </select> <input type="submit" name="sub"> </form> <?php } else{ $day = $_REQUEST['day']; $month = $_REQUEST['month']; $year = $_REQUEST['year']; $week = ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота']; $x = date('w', mktime(0,0,0,$month[0],$day[0],$year[0])); print_r($week[$x]); }?>
Немного переработал PHP: <?php date_default_timezone_set('Europe/Kiev'); $d = range(1,31); $m = range(1,12); $y = range(1990,2025); function selectD($arr,$a,$sel){ echo '<a>'. $a .'</a>'; echo '<select name="'. $sel . '">'; foreach ($arr as $key => $value) { echo '<option value="'.$value.'">'. $value.'</option>'; } echo '</select>'; } if (!isset($_REQUEST['sub'])) { ?> <form action="<?=$_SERVER['SCRIPT_NAME']?>"> <p>Выберете дату: </p> <?php selectD($d,'День',"day[]"); selectD($m,'Месяц',"month[]"); selectD($y,'Год',"year[]"); ?> <input type="submit" name="sub"> </form> <?php }else{ $day = $_REQUEST['day']; $month = $_REQUEST['month']; $year = $_REQUEST['year']; $week = ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота']; $x = date('w', mktime(0,0,0,$month[0],$day[0],$year[0])); print_r($week[$x]); }?> или это перебор построение html в функции?
Ладно. Смотри мастер-класс: PHP: function solveQuadratic($a, $b, $c) { $d = $b ** 2 - 4 * $a * $c; if ($d < 0) { return null; } if ($d === 0) { return (-$b) / (2 * $a); } return [(-$b - sqrt($d))/(2 * $a), (-$b + sqrt($d))/(2 * $a)]; } $solution = solveQuadratic($_POST["a"], $_POST["b"], $_POST["c"]); if ($solution === null) { echo "Нет корней"; } elseif (!is_array($solution)) { echo "Корень $solution"; } else { echo "Корни $solution[0], $solution[1]"; } (синтаксис php >= 5.6) Надеюсь после рабочего дня ничего не напутал --- Добавлено --- Есть такая функция, checkdate, в принципе. Для обучения будет полезно написать самому. Там как раз нужна проверка на месяцы, проверка на високосный год - очень полезная штука. Как, кстати, и вычисление дня недели самому запрограммировать - есть алгоритмы. Я в школе на районной олимпиаде когда-то писал https://ru.wikihow.com/вычислить-день-недели Цель этих заданий - научить тебя мыслить алгоритмически, поэтому готовые функции лучше ограничивать пока.
Учить пхп сразу с новой версии языка? Не соцсеть\игра\стартап, а алгоритмы? Пытаться понять правильное решение? Если честно, я в шоке. Давно такого не было. Кажется, вера в человечество начинает ко мне возвращаться.
Делают так иногда. Для твоего уровня норм. Когда будешь готов к реалу, увидишь, как там делают. Хотя так тоже ещё, иногда.
круто буду знать, мне всегда почему то хотелось делать вот так: PHP: $var2 = ((-$b) + sqrt($d))/(2*$a); return array($var1, $var2, $d); сначала присвоить, после отправить Человечество я вас - не подведу
С задания Если результат больше 6, то вычтите из него наибольшее число, кратное 7. Такое решение подойдет ?: PHP: $b = 44; $i = 1; $a = 0; while ($a <= $b) { $a = $i * 7; $i++; } echo $b - ($a-7);
Нормально, хотя я бы сделал по-другому: PHP: $b = 44; // предполагается, что это результат расчётов $d = $b; while ($d % 7) { $d--; } Меньше итераций
@4akHopic, расскажешь потом, работает алгоритм или нет. Страничку я в поиске нашёл. На олимпиаде я другим методом делал, там в условии было что какой-то там день в каком-то забытом году понедельник, какой - уже не помню.
Алгоритм работает, возникла проблема приделать его к предыдущей форме с селектами, а потом распознать и дать на обработку в алгоритм. Если делать с инпутами без селекта, по типу - введите сами то нет проблем. Код не буду пока выкладывать, там можно голову сломить
Как сделать: нам пришел PHP: $month2 = $_REQUEST['month2']; равен 'Февраль', далее нужно достать из массива $month1 ключ(для дальнейших вычислений). Пробовал array_search но не подходить, у нас есть одинаковые ключи, как вариант сделать вложенный массив ['0'=>['Январь','Октябрь'], '6'=>['Апрель','Июль']] PHP: $month1 = ['0'=>'Январь', '3'=>'Февраль', '3'=>'Март', '6'=>'Апрель', '1'=>'Май', '4'=>'Июнь', '6'=>'Июль', '2'=>'Август', '5'=>'Сентябрь', '0'=>'Октябрь', '3'=>'Ноябрь', '5'=>'Декабрь'];
Во-первых, почему пришёл "Февраль" а не двойка? А во-вторых, ассоциативные массивы тем и хороши, что строки тоже могут быть ключами. PHP: $monthTable = ["Январь" => 0, "Февраль" => 3 /* и т.д. */]; И потом $monthTable["Январь"] === 0
И сотворил он по образу и подобию своему(мне он вообще не нравится но работает): PHP: <?php date_default_timezone_set('Europe/Kiev'); $d = range(1,31); $m = range(1,12); $month2 = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь']; $y = range(1990,2025); function selectD($arr,$a,$sel){ echo '<a>'. $a .'</a>'; echo '<select name="'. $sel . '">'; foreach ($arr as $key => $value) { echo '<option value="'.$value.'">'. $value.'</option>'; } echo '</select>'; } if (!isset($_REQUEST['sub'])) { ?> <form action="<?=$_SERVER['SCRIPT_NAME']?>"> <p>Введите дату: </p> <?php selectD($d,'День',"day[]"); selectD($month2,'Месяц',"month2[]"); selectD($y,'Год',"year[]"); ?> <input type="submit" name="sub"> </form> <?php }else{ $day = $_REQUEST['day']; $month2 = $_REQUEST['month2']; $year = $_REQUEST['year']; $day = $day[0]; $znach = $month2[0]; $x = 0; if (in_array('Февраль', $month2)) { $x = 3; } if (in_array('Март', $month2)) { $x = 3; } if (in_array('Апрель', $month2)) { $x = 6; } if (in_array('Май', $month2)) { $x = 1; } if (in_array('Июнь', $month2)) { $x = 4; } if (in_array('Июль', $month2)) { $x = 6; } if (in_array('Август', $month2)) { $x = 2; } if (in_array('Сентябрь', $month2)) { $x = 5; } if (in_array('Ноябрь', $month2)) { $x = 3; } if (in_array('Декабрь', $month2)) { $x = 5; } function rizn($k,$num){ $i = 1; $a = 0; while ($a <= $k) { $a = $i * $num; $i++; } return $k - ($a-$num); } $x1 = $x + $day; $arg1 = 7; if($x1 >= $arg1){ $x1 = rizn($x1,$arg1); } $god = $year[0]; $str = substr($god,2,2); $stryear = $str; $str2 = floor($str /4); $arg2 = 28; if($str>=$arg2){ $str = rizn($str,$arg2); } $x2 = $str2 + $str; if ($god >= 1900 && $god <= 1999) { $x2 += 1; } if($stryear != '00'){ if($stryear % 4 == 0 && ($month2[0] == 0 || $month2[0] == 1)) $x2 -=1; }elseif ($stryear == '00' && $stryear%400 == 0 && ($month2[0] == 0 || $month2[0] == 1)) { $x2 -=1; } $result = $x1 + $x2; if($result>=$arg1){ $result = rizn($result,$arg1); } $dayweek = ['Суббота', 'Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота']; echo '<br>'.'День недели '; print_r($dayweek[$result]); }?>
Зачем массивы? Ты же один месяц передаёшь --- Добавлено --- И чего мои подсказки не используешь? --- Добавлено --- Но молодец, запрограммировал. Алгоритм прикольный, вообще
мотаю на ус хочу показать свой код, каким он был в моем представлении, но в конечном результате сегодня переделаю с подсказками. Большое спасибо что помогаешь рефакторить) функция предназначена для вывода на экран через селект, если не указать массива то не выводит ничего, селект пустой. если ты про этот элемент PHP: "month2[]" Только что попробовал выводит, но после: Warning: in_array() expects parameter 2 to be array, string given in C:\Users\..... переделаю без PHP: "month2[]"
Результат с поправками PHP: <?php date_default_timezone_set('Europe/Kiev'); $d = range(1,31); $month = ['Январь'=>'0', 'Февраль'=>'3', 'Март'=>'3', 'Апрель'=>'6', 'Май'=>'1', 'Июнь'=>'4', 'Июль'=>'6', 'Август'=>'2', 'Сентябрь'=>'5', 'Октябрь'=>'0', 'Ноябрь'=>'3', 'Декабрь'=>'5']; $y = range(1990,2025); function selectD($arr,$a,$sel){ echo '<a>'. $a .'</a>'; echo '<select name="'. $sel . '">'; foreach ($arr as $key => $value) { echo '<option value="'.$value.'">'. $value.'</option>'; } echo '</select>'; } function selectMonth($arr,$a,$sel){ echo '<a>'. $a .'</a>'; echo '<select name="'. $sel . '">'; foreach ($arr as $key => $value) { echo '<option value="'.$key.'">'. $key.'</option>'; } echo '</select>'; } if (!isset($_REQUEST['sub'])) { ?> <form action="<?=$_SERVER['SCRIPT_NAME']?>"> <p>Введите дату: </p> <?php selectD($d,'День',"day"); selectMonth($month,'Месяц',"month"); selectD($y,'Год',"year"); ?> <input type="submit" name="sub"> </form> <?php }else{ $day = $_REQUEST['day']; $month2 = $_REQUEST['month']; $year = $_REQUEST['year']; $x = ($month[$month2]); //Функция разницы чисел кратных $num, // $k = 37, $num = 7, return = 2. //при содействии mkramer function rizn($k,$num){ $d = $k; while ($d % $num) { $d--; } return $k-$d; } //первое вычисление $x1 = $x + $day; $arg1 = 7; $x1 = rizn($x1,$arg1); //этот кусок кода не нравится оч много переменных //2! второе вычисление $str = substr($year,2,2); $stryear = $str; $str2 = floor($str /4); $arg2 = 28; $str = rizn($str,$arg2); $x2 = $str2 + $str; //век. проверка века //сделано только для века 1900 и 2000, //если 1900 $x2 += 1 если, 2000 $x2 += 0 //в $y = range(1990,2025); можно добавить больше значений //пример для наглядности идет цыкл 0,5,3,1,0 и т.д. if ($year >= 1600 && $year <= 1699) {// $x2 += 0;//можно не писать но для наглядности сойдет } if ($year >= 1700 && $year <= 1799) {// $x2 += 5;// } if ($year >= 1800 && $year <= 1899) {// $x2 += 3;// } if ($year >= 1900 && $year <= 1999) {// $x2 += 1;// } if ($year >= 2000 && $year <= 2999) {// $x2 += 0;// } //проверка на высокосный год if(($stryear != '00' && $year % 4 == 0 && ($month2 == 'Январь' || $month2 == 'Февраль'))||($stryear == '00' && $year%400 == 0 && ($month2 == 'Январь' || $month2 == 'Февраль'))){ $x2 -=1; } // 3! конечный результат $result = $x1 + $x2; $result = rizn($result,$arg1); $dayweek = ['Суббота', 'Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница']; echo '<br>'.'День недели '; print_r($dayweek[$result]); }?>
По векам там объяснено, как это число вычислить для произвольного века. Хотя, если надоела эта задача, то можешь дальше идти