Форум программистов, компьютерный форум, киберфорум
Наши страницы
Free Pascal
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.90/21: Рейтинг темы: голосов - 21, средняя оценка - 4.90
diliana
93 / 26 / 1
Регистрация: 19.05.2009
Сообщений: 138
#1

Динамические списки

19.05.2009, 22:51. Просмотров 3830. Ответов 33
Метки нет (Все метки)

Приветики всем.

Мое задание - реализовать добавление элементов в список А и удаление их из списка А в список Б, с возможность просмотра текущего состояния списков.
Я уже кое-что сделала, но больше никак не могу.
Миленькие мои програмисты, помогите пожалуста бедной студентке доделать задание. Очень вас прошу.

вот что я смогла сделать

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
program Laba_List;
 
Type
{обьявление списка}
  plist = ^tl;
  tl = record
  next : plist;
  data: integer;
  end;
 
Var
  head: plist;
  cur: plist;
  x: integer;
  key: char;
 
 
{Просмотр списка1}
procedure ScanList;
var  t: plist;
begin
  writeln ('Prosmotr spiska');
  writeln;
  t := Head;
  while t <> nil do begin
    write(t^.Data, ' ');
    t := t^.Next;
  end;
writeln;
writeln;
end;
 
 
{добавление элемента в список1}
procedure AddList;
var t : plist;
begin
  Write ('Dobavit element: ');
  Readln (x);
  New(t);
  t^.Data := x;
  t^.Next := nil;
  if Head = nil then Head := t
   else cur^.next := t;
  cur := t;
  Writeln ('Dobavlen: ',t^.Data);
  Writeln;
end;
 
 
{Просмотр списка2}
procedure ScanList2;
begin
end;
 
{добавление элемента в список2}
procedure AddList2;
begin
end;
 
 
{удаление элемента из списка1 в список2}
procedure DelList;
var t: plist;
begin
 if Cur <> nil then begin
 if Cur = Head then begin
 Head := Head^.Next;
 Writeln ('Udalen ',Cur^.data);
 dispose(Cur);
 Cur := Head;
 end else  begin
 t := Head;
 while t^.Next <> Cur do
  t := t^.Next;
  t^.Next := Cur^.Next;
  Writeln ('Udalen ',Cur^.data);
  dispose(Cur);
  Cur := t;
   end;
 end;
end;
 
 
BEGIN
 Head:=nil;
 Repeat
 Writeln ('===================');
 Writeln ('PROGRAM List');
 Writeln ('===================');
 Writeln ('1: Dobavit element v spisok-1');
 Writeln ('2: Udalit element v spisok-2');
 Writeln ('3: Prosmotr spiska-1');
 Writeln ('4: Prosmotr spiska-2');
 Writeln ('0: Exit');
 Writeln ('====================');
 Readln (key);
 case key of
   '1': AddList;
   '2': DelList;
   '3': ScanList;
   {'4': ScanList2;}
  end;
   until key ='0';
 END.
Добавлено через 10 часов 6 минут 20 секунд
Неужели мне никто не поможет?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2009, 22:51
Ответы с готовыми решениями:

Динамические списки
Привет! Вот задание: -новый элемент Е в начало списка L, упорядоченного по...

Ссылки, списки, динамические структуры данных
Здравствуйте, помогите пожалуйста. Построить список символов, содержащий...

Динамические списки. Что нужно добавить, чтобы текст из внешнего файла не делился на строки?
Program Iluha; uses crt; type sSpis = ^rSpis; rSpis = record S : String;...

Динамические списки
Помогите решить вот такую задчу! Разделить упорядоченный список на два по...

динамические списки
описать две процедуры в списке L из каждой группы подряд идущих равных...

33
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
19.05.2009, 23:04 #2
Не смотрел весь код, но вот Вам подсказка, вместо процедуры
Pascal
1
ScanList
напишите Вот такую процедуру:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
procedure ScanList(t,Head: plist); {t- список который нужно просмотреть}
begin                                                    {Head- адрес его первого элемента}
  writeln ('Prosmotr spiska');
  writeln;
  t := Head;
  while t <> nil do begin
    write(t^.Data, ' ');
    t := t^.Next;
  end;
writeln;
writeln;
end;
и вызывайте примерно так:
ScanList(t,Head);
Посмотрел Ваши процедуры, по-идее Ваша программа совершенно не должна работать (Вы меня извините). Просто Вы немного не понимаете понятия:
1)Глобальные переменные.
2)Не осведомлены про описания процедур (что там можно написать вот так:Procedure name(var a: *** ); и какой будет при этом результат

Это Ваши основные проблемы, глядя на процедуры ,не считая того что Вы всегда используете локальные переменные, у Вас вполне правильно написаны процедуры добавления и просмотра списка.

Добавлено через 48 секунд
Вам осталось разобраться в тех проблемах которые Я для Вас обозначил и переделать свои процедуры и всё.
1
diliana
93 / 26 / 1
Регистрация: 19.05.2009
Сообщений: 138
19.05.2009, 23:44  [ТС] #3
Спасибо lexus_ilia
Цитата Сообщение от lexus_ilia Посмотреть сообщение
Посмотрел Ваши процедуры, по-идее Ваша программа совершенно не должна работать (Вы меня извините).
Как ни странно почему-то работала
Но я все равно с вами согласна, и переделала код
Но самая главная проблема в том, что я не знаю как удалить элемент из одного списка в другой.
Помогите пожалуста, покажите как это сделать.

Вот переделанный код
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
program Qu_Laba_List;
 
Type
{обьявление списка}
  plist = ^tl;
  tl = record
  next : plist;
  data: integer;
  end;
 
Var
  Head,t,cur: plist;
  x: integer;
  key: char;
 
 
{Просмотр списка1}
procedure ScanList(var t,Head: plist);
begin
  writeln ('Prosmotr spiska');
  writeln;
  t := Head;
  while t <> nil do begin
    write(t^.Data, ' ');
    t := t^.Next;
  end;
writeln;
writeln;
end;
 
{добавление элемента в список1}
procedure AddList(var t,cur,Head: plist);
begin
  Write ('Dobavit element: ');
  Readln (x);
  New(t);
  t^.Data := x;
  t^.Next := nil;
  if Head = nil then Head := t
   else cur^.next := t;
  cur := t;
  Writeln ('Dobavlen: ',t^.Data);
  Writeln;
end;
 
{Просмотр списка2}
procedure ScanList2;
begin
end;
{добавление элемента в список2}
procedure AddList2;
begin
end;
 
{удаление элемента из списка1 в список2}
procedure DelList(var t,cur,Head: plist);
begin
 if Cur <> nil then begin
 if Cur = Head then begin
 Head := Head^.Next;
 Writeln ('Udalen ',Cur^.data);
 dispose(Cur);
 Cur := Head;
 end else  begin
 t := Head;
 while t^.Next <> Cur do
  t := t^.Next;
  t^.Next := Cur^.Next;
  Writeln ('Udalen ',Cur^.data);
  dispose(Cur);
  Cur := t;
   end;
 end;
end;
 
BEGIN
 Head:=nil;
 Repeat
 Writeln ('============================');
 Writeln ('PROGRAM List');
 Writeln ('============================');
 Writeln ('1: Dobavit element v spisok-1');
 Writeln ('2: Udalit element v spisok-2');
 Writeln ('3: Prosmotr spiska-1');
 Writeln ('4: Prosmotr spiska-2');
 Writeln ('0: Exit');
 Writeln ('============================');
 Readln (key);
 case key of
   '1': AddList(t,cur,Head);
   '2': DelList (t,cur,Head);
   '3': ScanList (t,Head);
   {'4': ScanList2;}
  end;
   until key ='0';
 END.
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
20.05.2009, 00:36 #4
Цитата Сообщение от diliana Посмотреть сообщение
Но самая главная проблема в том, что я не знаю как удалить элемент из одного списка в другой.
Вы не всё разобрали с процедурами, т.к. Ваша процедура просмотра не такая как я её себе представлял.
Давайте немного остановимся на процедуре просмотра списка(ScanList) :
1)В процедуру приходят два параметра (var t,Head: plist) t-это у нас список, а Head- начало этого списка.
1.1) Немного остановимся на описании наших списков:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
 
  Head,      {начало первого списка}
  t,           {Указатель на первом списке}
  cur: plist;{Указатель на втором списке}
{Позвольте спросить, а где указатель на начало второго списка ?
Значит делаем Вот так}
 
 
  HeadT,      {начало первого списка}
  HeadCur    {начало второго списка}
  t,             {Указатель на первом списке}
  cur: plist;  {Указатель на втором списке}
И всё это я писал для того чтобы Вы вызывали процедуру просмотра второго списка вот так:
Pascal
1
ScanList (cur,HeadCur);
А для просмотра первого списка вот так:
Pascal
1
ScanList (t,HeadT);
Пока всё, надеюсь Вы поняли свой недочёт.
1
diliana
93 / 26 / 1
Регистрация: 19.05.2009
Сообщений: 138
20.05.2009, 01:23  [ТС] #5
Цитата Сообщение от lexus_ilia Посмотреть сообщение
Вы не всё разобрали с процедурами
какой строгий учитель

Свой недочет поняла, код переделала
А как делать дальше?

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
{главная программа}
 
program Qu_Laba_List;
 
Type
{обьявление списка}
  plist = ^tl;
  tl = record
  next : plist;
  data: integer;
  end;
 
Var
  HeadT,t,ct: plist;
  HeadCur,cur: plist;
  x: integer;
  key: char;
 
 
{Просмотр списка1}
procedure ScanList(var t,HeadT: plist);
begin
  writeln ('Prosmotr spiska-1');
  writeln;
  t := HeadT;
  while t <> nil do begin
    write(t^.Data, ' ');
    t := t^.Next;
  end;
writeln;
writeln;
end;
 
 
{Просмотр списка2}
procedure ScanList2(var cur,HeadCur: plist);
begin
begin
  writeln ('Prosmotr spiska-2');
  writeln;
  cur := HeadCur;
  while t <> nil do begin
    write(cur^.Data, ' ');
    cur := cur^.Next;
  end;
  writeln;
  writeln;
 end;
end;
 
 
{добавление элемента в список1}
procedure AddList(var t,ct,HeadT: plist);
begin
  Write ('Dobavit element: ');
  Readln (x);
  New(t);
  t^.Data := x;
  t^.Next := nil;
  if HeadT = nil then HeadT := t
   else ct^.next := t;
  ct := t;
  Writeln ('Dobavlen: ',t^.Data);
  Writeln;
end;
 
{добавление элемента в список2}
procedure AddList2;
begin
end;
 
 
{удаление элемента из списка1 в список2}
procedure DelList(var t,ct,HeadT: plist);
begin
 if ct <> nil then begin
 if ct = HeadT then begin
 HeadT := HeadT^.Next;
 Writeln ('Udalen ',ct^.data);
 dispose(ct);
 ct := HeadT;
 end else  begin
 t := HeadT;
 while t^.Next <> Cur do
  t := t^.Next;
  t^.Next := ct^.Next;
  Writeln ('Udalen ',ct^.data);
  dispose(ct);
  ct := t;
   end;
 end;
end;
 
 
BEGIN
 HeadT:=nil;{создает список-1}
 HeadCur:=nil;{создает список-2}
 Repeat
 Writeln ('============================');
 Writeln ('PROGRAM List');
 Writeln ('============================');
 Writeln ('1: Dobavit element v spisok-1');
 Writeln ('2: Udalit element v spisok-2');
 Writeln ('3: Prosmotr spiska-1');
 Writeln ('4: Prosmotr spiska-2');
 Writeln ('0: Exit');
 Writeln ('============================');
 Readln (key);
 case key of
   '1': AddList(t,ct,HeadT);
   '2': DelList (t,ct,HeadT);
   '3': ScanList (t,HeadT);
   '4': ScanList2(cur,HeadCur);
  end;
   until key ='0';
 END.
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
20.05.2009, 02:45 #6
Откатимся назад, Вы Мой недочёт не поняли, Ваша процедура (Scanlist) должна была выглядить вот так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
procedure ScanList(var tmp ,HeadTmp: plist);
begin
begin
  writeln ('Prosmotr spiska');
  writeln;
  tmp := HeadTmp;
  while tmp <> nil do begin
    write(tmp^.Data, ' ');
    tmp := tmp^.Next;
  end;
  writeln;
  writeln;
 end;
end;
И для просмотра первого списка Вы Вызываете:
Pascal
1
ScanList (t,HeadT);
А для просмотра второго списка:
Pascal
1
ScanList(cur,HeadCur);
И убираете лишнюю процедуру ScanList2 (тем более что в этой проwедуре в строке с While есть ошибка, там стоит оператор t<>nil , а должен cur<>nil)
И ешё добавьте пожалуйсто в процедуру просмотра (Scanlist) проверку на отсутствие элементов и выводы соответствующего сообщения.

Дальше, Если Вы все мои замечания прИмите и переделаете код, то тогда остаются вопросы по заданию:
1) Пользователь вводит число которое нужно удалить или элементы удаляются по какому-либо правилу?
2)Удалённый элемент добавляется во второй список в конец списка?

З.Ы.

Не по теме:

Цитата Сообщение от diliana Посмотреть сообщение
какой строгий учител
Неет, я не такой, просто мне нравится общаться с людьми которые знают своё дело.И мне хотелось чтобы и Вы стали таким человеком.Мне не составило бы особого труда написать Вашу программу, но я смотрю Вы и сами неплохо разбираетесь и это похвально.

1
diliana
93 / 26 / 1
Регистрация: 19.05.2009
Сообщений: 138
20.05.2009, 04:07  [ТС] #7
Цитата Сообщение от lexus_ilia Посмотреть сообщение
я смотрю Вы и сами неплохо разбираетесь и это похвально.
спасибо, очень приятно, хоть мне и сложно дается этот язык, но стараюсь...
И еще я очень благодарна вам за помощь, потому что я действительно понимаю сейчас, что я делаю.
Кстати если не против может перейдем на ты

Цитата Сообщение от lexus_ilia Посмотреть сообщение
Откатимся назад, Вы Мой недочёт не поняли, Ваша процедура (Scanlist) должна была выглядить вот так:
все я исправила

Цитата Сообщение от lexus_ilia Посмотреть сообщение
Дальше, Если Вы все мои замечания прИмите и переделаете код, то тогда остаются вопросы по заданию:
1) Пользователь вводит число которое нужно удалить или элементы удаляются по какому-либо правилу?
2)Удалённый элемент добавляется во второй список в конец списка?
1) особых правил не указано в задании, а раз так, я просто сделала добавление в конец списка. В список-1 вводяться элементы, а потом удаляются в список-2.
2) то же самое в задании нет конкретики, так что делаем добавление в конец списка

исправленный бедняга-код

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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
program Qu_Laba_List;
 
Type
{обьявление списка}
  plist = ^tl;
  tl = record
  next : plist;
  data: integer;
  end;
 
Var
  HeadT,t,tc: plist;
  HeadCur,cur,cc: plist;
  x: integer;
  key: char;
 
 
{Просмотр списка1}
procedure ScanList(var tmp ,HeadTmp: plist);
begin
begin
  writeln ('Prosmotr spiska');
  writeln;
  if HeadTmp = nil then writeln ('Pustoy spisok')
  else begin
  tmp := HeadTmp;
  while tmp <> nil do begin
    write(tmp^.Data, ' ');
    tmp := tmp^.Next;
  end;
  writeln;
  writeln;
 end;
 writeln;
end;
end;
 
{добавление элемента в список1}
procedure AddList(var tmp,tcur,HeadTmp: plist);
begin
  Write ('Dobavit element: ');
  Readln (x);
  New(tmp);
  tmp^.Data := x;
  tmp^.Next := nil;
  if HeadTmp = nil then HeadTmp := tmp
   else tcur^.next := tmp;
  tcur := tmp;
  Writeln ('Dobavlen: ',t^.Data);
  Writeln;
end;
 
{добавление элемента в список2}
procedure AddList2;
begin
 end;
 
 
{удаление элемента из списка1 в список2}
procedure DelList(var t,ct,HeadT: plist);
begin
 if ct <> nil then begin
 if ct = HeadT then begin
 HeadT := HeadT^.Next;
 Writeln ('Udalen ',ct^.data);
 dispose(ct);
 ct := HeadT;
 end else  begin
 t := HeadT;
 while t^.Next <> Cur do
  t := t^.Next;
  t^.Next := ct^.Next;
  Writeln ('Udalen ',ct^.data);
  dispose(ct);
  ct := t;
   end;
 end;
end;
 
 
BEGIN
 HeadT:=nil;
 HeadCur:=nil;
 Repeat
 Writeln ('============================');
 Writeln ('PROGRAM List');
 Writeln ('============================');
 Writeln ('1: Dobavit element v spisok-1');
 Writeln ('2: Udalit element v spisok-2');
 Writeln ('3: Prosmotr spiska-1');
 Writeln ('4: Prosmotr spiska-2');
 Writeln ('0: Exit');
 Writeln ('============================');
 Readln (key);
 case key of
   '1': AddList(t,tc,HeadT);
   '2': DelList (t,tc,HeadT);
   '3': ScanList (t,HeadT);
   '4': ScanList(cur,HeadCur);
  end;
   until key ='0';
 END.
Добавлено через 30 минут 34 секунды
Ой ошибку нашла
Вот так правильнее

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
{Просмотр списка1}
procedure ScanList(var tmp ,HeadTmp: plist);
begin
begin
  writeln ('Prosmotr spiska');
  writeln;
  tmp := HeadTmp;
  if HeadTmp = nil then writeln ('Pustoy spisok')
  else begin
    while tmp <> nil do begin
     write(tmp^.Data, ' ');
     tmp := tmp^.Next;
  end;
  writeln;
  writeln;
 end;
 writeln;
end;
end;
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
20.05.2009, 05:02 #8
Сделал Ваше задание, рабочая программа:
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
program Qu_Laba_List;
uses
  crt;
Type
  plist = ^tl;
  tl = record
  next : plist;
  data: integer;
  end;
Var
  HeadT,t: plist;
  HeadCur,cur: plist;
  key: char;
  CurX:integer;
 
procedure ScanList(tmp ,HeadTmp: plist);
begin
  writeln ('Prosmotr spiska');
  writeln;
  if HeadTmp = nil then
    writeln ('Pustoy spisok')
  else
  begin
    tmp := HeadTmp;
    while tmp <> nil do
    begin
      write(tmp^.Data, ' ');
      tmp := tmp^.Next
    end;
    writeln;
    writeln
  end;
  writeln;
  readkey
end;
 
procedure AddList(var tmp,HeadTmp: plist;p:boolean);
var
  tmp1:plist;
  x: integer;
begin
  if p then
  begin
    Write ('Dobavit element: ');
    Readln (x)
  end
  else
    Write('V spisok2 dobavlen element ' , CurX, ' YdaleNNbli uz pervogo spiska');
  New(tmp1);
  if p then
    tmp1^.Data := x
  else
    tmp1^.Data:=CurX;
  tmp1^.Next := nil;
  if HeadTmp = nil then
  begin
    HeadTmp := tmp1;
    tmp:=HeadTmp
  end
  else
    tmp^.next := tmp1;
  tmp := tmp1;
  if p then
    Writeln ('Dobavlen: ',tmp^.Data);
  Writeln;
  readkey
end;
 
 
procedure DelList(var t1,t2,Headt1,Headt2: plist);
var
  tmp:plist;
begin
  if Headt1 = nil then
  begin
    Writeln('cnicok nycT');
    readkey ;
    exit
  end
  else
    if t1 = HeadT then
    begin
      HeadT := HeadT^.Next;
      Writeln ('Udalen ',t1^.data);
      CurX:=t1^.data;
      dispose(t1);
      t1 := HeadT
    end
    else
    begin
      tmp := t1;
      t1:=HeadT;
      while t1^.Next <> tmp do
        t1:= t1^.Next;
      t1^.next:=tmp^.next;
      CurX:=tmp^.data;
      Writeln ('Udalen ',tmp^.data);
      dispose(tmp)
    end;
  AddList(cur,HeadCur,false);
end;
 
 
Begin
 HeadT:=nil;
 HeadCur:=nil;
 t:=nil;
 cur:=nil;
 CurX:=0;
 Repeat
   clrscr;
   Writeln ('============================');
   Writeln ('PROGRAM List');
   Writeln ('============================');
   Writeln ('1: Dobavit element v spisok-1');
   Writeln ('2: Udalit element v spisok-2');
   Writeln ('3: Prosmotr spiska-1');
   Writeln ('4: Prosmotr spiska-2');
   Writeln ('0: Exit');
   Writeln ('============================');
   key:=Readkey;
   clrscr;
   case key of
       '1': AddList(t,HeadT,true);
       '2': DelList(t,cur,HeadT,HeadCur);
       '3': ScanList(t,HeadT);
       '4': ScanList(cur,HeadCur);
   end;
 until key ='0';
End.
Хотелось бы обратить Ваше внимание на изменения:
1)Описание процедуры ScanList
2)Изменения в разделе var
3)Добавление библиотеки crt и на её использование.
4)Ещё на то, как имея одну процедуру добавления данных в список, можно её использовать для добавления информации сразу в два списка.
1
diliana
93 / 26 / 1
Регистрация: 19.05.2009
Сообщений: 138
20.05.2009, 10:26  [ТС] #9
lexus_ilia, большое спасибо, так классно получилась!!!!
Вы молодчина! Я хорошенько изучу ваш код.
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
20.05.2009, 13:25 #10
Спасибо. Изучайте, а лучше разберитесь и напишите свой, так будет лучше.
0
diliana
93 / 26 / 1
Регистрация: 19.05.2009
Сообщений: 138
20.05.2009, 14:44  [ТС] #11
Цитата Сообщение от lexus_ilia Посмотреть сообщение
Просто Вы немного не понимаете понятия:
1)Глобальные переменные.
2)Не осведомлены про описания процедур (что там можно написать вот так:Procedure name(var a: *** ); и какой будет при этом результат
Это Ваши основные проблемы, глядя на процедуры ,не считая того что Вы всегда используете локальные переменные, у Вас вполне правильно написаны процедуры добавления и просмотра списка.
Привет lexus_ilia

я плохо понимаю как использовать глобальные и локальные переменные - скажите пожалуста - где можно почитать об этом в доступном изложении, чтобы ясно было и еще лучше с примерами?
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
20.05.2009, 23:31 #12
Цитата Сообщение от diliana Посмотреть сообщение
скажите
Вроде на "ты" перешли.
Я сам попробую объяснить.
Начнём с понятия глобальные переменные.
Это те переменные которые описываются в разделе var:
Pascal
1
2
var
  i:integer; {переменная i объявлена в начале программы, она является глобальной}
Посмотрим более интересный пример локальных переменных:
Приведу кусочек кода с пояснениями:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Program xa;
var
  i:integer;
Procedure Sum(i:integer);
var
  a:integer;
begin
  a:=1;
  a:=a+i;
  i:=a;
  Writeln('i (v procedur''e)= ',i)
end;
 
begin
  i:=1;
  Sum(i);
  Writeln('i (v ocnovnou programme)= ' ,i);
  readln
end.
В данном примере переменная i- объявленная в разделе var является глобальной.
Переменная i-описанная в процедуре является локальной, такой же как и переменная a описанная в той же процедуре.
Теперь посмотрим работу программы.

Перед началом осмотра сделаем подготовку.Нажмите ctrl+F5 потом Shift+(стрелочка_вверх) этим самым Мы уменьшаем размер нашей рабочей области, дальше жмём Enter (принимаем изменения размеров).Теперь напечатайте всю программу и Выделите переменную i и нажмите правую клавишу, и выберите из списка пункт "Add Watch...", сделайте так же для переменной a.

Для проверки работы программы мы будем использовать клавишу F7 (пошаговое выполнение программы). Нажимаем F7 строка выполнения находится на первой строке (begin) жмём ещё раз строка переместилась (переменная i в Watches имеет значение 0). Нажимаем, теперь переменной i присвоилось значение "1". Идём дальше, переходим в процедуру, переменной а присвоили "1", потом "2", потом переменной i присвоили "a" (т.е. "2"). Все эти изменения видны в разделе Watches. Вывели переменную i (здесь она является локальной и имеет значение "2"). Вышли из процедуры и вывели ещё раз i (здесь она глобальная и имеет значение 1, т.е. то значение которое мы ей присвоили в начале программы).
Подсказка:Для просмотра того что сейчас вывела программа нажмите сочетание клавиш Alt+F5


Из всего делаем выводы:
1)Глобальные переменные не теряются в ходе программы, даже если переменны с таким же именем описаны в процедуре (не считая одного случая, о нём дальше).

2)Локальные переменные, используемые в процедурах, не могут быть использованы в основной программе (если вы находились на строке вывода глобальной i, то могли заметить, что переменная a не имеет значения в данный момент (в тот момент когда мы вышли из процедуры).


Теперь поговорим про тот случай когда глобальные переменные теряют своё значение, а точнее сказать изменяют.
В нашей программе в разделе описания функции:
Pascal
1
Procedure Sum(i:integer);
напечатайте вот так:
Pascal
1
Procedure Sum(var i:integer); {если нужно несколько переменных можно писать так sum(var i,a,b:integer;var p:boolean); }
А теперь пройдитесь по программе и посмотрите что происходит при выходе из процедуры.Наша переменная i (глобальная) изменила своё значение, т.к. в процедуре было написано var i.

Надеюсь изложил понятно и доступно, мог что-то упустить, но вроде по всему основному прошёлся.
1
diliana
93 / 26 / 1
Регистрация: 19.05.2009
Сообщений: 138
21.05.2009, 01:34  [ТС] #13
Цитата Сообщение от lexus_ilia Посмотреть сообщение
Я сам попробую объяснить.
Спасибо тебе, что находишь время возиться со мной. Эта тема для меня очень важна.
Написал то просто, осталось только понять это!!!
Но постараюсь.

Первый вопрос

Цитата Сообщение от lexus_ilia Посмотреть сообщение
переменная i объявлена в начале программы, она является глобальной
Это понимаю, глобалные могут использоваться в любом месте программы.
Но почему советуют избегать их использование при написании программ?

Добавлено через 30 минут 22 секунды
lexus_ilia, у меня еще просьба помочь с этим же заданием. препод сказала чтоб я сделала процедуры сохранения списков в файл и загрузку из файла

вот что я сама сделала


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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
program Qu_Laba_List;
uses
  crt;
 
Type
  plist = ^tl;
  TL = record
  next : plist;
  data: integer;
  end;
  
 TypList = file of TL;{типизированный файл} 
 
Var
  HeadT,t: plist;
  HeadCur,cur: plist;
  key: char;
  CurX:integer;
 
{сохранение структуры во внешнем файле}
Procedure Save (var f: TypList; start: plist);
begin
  Writeln('Saving file');
  assign(f, 'c:\my.txt');
  reset(f);
  while start <> nil do write(f, start^.data); {Пишем в файл}
  start := start^.next;
  close(f);
end;
 
{загрузка структуры из внешнего файла}
Procedure Load (var f: TypList; start: plist);
var
   Rec: TLst;
   temp:list;
Begin
  Writeln ('Loading file');
  While start <> nil do  {free memory}
  temp:= start^.next;
  dispose (start);
  start:= temp;
  Reset (f);
  While not eof(f) do begin
  read (f, rec);
  end;
End;
 
 
Begin
 HeadT:=nil;
 HeadCur:=nil;
 t:=nil;
 cur:=nil;
 CurX:=0;
 Repeat
   clrscr;
   Writeln ('============================');
   Writeln ('PROGRAM List');
   Writeln ('============================');
   Writeln ('1: Dobavit element v spisok-1');
   Writeln ('2: Udalit element v spisok-2');
   Writeln ('3: Prosmotr spiska-1');
   Writeln ('4: Prosmotr spiska-2');
   Writeln ('5: Save');
   Writeln ('6: Load');
   Writeln ('0: Exit');
   Writeln ('============================');
   key:=Readkey;
   clrscr;
   case key of
       '1': AddList(t,HeadT,true);
       '2': DelList(t,cur,HeadT,HeadCur);
       '3': ScanList(t,HeadT);
       '4': ScanList(cur,HeadCur);
       '3': Save;
       '4': Load;      
       
   end;
 until key ='0';
End.
Добавлено через 20 минут 6 секунд
еще исправила, но все равно не идет

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
{сохранение структуры во внешнем файле}
Procedure Save (var f: TypList; start: plist);
begin
  Writeln('Saving file');
  assign(f, 'c:\my.txt');
  reset(f);
  while start <> nil do
  begin
  write(f, start^.data); {Пишем в файл}
  start := start^.next;
  end;
  close(f);
end;
 
 
 
{загрузка структуры из внешнего файла}
Procedure Load (var f: TypList; start: plist);
var
   Rec: TL;
   temp:plist;
Begin
  Writeln ('Loading file');
  While start <> nil do  {free memory}
  temp:= start^.next;
  dispose (start);
  start:= temp;
  Reset (f);
  While not eof(f) do begin
  read (f, rec);
  end;
End;
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
21.05.2009, 01:39 #14
Цитата Сообщение от diliana Посмотреть сообщение
Но почему советуют избегать их использование при написании программ?
Потому что Ты писала когда-нибудь код в 2000 строк ? Если да, то Ты бы не спрашивала. Т.к. ты ищешь где у тебя изменяется очередная глобальная переменная, которая очень важна и это ещё не все минусы, в некоторых языках переменные во время выполнения программы теряют своё значение, ещё минус в том, что в процедурах используемых программой глобальные переменные не должны использоваться, вот тебе простой пример:

Посмотрим на твою процедуру сохранения списка в файл:
Pascal
1
Procedure Save (var f: TypList; start: plist);
Нет ли у тебя ощущения неполноты описания ? У меня есть, не хватает имени файла, я бы написал вот так:
Pascal
1
Procedure Save (start: plist;var f: TypList;namefile:string);
Это только один из плюсов процедур (а как и следствие локальных переменных).
Я не говорю уже про память, т.к. если мы используем динамику и если переменная глобальная то памяти приходится держать её внутри, а если мы работает больше с локальными переменными, то процедура выполнилась и память освободилась. Но без глобальных переменных всё-таки не уйдёшь.
Так что глобальные переменные конечно хорошо, но всё-же.

Добавлено через 4 минуты 12 секунд
Посмотрел только на описание файла и вздрогнул:
Pascal
1
2
3
4
5
6
7
8
T
ype
  TL = record
  next : plist;
  data: integer;
  end;
  
 TypList = file of TL;{типизированный файл}
Как ты себе представляешь такой типизировнанный файл ?
Хочешь сделать то что тебе надо, так и напиши
Pascal
1
  TypList = file of integer;
А вот про работу с типизированными файлами я объяснять не буду, там всё просто.
0
diliana
93 / 26 / 1
Регистрация: 19.05.2009
Сообщений: 138
21.05.2009, 02:06  [ТС] #15
Цитата Сообщение от lexus_ilia Посмотреть сообщение
Посмотрел только на описание файла и вздрогнул:
Как ты себе представляешь такой типизировнанный файл ?
Хочешь сделать то что тебе надо, так и напиши

*
* TypList = file of integer;

А вот про работу с типизированными файлами я объяснять не буду, там всё просто.
Большое спасибо lexus_ilia, такой ты хороший, но мне на сегодня хватит, я так устала, вчера до 4 утра сидела с этим заданием( и с тобой переписывалась), спала всего 3 часа, потом целый день занималась, так спать хочу просто еле на ногах держусь.

про типиз_файлы я хорошо знаю, не совсем дурочка , просто устала очень.
спасибо тебе за внимание.


Цитата Сообщение от lexus_ilia Посмотреть сообщение
Хочешь сделать то что тебе надо, так и напиши
Задание то же самое про те же списки А и Б, просто надо добавить к нашему коду еще процедуры процедуры сохранения этих списков в файл и загрузку их из файла.

до завтра....
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
21.05.2009, 02:07 #16
Цитата Сообщение от diliana Посмотреть сообщение
Цитата Сообщение от lexus_ilia Посмотреть сообщение
Хочешь сделать то что тебе надо, так и напиши
Это был не упрёк, а продолжение моих мыслей.
0
diliana
93 / 26 / 1
Регистрация: 19.05.2009
Сообщений: 138
21.05.2009, 11:32  [ТС] #17
lexus_ilia, привет

Вот переделала, посмотри пожалуста. Какие здесь ошибки?
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
program Qu_Laba_List;
uses  crt;
Type
  plist = ^tl;
  tl = record
  next : plist;
  data: integer;
  end;
TypList = file of integer;{типизированный файл}
 
  Var
  HeadA,curA: plist;
  HeadB,curB: plist;
  key: char;
  CurX:integer;
  f: TypList;
 
procedure ScanList(curTmp ,HeadTmp: plist);
begin
  writeln ('Prosmotr spiska');
  writeln;
  if HeadTmp = nil then
    writeln ('Pustoy spisok')
  else
  begin
    curTmp := HeadTmp;
    while curTmp <> nil do
    begin
      write(curTmp^.Data, ' ');
      curTmp := curTmp^.Next
    end;
    writeln;
    writeln
  end;
  writeln;
  readkey
end;
 
procedure AddList(var curTmp,HeadTmp: plist;p:boolean);
var
  temp:plist;
  x: integer;
begin
  if p then
  begin
    Write ('Dobavit element: ');
    Readln (x)
  end
  else
    Write('V spisok2 dobavlen element ' , CurX, ' YdaleNNbli uz pervogo spiska');
  New(temp);
  if p then temp^.Data := x
   else  temp^.Data:=CurX;
  temp^.Next := nil;
  if HeadTmp = nil then
  begin
    HeadTmp := temp;
    curTmp:=HeadTmp
  end
  else  curTmp^.next := temp;
  curTmp := temp;
  if p then Writeln ('Dobavlen: ',curTmp^.Data);
  Writeln;
  readkey
end;
 
 
procedure DelList(var t1,t2,Headt1,Headt2: plist);
var
  temp:plist;
begin
  if Headt1 = nil then
  begin
    Writeln('cnicok nycT');
    readkey ;
    exit
  end
  else
    if t1 = HeadA then
    begin
      HeadA := HeadA^.Next;
      Writeln ('Udalen ',t1^.data);
      CurX:=t1^.data;
      dispose(t1);
      t1 := HeadA
    end
    else
    begin
      temp := t1;
      t1:=HeadA;
      while t1^.Next <> temp do
        t1:= t1^.Next;
      t1^.next:=temp^.next;
      CurX:=temp^.data;
      Writeln ('Udalen ',temp^.data);
      dispose(temp)
    end;
  AddList(curB,HeadB,false);
end;
 
{сохранение структуры во внешнем файле}
Procedure Save (start: plist; var f: TypList; namefile:string);
begin
  Writeln('Saving file');
  assign(f, 'c:\my.txt');
  reset(f);
  while start <> nil do
  begin
  write(f, start^.data); {Пишем в файл}
  start := start^.next;
  end;
  close(f);
end;
 
{загрузка структуры из внешнего файла}
Procedure Load (var f: TypList; start: plist);
var
   temp:plist;
Begin
  Writeln ('Loading file');
  While start <> nil do  {free memory}
  temp:= start^.next;
  dispose (start);
  start:= temp;
  Reset (f);
  While not eof(f) do begin
  read (f, start^.data);
  end;
End;
 
Begin
 HeadA:=nil; curA:=nil;{список-1}
 HeadB:=nil; curB:=nil;{список-2}
 CurX:=0;
 Repeat
   clrscr;
   Writeln ('============================');
   Writeln ('PROGRAM List');
   Writeln ('============================');
   Writeln ('1: Dobavit element v spisok-1');
   Writeln ('2: Udalit element v spisok-2');
   Writeln ('3: Prosmotr spiska-1');
   Writeln ('4: Prosmotr spiska-2');
   Writeln ('5: Save');
   Writeln ('6: Load');
   Writeln ('0: Exit');
   Writeln ('============================');
   Readln (key);
   key:=Readkey;
   clrscr;
   case key of
       '1': AddList(curA,HeadA,true);
       '2': DelList(curA,curB,HeadA,HeadB);
       '3': ScanList(curA,HeadA);
       '4': ScanList(curB,HeadB);
       '3': Save;
       '4': Load;
 
   end;
 until key ='0';
End.
0
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
21.05.2009, 12:37 #18
Ошибки есть, вечером распишу про них.
0
diliana
93 / 26 / 1
Регистрация: 19.05.2009
Сообщений: 138
21.05.2009, 20:28  [ТС] #19
Цитата Сообщение от lexus_ilia Посмотреть сообщение
Ошибки есть, вечером распишу про них.
OK

Я зря время не теряла и вот пока я раскажу что я изучила

Итак я разобралась:

Переменные, описанные в основной программе, называются глобальными.
Переменные, описанные в подпрограмме называются локальными.
Использовать глобальным переменные внутри процедуры нежелательно потому что они могут там измениться и это приведет к ошибке! И еще они лишнюю память занимают.

Это понятно.

Теперь разбираем - что такое параметр? Это переменные.

формальные параметры - это переменные которые используются при записи текста подпрограммы в разделе описаний
фактические - это переменные которые используются при ее вызове.

Теперь я поняла что ты мне обьяснял в посте№4 и 6

Pascal
1
2
3
4
5
6
7
8
9
10
11
PROGRAM list;
Var
t, HeadT: plist; - это глобальные перем
 
procedure ScanList(var tmp ,HeadTmp: plist); - это формальные параметры (они же локальные переменные)
 
BEGIN
 
ScanList (t,HeadT); - фактические параметры (они же глобальные переменные)
 
END.

Итак В общем случае формальные параметры в заголовке процедур и функций записываются в виде:

Pascal
1
имя процедуры (var имя параметра: имя типа)
Вызов процедуры производится оператором, имеющим следующий формат:

Pascal
1
имя  процедуры (список фактических параметров);
Список фактических параметров - это их перечисление через запятую.
При вызове фактические параметры как бы подставляются вместо формальных, стоящих на тех же местах в заголовке.

При вызове процедур и функций необходимо соблюдать правила:

1. количество фактических параметров должно совпадать с количеством формальных;
2. соответствующие фактические и формальные параметры должны совпадать по порядку следования и по типу.

Вот это стало понятно.

Теперь мне надо разобраться что такое параметры-значения и параметр-переменные. Для чего нужны и как работают...

Добавлено через 7 минут 52 секунды

еще мне надо до конца разобраться почему в некоторых случаях пишут
procedure ScanList(var tmp ,HeadTmp: plist);

а в других без var
procedure ScanList(tmp ,HeadTmp: plist);

Добавлено через 5 часов 12 минут 2 секунды


Оказалось То что я написала выше, не совсем так (постепенно расставляется все по полочкам) - итак

Для передачи вход.данных в процедуру и возврата результата в основную программу используют механизм параметров.

Что такое параметр? Это специальная переменная.

Формальные параметры - используются при записи текста подпрограммы в разделе описаний.
Это специальные переменные, которые существуют только внутри процедуры, но в отличии от локальных переменных формальные параметры при входе в процедуру могут принимать некоторые начальные значения, устанавливаемые основной программой

Фактические параметры - это переменные которые используются при вызове процедуры.

таким образом в коде это будет выглядеть так

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PROGRAM list;
 Var
   t, HeadT: plist; //это глобальные переменные
 
Procedure ScanList (var tmp ,HeadTmp: plist); // это формальные параметры
 Var
  a: integer; //локальные переменные
 begin
 
 end;
 
BEGIN
 
 ScanList (t,HeadT); //фактические параметры
 
END.
Вот так правильно
1
lexus_ilia
3050 / 710 / 69
Регистрация: 24.09.2008
Сообщений: 1,531
21.05.2009, 23:44 #20
Впринципе Вы всё правильно поняли.
А про Вашу программу у Вас в процедуре Save есть переменная namefile:string
Так Вы бы перед вызовом даннной процедуры спрашивали пользователя имя файла в который надо сохранить список.А в общем неплохо (только я ни разу не запускал Вашу программу, кроме того случая когда дописал её Вам )

Добавлено через 47 секунд
Вот каждый бы человек так старательно изучал материал и разбирался в нём.
0
21.05.2009, 23:44
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2009, 23:44

Динамические списки
Помогите, пожалуйста. Мне только эта прога и CRT остались (в другой теме). ...

Динамические списки
Здравствуйте. Подскажите пожалуйста как создать динамический список состоящий...

Процедура на динамические списки
Доброго времени суток,хочу попросить вас помочь мне в написании процедуры:...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru