Как написать полноценный калькулятор на паскале? имею в виду, что программа должна сама понимать какое число, какое действие я написал и т.д. то есть, чтобы я не выбирал какое действие я хочу выполнить с какими-либо числами. я не прошу готовый код, я прошу подсказку. заранее !
Ответы на вопрос:
для вычисления выражения, представленного текстом, требуется написать простенький анализатор этих самых выражений. изначально мы имеет выражение, из которого должны, с различных вычислений получить число.
для этого разберёмся, что же такое число и выражение, и какие они бывают.
понятия и определения:
1) число. может быть целым или дробным. запишем это так (в // записано регулярное выражение для всех неотрицательных чисел, отрицательные рассмотрим, как выражение)
число : - строка вида /[0-9]+(.[0-9]+)? / или число на паскале
2) у выражения можество определений. во-первых, число само по себе тоже является выражением, возвращающим само себя. во-вторых число {+*,итд} выражение тоже являются выражением.
набор рекурсивных определений:
выражение : - число
выражение : - -число
выражение : - (выражение)
выражение : - число + выражение
выражение : - число - выражение
выражение : - число * выражение
выражение : - число \ выражение
список можно продолжить и для других операций.
используя эти определения можно написать программу, которая реализует предикаты (функции) число() и выражение() (функции называй, как хочешь). особенно удобно это делать на логических языках программирования по типу prolog, так как её код похож на то, что записано выше.
для паскаля же (или того же c++) нужно писать рекурсивную программу.
далее псевдокод:
void вывестиошибку(){
print("у тебя что-то не то с перепиши! ");
}
real число(string numb){
if(/[0-9]+(.[0-9]+)? /.ismatch(numb) < > true) вывестиошибку();
return strtoint(numb);
}
real число(real numb){
return numb;
}
real выражение (string expr) {
if(/[0-9]+(.[0-9]+)? /.ismatch(expr)){
// вариант: число
return число(expr);
}
else if(/-[0-9]+(.[0-9]+)? /.ismatch(expr)){
// вариант: -число
return -число(expr);
}
else if(/+)\)/.ismatch(expr)){
// вариант: (выражение)
return выражение(/+)\)/.match(expr)[1]); //используя группы регулярных выражений вытаскиваем содержимое из скобок
}
else if(/([0-9]+-9]++(.+)/.ismatch(expr)){
// вариант: число + выражение
real numb = /([0-9]+-9]++(.+)/.match(expr)[1]; // вытаскиваем число
expr = /([0-9]+-9]++(.+)/.ismatch(expr)[2]; // вытаскиваем выражение
return число(numb) + выражение(expr); // складываем
} else if для остальных *,/) {}
else {
//если ничего не подошло, значит ошибка в выражении.
вывестиошибку();
}
}
p.s. в выражении не может быть пробелов. если нужна поддержка пробелов, подкорректируй регулярки.
Реши свою проблему, спроси otvet5GPT
-
Быстро
Мгновенный ответ на твой вопрос -
Точно
Бот обладает знаниями во всех сферах -
Бесплатно
Задай вопрос и получи ответ бесплатно
Популярно: Информатика
-
Elizaveta861420.06.2023 23:53
-
observatorshkip06tpd07.12.2020 09:05
-
ghbdtnzujdyjfns27.11.2020 13:45
-
Sagidanovadi11.02.2021 10:41
-
Bogdan30070726.02.2020 15:20
-
chumaeva79105.04.2022 12:44
-
SanyaLuckYouTube21.08.2020 19:11
-
Darina2015201520.04.2021 01:19
-
Сакура203407.04.2021 04:23
-
srente09.06.2023 05:30
Есть вопросы?
-
Как otvet5GPT работает?
otvet5GPT использует большую языковую модель вместе с базой данных GPT для обеспечения высококачественных образовательных результатов. otvet5GPT действует как доступный академический ресурс вне класса. -
Сколько это стоит?
Проект находиться на стадии тестирования и все услуги бесплатны. -
Могу ли я использовать otvet5GPT в школе?
Конечно! Нейросеть может помочь вам делать конспекты лекций, придумывать идеи в классе и многое другое! -
В чем отличия от ChatGPT?
otvet5GPT черпает академические источники из собственной базы данных и предназначен специально для студентов. otvet5GPT также адаптируется к вашему стилю письма, предоставляя ряд образовательных инструментов, предназначенных для улучшения обучения.