Форум программистов, компьютерный форум, киберфорум
D (DLang)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.68/104: Рейтинг темы: голосов - 104, средняя оценка - 4.68
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446

Возможно ли написать калькулятор на D почти в одну строчку?

13.03.2015, 00:31. Показов 24233. Ответов 102
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Я экспериментировал с типом данных TypeTuple и решил попробовать написать с помощью него простой калькулятор, который смог бы парсить скобки и вычислять значение выражений.
C++
1
2
3
4
5
6
7
8
9
import std.stdio;
import std.typetuple;
 
void main() {
 
    auto a = TypeTuple!(2 * (2 + 1));
 
    writeln(a); // prints 6
}
Но я столкнулся с проблемой ввода данных для TypeTuple:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
import std.stdio;
import std.typetuple;
 
void main() {
 
    string s;
 
    readf(" %s\n", &s);
 
    auto a = TypeTuple!(s);
 
    writeln(a); // prints 2 * (2 + 1)
}
Возможно ли как-то "срезать" кавычки со строки s?
1
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.03.2015, 00:31
Ответы с готовыми решениями:

Калькулятор в одну строчку
Нашел на Форуме. Немного переделал, добавил и изменил. В функциях Cos,Sin,Tan вместо Radian, градусы. С уважением,...

Одну строчку немогу написать
Объявлены структура, описывающая точку в пространстве TPoint и массив точек Points: struct TPoint { int X; int Y; ...

написать одну строчку кода:
Сам пример на рисунке: я не понимаю как написать верхнюю и нижнюю строку там где X^2 надо куда то втулить j+1 я не знаю как записать сам...

102
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38217 / 21149 / 4314
Регистрация: 12.02.2012
Сообщений: 34,761
Записей в блоге: 14
23.03.2015, 13:44
Студворк — интернет-сервис помощи студентам
Dennis Ritchie, ох... Я так и думал. "Калькулятор из одной строки кода" можно написать, когда есть функция, которая выполняет разбор и вычисление алгебраического выражения. Тогда "калькулятор" - есть просто вызов этой функции. Но такое "программирование" сродни добыванию ртути из градусников или изюма из булок.
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
23.03.2015, 13:47
Так зачем тогда что-то писать? Находим модуль/пакет/класс для любого интересующего нас языка и пишем сделать("2+3+(5-4)"). Абсурд.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38217 / 21149 / 4314
Регистрация: 12.02.2012
Сообщений: 34,761
Записей в блоге: 14
23.03.2015, 13:50
Цитата Сообщение от castorsky Посмотреть сообщение
Так зачем тогда что-то писать? Находим модуль/пакет/класс
- вот и меня раздражает подмена программирования поиском библиотек.

А вот "калькулятор в одну строку" в Lisp:

Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun calc (formula) (eval (inf2pref (parse formula))))
 
==> calc
 
(calc "4+6*2")
 
==> 16
 
(calc "5-7/(4^2+6)")
 
==> 103/22
Работает!!!
2
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.03.2015, 13:53  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Тогда "калькулятор" - есть просто вызов этой функции.
Наверное, да. Но ведь такая функция в стандартной библиотеке могла бы очень сильно облегчить жизнь программистов, тем более если бы она ещё и оптимизирована была настоящими профессионалами вроде Александреску.
Цитата Сообщение от castorsky Посмотреть сообщение
Находим модуль/пакет/класс для любого интересующего нас языка и пишем сделать("2+3+(5-4)"). Абсурд.
Ага. А зачем тогда Александреску запихнул в D сильно оптимизированный (так написано в его книге) std.bigint. Лично мне не очень хочется самому реализовывать bigint на каждом соревновании, где можно использовать только C++.

Не по теме:

Цитата Сообщение от Catstail Посмотреть сообщение
Но такое "программирование" сродни добыванию ртути из градусников или изюма из булок.
А чего? Я, например, люблю выковыривать изюм из булок. :)

0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
23.03.2015, 13:53
Цитата Сообщение от Catstail Посмотреть сообщение
вот "калькулятор в одну строку" в Lisp
Ага. Вот lisp в очередной раз уделал D.

Бедный Дениска =))
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.03.2015, 13:55  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
А вот "калькулятор в одну строку" в Lisp:
Вот и я хочу, чтобы в каждом языке программирования была бы такая функция именно в стандартной библиотеке.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38217 / 21149 / 4314
Регистрация: 12.02.2012
Сообщений: 34,761
Записей в блоге: 14
23.03.2015, 13:55
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А чего?
- а то, что кто-то должен был изюм туда положить.
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
23.03.2015, 13:55
Dennis Ritchie, при чем тут bigint? Речь идет о калькуляторе, о том как это делается, о технике разбора грамматик.
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.03.2015, 13:58  [ТС]
Цитата Сообщение от castorsky Посмотреть сообщение
Речь идет о калькуляторе, о том как это делается, о технике разбора грамматик.
Нет. Речь идёт о наличии функции в стандартной библиотеке языка, которая позволяет написать калькулятор в одну строчку. Разбор грамматик мне совершенно не интересен.
Цитата Сообщение от Catstail Посмотреть сообщение
а то, что кто-то должен был изюм туда положить.
Так вот разработчики языка и должны вкладывать этот изюм. При чём тут я?
1
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
23.03.2015, 14:01
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Вот и я хочу, чтобы в каждом языке программирования была бы такая функция именно в стандартной библиотеке
в этом нет необходимости, каждый должен сам решать каким методом разбирать выражения, какие семантические правила устанавливать для функций. То, что Борис реализовал это в своей реализации лиспа, еще ничего не значит. Его целевая аудитория - ученики (на данном этапе).

Добавлено через 1 минуту
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Разбор грамматик мне совершенно не интересен.
Ну тогда Вы просто не будете иметь права заявить "я написал калькулятор". Вас поднимут на смех.
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.03.2015, 14:06  [ТС]
Цитата Сообщение от castorsky Посмотреть сообщение
Его целевая аудитория - ученики (на данном этапе).
А где это преподают Лисп? В ВУЗ'ах или в школах?
Цитата Сообщение от castorsky Посмотреть сообщение
в этом нет необходимости, каждый должен сам решать каким методом разбирать выражения, какие семантические правила устанавливать для функций.
Ага. Может быть, функция sort() во многих языках тоже не нужна. Давайте каждый раз для сортировки массива будем реализовывать свой qsort()? Правда, ведь это круто? Вы каждый раз сможете громко заявлять: "Я отсортировал массив! Сам отсортировал! Я написал сортировку!"
1
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
23.03.2015, 14:21
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
Может быть, функция sort() во многих языках тоже не нужна.
Не аргумент. Сортировка нужна на практике сплошь и рядом. Парсинг математических выражений на практике вообще не нужен, кроме как для написания своих языков и их реализации.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38217 / 21149 / 4314
Регистрация: 12.02.2012
Сообщений: 34,761
Записей в блоге: 14
23.03.2015, 15:07
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
А где это преподают Лисп? В ВУЗ'ах или в школах?
- в основном в ВУЗах. Должен заметить, что парсер мой, а перевод из инфиксной в префиксную форму - не вполне мой. Я подстроил найденный код под свои нужды. Ну и добавил некоторые элементарные функции.
0
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
23.03.2015, 15:17
Catstail, а что парсер вовзращает? Просто список? По логике он должен возвращать уже готовое дерево.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38217 / 21149 / 4314
Регистрация: 12.02.2012
Сообщений: 34,761
Записей в блоге: 14
23.03.2015, 17:03
У меня функция parse переводит строку в список:

Lisp
1
2
3
(parse "5+x^3/(x^2-3)")
 
==> (5 + x ^ 3 / (x ^ 2 - 3))
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.03.2015, 17:05
Dennis Ritchie, что значит "почти в одну"? Если не в одну, значит как минимум в две, разница 1, 1/1*100%=100%. Это нифига не почти, разница гигантская. А если ровно в одну, то это точно одна.
1
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
23.03.2015, 22:34  [ТС]
taras atavin, напиши в одну или в две строчки простенький калькулятор на D, который парсит скобки и выполняет арифметические операции '+', '-', '*', '/', '%', а при нажатии на enter выдаёт результат, например,
Code
1
2+(2*3)%4
Нажимаем на enter - получаем 4.
P.S. Если напишешь, то лучший ответ тебе обеспечен.
2
 Аватар для castorsky
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
28.03.2015, 18:51
Цитата Сообщение от Catstail Посмотреть сообщение
У меня функция parse переводит строку в список
это же два прохода по выражению, можно за один.
Цитата Сообщение от Dennis Ritchie Посмотреть сообщение
выполняет арифметические операции '+', '-', '*', '/', '%'
Может быть Вы мне укажете где у математиков функция mod обозначается знаком %? То же касается и степени. Это и есть ответы на Ваш вопрос почему такие функции не реализуются в языках. Нет единого соглашения. Вот когда будет единый мировой стандарт матматических функций, то я думаю что во всех языках появится eval(math-expr).
0
 Аватар для Dennis Ritchie
555 / 148 / 58
Регистрация: 27.07.2014
Сообщений: 2,446
28.03.2015, 19:04  [ТС]
Цитата Сообщение от castorsky Посмотреть сообщение
Может быть Вы мне укажете где у математиков функция mod обозначается знаком %?
В сиподобных языках эта операция обозначается именно так.
Цитата Сообщение от castorsky Посмотреть сообщение
То же касается и степени.
Операция степени в D выглядит так: ^^.
Цитата Сообщение от castorsky Посмотреть сообщение
Вот когда будет единый мировой стандарт матматических функций, то я думаю что во всех языках появится eval(math-expr).
Нет нужды ждать единого стандарта. Боюсь, что такого стандарта не дождусь даже я, ибо математики делают всё медленно и неповоротливо. Может быть, через 300 лет они додумаются.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38217 / 21149 / 4314
Регистрация: 12.02.2012
Сообщений: 34,761
Записей в блоге: 14
28.03.2015, 19:44
Цитата Сообщение от castorsky Посмотреть сообщение
это же два прохода по выражению, можно за один.
- согласен. Если не привлекать аппарат списков, можно за один проход. Но это немного не по-лисповски.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
28.03.2015, 19:44

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

Js в одну строчку
Подскажите готовые сервисы через которые можно пропустить js и получить на выходе js код в одну строчку.

перевести одну строчку на с++
case (operation_list.ItemIndex) of 0: ..............

Перевести одну строчку с С++ в С
помогите перевести cout << (i == 0 || j == 0 || i == N + 1 || j == M + 1 ? (char)178 : a) << (j <= M ? "" : "\n"); С++ не проходила,...

Текст в одну строчку
Можно ли весь код сайта начиная от <!DOCTYPE html><html> и кончая </body></html> вывести в одну строчку. Как например это сделано у Яндекс?...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru