Как создать массив в pascal

Массивы в Pascal

Массив в программировании является набором элементов одного типа (однотипных).

Различают несколько видов массивов – одномерный (векторный) и многомерный.

Элементы в массиве характеризуются своими именами и порядковыми номерами — индексами.

Индекс – это порядковый номер элемента в массиве.

В Паскале каждому элементу присваивается один или несколько индексов, которые описывают положение элемента в массиве.

Одномерный массив

Синтаксис массива в Pascal таков :

Где :
1 – нижний индекс
10 – верхний индекс
A – имя переменной массива
[ ] – диапазон значений
Integer – тип данных
A[ i ] – обращение к элементу массива в Pascal

Тип элементов массива может быть любым допустимым типом в Pascal, кроме файлов (даже массивом).

Пример массива : A =

Когда описывается массив, его верхний индекс должен быть строго определён.

При описании массива идёт распределение памяти, и компилятор должен знать какое количество памяти нужно выделить под описанный массив.

Ограничения по количеству индексов в массиве Pascal не ограничивается. Однако сам массив не должен быть больше чем 65537 байт.

Массив также можно объявлять в разделе описания типов:

Доступ к элементам массива осуществляется в цикле.

Наиболее рациональным способом обработки элементов массива в Паскаль является оператор цикла с параметром.

Алгоритмы заполнения массива в Pascal

  1. Ввод элементов массива с помощью компьютера осуществляется с помощью такой конструкции :

Массив можно задать случайным образом с помощью датчика случайных величин.

Для запуска датчика случайных величин в Паскаль нужно прописать специальную конструкцию — Randomize;

Новое значение генерируется с помощью функции Random(n) ,где n – целое число. В таком случае генерируется любое число с диапазоном от 0 до n.

Если функция Random используется без параметра, то она генерирует вещественное число (тип real) в диапазоне 0 < X < 1

Массив переменной длины

Всем здравствуйте. Скажите пожалуйста, как в Паскале (самом обычном) сделать массив переменной длины? Т.е. чтобы юзер сам вводил с клавы его длину. В интернете ничего найти не смог, поэтому задаю вопрос тут. И ещё один вопрос: как, используя ТОЛЬКО html и javascript, напечатать длину массива из тела скрипта. Массив называется ‘a’. Если не сложно, приведите весь участок кода.

как, используя ТОЛЬКО html и javascript, напечатать длину массива из тела скрипта. Массив называется ‘a’. Если не сложно, приведите весь участок кода.

Как создать массив в pascal

Все бы ничего, да не могу я сделать так, чтобы пользователь мог задавать размеры матриц ..
Весь HELP по паскалю перерыл, нигде не нашел.
Я сначала хотел сделать так, чтобы пользователь передавал размер матриц в параметры программы,
например proga.exe 1 2 3 4, где 1 2 3 4 соответственно количество строк и столбцов матрицы,
но препод сказал, что так нельзя. Описание в разделе =>CONST<= тоже непойдет, так как надо
сделать так, чтобы юзверь запустил proga.exe, ввел размер и содержимое матриц,
а на выходе получил результат работы программы.

P.S Если эта тема уже где-то поднималась, просьба ногами не пинать, а дать ссылку.

Если у кого есть примеры программ, плиз намыльте исходники на pavel[at]pleshkov.name
([at] заменить на @)

Я понимаю, но это не подходит, может есть какие либо другие выходы??

Напиши два класса(блин. да что такое то. объекта конечно. бросать надо на двух языках одновременно писать), строка и матрица и пользуйся ими. в качестве обращения к элементам матрицы вызывай функции объекта матрицы.

Соответственно у строк будет своя размерность у матрицы своя размерность.

Но тут прийдется повозится, но если тебе это удасться сделать самому, тогда ты очень вырастешь в проффесиональном плане. Не ленись, это тебе очень поможет.

все другие реализации в общем случае сводятся к п 2. т.е. динамическая работа с памятью.

Если не знаешь (или реализация не позволяет) создавать классы, тогда делай это через процедуры/функции.

Вызовы этого массива можно обернуть в 5 функции, так что пользователю не нужно будет знать как у тебя реализована функциональность, в виде объекта или кучи функций.
1-я создание массива, получает размер массива, возвращает указатель на массив (или индекс)
2,3-я получение/установка значения элемента, получает указатель на массив, индексы элемента, возврат значение.
4. Удаление массива, получает указатель на массив. используется для очистки памяти.
5. Очистка массива, получает указатель на массив. заполняет массив 0.

Цитата:

MyArray : array[0..999] of String;

а реально заполнено лишь некоторое количество значений (пользователь тоже его вводит).
Задача явно носит учебный характер, поэтому не нужно слишком заморачиваться.

Цитата:

Не понял, что ты имел ввиду

показал как пользователю задать/ввести матрицу с клавиатуры
собственно реализация — как и ввод: класс из трех элементов (строки ввода соответственно), размерность, длины размерностей и сама матрица. два последних элемента — динамические одномерные массивы

Цитата:

MyArray : array[0..999] of String;

Цитата:

На Паскале человек пишет. А не на Делфи!

впрочем, сути не меняет. есть GetMem и FreeMem (см. pascal help). списки ни к чему, массивов вполне достаточно, но только динамических, а не статических. я на месте преподавателя за статические массивы удавил бы на месте.
боюсь, что автор темы ждет от форума готового решения, а ни у кого нет желания этим заниматься. мне тоже
ниже — начало наброска для класса. нужна еще куча всякого (комменты, проверки всякие и пр.). имхо все это коту под хвост, разве что для очистки совести

const
verybig = 999999999; // задолбаются вводить с клавиатуры
type
tmyparams = array[0..verybig] of integer; // для размерности матрицы и локализации ее элементов
pmyparams = ^tmyparams;
tmyarray = array[0..verybig] of double; // для хранения собственно матрицы
pmyarray = ^tmyarray;
// все массивы здесь и ниже начинаются с нуля! дело привычки/вкуса

tmymatrix = class
dim: integer; // размерность матрицы
dims: pmyparams; // вектор размерностей
mylength: integer; // сколько элементов в матрице
matrix: pmyarray; // собственно матрица
constructor mycreate(adim: integer);
procedure allocate(adims: pmyparams);
function getelement(params: pmyparams): double; // доставание одного элемента
prcedure free;
end;

constructor tmymatrix.mycreate(adim: integer);
begin
create;
dim := adim;
GetMem(dims^[0], dim*SizeOf(dims^[0]));
end;

procedure tmymatrix.allocate(adims: pmyparams);
var i: integer;
begin
mylength := 1;
for i := 0 to dim-1 do
begin
dims^[i] := adims^[i];
mylength := mylength*dims^[i];
end;
GetMem(matrix^[0], mylength*SizeOf(matrix^[0]));
end;

function tmymatrix.getelement(params: pmyparams): double;
var i, n: integer;
begin
n:= 1; // адрес элемента в одномерном массиве
for i := 0 to dim-1 do
n := n*(params^[i]+1);
result := matrix^[n-1];
end;

Цитата:

но только динамических, а не статических. я на месте преподавателя за статические массивы удавил бы на месте.

Я чего то не догоняю откуда в паскале динамические массивы

Цитата:

const
verybig = 999999999; // задолбаются вводить с клавиатуры
type
tmyparams = array[0..verybig] of integer; // для размерности матрицы и локализации ее элементов
pmyparams = ^tmyparams;
tmyarray = array[0..verybig] of double; // для хранения собственно матрицы
pmyarray = ^tmyarray;

а верибиг=99999..99 это что? ИМХО это верхняя граница матрицы то есть, если я захочу заполнить элемент который больше этого предела, то получу ошибку. Разве я не прав?
И не надо говорить, что юзер никогда не введт столько чисел, в задании не говорится, что их надо все вводить, надо чтобы матрицы были ЛЮБОГО размера. а не просто очень или дико большого, ведь скорее всего проверяется не работа проги а ее текст, по крайней мере я так принимаю лабы, (мне пофигу на результат, обычно по тексту видно, что прога работает не правильно)
vserd

Цитата:

Для чистого массива (создаваемого на этапе компиляции) да, для класса нет, ты же сам ниже пересказал идею

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

Цитата:

откуда в паскале динамические массивы

GetMem+FreeMem и SetLength+=nil — по сути одно и то же

Цитата:

а верибиг=99999..99 это что?

не надо путать божий дар с яичницей
MyArray : array[0..999] of String; — размещаешь память с избытком, от балды
GetMem(matrix^[0], mylength*SizeOf(matrix^[0])); — ровно столько, сколько надо, причем проверку можно поставить и стопануть до выделения памяти, если лимит превышен

Цитата:

это верхняя граница матрицы то есть, если я захочу заполнить элемент который больше этого предела, то получу ошибку. Разве я не прав?

array index < 2GB — это ограничение языка, точнее платформы win32, я поставил 1GB девятками чисто для красоты, в дельфи пишу MaxInteger, не уверен, что в паскале есть

Цитата:

не надо говорить, что юзер никогда не введт столько чисел, в задании не говорится, что их надо все вводить

а это что? надо сделать так, чтобы юзверь запустил proga.exe, ввел размер и содержимое матриц

А кто тебе сказал что я использую статические массивы? О них и не было и речи..
Я упомянул объекты, по моему это разные вещи , если как ты говоришь ты программировал в паскале! А уж их то и укладывай в динамические списки как тебе угодно.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *