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

Приветствую всех.
Учусь в нетологии, отправила задание на проверку, завернули, пишут исправьте, ответ преподавателя прилагаю:
«Отлично, что есть пояснения, что именно надо ввести.
При вводе данных код не всегда ведет себя корректно, исправьте»

<?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

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

 

1) научитесь оформлять код на форуме, тырка </> для кого?
2) дробные и отрицательные числа почему-то не считаются числами )

 

digit — цифра
number — число
numeric — числовой

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

 

Предлагаю следующие улучшения для данного кода:

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 в отдельной функции.

 

чем intval лучше int?

 

Вот, я погуглил за Вас:

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

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

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

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

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

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

 

Спасибо большое, но какое отношение это имеет к текущему контексту?

когда (int) при преобразовании из строки вернет ошибку?

тут, вроде, это не актуально

тут гугл сломался. Пустое это какое? » или null? в обоих случаях это поведение одинаковое — преобразование к нулю

это какое-то недокументированное поведение?

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

Дополню, что говорит chatGpt

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

 

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

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *