![]() |
1. Заголовок или название темы должно быть информативным !
2. Все тексты фрагментов программ должны помещаться в теги [code] ... [/code] или [code=pas] ... [/code].
3. Прежде чем задавать вопрос, см. "FAQ" и используйте ПОИСК !
4. НЕ используйте форум для личного общения!
5. Самое главное - это раздел теоретический, т.е. никаких задач и программ (за исключением небольших фрагментов) - для этого есть отдельный раздел!
![]() |
Tonic |
![]()
Сообщение
#1
|
Гость ![]() |
Синтаксиса не знаю, поэтому объясняю на пальцах:
массив[заранее_не_знаю_сколько_элементов] i:=0 начало_цикла i:=i+1 элемент_массива[i] = ввод_с_клавы(неск._букв) если элемент_массива[i] = 'особый_символ' то выйти из цикла конец_цикла Вопрос в том, как бы мне менять границы массива по ходу исполнения программы? Есть ли какие варианты? Может быть, использовать не массивы, а ещё что-то? |
![]() ![]() |
Some1 |
![]()
Сообщение
#2
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 38 Репутация: ![]() ![]() ![]() |
Что же до системы с 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. |
![]() ![]() |
![]() |
Текстовая версия | 22.07.2025 11:28 |