«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2018/08/01 21:27:04  №1239383 1
15310929391570.jpg (68, 604x604)
604x604
Привет ОП, проверь пожалуйста задачу "сумма прописью".
https://ideone.com/oytq0C

Каюсь, пару раз использовал тернарный оператор. Было интересно посмотреть как он работает, ну и задача немного сократилась.

На локальном сервере результаты работы программы отображались нормально, но когда загрузил на ideone появились лишние пробелы. Отдаю на суд, сил больше нет перерешивать. Задача была самой интересной из всех, но кажется я решил её через задницу.
Ответы: >>1241891 >>1243951
Аноним 2018/08/06 10:53:25  №1241891 2
Ответы: >>1243951
Аноним 2018/08/10 03:55:45  №1243951 3
>>1239383
>>1241891

> function inclineWord($numbers, $isFemale, $key) {
Мне кажется, было бы лучше передавать не непонятный номер, а варианты формы слов, а функция бы из них выбирала. Так получилась бы универсальная функция, которая работает с любыми словами.

> if (arrayCheck($numbers)) {
Непонятно, зачем это. Не лучше ли обязать передавать в функцию просто число? Зачем туда передавать целый массив? Почему функция выбора формы числа должна ковыряться в каких-то непонятных массивах? Ты явно код разбора массива поместил не туда. Это не задача этой функции.

Вдобавок ты не добавил никаких пояснений перед функцией, в каком формате ей надо передавать массив чисел. Как это понять? Каждая функция в идеале должна быть понятной сама по себе, без разбора остального кода. В реальных приложениях десятки и сотни тысяч строк кода, их все читать просто нет времени.

Код тут должен быть разбит на функции, и по каждой функции должно быть понятно, что она делает, в каком формате принимает входные данные и что выдает на выходе. Каждая функция должна быть понятна без изучения остального кода. Я поймал себя на мысли, что в моем учебнике это не объясняется - надо будет потом дописать и может даже дать примеры разбиения кода на функции.

В функцию inclineWord проще всего просто передавать число, для которого надо подобрать форму слова.

> Соединяет особенные числа
> function combineNumbers($numbers) {
Я абсолютно не понимаю, что делает эта функция. И комментарий тоже ничего не говорит. Код должен быть простой и понятный, а не такой. Подумай, если кто-то работает с твоим кодом, сколько времени придется ему потратить на разбор? Почему он или она должны решать ребусы? Так не должно быть.

> $multiplierAndKey = (count($numbers) == 3) ? [100, 3] : ((count($numbers) == 2) ? (($length == 4) ? [100, 2] : [10, 2]) : [1, 1]);
Это тоже трудно понять. Я смутно догадываюсь, что это как-то связано с сотнями и единицами, но не до конца понимаю.

> for ($key = 0, $min = 0, $max = 3; $max <= 9; $key++, $min += 3, $max += 3) {
Это тоже непонятно.

К сожалению, логику алгоритма я в первого взгляда понять не смог, и увидеть, есть ли в нем ошибки, не могу. Разбирать его по строкам у меня времени, увы, нету. Код должен читаться гораздо легче.

Мне кажется, код надо переделывать почти полностью. Ты можешь сделать как-то по своему, но один из вариантов это:

- функция, которая выбирает подходящую форму слова рубль/тысяча/миллион
- функция, которая получает число от 0 до 999 и возвращает его прописью
- функция, которая разбивает число на группы по 3, используя функции выше, для каждой группы получает слова и склеивает их

Будет гораздо проще.
Ответы: >>1244539
Аноним 2018/08/10 22:49:11  №1244539 4
opmolodec.jpg (255, 807x646)
646x807
>>1243951
Очень приятно, что кто-то проверяет мои поделки. Большое человеческое спасибо!

Переделал и максимально закомментировал код. Надеюсь я исправился, пожалуйста оцените :3
https://ideone.com/QKJaY8
Ответы: >>1246427 >>1246798
Аноним 2018/08/14 00:58:20  №1246427 5
image.jpg (351, 1280x738)
738x1280
Ответы: >>1249518 >>1250182
Аноним 2018/08/14 19:04:34  №1246798 6
>>1232710 (OP)
>>1244539
Переосмысление задачи "сумма прописью", алгоритм работы множителя расписан в более понятных if - else.

Пожалуйста, проверьте.
https://ideone.com/ycLXlo
Ответы: >>1249518 >>1250182
Аноним 2018/08/20 04:02:45  №1249518 7
Аноним 2018/08/21 09:35:54  №1250182 8
>>1249560

Ну да, верно.

>>1246427

> if (preg_match_all('/\d+\.?\d|[\+\-\\/\=]/', $input, $numbersAndOperations)) {
if тут не нужен. Можно по умолчанию положить в $numbersAndOperations пустой массив и тогда никаких проблем не будет, если ничего не найдется.

Небольшой минус твоего кода - он игнорирует все некорректные символы вместо того, чтобы сообщить об ошибке.

Знаки плюс, звездочка, равно не требуют экранирования в квадратных скобках.

Считает программа неправильно, попробуй найди причину: https://ideone.com/Gb1WFg - для выражения 2-2x4 выдает ответ 8 вместо 0 (или -6).

> Определяет переменную с десятичной дробью и задает ей тип double, остальным integer
Вообще, integer - это не любые целые числа, а только небольшие целые числа (от PHP_INT_MIN дл PHP_INT_MAX), предел описан в мануале:

- http://php.net/manual/ru/reserved.constants.php
- http://php.net/manual/ru/language.types.integer.php

Так что всегда использовать float будет безопаснее.

>>1246798

В inclineWord можно было сделать проще:

если (число от 11 до 19) {
сразу вернуть вариант word3;
}

смотреть на последнюю цифру...;

Вместо последнего длинного ifelse можно было написать просто else.

> smallNumberToText($number, $isFemale, $lengthOfNumber) {
lengthOfNumber избыточна и не нужна, так как размер числа можно определить по $number. Или это что-то другое?

В smallNumberToText слишком много кода. В моем понимании, там хватит 5 веток:

- если число равно нулю, то ...
- если в числе есть сотни, то ...
- если число оканчивается на 11-19, то ...
- если число оканчивается на 20-99, то ...
- если в числе есть единицы, то ...

У тебя же сложная структура ифов и 7 мест с $words[] = .... Есть куда упрощать.

> $isFemale = ($x == 1 and $numbers[1] % 10 == 1 or $x == 1 and $numbers[1] % 10 == 2) ? 1 : 0;

По моему, так все проще: в женском роде только слово "тысяча" и условие должно быть $isFemale = ($x == 1); А SmallNumberToText на основе этого выбирает формы "один" или "одна".

В функции numberToText внутри if ($x == 0) многовато кода и было бы хорошо упростить.
Ответы: >>1250963
Аноним 2018/08/22 12:20:48  №1250963 9
cat3.gif (255, 326x326)
326x326
>>1250182
Переделал "цифры прописью":
https://ideone.com/i4Ktf9

Переделал калькулятор:
https://ideone.com/MZjuzH

Я полный аутист, если потратил на цифры прописью 1,5 месяца или это норма? Можно мне перейти на второй лвл?
Ответы: >>1251124 >>1253603
Аноним 2018/08/22 18:07:15  №1251124 10
>>1250963
>потратил на цифры прописью 1,5 месяца
Что так?
Ответы: >>1251485
Аноним 2018/08/23 12:13:16  №1251485 11
>>1251124
Прокрастинация не дает жить.
Аноним 2018/08/27 11:40:07  №1253603 12
>>1251564

Она там специально стоит, чтобы парсеры не работали. А так, можешь попробовать куки из браузера скопировать.

>>1251212

Плохо пробовал, по моему так скачивание HTML файла и его разбор никак не пересекаются.

>>1251129

Мне кажется, этот код не надо было 2 раза копировать:

$decades = $number % 100;
} elseif (array_key_exists($decades, $spelling)) {
array_push($words, $spelling[$hundreds], $spelling[$decades]);

Это можно было сделать так:

если (в числе есть сотни) {
добавляем слово для сотен
}

если (число заканчивается на 11-19) {
добавляем слово для них;
} иначе {

если (число заканчивается на 2x-9x) {
...
}
если (в числе есть единицы) {
..
}
}

В numberToText не очень понятно, зачем заводить несколько переменных для одного и того же: $thousandsForMillions, $thousandsForThousands. Можно тут использовать одну переменную и считать ее в любом случае. Если число меньше 1000, там просто будет 0.

Тогда функция numberToText станет гораздо меньше.

>>1250963

> Переделал "цифры прописью": https://ideone.com/i4Ktf9

>if ($number % 100 == 10 or $number % 100 >= 20 and $number % 100 <= 99) {
Тут надо ставить скобки, чтобы не было сомнений в том, как понимать условия: a or (b and c) или (a or b) and c.

> // Обработка нуля
> if ($numberToText == 'ноль' and $lengthOfNumber > 0) {
Лучше просто писать if ($numbers[$i] == 0), то есть проверять исходное число, а не строку, которую вернула функция.

А так, верно.

> Переделал калькулятор: https://ideone.com/MZjuzH

Ок, верно, хотя не очень хорошо, что он пропускает посторонние символы вместо вывода ошибки. Хотя в задаче это и не требовалось.
Ответы: >>1253655
Аноним 2018/08/27 13:11:27  №1253655 13
Двачаю2.jpg (41, 500x292)
292x500