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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Очереди, queue
Гость_Boris
сообщение 9.11.2004 20:04
Сообщение #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
сообщение 9.11.2004 20:20
Сообщение #2


Гость






Гость_Boris

Цитата
Если кто забыл - напоминаю: основное правило очереди - первым вошёл - первым вышел!


Цитата
Причём если следующая команда get будет превышать массив, то число будет !!!!!записываться в конец очереди (другой вариант - в начало)!!!!!!!!!!!!


Вы же сами себе противоречите! До переполнения очереди - все в порядке. Но как только произошло переполнение, следующий элемент записывается первым, и тут Вы пытаетесь взять элемент из очереди... Что получилось? Нарушилось правило очереди (FIFO), т.к. элемент, который вошел последним, выйдет первым blink.gif

Решите уже для себя, очередь это или какая-то другая структура данных... С очередями такой трюк не проходит...
 К началу страницы 
+ Ответить 
GoodWind
сообщение 9.11.2004 20:31
Сообщение #3


Автооответчик
*****

Группа: Модераторы
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

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


Цитата
Но как только произошло переполнение, следующий элемент записывается первым, и тут Вы пытаетесь взять элемент из очереди...

может при переполнении стоит сдвигать очередь вперед, тогда можно обойтись малой кровью (в смысле потеряется только передний элемент очереди) ?

Код
function put(a:integer):boolean;
begin
put:=false;
if n[0]=10 then
 begin
   for i:=1 to 9 do n[i]:=n[i+1];
   n[0]:=9;
 end;
if n[0]<m then
 begin
   n[n[0]]:=a;
   n[0]:=n[0]+1;
   put:=true;
 end;
end;


вот так примерно... не знаю работает или нет, т.к. в набирал прям тут без проверки...


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость_Boris
сообщение 9.11.2004 20:32
Сообщение #4


Гость






Так вот я и прошу переделать программу!
 К началу страницы 
+ Ответить 
volvo
сообщение 9.11.2004 20:41
Сообщение #5


Гость






Цитата
Так вот я и прошу переделать программу!


Поймите, нельзя переделать программу, не зная точного алгоритма

Цитата
в конец очереди (другой вариант - в начало)


Цитата
возвращает false если очередь пуста(по-моему - а может когда переполнение??


это алгоритм? lol.gif
 К началу страницы 
+ Ответить 
Гость_Boris
сообщение 9.11.2004 20:42
Сообщение #6


Гость






А функцию get тогда как переделать?
Или всё тоже самое оставить????

Добавлено (9.11.04 19:45):
Нет - ээто не алгоритм...
Конкретно: в конец очереди и false - если пусто
 К началу страницы 
+ Ответить 
GoodWind
сообщение 9.11.2004 20:46
Сообщение #7


Автооответчик
*****

Группа: Модераторы
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

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


Цитата
А функцию get тогда как переделать?

а разве переполненность очереди влияет на get ??


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость_Boris
сообщение 9.11.2004 21:00
Сообщение #8


Гость






Ещё как...а в принципе ... дайте подумать...наврно всё таки нет.
Буду тестить! А вы тестили? КАк ?
 К началу страницы 
+ Ответить 
GoodWind
сообщение 9.11.2004 21:03
Сообщение #9


Автооответчик
*****

Группа: Модераторы
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

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


Нет не тестил :no:
Предоставлю Вам сию почетную обязанность :yes:


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость_Boris
сообщение 9.11.2004 21:06
Сообщение #10


Гость






Только что тестил ...
при m=3 b
put(1) pu(2) pu(3) pu(4) get get get get

пишет
1
2
4
21463

(странные цифры вылазиют)
 К началу страницы 
+ Ответить 
GoodWind
сообщение 9.11.2004 21:12
Сообщение #11


Автооответчик
*****

Группа: Модераторы
Сообщений: 1 188
Пол: Мужской
Реальное имя: Александр

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


дык вы пытаетесь из очереди длиной 3 элемента взять 4 элемента, вот и получается бурда lol.gif


--------------------
Неадекватная чушь может быть адекватным ответом на неадекватный вопрос. Понятно или разжевать?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
Гость_Boris
сообщение 9.11.2004 21:26
Сообщение #12


Гость






Так я же и говорю: если в друг очередь больше то последний элемент затирается и на его место пишется новый (в моём примере 3 должна затереться
4). А вы как думали?
 К началу страницы 
+ Ответить 
volvo
сообщение 9.11.2004 21:54
Сообщение #13


Гость






Попробуйте так:

Код

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
 К началу страницы 
+ Ответить 
Гость_Boris
сообщение 9.11.2004 22:33
Сообщение #14


Гость






Спасибо..юработает.
Спасибо большое.

Добавлено (9.11.04 21:42):
Volvo, конечно ты молодец, но можно с подробнми комментариями, пожалуйста,
а то я в чужих программах не разбеоусь никогда.
Если не трудно,Volvo, напиши
 К началу страницы 
+ Ответить 
volvo
сообщение 9.11.2004 23:07
Сообщение #15


Гость






Гость_Boris

Комментарии к программе добавлены
 К началу страницы 
+ Ответить 
Гость_Boris
сообщение 10.11.2004 9:03
Сообщение #16


Гость






Thank - спасибо

Добавлено (10.11.04 14:30):

Сегодня мне сказали,что эта программа неправильная,т.к. например:
Код
const m=2
...
...
put(1)
put(2)
put(3)
writeln(get)
writeln(get)
writeln(get)
put(4)
writeln(get)


ТО ОТвет должен быть:

1
3
0
4
 К началу страницы 
+ Ответить 
volvo
сообщение 10.11.2004 15:47
Сообщение #17


Гость






Гость_Boris

Скажите, Вы не догадываетесь о существовании на клавиатуре F7, F8 и окна Watches? Неужели трудно было догадаться, из-за чего это происходит ??? Смотрите исправленную версию Get...

P.S. Тесты нужно давать сразу...
 К началу страницы 
+ Ответить 
Гость_Boris
сообщение 10.11.2004 17:07
Сообщение #18


Гость






Всё равно пишет : 1 3 4
а должен : 1 3 0 4
 К началу страницы 
+ Ответить 
volvo
сообщение 10.11.2004 17:28
Сообщение #19


Гость






Ну что мне, EXE выслать? Какой компилятор?

P.S. А чему М равно?

Сообщение отредактировано: volvo - 10.11.2004 17:29
 К началу страницы 
+ Ответить 
Altair
сообщение 10.11.2004 17:50
Сообщение #20


Ищущий истину
******

Группа: Модераторы
Сообщений: 4 824
Пол: Мужской
Реальное имя: Олег

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


ЗЫ: я так понял задача решена (раз за нее взялся volvo smile.gif )
НО!
я думаю что вообще-то все можно было решить с помощью функций и процедур из FAQ'а:
Цитата
procedure QueueInit (VAR Q:TQueue); {INIT}
Function QueueEmpty(Q:TQueue):boolean; {проверка на заполненность}
Procedure OueuePush(var q:TQueue; e:TElem);  {поместить в хвост}
Function QueuePop(var q:TQueue):TElem;    {извлечь из хвоста}

Это все что нужно!


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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

 



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