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

В процедуре вставки элемента возможно переполнение массива

22.05.2020, 12:18. Показов 566. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
В процедуре вставки элемента возможно переполнение массива. Нужно исправить. Пожалуйста

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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
unit Program2;
interface
const errOk=0;
errBufferSize=-1;
errInvalidIndex=-2;
function SearchInArray(x:integer; a:array of integer):integer;
function MinInArray(a:array of integer):integer;
function MaxInArray(a:array of integer):integer;
procedure PasteInArray(x,i:integer; var a:array of integer);
procedure DeleteFromArray(i:integer; var a:array of integer);
procedure BubbleSortUpArray(var a:array of integer);
function MergeSort(var a:array of Integer;
var buf:array of Integer; FirstItem, LastItem:Integer):Integer;
procedure QuickSort(var a:array of Integer;
aFirst, aLast:Integer);
procedure GenArray(var a:array of Integer;
aFirst, aLast, AValue :Integer);
procedure PrintArray(const a:array of Integer);
implementation
const MSCutOff=16;
function SearchInArray(x:integer; a:array of integer):integer;
var i:integer;
f:boolean;
begin
f:=true;
result:=-1;
for i:=0 to high(a) do
if (a[i]=x) and f then
begin
result:=i;
f:=false;
end;
end;
function MinInArray(a:array of integer):integer;
var i, min:integer;
begin
min:=a[high(a)];
for i:=0 to high(a)-1 do
if a[i]<min then min:=a[i];
result:=min;
end;
function MaxInArray(a:array of integer):integer;
var i, max:integer;
begin
max:=a[high(a)];
for i:=0 to high(a)-1 do
if a[i]>max then max:=a[i];
result:=max;
end;
procedure PasteInArray(x,i:integer; var a:array of integer);
var j:integer;
Begin
for j:=high(a) downto i do
a[j+1]:=a[j];
a[j]:=x;
end;
procedure DeleteFromArray(i:integer; var a:array of integer);
var j:integer;
begin
for j:=high(a) downto i+1 do
a[j-1]:=a[j];
a[high(a)]:=0;
end;
procedure BubbleSortUpArray(var a:array of integer);
var i,buf:integer;
f:boolean;
begin
f:=true;
while f do
begin
f:=false;
for i:=0 to high(a)-1 do
if a[i]>a[i+1] then
begin
buf:=a[i];
a[i]:=a[i+1];
a[i+1]:=buf;
f:=true;
end;
end;
end;
function MergeSort(var a:array of Integer;
var buf:array of Integer;
FirstItem,
LastItem:Integer
):Integer;
procedure InsSort(aFirst, aLast:Integer);
var i,j,el:integer;
begin
for i:=aFirst+1 to aLast do begin
el:=a[i];
j:=i-1;
while (j>-1)and(a[j]>el) do begin
a[j+1]:=a[j];
j:=j-1;
end;
a[j+1]:=el;
end;
end;
procedure MSort(aFirst, aLast:Integer);
var mid, i, j, toInx, FirstCount:Integer;
begin
mid:=(aFirst + aLast) div 2;
if (aFirst < mid) then
if (mid-aFirst)<=MSCutOff then InsSort(aFirst, mid)
else MSort(aFirst, mid);
if ((mid+1) < aLast) then
if (aLast-succ(mid))<=MSCutOff then InsSort(mid+1, aLast)
else MSort(succ(mid), aLast);
FirstCount:=(mid - aFirst) + 1;
Move(a[aFirst], buf[0], FirstCount*sizeof(Integer));
i:=0;
j:=mid + 1;
toInx:=aFirst;
while (i<FirstCount)and(j<=aLast) do begin
if buf[i]<=a[j] then begin
a[toInx]:=buf[i];
inc(i);
end
else begin
a[toInx]:=a[j];
inc(j);
end;
inc(toInx);
end;
if i < FirstCount then
Move(buf[i], a[toInx], (FirstCount-i)Integer);
end;
var tmp:Integer;
begin
if FirstItem>LastItem then begin
tmp:=FirstItem;
FirstItem:=LastItem;
LastItem:=tmp;
end;
if (FirstItem<0)or(LastItem>High(a)) then begin
Result:=errInvalidIndex;
Exit;
end;
if Length(buf)<(LastItem - FirstItem) div 2 then begin
Result:=errBufferSize;
Exit;
end;
MSort(FirstItem, LastItem);
Result:=errOk;
end;
procedure QuickSort(var a:array of Integer; aFirst,
aLast:Integer);
var l, r:Integer;
base:Integer;
procedure Swap(var a, b:Integer);
var temp:Integer;
begin
temp:=a;
a:=b;
b:=temp;
end;
begin
while aFirst<aLast do begin
if aLast-AFirst>=2 then begin
r:=(aFirst + aLast) div 2;
if a[aFirst] > a[r] then Swap(a[aFirst], a[r]);
if a[aFirst] > a[aLast] then Swap(a[aFirst], a[aLast]);
if a[r] > a[aLast] then Swap(a[r], a[aLast]);
base:=a[r];
end
else base:=a[aFirst];
l:=aFirst-1;
r:=aLast+1;
while True do begin
repeat dec(r) until a[r]<=base;
repeat inc(l) until a[l]>=base;
if l>=r then Break;
Swap(a[l], a[r]);
 
end;
if aFirst<r then QuickSort(a, aFirst, r);
aFirst:=r+1;
end;
end;
procedure GenArray(var a:array of Integer;
aFirst, aLast, AValue :Integer);
var i:Integer;
begin
Randomize;
for i:=aFirst to aLast do a[i]:=Random(AValue);
end;
procedure PrintArray(const a:array of Integer);
var i:Integer;
begin
for i:=0 to High(a) do write(a[i], ' ');
end;
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.05.2020, 12:18
Ответы с готовыми решениями:

Скажите, пожалуйста, как исправить исправить код в процедуре
задание такое :Дан одномерный массив. Переместить нулевые элементы массива в начало, сдвинув...

Windows 10 полетела,пожалуйста, возможно не исправить
Сидел в браузере/телеграме, ничего не предвещало беды. Спустя некоторое время, я заметил что винда...

В программе написать функции: вставки элемента, поиска максимального элемента, определения среднего арифметического элементов массива
В целочисленном массиве Х(N) после каждого четного числа вставить максимальный элемент массива....

Эффективные алгоритмы вставки и удаления элемента из массива
Необходимы два эти алгоритма. + Всем в карму

2
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7769 / 4598 / 2823
Регистрация: 22.11.2013
Сообщений: 13,077
Записей в блоге: 1
22.05.2020, 19:09 2
Если последний элемент должен потеряться:
Pascal
procedure PasteInArray(x, i: Integer; var a: array of Integer);
var j: Integer;
begin
  for j:=High(a)-1 downto i do
    a[j+1]:=a[j];
  a[i]:=x;
end;
Кроме того, i не проверяется на корректность значения, это тоже потенциальный источник ошибки.

Добавлено через 5 минут
Использовать Randomize внутри GenArray не очень хорошая идея.

Добавлено через 9 минут
Пробел лучше выводить до числа:
Pascal
194
  for i:=0 to High(a) do Write(' ',a[i]);
Это имеет существенное значение, если такой вывод подается на вход другой программе (через пайп или через файл).

Добавлено через 6 минут
Зачем такой странный поиск?
Pascal
24
25
26
27
28
29
30
31
32
33
34
function SearchInArray(x: Integer; a: array of Integer): Integer;
var i: Integer;
begin
  Result:=-1;
  for i:=0 to High(a) do
    if a[i]=x then
    begin
      Result:=i;
      Exit;
    end;
end;
Добавлено через 4 минуты
Минимум и максимум можно немного упростить:
Pascal
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
function MinInArray(a: array of Integer): Integer;
var i: Integer;
begin
  Result:=a[High(a)];
  for i:=High(a)-1 downto 0 do
    if Result>a[i] then Result:=a[i];
end;
 
function MaxInArray(a: array of Integer): Integer;
var i: Integer;
begin
  Result:=a[High(a)];
  for i:=High(a)-1 downto 0 do
    if Result<a[i] then Result:=a[i];
end;
Добавлено через 19 минут
В InsSort алгоритмическая ошибка: собирались сортировать фрагмент [aFirst, aLast], но j ходит до начала массива, а не до aFirst.

Добавлено через 4 минуты
Плюс, если сдвинуть j на единицу, будет выглядеть более естественно:
Pascal
90
91
92
93
94
95
96
97
98
99
100
  procedure InsSort(aFirst, aLast: Integer);
  var i, j, t: Integer;
  begin
    for i:=aFirst+1 to aLast do begin
      j:=i; t:=a[i];
      while (j>aFirst) and (a[j-1]>t) do begin
        a[j]:=a[j-1]; Dec(j);
      end;
      a[j]:=t;
    end;
  end;
Добавлено через 25 минут
DeleteFromArray сдержит алгоритмическую ошибку -- затирает последним элементом все от конца до i-го.
Смысла заполнять нулем последний элемент не вижу никакого -- вызывающий или сам уменьшит массив или уменьшит счетчик элементов массива.
Pascal
60
61
62
63
procedure DeleteFromArray(i: Integer; var a: array of Integer);
begin
  for i:=i to High(a)-1 do a[i]:=a[i+1];
end;
1
0 / 0 / 0
Регистрация: 13.04.2020
Сообщений: 24
25.05.2020, 10:33  [ТС] 3
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
{$IFDEF FPC}
{$MODE DELPHI}
{$ENDIF}
unit Program2;
interface
const errOk=0;
errBufferSize=-1;
errInvalidIndex=-2;
function SearchInArray(x:integer; a:array of integer):integer;
function MinInArray(a:array of integer):integer;
function MaxInArray(a:array of integer):integer;
function PasteInArray(x,i:integer; var a:array of integer; var count:integer):boolean;
function DeleteFromArray(i:integer; var a:array of integer; var count:integer):boolean;
procedure BubbleSortUpArray(var a:array of integer);
function MergeSort(var a:array of integer;
var buf:array of integer; FirstItem, LastItem:integer):integer;
procedure QuickSort(var a:array of integer;
aFirst, aLast:integer);
procedure GenArray(var a:array of integer;
aFirst, aLast, AValue :integer);
procedure PrintArray(const a:array of integer);
implementation
const MSCutOff=16;
function SearchInArray(x:integer; a:array of integer):integer;
var i:integer;
f:boolean;
begin
f:=true;
result:=-1;
for i:=0 to high(a) do
if (a[i]=x) and f then
begin
result:=i;
f:=false;
end;
end;
function MinInArray(a: array of integer): integer;
var i: integer;
begin
  Result:=a[High(a)];
  for i:=High(a)-1 downto 0 do
    if Result>a[i] then Result:=a[i];
end;
 
function MaxInArray(a: array of integer): integer;
var i: integer;
begin
  Result:=a[High(a)];
  for i:=High(a)-1 downto 0 do
    if Result<a[i] then Result:=a[i];
end;
function PasteInArray(x,i:integer; var a:array of integer; var count:integer):boolean;
var j:integer;
Begin
   if (i>=0)and(i<=count)then begin
for j:=count downto i do
a[j+1]:=a[j];
a[i]:=x;
result:=true;
count:=count+1;
end
   else result:=False;
end;
 
function DeleteFromArray(i:integer; var a:array of integer; var count:integer):boolean;
var j:integer;
begin
   if (i>=0)and(i<count)then begin
for j:=i to count-1 do
a[j]:=a[j+1];
result:=true;
count:=count-1;
end
   else result:=False;
end;
 
procedure BubbleSortUpArray(var a:array of integer);
var i,buf:integer;
f:boolean;
begin
f:=true;
while f do
begin
f:=false;
for i:=0 to high(a)-1 do
if a[i]>a[i+1] then
begin
buf:=a[i];
a[i]:=a[i+1];
a[i+1]:=buf;
f:=true;
end;
end;
end;
function MergeSort(var a:array of integer;
var buf:array of integer;
FirstItem,
LastItem:integer
):Integer;
procedure InsSort(aFirst, aLast: integer);
var i, j, t: integer;
begin
for i:=aFirst+1 to aLast do begin
j:=i; t:=a[i];
while (j>aFirst) and (a[j-1]>t) do begin
a[j]:=a[j-1]; Dec(j);
end;
a[j]:=t;
end;
end;
procedure MSort(aFirst, aLast:Integer);
var mid, i, j, toInx, FirstCount:Integer;
begin
 mid:=(aFirst + aLast) div 2;
 if (aFirst < mid) then
 if (mid-aFirst)<=MSCutOff then InsSort(aFirst, mid)
 else MSort(aFirst, mid);
 if ((mid+1) < aLast) then
 if (aLast-succ(mid))<=MSCutOff then InsSort(mid+1, aLast)
 else MSort(succ(mid), aLast);
 FirstCount:=(mid - aFirst) + 1;
 Move(a[aFirst], buf[0], FirstCount*sizeof(Integer));
 i:=0;
 j:=mid + 1;
 toInx:=aFirst;
 while (i<FirstCount)and(j<=aLast) do begin
 if buf[i]<=a[j] then begin
 a[toInx]:=buf[i];
 inc(i);
 end
 else begin
 a[toInx]:=a[j];
 inc(j);
 end;
 inc(toInx);
 end;
 if i < FirstCount then
 Move(buf[i], a[toInx], (FirstCount-i)*sizeof(Integer));
end;
var tmp:Integer;
begin
if FirstItem>LastItem then begin
 tmp:=FirstItem;
 FirstItem:=LastItem;
 LastItem:=tmp;
end;
if (FirstItem<0)or(LastItem>High(a)) then begin
 Result:=errInvalidIndex;
 Exit;
end;
if Length(buf)<(LastItem - FirstItem) div 2 then begin
 Result:=errBufferSize;
 Exit;
end;
 MSort(FirstItem, LastItem);
 Result:=errOk;
end;
procedure QuickSort(var a:array of Integer; aFirst,
aLast:Integer);
var l, r:Integer;
base:Integer;
procedure Swap(var a, b:Integer);
var temp:Integer;
begin
temp:=a;
a:=b;
b:=temp;
end;
begin
while aFirst<aLast do begin
if aLast-AFirst>=2 then begin
r:=(aFirst + aLast) div 2;
if a[aFirst] > a[r] then Swap(a[aFirst], a[r]);
if a[aFirst] > a[aLast] then Swap(a[aFirst], a[aLast]);
if a[r] > a[aLast] then Swap(a[r], a[aLast]);
base:=a[r];
end
else base:=a[aFirst];
l:=aFirst-1;
r:=aLast+1;
while True do begin
repeat dec(r) until a[r]<=base;
repeat inc(l) until a[l]>=base;
if l>=r then Break;
Swap(a[l], a[r]);
 
end;
if aFirst<r then QuickSort(a, aFirst, r);
aFirst:=r+1;
end;
end;
procedure GenArray(var a:array of Integer;
aFirst, aLast, AValue :Integer);
var i:Integer;
begin
Randomize;
for i:=aFirst to aLast do a[i]:=Random(AValue);
end;
procedure PrintArray(const a:array of Integer);
var i:Integer;
begin
for i:=0 to High(a) do write(a[i], ' ');
end;
end.
0
25.05.2020, 10:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.05.2020, 10:33
Помогаю со студенческими работами здесь

Нужно исправить ошибку:( Пожалуйста
Вот кусок кода с картинкой в нём всё устраивает...

Пожалуйста, нужно исправить программу
Всем привет, есть программа, но в ней немного непонятные ошибки, просто голову изломал. Программу я...

Нужно исправить ошибку.Пожалуйста)
l = sum= conlusion= print(&quot;Введите размер матрицы: &quot;) n = int(input()) print(&quot;Введите...

Получение значения элемента массива с помощью ассемблерной вставки
У меня есть функция int kontr(char* str1, int len) { __asm{ lea esi, ; xor ebx, ebx;...

Пожалуйста, нужно исправить ошибку в коде
Моё задание &quot;Даны две строки. Пусть n1 - число слов в первой строке, а n2 - во второй (n1&lt;n2)....

Ошибка в процедуре вставки в упорядоченный массив
void insert (int a,int &amp;n,int x) { int i=n; int j=n+1; while (a&gt;x) a=a; a=x; if (j!=0) ...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru