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

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

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

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


Новичок
*

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

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


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



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


Гость






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

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


Новичок
*

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

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


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

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


Гость






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

Я же тебе давал ссылку на FAQ, где есть и калькулятор с использованием постфиксных выражений... Там был?
 К началу страницы 
+ Ответить 
Maximka
сообщение 7.06.2006 15:12
Сообщение #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 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.06.2006 15:30
Сообщение #6


Гость






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

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

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


Новичок
*

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

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


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


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


Новичок
*

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

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


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

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


Гость






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

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


Новичок
*

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

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


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

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

 



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