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

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

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

2 страниц V  1 2 >  
 Ответить  Открыть новую тему 
> Очереди, queue
сообщение
Сообщение #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.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Гость_Boris

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


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


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

Решите уже для себя, очередь это или какая-то другая структура данных... С очередями такой трюк не проходит...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Гость






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


Гость






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


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

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


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


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


Гость






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

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


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

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

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


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

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


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


Гость






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


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

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

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


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


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


Гость






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

пишет
1
2
4
21463

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


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

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

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


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


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


Гость






Так я же и говорю: если в друг очередь больше то последний элемент затирается и на его место пишется новый (в моём примере 3 должна затереться
4). А вы как думали?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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 -
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






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

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


Гость






Гость_Boris

Комментарии к программе добавлены
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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
 К началу страницы 
+ Ответить 
сообщение
Сообщение #17


Гость






Гость_Boris

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

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


Гость






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


Гость






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

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

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


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

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

Репутация: -  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

 





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