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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.11.2017, 03:35   #1
dastreba
Пользователь
 
Регистрация: 29.11.2017
Сообщений: 63
По умолчанию Удалить из массива минимальный элемент. - Pascal

Условие-
Заданный массив с n чисел, в котором все элементы разные. Удалить из массива
минимальный элемент. Удалить элемент массива означает: изъять этот
элемент из массива смещением всех элементов, следующие за ним, на одну
позицию влево, и присвоить последнему элементу массива значение 0.

Написал так-(сказали что не правильно)


Код:
const
nmax = 100;

var
A: array[1..nmax] of integer;
i, imin, n: byte;

begin
repeat
write('Введите к-во еле-в < ', nmax, ': ');
readln(n);
until n in [1..nmax];
for i := 1 to n do
begin
A[i] := random(10) - 5;
write(A[i]:4);
end;
imin := 1;
for i := 2 to n do
if A[i] < A[imin] then imin := i;
writeln;
writeln('Min = ', A[imin]);
dec(n);
 or i := imin to n do
A[i] := A[i + 1];
for i := 1 to n do
write(A[i]:4);
end.
Кто-то может отредактировать чтоб правильно было пж?

Последний раз редактировалось dastreba; 29.11.2017 в 03:45.
dastreba вне форума Ответить с цитированием
Старый 29.11.2017, 07:45   #2
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Не нужно использовать Random без предварительной инициализации генератора:

Код:
Randomize;
for i := 1 to n do
begin
  A[i] := random(10) - 5;
  write(A[i]);
end;
Кроме того, что делать, если в массиве несколько одинаковых минимальных элементов? Данная программа работает, но она удаляет только первый найденный.
А ответ дан прямо в задании: "Заданный массив с n чисел, в котором все элементы разные." Соответственно, рандом(10) тут уже не подходит, нужно как минимум брать n.

Ещё вот тут проще сделать цикл до n - 1 вместо декремента размера массива, а A[n] отдельно присваивать значение 0 (по заданию должно быть так - "присвоить последнему элементу массива значение 0"):

Код:
    dec(n);
    For i := imin to n do
      A[i] := A[i + 1];
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 29.11.2017 в 07:50.
Sciv вне форума Ответить с цитированием
Старый 29.11.2017, 07:57   #3
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Ну и вообще - можно использовать функции. Как-нибудь так:

Код:
const
nmax = 100;

type
  TArray = array [1..nmax] of integer;

var
  A: TArray;
  imin, n: integer;

procedure OutputArray(AArray: TArray; ADimension: integer);
var
  i_ArrayIndex: integer;
begin
  for i_ArrayIndex := 1 to ADimension do
    write(AArray[i_ArrayIndex]:4);
end;


function GetMin(AArray: TArray; ADimension: integer): integer;
var
  i_ArrayIndex: integer;
begin
  Result := 1;
  for i_ArrayIndex := 2 to ADimension do
    if AArray[i_ArrayIndex] < AArray[Result] then
      Result := i_ArrayIndex;
end;

function IsExists(AElement: integer; AArray: TArray; ADimension: integer): boolean;
var
  i_ArrayIndex: integer;
begin
  Result := false;
  for i_ArrayIndex := 1 to ADimension do
  begin
    Result := AArray[i_ArrayIndex] = AElement;
    if Result then
      break;
  end;
end;

function EnterDataInArray(var ADimension: integer): TArray;
var
  i_ArrayIndex: integer;
begin
  repeat
    write('Введите к-во еле-в < ', nmax, ': ');
    readln(ADimension);
  until ADimension in [1..nmax];
  randomize;
  for i_ArrayIndex := 1 to ADimension do
  begin
    Repeat
      Result[i_ArrayIndex] := random(nmax) - nmax;
    Until not IsExists(Result[i_ArrayIndex], Result, i_ArrayIndex - 1);
  end;
end;

procedure ShiftArray(ABeginPosition: integer; var AArray: TArray; ADimension: integer);
var
  i_ArrayIndex: integer;
begin
  for i_ArrayIndex := ABeginPosition to ADimension - 1 do
    AArray[i_ArrayIndex] := AArray[i_ArrayIndex + 1];
  AArray[ADimension] := 0;
end;

begin
  A := EnterDataInArray(n);
  OutputArray(A, n);
  imin := GetMin(A, n);
  writeln;
  writeln('Min = ', A[imin], ' on position ', imin);
  ShiftArray(imin, A, n);
  OutputArray(A, n);
  readln;
end.
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 29.11.2017, 08:49   #4
dastreba
Пользователь
 
Регистрация: 29.11.2017
Сообщений: 63
По умолчанию

Цитата:
Сообщение от dastreba Посмотреть сообщение
write(A[i]:4);
Цитата:
Сообщение от Sciv Посмотреть сообщение
Ну и вообще - можно использовать функции. Как-нибудь так:

Код:
const
nmax = 100;

type
  TArray = array [1..nmax] of integer;

var
  A: TArray;
  imin, n: integer;

procedure OutputArray(AArray: TArray; ADimension: integer);
var
  i_ArrayIndex: integer;
begin
  for i_ArrayIndex := 1 to ADimension do
    write(AArray[i_ArrayIndex]:4);
end;


function GetMin(AArray: TArray; ADimension: integer): integer;
var
  i_ArrayIndex: integer;
begin
  Result := 1;
  for i_ArrayIndex := 2 to ADimension do
    if AArray[i_ArrayIndex] < AArray[Result] then
      Result := i_ArrayIndex;
end;

function IsExists(AElement: integer; AArray: TArray; ADimension: integer): boolean;
var
  i_ArrayIndex: integer;
begin
  Result := false;
  for i_ArrayIndex := 1 to ADimension do
  begin
    Result := AArray[i_ArrayIndex] = AElement;
    if Result then
      break;
  end;
end;

function EnterDataInArray(var ADimension: integer): TArray;
var
  i_ArrayIndex: integer;
begin
  repeat
    write('Введите к-во еле-в < ', nmax, ': ');
    readln(ADimension);
  until ADimension in [1..nmax];
  randomize;
  for i_ArrayIndex := 1 to ADimension do
  begin
    Repeat
      Result[i_ArrayIndex] := random(nmax) - nmax;
    Until not IsExists(Result[i_ArrayIndex], Result, i_ArrayIndex - 1);
  end;
end;

procedure ShiftArray(ABeginPosition: integer; var AArray: TArray; ADimension: integer);
var
  i_ArrayIndex: integer;
begin
  for i_ArrayIndex := ABeginPosition to ADimension - 1 do
    AArray[i_ArrayIndex] := AArray[i_ArrayIndex + 1];
  AArray[ADimension] := 0;
end;

begin
  A := EnterDataInArray(n);
  OutputArray(A, n);
  imin := GetMin(A, n);
  writeln;
  writeln('Min = ', A[imin], ' on position ', imin);
  ShiftArray(imin, A, n);
  OutputArray(A, n);
  readln;
end.
а есть что-то проще пж?На уровне 1 курса.
Прост это слишком сложно понять,я такое еще не проходил
dastreba вне форума Ответить с цитированием
Старый 29.11.2017, 09:53   #5
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от dastreba Посмотреть сообщение
Код:
 or i := imin to n do
здесь, разумеется должен быть for


Цитата:
Сообщение от dastreba Посмотреть сообщение
присвоить последнему элементу массива значение 0
это Вы не делаете. (хотя, я не вижу смысла в этом присваивании)

randomize в начале не помешает, даже если у Вас Pascal ABC или Pascal ABC.NET (хотя там он и не нужен).

а в остальном всё работает: https://ideone.com/mHsGVQ

Код:
program ideone;
 
const
nmax = 100;
 
var
A: array[1..nmax] of integer;
i, imin, n: byte;
 
begin
repeat
  write('Введите к-во еле-в < ', nmax, ': ');
  readln(n);
until n in [1..nmax];
Randomize;
for i := 1 to n do
begin
  A[i] := random(10) - 5;
  write(A[i]:4);
end;
writeln;
imin := 1;
for i := 2 to n do
   if A[i] < A[imin] then imin := i;
writeln('Min = ', A[imin]);
dec(n);
for i := imin to n do
   A[i] := A[i + 1];
for i := 1 to n do
   write(A[i]:4);
end.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.11.2017, 10:02   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Так, на всяк случай)) Перемещать элементы массива к началу можно и без цикла процедурой move
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.11.2017, 11:13   #7
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
хотя, я не вижу смысла в этом присваивании
Смысл есть: после сдвига в конце массива будет два одинаковых значения, если не занулять последний элемент. Соответственно, это уже не будет первоначальным массивом, сдвинутым на 1 позицию влево

Цитата:
Сообщение от Serge_Bliznykov Посмотреть сообщение
а в остальном всё работает: https://ideone.com/mHsGVQ
Не всё. Как я выше указывал - элементы массива по условию должны быть разные
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...

Последний раз редактировалось Sciv; 29.11.2017 в 11:19.
Sciv вне форума Ответить с цитированием
Старый 29.11.2017, 11:17   #8
Sciv
Старожил
 
Аватар для Sciv
 
Регистрация: 16.05.2012
Сообщений: 3,211
По умолчанию

Цитата:
Сообщение от dastreba Посмотреть сообщение
а есть что-то проще пж?На уровне 1 курса.
Прост это слишком сложно понять,я такое еще не проходил

Ну для того, чтобы было проще, берите свою вполне работающую программу и допиливайте её с учётом всех перечисленных замечаний.

Кратко по замечаниям:
1) Использовать Randomize
2) Сделать заполнение массива уникальными значениями
3) Присваивать последнему элементу значение 0 после сдвига
4) Опционально - использовать процедуру move, про которую упоминал Аватар
Начал решать проблему с помощью регулярных выражений. Теперь решаю две проблемы...
Sciv вне форума Ответить с цитированием
Старый 29.11.2017, 11:49   #9
dastreba
Пользователь
 
Регистрация: 29.11.2017
Сообщений: 63
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Ну для того, чтобы было проще, берите свою вполне работающую программу и допиливайте её с учётом всех перечисленных замечаний.

Кратко по замечаниям:
1) Использовать Randomize
2) Сделать заполнение массива уникальными значениями
3) Присваивать последнему элементу значение 0 после сдвига
4) Опционально - использовать процедуру move, про которую упоминал Аватар
спасибо за помощь
dastreba вне форума Ответить с цитированием
Старый 29.11.2017, 13:46   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от Sciv Посмотреть сообщение
Смысл есть: после сдвига в конце массива будет два одинаковых значения, если не занулять последний элемент.
не соглашусь. во-первых, кто Вам сказал, что в массиве до удаления не было нуля?
будет два нулевых. И что? чем это лучше, чем два одинаковых ненулевых?
во-вторых, в массиве на 100 элементов мы заполняем первые n - остальные нас не интересуют. После уменьшения размера массива на единицу, нас уже не будет интересовать, какие там элементы, ПОСЛЕ n
в-третьих, в условии сказано про разные элементы массива только для того, чтобы не возникал вопрос - какой из минимальных элементов удалять - первый, последний или вообще все. Очевидно, что в массиве из разных элементов минимальный только один. Вот его и надо удалить.
и, к слову, ничего не сказано, как массив заполнен.
вполне можно и так: for i:=1 to n do A[i] := i;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Записать элементы массива X, удовлетворяющие условию Х[12], подряд в массив Y =. Определить минимальный элемент массива X. полин@ Общие вопросы C/C++ 0 03.10.2016 14:37
Вычислить минимальный элемент массива(вернусь ссылку на него ), заменить этой суммой минимальный элемент mari_ly Общие вопросы C/C++ 1 30.03.2016 16:31
'ПАСКАЛЬ'Удалить столбец, в котором находится минимальный элемент. Ver kat Помощь студентам 8 28.09.2012 06:56
Минимальный элемент массива Артемкка Помощь студентам 3 19.12.2011 01:18