
Как написать полноценный калькулятор на паскале? Имею в виду, что программа должна сама понимать
какое число, какое действие я написал и т.д. То есть, чтобы я не выбирал какое действие я хочу выполнить с какими-либо числами. Я не прошу готовый код, я прошу подсказку. Заранее спасибо!

Ответы на вопрос

Для вычисления алгебраического выражения, представленного текстом, требуется написать простенький анализатор этих самых выражений. Изначально мы имеет Выражение, из которого должны, с помощью различных вычислений получить Число.
Для этого разберёмся, что же такое число и выражение, и какие они бывают.
Понятия и определения:
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]+(?.[0-9]+)?)\+(.+)/.IsMatch(expr)){
// Вариант: число + выражение
real numb = /([0-9]+(?.[0-9]+)?)\+(.+)/.Match(expr)[1]; // Вытаскиваем Число
expr = /([0-9]+(?.[0-9]+)?)\+(.+)/.IsMatch(expr)[2]; // Вытаскиваем Выражение
return Число(numb) + Выражение(expr); // Складываем
} else if (...далее для остальных (-,*,/) знаков...) {....}
else {
//Если ничего не подошло, значит ошибка в выражении.
ВывестиОшибку();
}
}
P.S. В выражении не может быть пробелов. Если нужна поддержка пробелов, подкорректируй регулярки.



Для написания полноценного калькулятора на Паскале, который понимает какое число и какое действие нужно выполнить, вам нужно будет использовать оператор выбора - case. Этот оператор позволяет проверять значение переменной на соответствие определенному списку значений и выполнять соответствующие действия.
Вот пример кода на Паскале, который может помочь вам написать калькулятор:
sqlprogram calculator;
uses crt;
var
num1, num2, result: real;
operation: char;
begin
clrscr;
writeln('Enter first number: ');
readln(num1);
writeln('Enter operation (+, -, *, /): ');
readln(operation);
writeln('Enter second number: ');
readln(num2);
case operation of
'+': result := num1 + num2;
'-': result := num1 - num2;
'*': result := num1 * num2;
'/': result := num1 / num2;
else writeln('Invalid operation');
end;
writeln('Result: ', result);
readln;
end.
В этом примере программа запрашивает первое число, операцию и второе число. Затем оператор case проверяет значение переменной operation на соответствие символам "+", "-", "*" и "/". Если значение соответствует одному из символов, то выполняется соответствующее действие и результат сохраняется в переменной result. Если значение operation не соответствует ни одному из символов, то выводится сообщение об ошибке.
Надеюсь, это поможет вам написать свой калькулятор на Паскале. Удачи!


Топ вопросов за вчера в категории Информатика







Последние заданные вопросы в категории Информатика
-
Математика
-
Литература
-
Алгебра
-
Русский язык
-
Геометрия
-
Английский язык
-
Химия
-
Физика
-
Биология
-
Другие предметы
-
История
-
Обществознание
-
Окружающий мир
-
География
-
Українська мова
-
Информатика
-
Українська література
-
Қазақ тiлi
-
Экономика
-
Музыка
-
Право
-
Беларуская мова
-
Французский язык
-
Немецкий язык
-
МХК
-
ОБЖ
-
Психология
-
Физкультура и спорт
-
Астрономия
-
Кыргыз тили
-
Оʻzbek tili