За последние 24 часа нас посетили 36843 программиста и 7750 роботов. Сейчас ищут 1688 программистов ...

"Консольные приложения в php"

Тема в разделе "PHP для новичков", создана пользователем Mira-Namira, 12 сен 2023.

  1. Mira-Namira

    Mira-Namira Новичок

    С нами с:
    12 сен 2023
    Сообщения:
    1
    Симпатии:
    0
    Приветствую всех.
    Учусь в нетологии, отправила задание на проверку, завернули, пишут исправьте, ответ преподавателя прилагаю:
    "Отлично, что есть пояснения, что именно надо ввести.
    При вводе данных код не всегда ведет себя корректно, исправьте"

    <?php
    echo "Введите первое число:\n";

    do {
    $a = trim(fgets(STDIN));
    if (ctype_digit($a) === false) {
    fwrite(STDERR, "Введите, пожалуйста, число\n");
    }
    } while (ctype_digit($a) === false);

    echo "Введите второе число:\n";

    do {
    $b = trim(fgets(STDIN));
    if ((int)$b === 0) {
    fwrite(STDERR, "Делить на 0 нельзя\n");
    $b = trim(fgets(STDIN));
    }
    if (ctype_digit($b) === false) {
    fwrite(STDERR, "Введите, пожалуйста, число\n");
    }
    }
    while ((int)$b === 0 || ctype_digit($b) === false);

    fwrite(STDOUT, "Результат вычисления: " . $a/$b);


    При заданных цифрах 3,4, выводит следующее:

     php main.php
    Введите первое число:
    3
    Введите второе число:
    4
    Результат вычисления: 0.75



    Помогите пожалуйста в решении задания, не пойму что хотят от меня
     

    Вложения:

  2. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    1) научитесь оформлять код на форуме, тырка </> для кого?
    2) дробные и отрицательные числа почему-то не считаются числами )
     
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.129
    Симпатии:
    1.223
    Адрес:
    там-сям
    digit - цифра
    number - число
    numeric - числовой

    is_numeric()
    --- Добавлено ---
    почаще читайте документацию на php.net. там масса полезных примеров и частных случаев, а также ссылок "смотри также"
     
  4. konkin_ivan

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

    С нами с:
    28 июн 2013
    Сообщения:
    9
    Симпатии:
    2
    Адрес:
    х Калиновский
    Предлагаю следующие улучшения для данного кода:

    1. Использовать функцию intval() вместо (int) для преобразования строки в целое число.
    2. Вынести проверку на делимое равное 0 в отдельную функцию для улучшения читаемости кода.
    3. Использовать функцию is_numeric() вместо ctype_digit() для проверки вводимых числовых значений.
    4. Разделить код на функции для повышения модульности и упрощения чтения.

    Вот улучшенный код:

    PHP:
    1. <?php
    2.  
    3. function getInput($message) {
    4.     fwrite(STDOUT, $message . "\n");
    5.     $input = trim(fgets(STDIN));
    6.     return $input;
    7. }
    8.  
    9. function isDivisorZero($divisor) {
    10.     return intval($divisor) === 0;
    11. }
    12.  
    13. function isValidNumber($number) {
    14.     return is_numeric($number);
    15. }
    16.  
    17. $a = '';
    18. $b = '';
    19.  
    20. do {
    21.     $a = getInput("Введите первое число:");
    22.  
    23.     if (!isValidNumber($a)) {
    24.         fwrite(STDERR, "Введите, пожалуйста, число\n");
    25.     }
    26. } while (!isValidNumber($a));
    27.  
    28. do {
    29.     $b = getInput("Введите второе число:");
    30.  
    31.     if (isDivisorZero($b)) {
    32.         fwrite(STDERR, "Делить на 0 нельзя\n");
    33.         continue;
    34.     }
    35.  
    36.     if (!isValidNumber($b)) {
    37.         fwrite(STDERR, "Введите, пожалуйста, число\n");
    38.     }
    39. } while (isDivisorZero($b) || !isValidNumber($b));
    40.  
    41. $result = intval($a) / intval($b);
    42. fwrite(STDOUT, "Результат вычисления: " . $result);
    Этот улучшенный код использует функции для повышения читаемости и модульности, а также проводит проверку делителя на равенство 0 в отдельной функции.
     
  5. valentinnew

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

    С нами с:
    30 янв 2011
    Сообщения:
    161
    Симпатии:
    36
    чем intval лучше int?
     
  6. konkin_ivan

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

    С нами с:
    28 июн 2013
    Сообщения:
    9
    Симпатии:
    2
    Адрес:
    х Калиновский
    Вот, я погуглил за Вас:

    Функция intval() в PHP является улучшенной версией приведения типа int. Она имеет следующие преимущества перед стандартным приведением типа int:

    1. Обработка ошибок: intval() возвращает значение 0 в случае неудачи, вместо возникновения ошибки. Таким образом, она более гибкая и надежная, когда речь идет о приведении типа.

    2. Учёт системы счисления: intval() позволяет указывать систему счисления при приведении строковых значений. Например, можно указать, что строка "10" должна быть приведена к числу 10 в двоичной системе счисления.

    3. Приведение пустых значений: intval() по умолчанию возвращает 0 при попытке привести пустую строку или пустое значение к числу. Это полезно для обработки пользовательского ввода или данных из базы данных, которые могут быть пустыми.

    4. Использование дополнительных параметров: intval() принимает дополнительные параметры, такие как указание минимальной и максимальной длины возвращаемого значения. Это может быть полезно для более точного контроля над результатом приведения типов.

    В общем, функция intval() предоставляет больше возможностей и гибкости при работе с приведением типов int в PHP. Она может быть предпочтительнее использования простого приведения типа int в некоторых ситуациях.
     
  7. valentinnew

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

    С нами с:
    30 янв 2011
    Сообщения:
    161
    Симпатии:
    36
    Спасибо большое, но какое отношение это имеет к текущему контексту?
    когда (int) при преобразовании из строки вернет ошибку?
    тут, вроде, это не актуально
    тут гугл сломался. Пустое это какое? '' или null? в обоих случаях это поведение одинаковое - преобразование к нулю
    это какое-то недокументированное поведение?

    А ещё в документации php.net в разделе преобразования типов в первую очередь говорится о конструкции языка (int) и потом упоминается об intval, т.е. как минимум это не хуже, а в производительности будет получше, т.к. это конструкция языка.

    Дополню, что говорит chatGpt
    с чем я в целом согласен - с int более читаемый код и быстрее. intval использовать когда нужна его функциональность. Потому в текущем контексте (int) -> в intval не улучшение.
    К улучшенным циклам тоже есть вопросы)
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.840
    Симпатии:
    1.338
    Адрес:
    Лень
    composer require symfony/console

    PHP:
    1. $app = new Symfony\Component\Console\Application;
    2. $app -> add( new App\Console\Test );
    3. $app -> run();
    PHP:
    1. <?php
    2.  
    3. declare ( strict_types = 1 );
    4.  
    5. namespace App\Console;
    6.  
    7. use Symfony\Component\Console\Command\Command;
    8. use Symfony\Component\Console\Input\InputInterface;
    9. use Symfony\Component\Console\Output\OutputInterface;
    10. use Symfony\Component\Console\Style\SymfonyStyle;
    11.  
    12. class Test extends Command
    13. {
    14.     protected static $defaultName = 'test:first';
    15.    
    16.     private SymfonyStyle $io;
    17.    
    18.     public function getName(): string
    19.     {
    20.         return 'Test';
    21.     }
    22.  
    23.     protected function configure()
    24.     {
    25.         $this
    26.             -> setDescription( '1...' )
    27.             -> setHelp( '2...' );
    28.     }
    29.  
    30.     protected function execute( InputInterface $input, OutputInterface $output )
    31.     {
    32.         $this -> io = new SymfonyStyle( $input, $output );
    33.  
    34.         $res = $this -> io -> ask( 'Напиши че - нибудь' );
    35.  
    36.         $this -> io -> writeln( '-----' . $res );
    37.        
    38.         return Command :: SUCCESS;
    39.     }
    40. }
    php console test