Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Программа на Pascal ABC

Nate Diaz Ученик (110), на голосовании 4 года назад
Удаление элементов равных номеру элемента в исходном списке, добавление после каждого элемента числа
его единиц, нахождение минимума из оставшихся элементов списка.
Дополнен 5 лет назад
Готовый код.
Голосование за лучший ответ
Кублен Оракул (96965) 5 лет назад
приведи пример
Nate DiazУченик (110) 5 лет назад
Пример чего именно?
Кублен Оракул (96965) твоей задачи, исходный список и т. д., ибо не совсем понятно условие задачи
Peer-2-Peer Мудрец (16172) 5 лет назад
КАРДИНАЛЬНОЕ ПРЕДЛОЖЕНИЕ.

Поскольку само понятие «номер элемента» является явно заданным в формулировке вопроса, то предлагаю объединить понятия «элемент списка» и «номер элемента» в одной ячейке. Также можно не связывать индекс массива с собственным номером элемента, но использовать как инструмент.

Пожалуйста, Nate Diaz, прошу Вас ответить, проходили ли Вы ключевое слово „Record” и понятие типа-записи?

Через запись можно записать обособление номера вместе с соответствующим элементом, например, так:

Type UNITinList = record
Number,Value:integer // поле Value для значения элемента, поле Number для его номера
end;
var VList:array[0..MaxInt] of UNITinList;
// пример: VList[i].Number:=i; VList[i].Value:=Random(MaxInt);

✓ Вариант без Record:

Type UNITSet = [Number,Value]; // определение пользовательских констант внутри типа. Каждая из констант имеет тип UNITSet
var VList:array [0..MaxInt,UNITSet] of integer;
// пример обращения к элементу списка: VList[i,Number]:=i; VList[i,Value]:=Random(MaxInt);

›⟩ ОБОСОБЛЕНИЕ номера элемента вместе со значением соответствующего элемента позволит сохранить присвоенный номер НЕЗАВИСИМО от вставок/удалений элементов!!!
Peer-2-PeerМудрец (16172) 5 лет назад
Инициализировать массив удобно случайными числами. Например:

var i:integer;

· · ·

Randomize;
for i:=0 to MaxInt do
begin
VList[i,Number]:=i; VList[i,Value]:=Random(MaxInt)
end;
Peer-2-Peer Мудрец (16172) Random(MaxInt) можно заменить на Random(MaxInt*2)-MaxInt. ✓ Хотя значение функции Random обязательно выйдет за пределы типа Integer, однако вычитание MaxInt вернёт результат в область определения. Кто сомневается, те вправе добавить явное преобразование типов.
Peer-2-PeerМудрец (16172) 5 лет назад
* Удаление элементов списка лучше реализовать условно, как пометку. Например, присваивать номеру удаляемого элемента отрицательное значение.

* Для значений единиц элементов можно объявить отдельный массив типа ShortInt. Дело в том, что | Z mod 10 | < 10 по определению понятия остатка числа.

• Далее реализовать сведение двух массивов в один. Это окончательно убедило меня в том, что лучше использовать динамические массивы. Pascal ABC их поддерживает.
Peer-2-Peer Мудрец (16172) Более того, можно сразу создать массив результатов типа Integer и заполнить каждую вторую ячейку числом единиц элемента, а в остальные копировать элементы из исходного массива.
Peer-2-PeerМудрец (16172) 5 лет назад
Ну а поиск минимального в массиве результатов — простая рутина.
Пусть ResList — динамический массив результатов типа Integer. Переменная ListBottom типа Integer — индекс минимального в массиве.

ListBottom:=0;
for i:=1 to Length(ResList)-1 do
if ResList[i] < ResList[ListBottom] then ListBottom:=i;
Peer-2-Peer Мудрец (16172) Напоминаю, Length(ResList) эквивалентно ResList.Length
Peer-2-PeerМудрец (16172) 5 лет назад
Re: КАРДИНАЛЬНОЕ ПРЕДЛОЖЕНИЕ

Объявление исходного массива как динамического:

var VList:array of UNITinList;

либо

var VList:array of array [UNITSet] of Integer;
Peer-2-Peer Мудрец (16172) В таком случае перед инициализацией следует выделить память для массива: var ListLen: Integer; write('Сколько элементов будет в списке? '); read(ListLen); SetLength(VList,ListLen); (переменная ListLen пригодится в дальнейшем)
Peer-2-PeerМудрец (16172) 5 лет назад
Nate Diaz, я ожидаю критики от Вас!
Peer-2-PeerМудрец (16172) 5 лет назад
* * * ОСНОВНОЙ ПРОЦЕСС * * *

var j,Actual:Integer=0;

···

// удаление элементов
For i:=0 to ListLen-1 do
if VList[i,Number] = VList[i,Value] then VList[i,Number]:=-1
else Inc(Actual,2);
// далее создаётся массив результатов
SetLength(ResList,Actual);
// копирование из исходного массива в конечный и добавление числа единиц
j:=0;
for i:=0 to ListLen-1 do
begin
if VList[i,Number] = -1) do Continue;
ResList[j]:=VList[i,Value];
ResList[j+1]:=VList[i,Value] mod 10;
Inc(j,2)
end;
Peer-2-Peer Мудрец (16172) ✓ Поиск минимального описан выше, он добавляется в конец основного процесса. Кстати, переменную j можно не объявлять, а использовать вместо неё свободную, например, ListBottom. Контексты этих переменных не пересекаются!
Похожие вопросы