![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Доброго времени суток!
Разбираюсь со стеками и очередями на примере следующей задачи: ”Дан стек, элементами которого являются действительные числа. Сформировать структуру данных очередь, в которую включить значения тех элементов из стека, которые не превосходят uz. Элементы с найденными значениями из стека исключить. А также получить: (uz+r)/(uz+s), где r- сумма всех тех значений элементов, которые не превосходят u, s- сумма значений элементов, больших u.” Реализовать нужно без динамических массивов, только очереди и стеки. Ниже привожу свой код, укажите на ошибки. Я пока не могу понять, почему при первом выводе стека на экран он обнуляется. И потом просто программа вылетает с ошибкой, как я понимаю как раз из за того, что стек стал пустым и последующее обращение к нему приводит к падению программы Код:
program new_stack; {$APPTYPE CONSOLE} uses SysUtils; type Stack =^Еlеm; Еlеm = Record inf : integer; next : Stack; end; Ocher =^och; och = record inf : integer; next : Ocher; end; /////////////////////// Добавляем в стек /////////////////////////////////////// Procedure In_stak(Var Beg:Stack; Sim:integer); Var x:Stack; Begin New(X); X^.inf:=Sim; X^.next:=Beg; Beg:=X; End; //////////////////////////// Достаём верхний элемент стека ///////////////////// procedure Out_stak(Var Beg: Stack; Var Flag: Boolean); Var x: Stack; Begin If Beg= Nil then Flag:= false else Begin Flag:=true; X:=Beg; Beg:=Beg^.next; Dispose(x); End; End; ////////////////////////////////////////////////////////////////////////////////// //////////////////////// Занесение в очередь /////////////////////////////////// Procedure writeO(Var BeginO, EndO : Ocher; c : integer); Var Elem : Ocher; Begin new(Elem); Elem^.inf := c; Elem^.Next := Nil; if BeginO = Nil {проверяем, пуста ли очередь} then BeginO := Elem {ставим указатель начала очереди на первый созданный элемент} else EndO^.Next := Elem; {ставим созданный элемент в конец очереди} EndO := Elem; {переносим указатель конца очереди на последний элемент} End; ///////////////////////////// Чтение из очереди ///////////////////////////////// Procedure readO(Var BeginO : Ocher; Var INF : integer); Var Elem : Ocher; Function FreeO(x1 : Ocher): boolean; Begin FreeO := (x1 = Nil); End; Begin if FreeO(BeginO) then writeln('Очередь пуста') else begin INF := BeginO^.inf; {считываем искомое значение в переменную с} Elem := BeginO; {ставим промежуточный указатель на первый элемент очереди} BeginO := BeginO^.Next;{указатель начала переносим на следующий элемент} dispose(Elem); {освобождаем память, занятую уже ненужным первым элементом} end; End; var MY,MY2:Stack; INF,I,uz,R,S:integer; BeginO, EndO , O:Ocher; IO:Boolean; begin R:=0; S:=0; Randomize; write ('Input Uz :'); readln(uz); MY:=nil; BeginO:=nil; EndO :=nil; for I := 0 to 10 do begin In_stak(MY, random(100)); end; write ('Ishodn stack :'); while MY <> Nil do begin write (My^.inf); write ('-->'); MY:=My^.next; end; readln; while MY <> Nil do Begin Out_stak(My,IO); // из основного стека достали if MY^.inf <uz then begin R:=MY^.inf; writeO( BeginO, EndO , MY^.inf); {помещаем элемент в очередь } end else begin if MY^.inf >=uz then begin S:=MY^.inf; In_stak(MY2, MY^.inf); end; End; MY := MY^.next; End; /////////////// Вывод стека //////////////////////////////////////////////// while MY2 <> nil do begin write (MY2^.inf); MY2:=MY2^.next; end; /////////////// Вывод Очереди //////////////////////////////////////////////// while O <> nil do begin write (O^.inf); O:=O^.next; end; /////////////// Вывод итогового числа //////////////////////////////////////////////// writeln ('Iskomoe chislo :'); write ((uz+r)/(uz+s)) ; readln; end. Последний раз редактировалось kaizer131, 25.02.2010 в 15:13. |