Как сделать массив переменной длины

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Как сделать массив переменной длины

Сообщение tmpnikl » 03.12.2013 19:40:08

Дано N множеств, и у каждого множества надо задать длину
var N: integer;
begin
writeln('Введите количество массивов');
read(N);
for i=1 to n
writeln('Введите количество элементов ' +str(i)+массива');
read(arr_ke(i)); arr_ke(i)- это массив кол-ва элементов, который не понятно, как надо описать, так как у него переменная длина

и т.д. надо как-то задать массив количества элементов в каждом массиве, как это можно описать?
end
PS: Вариант задать статический размер тысячу не подходит..., облазил весь инет нигде не нашел..., подумал, может как-нибудь в файл записывать, а потом оттуда считывать...
tmpnikl
новенький
 
Сообщения: 15
Зарегистрирован: 18.11.2013 17:51:43

Re: Как сделать массив переменной длины

Сообщение Frolik » 03.12.2013 19:58:17

Код: Выделить всё
var N, m : integer;
      arr_ke : array of array of тип_элементов_массива;

begin

writeln('Введите количество массивов');
read(N);
SetLength(arr_ke, N);
for i=0 to N-1 do   // нумерация начинается с 0
    begin
    writeln('Введите количество элементов ' +str(i+1)+' массива');
    read(m);
    SetLength(arr_ke[i], m );
    end;


Обращение к элементу массива : arr_ke[номер массива][Номер элемента].
Нумерация начинается с 0.
Frolik
постоялец
 
Сообщения: 275
Зарегистрирован: 18.08.2011 11:52:32

Re: Как сделать массив переменной длины

Сообщение tmpnikl » 04.12.2013 09:31:45

спасибо..., но решив одну проблему, я поискал по инету про эту функцию, не нашел, как двухмерный массив сделать с помощью этой функции, чтоб получилось в виде таблицы...
N массива элемент массива
1 2
1 1
1 3
3 2
2 1
2 1
и т.д.
PS: Поччему то нет кодов на сайте офрмление в виде таблицы(CSV)..:-(
tmpnikl
новенький
 
Сообщения: 15
Зарегистрирован: 18.11.2013 17:51:43

Re: Как сделать массив переменной длины

Сообщение Frolik » 04.12.2013 09:59:56

Не понял ни вопроса, ни суть проблемы.
Frolik
постоялец
 
Сообщения: 275
Зарегистрирован: 18.08.2011 11:52:32

Re: Как сделать массив переменной длины

Сообщение Vadim » 06.12.2013 07:00:36

tmpnikl
Если Вы говорите о выводе на экран, то это два цикла вложенные друг в друга - внешний цикл перебирает элементы массива массивов, а внутренний перебирает элементы текущего массива. Примеров - мильён.
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Как сделать массив переменной длины

Сообщение tmpnikl » 06.12.2013 16:19:12

Нет, я не о выводе на экран, вложенные циклы, я тоже знаю, задача в том, чтобы заполнить массивы неизвестной заранее длины, количество этих массивов, которое мы тоже не знаем. Поэтому вначале мы вводим количество массивов для заполнения, а потом начинаем их заполнять, длина этих масивов различна и также неизветстна...
Например вводим с консоли кол-во масивов 3
Далее цикл от 1 до 3
начинаем заполнять элементами первый массив
2;3;5;1 и т.д.
Вводим конец заполнения первого массива и приступаем заполнять второй массив и т.д.
получаем на выходе общий массив данных, где первый столбец это номер массива, а второй элемент массива..
Вот сделал примерно, но почему то выходит ошибка exitcode 201, видать надо как-то описать двумерный массив переменной длины...
Код: Выделить всё
Program primer;
var N,m,e,i,k:integer;
      mass_elm : array of array of integer;
begin
    writeln('Введите количество массивов');
    read(N);
for i:=0 to N-1 do   // нумерация начинается с 0
    begin
    writeln('Введите количество элементов ', i+1, ' массива');
    read(m);
    SetLength(mass_elm[i], m );
    writeln('Введите элементы', i+1, ' массива');
    for k:=0 to m-1 do
    begin
    read(e);
    mass_elm[i,k]:=e;
    end;
end;
for i:=0 to N-1 do
    begin
    writeln('массив', i+1);
   for k:=0 to m-1 do
    begin
    writeln('mass_elm[',i+1,',',k+1,'] = ',mass_elm[i,k]);
    end;
end;
    readln;
     readln;
end.

Не нашел спулер, чтоб код туда запрятать...
PS: может знает кто ссылку на русский хелп FPC, а то что-то контексная помощь не работает у меня... :-(
tmpnikl
новенький
 
Сообщения: 15
Зарегистрирован: 18.11.2013 17:51:43

Re: Как сделать массив переменной длины

Сообщение Frolik » 06.12.2013 19:58:10

Неудививительно, массивы же переменной длины.
Код: Выделить всё
for i:=0 to High(mass_elm) do
    begin
    writeln('массив', i+1);
   for k:=0 to High(mass_elm[i]) do
    begin
    writeln('mass_elm[',i+1,',',k+1,'] = ',mass_elm[i,k]);
    end;
end;
Frolik
постоялец
 
Сообщения: 275
Зарегистрирован: 18.08.2011 11:52:32

Re: Как сделать массив переменной длины

Сообщение tmpnikl » 08.12.2013 16:45:21

Да нет, вывод элементов двухмерного массива мне не важно, важно заполнение двухмерного массива
tmpnikl
новенький
 
Сообщения: 15
Зарегистрирован: 18.11.2013 17:51:43

Re: Как сделать массив переменной длины

Сообщение pihter » 11.12.2013 13:38:26

Есть два предложения для тебя:
Используй одномерный массив в качестве двухмерного: вводи все элементы подряд в одномерный массив, а позиции конца каждого одномерного запоминай во втором динамическом одномерном массиве, ясно объяснил или подробнее нужно?

Второе:
напиши класс двухмерного массива, используя динамическое выделение памяти, но это сложнее, чем первый вариант.
pihter
новенький
 
Сообщения: 12
Зарегистрирован: 13.01.2010 02:40:33

Re: Как сделать массив переменной длины

Сообщение alexey38 » 11.12.2013 14:14:18

tmpnikl писал(а): read(N);
for i:=0 to N-1 do // нумерация начинается с 0

Вы забыли: SetLength(mass_elm, n );
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Как сделать массив переменной длины

Сообщение tmpnikl » 11.12.2013 18:26:02

Спасибо, я попробую первый вариант, т.к. классы писать что-то сложно
>SetLength(mass_elm, n );
В том варианте, который я предполагал, увелечение массива идет какждый раз после обявления длины заполняемого массива, объявили, что длина первого массива, будет 5 элементов увеличили на 5, заполнили, объявили длину второго массива 3 увеличили длину массива ещё на 3 элемента, и также заполнили второй массив, и т.д. до N
В общем я понял, каждый элемент массива будет состоять из двух частей, код массива, раделитель(например /) и затем элемент массива..., типа 1/123 (первый массив, число 123)
Конечно можно было бы в школьной задаче применить таблицы, то пара операторов(CREATE CURSOR Массив_массивов(Ном_мас I,эл_мас I), INSERT INTO Массив_массивов (Ном_мас,эл_мас) VALUES 1,123) ), заполнил бы таблицу, затем selectы(select distinct эл_мас from Массив_массивов group by эл_мас having count(*)>кол-во массивов ) и всё.., но вот надо в Паскале, и вот тут полный ступор... Сейчас буду делать одномерный массив переменной длины...
Последний раз редактировалось tmpnikl 11.12.2013 19:04:37, всего редактировалось 1 раз.
tmpnikl
новенький
 
Сообщения: 15
Зарегистрирован: 18.11.2013 17:51:43

Re: Как сделать массив переменной длины

Сообщение alexey38 » 11.12.2013 18:59:24

tmpnikl писал(а):В том варианте, который я предполагал

В Вашем варианте после строки "read(N);" нужно добавить строку "SetLength(mass_elm, n );" и все будет работать. У Вас все правильно написано, и не нужно выдумывать никакие другие варианты, т.к. предложения от pihter » 11.12.2013 18:38:26 не совсем корректные (так нельзя программировать, хотя будет работать).

Также у Вас вывод на печать нужно сделать так, как указал Frolik » 07.12.2013 00:58:10
А именно использовать High(mass_elm) и High(mass_elm[i]) для определения границ ранее выделенного массива.
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

Re: Как сделать массив переменной длины

Сообщение pihter » 12.12.2013 05:11:56

alexey38 писал(а):т.к. предложения от pihter » 11.12.2013 18:38:26 не совсем корректные (так нельзя программировать, хотя будет работать).


Это почему нельзя? Ладно первый способ - не очевидный костыль, но для школьной задачки в 30 строчек - вполне допустимо. А написать класс - вполне себе годный стиль.
pihter
новенький
 
Сообщения: 12
Зарегистрирован: 13.01.2010 02:40:33

Re: Как сделать массив переменной длины

Сообщение Frolik » 12.12.2013 10:32:53

Это почему нельзя? Ладно первый способ - не очевидный костыль, но для школьной задачки в 30 строчек - вполне допустимо. А написать класс - вполне себе годный стиль.

Зачем делать сложно то, что проще простого?
Frolik
постоялец
 
Сообщения: 275
Зарегистрирован: 18.08.2011 11:52:32

Re: Как сделать массив переменной длины

Сообщение alexey38 » 12.12.2013 15:42:56

pihter писал(а):А написать класс - вполне себе годный стиль.

Frolik писал(а):Зачем делать сложно то, что проще простого?

Согласен с Frolik
alexey38
долгожитель
 
Сообщения: 1627
Зарегистрирован: 27.04.2011 19:42:31

След.

Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

Рейтинг@Mail.ru