Задание 11 Урок 15
Primary tabs
Задание 11 Урок 15
Напишите функцию, которая определяет являются ли значения переданного массива целых чисел уникальными относительно друг друга, если среди есть неуникальные элементы, то удалите их, сдвинув значения влево, заполняя оставшиеся справа ячейки нулями.
Протестируйте работу функции на массиве из 7 случайных элементов из диапазона от 1 до 15-ти.
Например для:|1|-3|5|-3|9|5|8|
получим:|1|9|8|0|0|0|0|
type arr = array[0..6] of integer;
var i,min,max : integer;
first_array,second_array: arr;
function check(f_array,s_array: arr): arr;
var c,z,counter_number,first_number,second_number,number_zero : integer;
label m1,m2;
function shift(x: integer;var n_z: integer): arr;{функция смещения}
var g : integer;
begin
for g := low(f_array) to high(s_array) do
begin
s_array[g] := f_array[g];
if g = x then
break;{остановка итераций для сдвига}
end;
for g := (x) to (high(s_array)-1) do
begin
s_array[g] := f_array[g+1];
end;
result := s_array;
for g := low(f_array) to high(f_array) do
f_array[g] := s_array[g];
n_z +=1;{счетчик 0-ей, чтоб сократить second_number и не считать 0-ые
значения при проверке повторов}
end;
begin
number_zero := 0;
counter_number := 1;
m1:
for c := low(f_array) to high(f_array) do
begin
first_number := f_array[c];
for z :=(low(f_array)+counter_number) to (high(f_array)-number_zero) do
begin
second_number := f_array[z];
if first_number = second_number then// если есть повторения
begin
shift(c,number_zero);
counter_number := 1;
goto m1;
end
else
if ((c = high(f_array)-1) and (z = high(f_array))) then{если нет
повторов}
begin
goto m2;
end;
end;
counter_number += 1;{счетчик смещения первого числа от второго постоянно на
"+" 1, воизбежании искуственных совпадений, когда сравнивается одно и то
же значение}
end;
result := s_array;
begin
for z := low(f_array) to high(f_array) do
write('|', result[z],'|');
exit;
end;
m2:
write('Массив уникален!');
end;
begin
min := 1;
max := 15;
randomize;
for i := low(first_array) to high(second_array) do// ниц.массивов
begin
first_array[i] := min + random(max - min + 1);
second_array[i] := 0;// используется при смещении для 0-ых значений
end;
for i := low(first_array) to high(second_array) do
write('|',first_array[i],'|');
writeln();
check(first_array,second_array);
readln();
end.- Log in to post comments
- 5758 reads
vedro-compota
Sun, 12/20/2020 - 16:56
Permalink
замечание
переписать сдвиг без использования второго массива
_____________
матфак вгу и остальная классика =)
Dobrii_kot
Sat, 01/02/2021 - 14:08
Permalink
Исправлено
type arr = array[1..7] of integer; var i,min,max,value_zero, value_shift : integer; value_string : string; first_array : arr; function uniqueness(f_array: arr; var value_z,value_sh: integer): string; var g,k,t: integer; begin t := (low(f_array)+1); for g := low(f_array) to (value_z-1) do begin for k := t to value_z do if f_array[g] = f_array[k] then begin result := 'Массив не уникален!'; value_z -= 1; value_sh := g; exit; end; t += 1; end; result := 'Массив уникален!'; end; function shift(value_s: integer; f_array: arr): arr; var g: integer; begin for g := value_s to (high(f_array)-1) do f_array[g] := f_array[g+1]; f_array[high(f_array)] := 0; result := f_array; end; begin value_shift := 0; value_string := 'Массив уникален!'; value_zero := high(first_array); min:= -5; max:= 12; randomize; for i := low(first_array) to high(first_array) do begin first_array[i] := min + random(max - min + 1); write('|', first_array[i], '|'); end; writeln(); repeat value_string := uniqueness(first_array,value_zero,value_shift); if value_string = 'Массив уникален!' then for i := low(first_array) to high(first_array) do write('|', first_array[i], '|') else first_array := shift(value_shift,first_array); until value_string = 'Массив уникален!'; readln(); end.консоль
vedro-compota
Sun, 01/03/2021 - 15:14
Permalink
замечание
1) value_z и value_sh не необходимы на входе функции uniqueness()
--есть предположение, что на входе достаточно одного массива.
2)
-- возвращайте из функции boolean
_____________
матфак вгу и остальная классика =)
Dobrii_kot
Thu, 01/07/2021 - 15:50
Permalink
Исправлено
type arr = array [1..7] of integer; var first_array : arr; function init_array(f_array: arr): arr; var i,min,max : integer; begin min := 1; max := 15; randomize; for i := low(f_array) to high(f_array) do f_array[i] := min + random(max - min + 1); result := f_array; end; procedure print(f_array: arr); var z : integer; begin for z := low(f_array) to high(f_array) do write('|', f_array[z], '|'); end; function uniqueness(f_array: arr): arr; var g,k,t: integer; function shift(): arr; var m: integer; begin for m := g to (high(f_array)-1) do f_array[m] := f_array[m+1]; f_array[high(f_array)] := 0; result := f_array; end; begin k := (low(f_array)+1); t := high(f_array); for g := low(f_array) to (high(f_array)-1) do begin repeat if f_array[g] = f_array[k] then begin f_array := shift(); t -= 1; end else k += 1; until k > t; k := g + 2; end; result := f_array; end; begin first_array := init_array(first_array); print(first_array); writeln(); first_array := uniqueness(first_array); print(first_array); readln(); end.vedro-compota
Sun, 01/17/2021 - 14:34
Permalink
замечание
-- вынести реализацию в глобальное пространство (без вложенных функций)
_____________
матфак вгу и остальная классика =)
vedro-compota
Sun, 01/17/2021 - 14:34
Permalink
проверить логику решения
проверить логику решения по примеру:
_____________
матфак вгу и остальная классика =)
Dobrii_kot
Sat, 01/23/2021 - 12:33
Permalink
Исправлено
type arr = array [1..7] of integer; var first_array : arr; function init_array(f_array: arr): arr; var i,min,max : integer; begin min := 1; max := 15; randomize; for i := low(f_array) to high(f_array) do f_array[i] := min + random(max - min + 1); result := f_array; end; procedure print(f_array: arr); var z : integer; begin for z := low(f_array) to high(f_array) do write('|', f_array[z], '|'); end; function shift(shift_array :arr; the_value_to_be_removed: integer): arr; var m: integer; begin for m := the_value_to_be_removed to (high(shift_array)-1) do shift_array[m] := shift_array[m+1]; shift_array[high(shift_array)] := 0; result := shift_array; end; function search_for_identical_values(f_arr:arr;y:integer;var l:integer):arr; var e : integer; begin e := low(f_arr); repeat if f_arr[e] = y then begin f_arr := shift(f_arr,e); l -= 1; end else e += 1; until e > l; result := f_arr; end; function uniqueness(f_array: arr): arr; var g,k,t: integer; begin k := (low(f_array)+1); t := high(f_array); for g := low(f_array) to (t-1) do begin repeat if f_array[g] = f_array[k] then begin f_array := search_for_identical_values(f_array,f_array[k],t); k := (g + 1); end else k += 1; until k > t; k := g + 2; end; result := f_array; end; begin first_array := init_array(first_array); print(first_array); writeln(); first_array := uniqueness(first_array); print(first_array); readln(); end.консоль
vedro-compota
Sat, 01/23/2021 - 16:17
Permalink
Просьба добавить
Просьба добавить альтернативное решение:
_____________
матфак вгу и остальная классика =)