Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: почему не работает case?
Форумы портала PHP.SU » » Вопросы новичков » почему не работает case?

Страниц (1): [1]
 

1. Perun - 28 Апреля, 2019 - 19:09:41 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. function discriminant($a, $b, $c){
  3.     return $b*$b-4*$a*$c;
  4. }
  5. $a = 1;
  6. $b = 12;
  7. $c = 36;
  8. $result=discriminant($a,$b,$c);
  9. echo 'дискриминант: '.$result.'<br>';
  10. switch($result){
  11.     case ($result<0) : {
  12.         echo 'корней нет';
  13.         break;
  14.     }
  15.     case ($result>0) : {
  16.         $res1 = (-$b+sqrt(discriminant($a,$b,$c)))/(2*$a);
  17.         $res2 = (-$b-sqrt(discriminant($a,$b,$c)))/(2*$a);
  18.         echo 'корень1: '.$res1.'<br>';
  19.         echo 'корень2: '.$res2;
  20.         break;
  21.     }
  22.     case ($result==0) : {
  23.         $res1 = (-$b+sqrt(discriminant($a,$b,$c)))/(2*$a);
  24.         echo 'корень1: '.$res1;
  25.         break;
  26.     }
  27. }
  28. ?>


В выводе дискриминант 0 и нет корней.
Дискриминант вычисляется правильно, но switch не пойму почему игнорирует условие, когда дискриминант = 0 и отрабатывает условие когда дискриминант меньше нуля.
2. Мелкий - 28 Апреля, 2019 - 19:22:20 - перейти к сообщению
Perun пишет:
switch($result){
    case ($result<0) : {

Здесь замысловато написано:

Работает соответственно этому корректно.
3. Perun - 28 Апреля, 2019 - 19:31:01 - перейти к сообщению
Через if-else работает. А как правильно будет записать через switch-case? Или в подобных случаях switch-case не уместно?
4. Мелкий - 28 Апреля, 2019 - 21:52:59 - перейти к сообщению
Неуместен, да. switch используется для проверки на равенство.

Логически корректно, впрочем, будет
PHP:
скопировать код в буфер обмена
  1. switch (true) {
  2.     case ($result<0):

Но обычно такой вариант не используется.
5. LIME - 29 Апреля, 2019 - 15:23:50 - перейти к сообщению
вообще многоэтажные проверки лучше не использовать
портянку можно заменить полиморфизмом
шаблон "стратегия" например вполне тут к месту будет для освоить
6. Строитель - 29 Апреля, 2019 - 16:15:30 - перейти к сообщению
LIME пишет:
шаблон "стратегия" например вполне тут к месту будет
Прикольный шаблон, почитал тут: Шаблоны проектирования: Стратегия
7. Perun - 29 Апреля, 2019 - 16:28:18 - перейти к сообщению
Это точно ветка для новичков?
Я то в целом знаком с классами, но во многом еще за деревьями не вижу леса...
8. LIME - 29 Апреля, 2019 - 16:34:15 - перейти к сообщению
Perun ниче страшного
больше то некому отвечать
терпи)
Строитель читай лучше тут https://refactoring[dot]guru/ru/design-patterns
особенно по ссылкам ниже основного материала и сравнение паттернов
например в фабриках легко вообще ничего не понять и даже не заметить этого))
а там есть ссылка на сравнение
9. Строитель - 29 Апреля, 2019 - 18:55:01 - перейти к сообщению
LIME пишет:
Строитель читай лучше тут https://refactoring[dot]guru/ru/design-patterns
особенно по ссылкам ниже основного материала и сравнение паттернов
например в фабриках легко вообще ничего не понять и даже не заметить этого))
а там есть ссылка на сравнение
Благодарю за линк.

 

Powered by ExBB FM 1.0 RC1