За последние 24 часа нас посетили 17724 программиста и 1724 робота. Сейчас ищет 931 программист ...

Дибильный калькулятор )

Тема в разделе "PHP для новичков", создана пользователем Alexus, 9 май 2018.

  1. Alexus

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

    С нами с:
    1 май 2018
    Сообщения:
    64
    Симпатии:
    2
    Привет всем столкнулся с заморочкой при решении задачи, все вроде бы работает правильно и в то же время при делении на 0 результат выводится двойной, а нужен один, то, что на 0 делить нельзя и точка. Заметил что меняется значение isset($result) на false, но подставить это в условие с оператором if не решает проблему, все равно выводится 2 результата. Если есть мысли как решить эту проблему буду признателен. Спасибо

    <?php
    if ($_SERVER['REQUEST_METHOD'] == 'POST'){
    $num1=abs((int)$_POST['num1']);
    $operator=$_POST['operator'];
    $num2=abs((int)$_POST['num2']);
    }
    switch ($operator) {
    case '+':
    $result=$num1+$num2;
    break;
    case '-':
    $result=$num1-$num2;
    break;
    case '*':
    $result=$num1*$num2;
    break;
    case '/':
    if ($num2==0){
    echo 'На 0 делить нельзя ';
    }
    else
    $result=$num1/$num2;
    break;
    default:
    echo 'Вы ввели неверный оператор ';
    break;
    }
    if (!$num1||!$num2){
    echo 'Введите правильное число ';
    }
    else echo $result;
    ?>
    <!-- Область основного контента -->
    <form action='<?php $_SERVER['REQUEST_URI']?>' method='POST'>
    <label>Число 1:</label>
    <br />
    <input name='num1' type='text' />
    <br />
    <label>Оператор: </label>
    <br />
    <input name='operator' type='text' />
    <br />
    <label>Число 2: </label>
    <br />
    <input name='num2' type='text' />
    <br />
    <br />
    <input type='submit' value='Считать'>
    </form>

    <?= isset($result);?>
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    Да потому что в других операциях вы присваиваете результат в $result, а при делении и далее выводите через echo
    Вот он у вас и выводит echo, а потом ещё и result... Присваивайте все в переменную и выводите только в одном месте, ну и результирующую переменнную принято перед расчетами очищать
     
  3. Alexus

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

    С нами с:
    1 май 2018
    Сообщения:
    64
    Симпатии:
    2
    Спасибо я попробую
     
    glorsh66 нравится это.
  4. glorsh66

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

    С нами с:
    9 июл 2017
    Сообщения:
    247
    Симпатии:
    4
    ПОлностью поддерживаю ADSoft
    Да я бы просто записал бы $result то что выводится на экран пользователю.
    Т.е. значение ошибки в $result записывать
     
  5. Alexus

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

    С нами с:
    1 май 2018
    Сообщения:
    64
    Симпатии:
    2
    нет и что я записал все выводится в одну переменную в конце вывел ее через echo вывел одно условие, но не то которое нужно. проблема в том, что в данном случае оператор !$num2 и $num2==0, на выходе выдают одно и то же значение. Я не могу придумать условие при котором $result на выходе у двух этих переменных принимало бы разные значения
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    @Alexus
    Ты хотел проверить в case деление на 0, можно вроде было так сделать но не вариант.
    Я вынес проверку из цикла, проверяем что попадает и в поле 1 и в поле 2, если не 0 то гуд.
    PHP:
    1. <?php
    2. if ($_SERVER['REQUEST_METHOD'] == 'POST')
    3. {
    4.     $num1=(int)$_POST['num1'];
    5.     $operator=$_POST['operator'];
    6.     $num2=(int)$_POST['num2'];
    7.     $error = []; # массив ошибок
    8.  
    9.     if(!empty($num1) || !empty($num2))
    10.     {
    11.         # проверяем деление на 0
    12.        if(!$num1 == 0 && !$num2 == 0)
    13.         {
    14.             # проверяем оператор
    15.            if(!empty($operator))
    16.             {
    17.  
    18.                 switch ($operator)
    19.                 {
    20.                     case '+':
    21.                         $result = $num1 + $num2;
    22.                     break;
    23.  
    24.                     case '-':
    25.                         $result = $num1 - $num2;
    26.                     break;
    27.  
    28.                     case '*':
    29.                         $result = $num1 * $num2;
    30.                     break;
    31.  
    32.                     case '/':
    33.                         $result = $num1 / $num2;
    34.                     break;
    35.                 }
    36.  
    37.                 # если ошибки не равняються 0 выводим результат
    38.                if($error !== 0){
    39.                     echo '<span style="color:green">Ваш результат: '.$result.'</span><br>';
    40.                 }
    41.  
    42.             }else{
    43.                 echo $error[] = '<span style="color:red">Введите оператор!</span><br>';
    44.             }
    45.         }else{
    46.             echo $error[] = '<span style="color:red">На 0 делить нельзя!</span><br>';
    47.         }
    48.     }else{
    49.         echo $error[] = '<span style="color:red">Введите Число 1 и Число 2!</span><br>';
    50.     }
    51. }
    52. ?>
    53. <!-- Область основного контента -->
    54. <form action='<?php $_SERVER['REQUEST_URI']?>' method='POST'>
    55. <label>Число 1:</label>
    56. <br />
    57. <input name='num1' type='text' />
    58. <br />
    59. <label>Оператор: (<span style="color: blue;">'*', '/', '+', '-'</span>) </label>
    60. <br />
    61. <input name='operator' type='text' />
    62. <br />
    63. <label>Число 2: </label>
    64. <br />
    65. <input name='num2' type='text' />
    66. <br />
    67. <br />
    68. <input type='submit' value='Считать'>
    69. </form>
    Палец вверх если помог.
     
    #6 _ne_scaju_, 10 май 2018
    Последнее редактирование: 10 май 2018
  7. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    ребят.... и все же надо проверять так
    PHP:
    1. if(!empty($_POST['num1']) && !empty($_POST['num2']))
    иначе ваше условие
    PHP:
    1. if(!empty($num1) || !empty($num2))
    срабатывает хоть один параметр не пуст или не == 0, что не есть верно
    ну и сравнение для деления на 0 нужно только для второго числа проводить, сам 0 делить то можно - будет в результате 0
    PHP:
    1. # проверяем деление на 0
    2.       if($num2 != 0)
     
  8. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    сейчас протестирую, если писать таким образом то проверка не срабатывает, в моем случае все срабатывает.
    а на счет одной проверки верно:
    PHP:
    1. <?php
    2. if ($_SERVER['REQUEST_METHOD'] == 'POST')
    3. {
    4.     $num1=(int)$_POST['num1'];
    5.     $operator=$_POST['operator'];
    6.     $num2=(int)$_POST['num2'];
    7.     $error = []; # массив ошибок
    8.  
    9.     if(!empty($num1) || !empty($num2))
    10.     {
    11.         # проверяем деление на 0
    12.        if(!$num2 == 0)
    13.         {
    14.             # проверяем оператор
    15.            if(!empty($operator))
    16.             {
    17.  
    18.                 switch ($operator)
    19.                 {
    20.                     case '+':
    21.                         $result = $num1 + $num2;
    22.                     break;
    23.  
    24.                     case '-':
    25.                         $result = $num1 - $num2;
    26.                     break;
    27.  
    28.                     case '*':
    29.                         $result = $num1 * $num2;
    30.                     break;
    31.  
    32.                     case '/':
    33.                         $result = $num1 / $num2;
    34.                     break;
    35.                 }
    36.  
    37.                 # если ошибки не равняються 0 то выводим результат
    38.                if($error !== 0){
    39.                     echo '<span style="color:green">Ваш результат: '.$result.'</span><br>';
    40.                 }
    41.  
    42.             }else{
    43.                 echo $error[] = '<span style="color:red">Введите оператор!</span><br>';
    44.             }
    45.         }else{
    46.             echo $error[] = '<span style="color:red">На 0 делить нельзя!</span><br>';
    47.         }
    48.     }else{
    49.         echo $error[] = '<span style="color:red">Введите Число 1 и Число 2!</span><br>';
    50.     }
    51. }
    52. ?>
    53. <!-- Область основного контента -->
    54. <form action='<?php $_SERVER['REQUEST_URI']?>' method='POST'>
    55. <label>Число 1:</label>
    56. <br />
    57. <input name='num1' type='text' />
    58. <br />
    59. <label>Оператор: (<span style="color: blue;">'*', '/', '+', '-'</span>) </label>
    60. <br />
    61. <input name='operator' type='text' />
    62. <br />
    63. <label>Число 2: </label>
    64. <br />
    65. <input name='num2' type='text' />
    66. <br />
    67. <br />
    68. <input type='submit' value='Считать'>
    69. </form>
     
    #8 _ne_scaju_, 11 май 2018
    Последнее редактирование: 11 май 2018
  9. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.866
    Симпатии:
    753
    Адрес:
    Татарстан
    Не знаю, чего у вас там не срабатывает - прочтите про empty() - при каких параметрах какие результаты дает, ну и сравнение, не равно " != " это классический оператор php, а вот ваше (!$num2==0) - по сути работа с булевыми значениями, отрицаете результат $num2 и сравниваете с 0 (false)..... если правильно - то уж
    PHP:
    1. if (!($num2==0))
    что эквивалентно
    PHP:
    1. $num2 != 0
     
    glorsh66 и _ne_scaju_ нравится это.
  10. Alexus

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

    С нами с:
    1 май 2018
    Сообщения:
    64
    Симпатии:
    2
    Спасиб работает )
    --- Добавлено ---
    Единственное не понял зачем массив, может все значения можно было в одну переменную $result записать?