![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() ![]() |
![]() |
mirtan |
![]()
Сообщение
#1
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Ярослав Репутация: ![]() ![]() ![]() |
Всем привет. Задача следующая.
Сформировать очередь елементами которой есть цифры и арифметические знаки. Нужно вывести результат. Пробовал сделать, но у меня почему-то выводится самый последний символ в очереди вместо результата. Скорей всего ошибка детская, но в теме немного не разобрался :// Вот текст программы: Program lab13z; Зарание спасибо за помощь. Сообщение отредактировано: mirtan - 25.01.2010 22:09 |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Попробуй сразу после того, как ты "заполнил" очередь, ее напечатать (т.е., напечатать символы/цифры, присутствующие в очереди). Больше ничего делать не надо, просто напечатать. Тогда тебе станет понятно, что заполняешь ты очередь неверно.
Для начала: что такое очередь, тебе известно? Что ты имеешь в виду под термином "очередь"? Структуру FIFO (First In - First Out/Первым вошел - Первым выйдешь)? Или что-то другое? По какому алгоритму ты заполняешь очередь? Опиши его словами, а не кодом на Паскале, пожалуйста. И поверь, я просто так ничего не спрашиваю. Потом поймешь, почему я задаю такие вопросы. Если будешь на них отвечать, разумеется, а не просто ждать, пока кто-нибудь исправит программу. Только скажи сразу, чего ты хочешь. Хочешь разобраться (понять, что у тебя не так, и исправить) самостоятельно - пожалуйста, я помогу, надеюсь - не только я, остальные тоже с удовольствием помогут. Если надо исправить за тебя, то на мою помощь можешь не рассчитывать. |
mirtan |
![]()
Сообщение
#3
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Ярослав Репутация: ![]() ![]() ![]() |
Очередь я представляю как одна из разновидностей линейного списка, все елементы которого добавляются в конец, а считываются с начала списка. Да именно под абревиатурой FIFO.
Я себе представляю это так: 1) создается новый динамический обьект; 2) указатель равняем nil; так как следующего обьекта пока что вроде нету. Вводим данные в очередь символы. 1) Если является цифрой от 0 до 9, то проделывая cfr:=ord(symb)-48+cfr*10 мы переводим в число, если у нас идут несколько цифр подряд. Вставляем в очередь и после этого приравниваем к 0, чтобы можна было перепроверять последующие цифры. 2) Если мы имеем другой символ - просто вставляем его в очередь. Повторяем операцию, пока не встречаем символ =. 3) А вот дальше я не совсем понимаю принцып. Вроде как сперва берем елемент а, после него идет символ. С помощью кейса вводим операции для каждого символа. Ну и потом берем елемент б с которым будем проводить операцию. Результат присваиваем а и выводим его на экран. Собственно тут какойто бред выходит. Нет, код мне писать не нужно)) Если вдруг на экзамене попадется. Хочу разобратся. |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата 1) Если является цифрой от 0 до 9, то проделывая cfr:=ord(symb)-48+cfr*10 мы переводим в число, если у нас идут несколько цифр подряд. Вставляем в очередь и после этого приравниваем к 0, чтобы можна было перепроверять последующие цифры. А теперь посмотри, что ты делаешь на самом деле:Цитата repeat Теперь о добавлении: Цитата Procedure vcherc(zv1:zv;cfr1:integer); {процедура вставки ЧИСЛА в очередь} Procedure vcherc(VAR zv1:zv;cfr1:integer); Опять же, это делается не совсем так, как ты показал. Не надо заранее выделять память под лишний элемент (то что ты делаешь в 34-ой строке кода). Ты это делаешь по одной простой причине: тебе надо быть уверенным, что scher не NIL, иначе программа твоя начнет вылетать при попытке сделать NIL^.next, правда? Все проще: Procedure PutInteger(var head, tail: zv; value: integer);Вот и все. Теперь добавление в очередь будет работать корректно, и тебе останется только исправить только сам алгоритм вычислений... С алгоритмом вычисления значения, кстати, тоже не все так просто: 2+3*4= чему?Сначала надо вычислить 3*4 по правилам арифметики, правда? Или тебе надо вычисление без учета приоритетов операций? Ты это не уточнил, поэтому на данный момент (по умолчанию принято вычисление с учетом приоритетов) твой алгоритм неверен. |
mirtan |
![]()
Сообщение
#5
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Ярослав Репутация: ![]() ![]() ![]() |
1) Тоесть считывать число нужно так? Пока символ является цифрой - переводить его?
While symb in ['0'..'9'] do 2) C процедурой вставки я всё понял, спасибо большое что обьяснил. 3) Вычисления должно производится по порядку, тоесть как есть, без учёта законов арифметики. Я представляю себе такой алгоритм: Запоминаем первое число, присваиваем ему а. Видим символ, после которого 100% будет еще одно число, пускай b. В зависимости от значения символа, через кейс вводим операции, результат которой будет вносится опять же в а. Потом берем уже ЭТО а, и продолжаем дальше двигатся по циклу. Допустим: 1)2+3-5+13= а + b 2)2+3-5+13= a - b Сообщение отредактировано: mirtan - 26.01.2010 17:49 |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата Тоесть считывать число нужно так? Пока символ является цифрой - переводить его? Нет... Тебе надо добавлять только результат. То есть, в цикле изменяешь cfr, а добавляешь полученное число - уже после цикла, когда symb не попадает в интервал '0' .. '9'. Ты же опять пытаешься добавлять по одной цифре в очередь...Цитата Я представляю себе такой алгоритм: Ну, все правильно, теперь попробуй это реализовать ![]() |
mirtan |
![]()
Сообщение
#7
|
Группа: Пользователи Сообщений: 5 Пол: Мужской Реальное имя: Ярослав Репутация: ![]() ![]() ![]() |
Цитата Нет... Тебе надо добавлять только результат. То есть, в цикле изменяешь cfr, а добавляешь полученное число - уже после цикла, когда symb не попадает в интервал '0' .. '9'. Ты же опять пытаешься добавлять по одной цифре в очередь... Понял. Спасибо тебе огромное за помощь ![]() С алгоритмом вычисления я уже разберусь ![]() |
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 0:58 |