Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Паскаль, Turbo Pascal, PascalABC.NET
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2016, 16:40   #1
Калючка
Пользователь
 
Регистрация: 05.11.2016
Сообщений: 11
Сообщение [Очередь] Помогите найти ошибку...программа после компиляции и ввода значения не выдает ответ

Помогите найти ошибку...туплю по страшному.... программа после компиляции и ввода значения не выдает ответ....
Вложения
Тип файла: docx program o4ered.docx (21.5 Кб, 24 просмотров)

Последний раз редактировалось Вадим Мошев; 05.11.2016 в 21:16.
Калючка вне форума Ответить с цитированием
Старый 06.11.2016, 00:12   #2
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

А как бы увидеть программу?
Я не буду скачивать docx с форума из-за возможности поймать вирус в скрипте. А о случае, когда на форуме попросили отладить скрипт, а тот у тестеров отформатировал винчестер - я совсем молчу.
FPaul вне форума Ответить с цитированием
Старый 06.11.2016, 08:12   #3
Lektorfuja
Форумчанин
 
Аватар для Lektorfuja
 
Регистрация: 04.11.2016
Сообщений: 355
По умолчанию

А покороче у вас есть программы?
мой блог :patreon.com/hopkins1988 . facebook группы:"программирование на Андроид","
"Программирование чистый код"
Lektorfuja вне форума Ответить с цитированием
Старый 06.11.2016, 18:53   #4
Калючка
Пользователь
 
Регистрация: 05.11.2016
Сообщений: 11
Сообщение очередь

Код:
program o4ered;
const maxsize=7;
type prioritet=integer;
priorityQ=record
M:array [1..maxsize] of prioritet;
lt:integer;
end;
var
B:priorityQ;
x,y:prioritet;
i:integer;
procedure makenull(var G:priorityQ);
begin
G.lt:=0;
end;
procedure insert(x:prioritet;G:priorityQ);
var
i:integer;
temp:prioritet;
begin
if G.lt>=maxsize then
begin
writeln ('o4ered zapolnena');
end
else
begin
G.lt:=G.lt+1;
G.M[G.lt]:=x;
i:=G.lt;
while (i>1) and (G.M[i]<G.M[i div 2]) do
begin
temp:=G.M[i];
G.M[i]:=G.M[i div 2];
G.M[i div 2]:=temp;
i:=i div 2;
end;
end;
end;
function deletemin (var G:priorityQ):prioritet;
var
i,j:integer;
temp:prioritet;
minimym:prioritet;
begin
if G.lt=0 then
begin
writeln('o4ered pysta');
deletemin:=0;
end
else
begin
minimym:=G.M[i];
G.M[i]:=G.M[G.lt];
G.lt:=G.lt-1;
i:=1;
while i<=(G.lt div 2) do
begin
if (G.M[2*i]<G.M[2*i+1]) or (2*i=G.lt) then
j:=2*i
else
j:=2*i+1;
if (G.M[i]>G.M[j]) then
begin
temp:=G.M[i];
G.M[i]:=G.M[j];
G.M[j]:=temp;
i:=j;
end
else
deletemin:=minimym;
end;
end;
end;
begin
makenull(B);
writeln ('o4ered iz 7 eleventov');
for i:=1 to maxsize do
begin
write ('vvedite prioritet ');
readln(x);
insert(x,B);
end;
writeln ('o4ered');
for i:=1 to maxsize do write (' ',B.M[i],' ');
writeln;
writeln ('ydalenie s prioritetom');
y:=deletemin(B);
writeln ('y=',y);
writeln ('min prioritet iz o4eredi');
for i:=1 to maxsize do write (' ',B.M[i],' ');
writeln;
end.

Последний раз редактировалось Аватар; 06.11.2016 в 19:36.
Калючка вне форума Ответить с цитированием
Старый 06.11.2016, 18:54   #5
Калючка
Пользователь
 
Регистрация: 05.11.2016
Сообщений: 11
По умолчанию

увы...но мне надо довести до ума эту программу...(((
Калючка вне форума Ответить с цитированием
Старый 06.11.2016, 21:07   #6
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

1. В процедуре insert сделайте параметр G - параметром-переменной (добавьте var).
2. В процедуре deletemin в ветке else сразу идёт строка minimym := G.M[i]; но значение i - не определено, что приводит к ошибке.
3. В основной программе при выводе элементов очереди цикл не до maxsize, а до B.lt.

Последний раз редактировалось FPaul; 06.11.2016 в 21:11.
FPaul вне форума Ответить с цитированием
Старый 06.11.2016, 21:11   #7
ViktorR
Старожил
 
Регистрация: 23.10.2010
Сообщений: 2,304
По умолчанию

Было бы хорошо еще немного потрудиться и отформатировать программу ...
Но вот кажется нашел ...
Код:
procedure insert(x:prioritet;G:priorityQ);
...
else
begin
G.lt:=G.lt+1;
G.M[G.lt]:=x;
i:=G.lt;
while (i>1) and (G.M[i]<G.M[i div 2]) do
begin
temp:=G.M[i];
G.M[i]:=G.M[i div 2];
G.M[i div 2]:=temp;
...
Так понимаю, что значения должны меняться в G, но этот параметр передается в процедуру по значению, а должен передаваться по адресу ...
Предлагаю почитать Т.А. Павловская, Программирование на ЯВУ (в перечне имеется).

PS: А вот и ещё одна подсказка ...
Как-то так, ...
Как-то так, ...
ViktorR вне форума Ответить с цитированием
Старый 06.11.2016, 21:14   #8
FPaul
Форумчанин
 
Регистрация: 25.01.2015
Сообщений: 472
По умолчанию

Воспользовался автоформаттером и устранил п.1 и п.3. Что делать с п.2 - не знаю, надеюсь, топикстартер разберётся.
Код:
program o4ered;

const
  maxsize = 7;
type
  prioritet = integer;

  priorityQ = record
    M:  array [1..maxsize] of prioritet;
    lt: integer;
  end;

  procedure makenull(var G: priorityQ);
  begin
    G.lt := 0;
  end;

  procedure insert(x: prioritet;var G: priorityQ);
  var
    i: integer;
    temp: prioritet;
  begin
    if G.lt >= maxsize then
    begin
      writeln('o4ered zapolnena');
    end
    else
    begin
      G.lt := G.lt + 1;
      G.M[G.lt] := x;
      i := G.lt;
      while (i > 1) and (G.M[i] < G.M[i div 2]) do
      begin
        temp := G.M[i];
        G.M[i] := G.M[i div 2];
        G.M[i div 2] := temp;
        i := i div 2;
      end;
    end;
  end;

  function deletemin(var G: priorityQ): prioritet;
  var
    i, j: integer;
    temp: prioritet;
    minimym: prioritet;
  begin
    if G.lt = 0 then
    begin
      writeln('o4ered pysta');
      deletemin := 0;
    end
    else
    begin
      minimym := G.M[i];
      G.M[i] := G.M[G.lt];
      G.lt := G.lt - 1;
      i := 1;
      while i <= (G.lt div 2) do
      begin
        if (G.M[2 * i] < G.M[2 * i + 1]) or (2 * i = G.lt) then
          j := 2 * i
        else
          j := 2 * i + 1;
        if (G.M[i] > G.M[j]) then
        begin
          temp := G.M[i];
          G.M[i] := G.M[j];
          G.M[j] := temp;
          i := j;
        end
        else
          deletemin := minimym;
      end;
    end;
  end;

var
  B: priorityQ;
  x, y: prioritet;
  i: integer;
begin
  makenull(B);
  writeln('o4ered iz 7 eleventov');
  for i := 1 to maxsize do
  begin
    Write('vvedite prioritet ');
    //readln(x);
    x:=11*i;
    insert(x, B);
  end;
  writeln('o4ered');
  for i := 1 to B.lt do
    Write(' ', B.M[i], ' ');
  writeln;
  writeln('ydalenie s prioritetom');
  y := deletemin(B);
  writeln('y=', y);
  writeln('min prioritet iz o4eredi');
  for i := 1 to B.lt do
    Write(' ', B.M[i], ' ');
  writeln;
end.
FPaul вне форума Ответить с цитированием
Старый 07.11.2016, 16:57   #9
Калючка
Пользователь
 
Регистрация: 05.11.2016
Сообщений: 11
По умолчанию

всем большое спасибо за помощь...)))
Калючка вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
вводим 15 элементов в очередь, затем выводим на экран эту очередь и добавил в очередь еще один элемент. Потом удаляем любой элемен Xumera C++ Builder 2 07.12.2013 13:56
Очередь на Си majuw Помощь студентам 9 21.05.2013 19:54
очередь nani94 Паскаль, Turbo Pascal, PascalABC.NET 3 18.03.2013 20:33
Очередь Си svetikzo Помощь студентам 0 23.01.2010 10:03
Очередь C++ svetikzo Помощь студентам 2 23.01.2010 09:53