IPB
ЛогинПароль:

> Правила раздела!

1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!

> Как создать резиновый массив?
сообщение
Сообщение #1


Гость






Синтаксиса не знаю, поэтому объясняю на пальцах:

массив[заранее_не_знаю_сколько_элементов]
i:=0
начало_цикла
 i:=i+1
 элемент_массива[i] = ввод_с_клавы(неск._букв)
 если элемент_массива[i] = 'особый_символ' то
   выйти из цикла
конец_цикла

Вопрос в том, как бы мне менять границы массива по ходу исполнения программы? Есть ли какие варианты? Может быть, использовать не массивы, а ещё что-то?
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Новичок
*

Группа: Пользователи
Сообщений: 38

Репутация: -  0  +


Что же до системы с New:
Значит так - каждый элемен массива должен распологаться динамически в памяти, и содержать в себе:
1. Само значение элемента (строка, число, не важно...)
2. Указатель, где в памяти находится следующий элемент.

Таким образом зная указатель на самый первый элемент массива можно прочитать и его значение, и узнать, где находится следующий элемент массива, и так до самого конца. Изменять размер массива можно динамически - это как open arrays, тоесть - хочешь - добавь в конец новый элемент, а в предыдущем укажи ссылку на него, хочешь, вставь между двумя элементами массива ещё один (из предыдущего сделай ссылку на него, а у него сделай ссылку на следующий). Важно, то что при таком методе необходимо в отдельной переменной хранить ссылку на самый первый элемент массива, иначе можно просто потерять весь массив в памяти :)
Вот тебе пример:
Код
Type
  PData = ^TData; {указатель на элемент массива}
  TData = record {Сам элемент массива}
     N: Longint; {Число - содержимое элемента}
     Next: PData; {Указатель на следующий элемент массива}
  End;
Var
 Temp,First: PData; {Два элемента, один из них для работы с текущим элементом, другой для указания, где начинается массив}
 p:word;
begin
 temp:=nil; {укажем, что первый элемент пока не заполнен}
 Repeat
    ReadLn(X);
    If X = 0 then Break; {Если мы ввели ноль, то всё.. больше элементов не надо}
    If temp = nil then {если это самый первый элемент, то...}
    begin
      New(temp); {Создадим его}
      first:=temp; {Запомним где он находится в first}
    end else {Иначе это уже не первый}
    begin
      New(temp^.Next); {Создадим новый}
      temp:=Temp^.next; {Перенесёмся в него. temp теперь уже новый}
    end;
    temp^.N := X; {Занесём в него значение}
    data^.Next := nil; {Укаджем, что следующего ещё нет}
 Until False;
 {Теперь выведем все значения, чтоб тебе было более понятно}
 temp:=first; {Установим первый элемент}
 p:=0; {Номер текущего элемента}
 while temp<>nil do {Пока мы находим элемент}
 begin
   inc(p); {наращиваем номер текущего элемента}
   writeln('a(',p,')=',temp^.N); {выводим его}
   temp:=temp^.Next; {Переносимся в следующий элемент}
 {Если следующий элемент nil, то temp тоже странет nil, и цикл while закончится}
 end;
end.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 20.04.2024 12:13
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name