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
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Как сделать калькулятор и тем самым начать изучение языка
Покинул форум
Сообщений всего: 7
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Здравствуйте!
Мне как и многим, в принципе далеким от этого, людям приходится сталкиваться с этим языком.Самые мало существенные проблемы отнимают много времени,а более приходится обходить.Поэтому я решил что пора начать изучение этого языка.
И я решил что для получения фундаментального понимания, мне нужно сделать калькулятор.
Конечно было бы правильнее изучить несколько учебников и затем только начинать.
Но увы без понимания совсем ничего не запоминается,а примеры что попадались в учебниках какие то чрезмерно сложные или наоборот простые,но бессмысленные, или являются какими то хаками для CMS. Поэтому понимание приходит очень медленно.
В общем для начала я хочу сделать калькулятор следующего вида:
Я думаю вы уже заметили что здесь полное отсутствия понимания.Может я не туда написал,потому что хотелось больше чем просто получить готовый код,но более подходящей ветки я как то не нашел.
Viper
Отправлено: 10 Июля, 2012 - 22:02:12
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
fabervox
1. name="second count" неправильно. имя элементов форм не должно содержать пробелов.
2. не нужно делать для каждой строки echo
пример
3. типы полей integer и т.п. поддерживаются не всеми браузерами. Если пишете под html5 то используйте, иначе заменяйте на text
4. у submit необязательно указывать name.
5. php код сами напишете или?
Покинул форум
Сообщений всего: 7
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Viper
Продолжим по порядку.
1.2.3.Все понятно.
4.Попробовал убрать название и использовать тип в виде переменной, увы так не работает почему-то.
5.Код написал с небольшим сторонним пинком друга.
6.Теперь относительно того что нужно, т.е. будет, дальше:
а) разобраться как убрать имя переменной.
б) ограничить ввод только цифр.
в) сделать обнуление чтобы можно было обновить страницу.
г) добавить действия и их выбор.
В общем делать я буду сам, но мне важны поправки и критика.
DelphinPRO
Отправлено: 17 Июля, 2012 - 12:07:29
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
Viper пишет:
типы полей integer и т.п. поддерживаются не всеми браузерами
такого типа вообще нет. ) есть number
----- Чем больше узнаю, тем больше я не знаю.
Viper
Отправлено: 17 Июля, 2012 - 12:15:13
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
fabervox пишет:
Попробовал убрать название и использовать тип в виде переменной, увы так не работает почему-то
я ж думал у вас форма и скрипт php разделены. Имя у сабмита можно убрать. вы можете добавить скрытое поле и проверять его значение. Т.е. к примеру
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
Viper пишет:
Я просто не признаю ещё эти новые типы
зря
эти типы важны, как минимум, для мобильных устройств. Например для поля type="tel" вызывается экранная клавиатура только с цифрами, что несколько улучшает юзабельность сайта
----- Чем больше узнаю, тем больше я не знаю.
Viper
Отправлено: 17 Июля, 2012 - 13:29:24
Активный участник
Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007 Откуда: Симферополь
Помог: 98 раз(а)
DelphinPRO пока не доводилось ещё работать с моб. устройствами. В нашем "селе" толком даже проверить нет возможности.
Покинул форум
Сообщений всего: 7
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Калькулятор потихоньку развивается,в обратном порядке по списку.
Сделал действия.Но увы не селектором каким нибудь,а пока только разными кнопками.
Не понимаю что нужно чтобы сделать знак действия переменной или как его менять.
Кто знает, подскажите варианты более простого кода и/или с использованием селектора знака.
DelphinPRO
Отправлено: 18 Июля, 2012 - 14:14:31
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
fabervox пишет:
Кто знает, подскажите варианты более простого кода и/или с использованием селектора знака.
добавьте еще один инпут между цифрами для ввода знака действия.
в скрипте проверяйте какой знак пришел, элементарно пока. Пока вы не решите научить свой калькулятор вычислять сложные выражения вида 2+2*2-6/7
----- Чем больше узнаю, тем больше я не знаю.
fabervox
Отправлено: 27 Июля, 2012 - 15:13:55
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Да вы правы
DelphinPRO пишет:
...элементарно пока. Пока вы не решите научить свой калькулятор вычислять сложные выражения вида 2+2*2-6/7
Ну вот решил и запнулся на наверно довольно простом, только совсем не понимаю что не так.
Но давайте по порядку.
Модифицировать свой калькулятор, я решил таким образом, чтобы он мог решать вот такие как вы показали выражения введенные с одного поля формы.
На первый взгляд для этого не надо ничего делать, просто вывести переменную формы и php сам посчитает.
Но дело в том что я решил сделать его таким чтобы он игнорировал все случайно добавленные(введенные) символы, которые не относятся к калькулятору.
Можно было найти способ проще, но это для калькулятора лучше, а для моего обучения лучше будет вариант выбранный мной.
Калькулятор будет вычленять каждое число и знаки по своему порядку,т.е. как я сказал будет игнорировать лишние символы,буквы(опечатки). А затем собирать их в строку выводить и считать.
Конечно для самого калькулятора это как корове седло, но с другой стороны взгляните на Excel, это не калькулятор(больше), но я не знаю как в нем включить возможность, игнорирования не числовых и математических символов, автоматически, и вряд ли такое в нем есть.
Но не только это, можно ведь продолжить развивать этот инструмент.
Например научить его считать вещественные значения,примером:
9 яблок + 3 груши + 3 яблока + 10 груш + 1 груша и 1 яблоко = 13 яблок и 14 груш
До этого конечно как до Киева .... но ведь тут уже может быть какая то практическая реализация.
Впрочем тот код который я сделаю в ближайшее время, будет достаточно прост что пригодится в создании какой то программы и любой кому понадобиться это будет писать сам.
Поэтому это амбиции, выдумки, мечты.
В общем нужно это скорей мне одному. И не для этих высоких целей, а просто для обучения php.
Хотя в последнее время я стал зацикливаться, и сомневаюсь что разработка этого калькулятора развивает мои навыки php.
А теперь к конкретной проблеме.
Мне нужно сделать цикл, который в итоге повторял бы функцию "вычленения" до тех пор, пока её результат не станет нулевым.
Проблема заключается в том что мне никак не удается правильно создать цикл, то вообще не работает, то уходит в бесконечность.
вот так вот получилось, но не работает(Отобразить)
/*функция увеличивающая $i,в полном коде увеличивает аргумент массива в цикле
можно было воспользоваться циклом for, но с ним у меня тоже ничего не получилось*/
$LimitCode=0;//на всякий случай устанавливаю и чтобы наглядней было
function iTerator ($i,$LimitIterator,$Number,$LimitCode)//функция ограничения
{
global$Number,$LimitCode;
echo$LimitCode;
if($LimitIterator<$i)
{
$LimitCode=1;
}
elseif($Number[$i]== 0)
{
$LimitCode=1;
}
$LimitCodePlus=$LimitCode+1;
echo$LimitCodePlus;
}
do//пробный цикл
{
iPlus ($i);
iTerator ($i,$LimitIterator,$Number,$LimitCode);
echo$LimitCode;//выводит 1
}
while($LimitCode== 1);
/*но несмотря на вывод последней строки, цикл не останваливается,выводится следующий код:
0211211211211 ...
т.е. переменные имеют запланированные значения,но цикл игнорирует это*/
?>
И как это сделать правильно я не понимаю
Тут мне уже наверно лучше подойдет пример кода, потому что я уже как этот цикл, делаю одно и то же часами, и уже можно считать днями.
Я понял в чем была ошибка. Я считал что while действует до тех пор пока условие не выполнится. Прочитав описание цикла на официальном сайте мне дошло что все наоборот))
PS: Удивительно, каждый раз когда пишу сюда или собираюсь написать, решение приходит само, и ответы уже сразу после их появления кажутся очевидными.
Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010
Помог: 69 раз(а)
Есть такая штука называется "обратная польская нотация" она как раз для таких вещей. типа 2+2*2-6/7
P.S с грушами и яблоками там будет посложнее
DelphinPRO
Отправлено: 27 Июля, 2012 - 16:26:21
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
fabervox пишет:
Ну вот решил и запнулся на наверно довольно простом,
fabervox пишет:
Калькулятор будет вычленять каждое число и знаки по своему порядку
Сначала лексический анализ выражения - преобразование его в поток лексем.
Потом синтаксический разбор и вычисление результата.
Тема сложная..
----- Чем больше узнаю, тем больше я не знаю.
fabervox
Отправлено: 14 Сентября, 2012 - 16:51:03
Новичок
Покинул форум
Сообщений всего: 7
Дата рег-ции: Июль 2012
Помог: 0 раз(а)
Что то немогу разобраться с регулярными выражениями.
Нужно чтобы из строки в массив собиралось все что находится между символами.
Почитал уроки,мало что понял.
Составил pattern '/^[mdas][1234567890]+[mdas]$/'.
Как я понимаю должен действовать следующим образом:искать упоминание одного из в первых скобках,затем пропуская символы из вторых скобок,найти следующее упоминание из третьих скобок.
Раньше я думал сделать подобное без использования регулярных выражений.Впринципе кое что получалось с помощью strpbrk().Но получалось не очень удобно,некрасиво и просто много лишнего было в коде.Конечно если бы функция strpbrk() могла бы и справа налево читать строку было б лучше,но увы.
Да и просто хочется разобраться с регулярными выражениями.
DelphinPRO
Отправлено: 14 Сентября, 2012 - 17:23:40
Активный участник
Покинул форум
Сообщений всего: 7187
Дата рег-ции: Февр. 2012
Помог: 353 раз(а)
этот паттерн вернет подходит под выражения в которых первым символом идет один из "mdas", затем сразу одна или более цифр и заканчивается одним из символов "mdas"
[1234567890] это можно заменить на короткий вариант \d
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.