Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Задача об удалении элемента массива (http://www.tehnari.ru/f41/t74845/)

Натуличка 12.06.2012 19:09

Задача об удалении элемента массива
 
задача: удалить элемент массива вещественных чисел, меньший заданного числа. Если таких элементов нет выдать сообщение "элементы для удаления не найдены", иначе удалить первый найденный элемент.
нужна консультация!
я правильно мыслю: я должна вводить i, n, k. причем k-число, которое задуманно мной, а значит любое. кроме того при удалении элемента у меня и штдекс будет изменятся, т.е было n[5]:=n[6]. значит в цикле писать нужно будет for i:=1 to n-1 do?

Vladimir_S 12.06.2012 19:25

Цитата:

Сообщение от Натуличка (Сообщение 748075)
нужна консультация!

Запросто!
Цитата:

Сообщение от Натуличка (Сообщение 748075)
я правильно мыслю: я должна вводить i, n, k. причем k-число, которое задуманно мной, а значит любое.

Угу. Только i вводить не надо.
Цитата:

Сообщение от Натуличка (Сообщение 748075)
кроме того при удалении элемента у меня и штдекс будет изменятся, т.е было n[5]:=n[6]. значит в цикле писать нужно будет for i:=1 to n-1 do?

Не совсем так. Тут не очень просто: циклом for..to..do не обойтись, и нужен (желательно булевский) флажок. Сейчас покажу, как это делается. Только уж извините, но массив заполню через генератор случайных чисел, так что консольный ввод, если надо, организуйте сами.

Натуличка 12.06.2012 19:32

буду весьма благодарна)

Vladimir_S 12.06.2012 19:39

Цитата:

Сообщение от Натуличка (Сообщение 748097)
буду весьма благодарна)

Да без проблем:
Код:

Const
 Nmax=100;
var
 a:array [1..Nmax] of Real;
 i,j,n,k: integer;
 b:boolean;
begin
 Randomize;
 Write('n = ');
 Readln(n);
 for i:=1 to n do
  begin
  a[i]:=Random*10;
  write(a[i]:8:2);
  end;
 writeln;
 writeln;
 Write('k (1..9) = ');
 Readln(k);
 writeln;
 b:=false;
 i:=0;
 Repeat
  i:=i+1;
  If a[i]<k then b:=true;
 Until (i=n) or b;
 If b then
  begin
  for j:=i to n-1 do a[j]:=a[j+1];
  n:=n-1;
  for i:=1 to n do write(a[i]:8:2);
  end
 else
  Writeln('No such elements!');
 Readln
End.


Натуличка 12.06.2012 19:42

спасибо большое)
а вот если простым для меня языком могу я условия так написать:
if a[i] <k (при условии, что kввожу сама)then
a[i]:= a[i+1]или я уже не в ту степь пошла?

Vladimir_S 12.06.2012 20:18

Цитата:

Сообщение от Натуличка (Сообщение 748103)
спасибо большое)
а вот если простым для меня языком могу я условия так написать:
if a[i] <k (при условии, что kввожу сама)then
a[i]:= a[i+1]или я уже не в ту степь пошла?

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

Натуличка 12.06.2012 20:56

так-то по вашему примеру я поняла суть решения. но мне нужен самый простой алгоритм. объясните одну вещь j-это значение, которое приобретает i. т.е наши так называемые ячейки смещаются на 1. так?

Натуличка 12.06.2012 20:58

и можно ли обойтись здесь циклом с постусловием?

Vladimir_S 13.06.2012 10:11

Цитата:

Сообщение от Натуличка (Сообщение 748138)
так-то по вашему примеру я поняла суть решения. но мне нужен самый простой алгоритм. объясните одну вещь j-это значение, которое приобретает i. т.е наши так называемые ячейки смещаются на 1. так?

Во-первых, не старайтесь всюду найти путь попроще - это дорога в никуда, уверяю Вас. Осваивайте новые команды, операторы и т.п. - смелее. А стоять на позиции "вот я выучила три команды и больше ничего знать не хочу" неправильно в корне.
Теперь насчет i и j. Поясню на примере.
Пусть у нас есть массив из 20 элементов. Пусть требуемому условию отвечает элемент №5. В этом случае, когда цикл с постусловием (Repeat..Until) дойдет до значения i=5, флажок b примет значение true, перебор по i прекратится и цикл прервется. Далее запустится цикл по j от 5 до 19, в котором каждому a[j] будет присвоено значение следующего элемента массива. Таким образом, как и требуется, исходный 5-й элемент будет исключен.
Цитата:

Сообщение от Натуличка (Сообщение 748140)
и можно ли обойтись здесь циклом с постусловием?

Так он и применен...


Часовой пояс GMT +4, время: 03:50.

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.