IPB
ЛогинПароль:

> Прочтите прежде чем задавать вопрос!

1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code], либо быть опубликованы на нашем PasteBin в режиме вечного хранения.
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!

 
 Ответить  Открыть новую тему 
> Калькулятор, с произвольными разрядами
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Подскажите пожалуйста как реализовать калькулятор с числами произвольной разрядности?????
например
 
var
s:string;
begin
s:=(2000-353)*164-(2222/234);



Польская запись вроде не подходит....Можно сделать массив строк, и забивать каждый элемент в эти строки...Но как потом проверять приоритетность действий ??????
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






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

Если тебе надо действительно ЛЮБУЮ разрядность - смотри в сторону "Длинной Арифметики" (у нас в FAQ-е есть такая тема)... Но все равно, чтобы вычислить значение выражения, его сначала придется перевести в постфикс...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


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

" (Показать/Скрыть)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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

Я же тебе давал ссылку на FAQ, где есть и калькулятор с использованием постфиксных выражений... Там был?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Вы тоже извиняйте, что толком объяснить не могу. Я хочу сделать калькулятор, который бы вычислял скобочные выражения, с числами произвольной разрядности. (например: (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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Ну, вот же программа:
FAQ: Постфиксная форма записи, Перевод выражения в постфикс

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

Результат:
Цитата
142 3 2214 + * 5 *
В чем проблема?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Значит проблема в моей задаче. (не хочет она правильно работать).. Не могли бы вы взглянуть на нее своим профессиональным взглядом???!!!! Я новичек в программировании, и поэтому мне еще тяжело читать чужой код.... good.gif .


-------
Спасибо, что уделяете свое время..............
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


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

" (Показать/Скрыть)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Гость






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

То есть ты ГАРАНТИРОВАННО запихнешь в стек только один символ. Так? А это неверно... Тебе надо сначала прочесть из строки ряд символов (до первого знака операции, скобки или конца строки), и только потом заносить эту последовательность в стек...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Новичок
*

Группа: Пользователи
Сообщений: 16
Пол: Мужской

Репутация: -  0  +


Спасибо!!!! Буду мудрить...Вроде понял, что надо менять
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 




- Текстовая версия 19.10.2017 3:28
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"