![]() |
1. Заголовок темы должен быть информативным. В противном случае тема удаляется ...
2. Все тексты программ должны помещаться в теги [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ", если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Паскаля (исключение - только с согласия модератора).
5. НЕ используйте форум для личного общения, все что не относится к обсуждению темы - на PM!
6. Одна тема - один вопрос (задача)
7. Проверяйте программы перед тем, как разместить их на форуме!!!
8. Спрашивайте и отвечайте четко и по существу!!!
![]() |
Гость_Boris |
![]()
Сообщение
#1
|
Гость ![]() |
Как видно из задания, задача будет идти о очередях.
Если кто забыл - напоминаю: основное правило очереди - первым вошёл - первым вышел! Итак. Пусть дан одномерный массив (он задаёт количество элементов). Задача заключается в следующем: с помощью функций put и get реализовать распечатку текста на экране. .Например: get(1) get(2) writeln(get) writeln(get) Причём если следующая команда get будет превышать массив, то число будет !!!!!записываться в конец очереди (другой вариант - в начало)!!!!!!!!!!!! пример: put(1) put(2) put(3) get get get ; здесь массив состоит из 2-х элементов и происходит переполнение ... ВАЖНО: функции имеют слежующий вид: function put(i:integer):boolean; (возвращает false если очередь пуста(по-моему - а может когда переполнение??) и true, если переполнения нет) function get:integer; Вот и всё: ПОМОГИТЕ бедному студенту.! P.S: Вот я написал, но при переполнении не то, совсем не то: Код uses crt; const m=10; var n:array[0..m] of integer; i,j: integer; procedure Init; begin for i:=1 to m do n[i]:=0; n[0]:=1; end; function put(a:integer):boolean; begin put:=false; if n[0]<=m then begin n[n[0]]:=a; n[0]:=n[0]+1; put:=true; end; end; function get: integer; begin if n[0]>1 then begin get:=n[1]; n[0]:=n[0]-1; for i:=1 to m-1 do n[i]:=n[i+1]; end; end; begin init; clrscr; writeln; put(1); put(2); put(3); writeln(get); writeln(get); put(4); writeln(get); writeln(get); readln; end. |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Попробуйте так:
Код const m = 3; var a: array[1 .. m] of integer; first, last: integer; overflow: boolean; { инициализация очереди } procedure init; begin first := 0; last := 0; end; function get: integer; begin { при извлечении из очереди в любом случае признак переполнения снимается... } overflow := false; { извлекаем всегда первый эпемент } get := a[1]; { после извлечения уменьшаем количество элементов в очереди } if last > 0 then dec(last); { и сдвигаем всю очередь на 1 позицию ближе к началу } move(a[2], a[1], (m - 1)*sizeof(integer)); { освободившееся место в конце очереди заполняем нулем } a[m] := 0; end; function put(x: integer): boolean; begin { устанавливаем признак переполнения - очередь считается переполненной, если она уже была переполненной до этой операции или если указатель конца очереди стоит на последнем элементе } overflow := overflow or (last = m); { если очередь переполнена, увеличения указатель конца очереди не происходит, иначе - он увеличивается на 1 } inc(last, byte(not overflow)); { и в соответствующую ячейку пишется значение } a[last] := x; { функция возвращает признак переполнения очереди } put := overflow end; var r: boolean; begin init; { вызывать перед началом работы с очередью... } r := put(1); r := put(2); r := put(3); r := put(4); writeln(get); writeln(get); writeln(get); r := put(5); writeln(get); end. при переполнении Put возвращает True и последний элемент очереди затирается вновь введенным. Get при попытке чтения из пустой очереди возвращает 0... Сообщение отредактировано: volvo - 10.11.2004 15:42 |
![]() ![]() |
![]() |
Текстовая версия | 20.06.2025 14:28 |