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

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

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

> Задача на очередь, Паскаль
сообщение
Сообщение #1





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

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


Всем привет. Задача следующая.
Сформировать очередь елементами которой есть цифры и арифметические знаки. Нужно вывести результат.

Пробовал сделать, но у меня почему-то выводится самый последний символ в очереди вместо результата. Скорей всего ошибка детская, но в теме немного не разобрался ://

Вот текст программы:
Program lab13z;       
Const zn=['+','-','*','/'];
Type zv=^pointer; {описание переменных}
pointer=record
boolkey:boolean;
arsing:char;
arcint:integer;
next:zv;
end;
Var scher,lcher:zv;
symb:char;
cfr:integer;
a,b:integer;

Procedure vcherc(zv1:zv;cfr1:integer); {процедура вставки ЧИСЛА в очередь}
Var q:zv;
Begin
new(q);
q^.arcint:=cfr1;
zv1^.next:=q;
zv1:=zv1^.next;
end;

Procedure vchers(zv1:zv;simv:char); {Процедура вставки СИМВОЛА в очередь}
Var q:zv;
Begin
new(q);
q^.arsing:=simv;
zv1^.next:=q;
zv1:=zv1^.next;
end;

Begin {формирование очереди}
new(scher);
scher^.next:=nil;
lcher:=scher;
writeln('Введите очередь');
repeat
read(symb);
if symb in ['0'..'9'] then
Begin
cfr:=ord(symb)-48+cfr*10;
vcherc(lcher,cfr);
cfr:=0;
end;
if symb in zn then
vchers(lcher,symb)
until symb='=';
scher:=scher^.next;
a:=scher^.arcint;
scher:=scher^.next;
while (scher<>nil) do
Begin
symb:=scher^.arsing;
scher:=scher^.next;
b:=scher^.arcint;
scher:=scher^.next;
case symb of
'+':a:=a+b;
'-':a:=a-b;
'*':a:=a*b;
'/':a:=a div b;
end;
end; {Cкорей всего неправильно вывожу результат =/}
write(a);
Readln;
readln;
end.


Зарание спасибо за помощь.

Сообщение отредактировано: mirtan -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2





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

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


1) Тоесть считывать число нужно так? Пока символ является цифрой - переводить его?

While symb in ['0'..'9'] do
Begin
cfr:=ord(symb)-48+cfr*10;
vcherc(lcher,cfr); /
cfr:=0;
end;


2) C процедурой вставки я всё понял, спасибо большое что обьяснил.
3) Вычисления должно производится по порядку, тоесть как есть, без учёта законов арифметики.
Я представляю себе такой алгоритм:
Запоминаем первое число, присваиваем ему а. Видим символ, после которого 100% будет еще одно число, пускай b. В зависимости от значения символа, через кейс вводим операции, результат которой будет вносится опять же в а. Потом берем уже ЭТО а, и продолжаем дальше двигатся по циклу.

Допустим: 1)2+3-5+13=
а + b
2)2+3-5+13=
a - b

Сообщение отредактировано: mirtan -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


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

 





- Текстовая версия 9.09.2025 18:19
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name