С Новым годом! Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
0 / 0 / 2
Регистрация: 08.05.2015
Сообщений: 15

Найдите ошибку в коде построения структуры данных

28.05.2015, 23:05. Показов 562. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Построить структуру данных которая на рисунке и реализовать процедуру чтения данных в указаном порядке
Проблема заключается в том, что программа запускается, но просто показывает чёрное окно с курсором, и никаких действий
порядок: х1х2х3х6х5х4х1
Сам код:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
uses crt;
type point=^item;
item=record
right,left:point;
data:integer;
end;
var p,first:point;
begin
new(p); first:=p; read(p^.data);
new(p^.left); read(p^.left^.data);
new(p^.right); read(p^.right^.data);
p^.right:=first;
new(p^.right); read(p^.right^.data);
new(p^.left); p:=p^.right; read(p^.left^.data); 
new(p^.left); read(p^.left^.data); 
new (p^.right); p^.right:=first;  read(p^.right^.data);
new(p^.left); read(p^.right^.data);
new (p^.right); read(p^.right^.data);
writeln('x1,x2,x3,x6,x5,x4,x1');
p:=first;
write(p^.data, ' '); p:=p^.left;
write(p^.data, ' '); p:=p^.left;
write(p^.data, ' '); p:=p^.right;
write(p^.data, ' '); p:=p^.right;
write(p^.data, ' '); p:=p^.right;
write(p^.data, ' '); p:=p^.left;
write(p^.data);
end.
Миниатюры
Найдите ошибку в коде построения структуры данных  
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.05.2015, 23:05
Ответы с готовыми решениями:

Найдите ошибку в коде и укажите потенциальные проблемы, которые содержатся в коде
Дорогие программисты помогите с решением задачи по C#, не успеваю :( Найдите ошибку в коде и укажите потенциальные проблемы, которые...

Найдите ошибку в коде
Где, ну где тут ошибка. эта штука в упор отказывается принимать заданные значения(а=0,5, в=1,5, е=0,01) при том, что целые числа кушает...

Найдите ошибку в коде
uses crt; const n=5; const a:array of Integer = (2100,10000,3333,4000,5000); var i,sum,s:Integer; begin sum:=0; Writeln(' sum: ...

5
 Аватар для abit
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
28.05.2015, 23:29
смотрите, окошко с курсором оно не просто так, у вас в коде хотят, чтобы ввели числа - read(p^...
но так на вскидку 14 строка - не нормально
Pascal
1
new(p^.left); p:=p^.right; read(p^.left^.data);
вы создаёте элемент слева дерева, и после читаете данные в пока ещё несозданный левый элемент правой ветки, я пока не проверял в компиляторе, но что-то мне подсказывает что это упадёт...
и не буду проверять такой код, ибо где вообще dispose???
0
0 / 0 / 2
Регистрация: 08.05.2015
Сообщений: 15
28.05.2015, 23:42  [ТС]
Я в примере посмотрел, там без Dispos-а было. исправил 14 строку, убрал "p:=p^.right" Ввёл числа, и появилась ошибка "Ссылка на обьект не указывает на экземпляр обьекта" строка 23.
0
 Аватар для abit
868 / 527 / 148
Регистрация: 03.02.2013
Сообщений: 1,845
29.05.2015, 00:18
myalex
выкиньте ваши примеры, dispose обязаны быть, это всё равно что поставить дома унитаз без смыва, как долго вы им будете наслаждаться?
теперь к проблеме 23 строки... она заключается в том, что 2-й элемент вы поганите на 14-й строке, да и 13 строка не правильная (хотя имеет право на жизнь, при определенных условиях, но об этом дальше)...
вас вообще не смутило, то что X-ов на картинке 6, а вы требуете через read прочитать 9 чисел? нафига? разберитесь что и зачем вы читаете...
Знаете, есть такая сказка у Пушкина про Лукоморье, там был кот учёный, пойдёт налево - песнь заводит, направо - сказку говорит, вот смотрите на рисунок, что вы дали, пусть верхний квадратик - лево, а нижний - право, тогда, первая строка, согласен:
Pascal
1
new(p); first:=p; read(p^.data);
здесь говорим:
1)создаём новый элемент (new(p))
2) обозначим его как первый (чтобы всегда можно было к нему вернуться) first:=p;
3) читаем число в него
ок, вторая строка, тоже хороша:
Pascal
1
new(p^.left); read(p^.left^.data);
мы создаём элемент слева, по нашей договорённости - это на рисунке кубик X2 и читаем в него число, создавать связь кубика X1 направо пока рано, ибо элемента X4 у нас ещё нет, к тому же к кубику X1 мы всегда можем вернутся (т.к. сохранили его в first),
смотрим 3-ю строку...
Pascal
1
new(p^.right); read(p^.right^.data);
уже плохо, почему бы не пойти дальше, и не создать сперва верхний кубик X3 по той же логике, т.е. сперва пойти налево?
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,059
29.05.2015, 06:47
Для pABC.NET моё виденье кода:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
uses
  CRT;
 
type
  tList = class
    N, Data : Integer;
    Top, Bottom : tList;
  end;
  
begin
  /// ---------- создадим все шесть ячеек ----------
  // первый
  var First  := tList.Create;
  First.N    := 1;
  First.Data := ReadLnInteger('Введите значение 1 ячейки:');
  // второй
  var Second  := tList.Create;
  Second.N    := 2;
  Second.Data := ReadLnInteger('Введите значение 2 ячейки:');
  // третий
  var Third  := tList.Create;
  Third.N    := 3;
  Third.Data := ReadLnInteger('Введите значение 3 ячейки:');
  // четвёртый
  var Fourth  := tList.Create;
  Fourth.N    := 4;
  Fourth.Data := ReadLnInteger('Введите значение 4 ячейки:');
  // пятый
  var Fifth  := tList.Create;
  Fifth.N    := 5;
  Fifth.Data := ReadLnInteger('Введите значение 5 ячейки:');
  // шестой
  var Sixth  := tList.Create;
  Sixth.N    := 6;
  Sixth.Data := ReadLnInteger('Введите значение 6 ячейки:');
 
  /// ---------- пропишем все связи ----------
  First .Top := Second;   First .Bottom := Fourth;
  Second.Top := Third;    Second.Bottom := Fifth;
  Third .Top := Sixth;    Third .Bottom := Sixth;
  Fourth.Top := First;    Fourth.Bottom := First;
  Fifth.Top  := Fourth;   Fifth.Bottom  := Fourth;
  Sixth.Top  := Fifth;    Sixth.Bottom  := Fifth;
  
  /// ---------- начнём путешествие с первого ----------
  var Cur := First;
  var Ch : Char;
  repeat
    WriteLn('Текущая ячейка ', Cur.N, '. Её значение ', Cur.Data, '.');
    Write('Выберите переход клавишей вверх или вниз (ESC - выход) : ');
  
    Ch := ReadKey;
    if Ch = #0 then
      Ch := ReadKey;
 
    case Ch of
      #27 : WriteLn('Выход из программы.');
      #38 : begin WriteLn('Вверх.'); Cur := Cur.Top;    end;
      #40 : begin WriteLn('Вниз.' ); Cur := Cur.Bottom; end;
    end;
    
  until Ch = #27;
  WriteLn('The end.');
end.
В принципе, его легко переделать под любой другой…
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
 Аватар для bormant
7816 / 4635 / 2837
Регистрация: 22.11.2013
Сообщений: 13,158
Записей в блоге: 1
29.05.2015, 12:12
abit,
про Dispose. По завершению программы ОС очищает всю выделенную программе память. Если программа за время работы делает фиксированное количество выделений памяти (то есть, не выделяет память постоянно), то смысла в пообъектной зачистке перед завершение действительно нет, если только при этом не выполняется каких-либо других полезных действий.
Вы видели программы, которые долго завершаются по команде закрытия без сохранения? Большинство из них в это время чистит память поэлементно...

Добавлено через 2 часа 55 минут
Ну и на закуску вариант вообще без использования динамической памяти, но на указателях:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
type
  PNode = ^TNode;
  TNode = record
    lt, rt: PNode;
    data: Integer;
  end;
  TL6 = array [1..6] of TNode;
 
procedure l6Init(var x: TL6);
begin
  with x[1] do begin lt:=@x[4]; rt:=@x[2]; end;
  with x[2] do begin lt:=@x[5]; rt:=@x[3]; end;
  with x[3] do begin lt:=@x[6]; rt:=nil;   end;
  with x[4] do begin lt:=@x[1]; rt:=nil;   end;
  with x[5] do begin lt:=@x[4]; rt:=@x[6]; end;
  with x[6] do begin lt:=@x[5]; rt:=nil;   end;
end;
 
procedure l6Read(p: PNode);
begin
  Write('x1: '); Read(p^.data); p:=p^.rt;
  Write('x2: '); Read(p^.data); p:=p^.rt;
  Write('x3: '); Read(p^.data); p:=p^.lt;
  Write('x6: '); Read(p^.data); p:=p^.lt;
  Write('x5: '); Read(p^.data); p:=p^.lt;
  Write('x4: '); Read(p^.data); ReadLn;
end;
 
var
  x: TL6;
  i: Integer;
begin
  l6Init(x); l6Read(@x);
  Write('Содержимое структуры:');
  for i:=1 to 6 do Write(' x',i,' = ',x[i].data); WriteLn;
end.
Добавлено через 19 минут
PS. Был большой соблазн написать инициализацию стадии компиляции вроде:
Pascal
1
2
3
4
5
6
7
8
const
 x: array [1..6] of TNode = (
    (lt:@x[4]); rt:@x[2]),
    (lt:@x[5]; rt:@x[3]),
    (lt:@x[6]),
    (lt:@x[1]),
    (lt:@x[4]; rt:@x[6]),
    (lt:@x[5]));
Но поскольку по правилам языка Паскаль все символы на момент ссылки на них должны быть уже объявлены (кроме указателей), то в объявлении массива x нельзя ссылаться на элементы еще не объявленного массива x (хотя объективные к тому препятствия вряд ли существуют, размер памяти для x и ее начало компилятору уже могут быть известны).
Turbo Pascal такое не съест, а вот в Free Pascal с подобным вариантом, к счастью, никаких проблем не наблюдается:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
type
  PNode = ^TNode;
  TNode = record
    lt, rt: PNode;
    data: Integer;
  end;
 
procedure l6Read(p: PNode);
begin
  Write('x1: '); Read(p^.data); p:=p^.rt;
  Write('x2: '); Read(p^.data); p:=p^.rt;
  Write('x3: '); Read(p^.data); p:=p^.lt;
  Write('x6: '); Read(p^.data); p:=p^.lt;
  Write('x5: '); Read(p^.data); p:=p^.lt;
  Write('x4: '); Read(p^.data); ReadLn;
end;
 
var
  x: array [1..6] of TNode = (
    (lt:@x[4]; rt:@x[2]),
    (lt:@x[5]; rt:@x[3]),
    (lt:@x[6]; rt:nil),
    (lt:@x[1]; rt:nil),
    (lt:@x[4]; rt:@x[6]),
    (lt:@x[5]; rt:nil));
  i: Integer;
begin
  l6Read(@x);
  WriteLn('Содержимое структуры:');
  for i:=1 to 6 do WriteLn('x',i,' = ',x[i].data);
end.
PPS. Вариант из PS для Free Pascal является полноценным решением задачи, поскольку в задании не сказано построить структуру данных именно в динамической (New/Dispose, Mark/Release) памяти.

Добавлено через 31 минуту
PPPS. В целях наглядности контроля правильности указателей, вывод дампа структуры можно сделать, например, так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function PtrToStr(p: Pointer): String;
const h: array [0..15] of Char = '0123456789ABCDEF';
type  TBA = array [0..SizeOf(Pointer)-1] of Byte;
var
  t: ^TBA;
  s: String[ps*2];
  i: Integer;
begin
  t:=@p; s:='';
  for i:=Low(TBA) to High(TBA) do
    s:=h[t^[i] shr 4] + h[t^[i] and 15] + s;
  PtrToStr:=s;
end;
 
...
  for i:=1 to 6 do with x[i] do
    WriteLn('x',i,': @ = ',PtrToStr(@x[i]),', rt = ',PtrToStr(lt),
      ', lt = ',PtrToStr(rt),', data = ',data);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.05.2015, 12:12
Помогаю со студенческими работами здесь

Найдите ошибку в коде
нужно сформировать массив N целых чисел. определить наличие среди них одинаковых. нулевые значения - не учитывать. Sub indv1() Dim...

Найдите ошибку в коде с++
Есть задача: Найти наиболее близкий к среднему арифметическому элемент среди всех элементов матрицы В(N, N), а также номера строки и...

Найдите ошибку в коде
Тему не так задал, как разрешить проблему... f:file; ... procedure TForm1.Button2Click(Sender: TObject); begin ...

Найдите ошибку в коде
Sub dvumerniymass() Q= Val(InputBox("Введите число строк матрицы")) W = Val(InputBox("Введите число столбоцов матрицы")) Dim...

Найдите ошибку в коде
#include <bits/stdc++.h> using namespace std; int n,m,c=0; bool pos ={false}; vector <vector <int> > g; void dfs (int a) { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru