Помощь - Поиск - Пользователи - Календарь
Полная версия: Калькулятор
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Maximka
Подскажите пожалуйста как реализовать калькулятор с числами произвольной разрядности?????
например
 
var
s:string;
begin
s:=(2000-353)*164-(2222/234);



Польская запись вроде не подходит....Можно сделать массив строк, и забивать каждый элемент в эти строки...Но как потом проверять приоритетность действий ??????
volvo
Maximka, с чего бы это польская запись здесь не подходила? Что мешает? Слишком большие числа? Пользуйся Real... Мало? Double, Extended...

Если тебе надо действительно ЛЮБУЮ разрядность - смотри в сторону "Длинной Арифметики" (у нас в FAQ-е есть такая тема)... Но все равно, чтобы вычислить значение выражения, его сначала придется перевести в постфикс...
Maximka
Может польская и подходит, но я что-то не пойму как ее применить....
Допустим дана строка (3567-123), то по идее на выходе должно получиться: 3567123-
Вот здесь у меня ступор. wacko.gif Как разделить два числа, чтобы они не сливались в одно. |3567|123|-
Помогите пожалуйста!!!!
вот пример моей проги (но она считает с числами от 1 до 9).

" (Показать/Скрыть)
volvo
Ты меня конечно извини, но ты бы уточнил, ЧТО СДЕЛАТЬ хочешь? Просто преобразовать выражение в постфикс, или же ВЫЧИСЛИТЬ его? Если вычислить, то ... вычисляй, зачем ты его распечатываешь?

Я же тебе давал ссылку на FAQ, где есть и калькулятор с использованием постфиксных выражений... Там был?
Maximka
Вы тоже извиняйте, что толком объяснить не могу. Я хочу сделать калькулятор, который бы вычислял скобочные выражения, с числами произвольной разрядности. (например: (23434-1)-(13414+1)). По началу думал что это можно с помощь постфиксой записью.

Моя задача это делает так:

1.) Пользователь вводит строку. Допустим такую (1+1)
2.) Выражение просматривается посимвольно с лева на право. Прога, с помощью стеков переводит выражение в постфиксную запись 1 1 +
3.) Далее алгоритм считывает посимвольно новую строку и преобразует строки в числа и знаки.
4.) Складывает 1+1. Итог:2


А если ввести числа большой разрядности 124+234, то глюк. Прога переводит выражение в постфиксную запись 1 2 4 2 3 4 +. Получается она сливает 2 числа в одно. И я никак не пойму как от этого избавиться. FAQ читал , но там тоже задачи не для больших чисел. Помогите пожалуйста доработать задачу, чтобы она все таки научилась считать числа с произвольной разрядностью. СПАСИБО!!!!!! smile.gif
volvo
Ну, вот же программа:
FAQ: Постфиксная форма записи, Перевод выражения в постфикс

Только что проверил - она прекрасно отработала со строкой:
const
s: string = '142*(3+2214)*5';

Результат:
Цитата
142 3 2214 + * 5 *
В чем проблема?
Maximka
Значит проблема в моей задаче. (не хочет она правильно работать).. Не могли бы вы взглянуть на нее своим профессиональным взглядом???!!!! Я новичек в программировании, и поэтому мне еще тяжело читать чужой код.... good.gif .


-------
Спасибо, что уделяете свое время..............
Maximka
Вот мой алгоритм переводящий выражение в польскую запись. Попробуйте запустить его с большими числами и вы сразу, поймете почему он не подходит для чисел с произвольной разрядностью..Вы можете осудить меня за попытку "повторного изобретения велесипеда", но мне очень хочется довести задуманное до конца...
Помогите пожалуйста доработать мой алгоритм.

" (Показать/Скрыть)
volvo
Цитата
поймете почему он не подходит для чисел с произвольной разрядностью
Для этого совершенно не надо ничего запускать... Я тебе и так скажу. Вот то, что тебе мешает:
Procedure opz(var output: string);
...
case input[i] of
'0'..'9': instack (s2,input[i]); { <--- !!! }

То есть ты ГАРАНТИРОВАННО запихнешь в стек только один символ. Так? А это неверно... Тебе надо сначала прочесть из строки ряд символов (до первого знака операции, скобки или конца строки), и только потом заносить эту последовательность в стек...
Maximka
Спасибо!!!! Буду мудрить...Вроде понял, что надо менять
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.