Как сделать массив переменной длины
Модератор: Модераторы
Как сделать массив переменной длины
Дано 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: Вариант задать статический размер тысячу не подходит..., облазил весь инет нигде не нашел..., подумал, может как-нибудь в файл записывать, а потом оттуда считывать...
var N: integer;
begin
writeln('Введите количество массивов');
read(N);
for i=1 to n
writeln('Введите количество элементов ' +str(i)+массива');
read(arr_ke(i)); arr_ke(i)- это массив кол-ва элементов, который не понятно, как надо описать, так как у него переменная длина
и т.д. надо как-то задать массив количества элементов в каждом массиве, как это можно описать?
end
PS: Вариант задать статический размер тысячу не подходит..., облазил весь инет нигде не нашел..., подумал, может как-нибудь в файл записывать, а потом оттуда считывать...
Код: Выделить всё
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.
спасибо..., но решив одну проблему, я поискал по инету про эту функцию, не нашел, как двухмерный массив сделать с помощью этой функции, чтоб получилось в виде таблицы...
N массива элемент массива
1 2
1 1
1 3
3 2
2 1
2 1
и т.д.
PS: Поччему то нет кодов на сайте офрмление в виде таблицы(CSV)..
N массива элемент массива
1 2
1 1
1 3
3 2
2 1
2 1
и т.д.
PS: Поччему то нет кодов на сайте офрмление в виде таблицы(CSV)..
Не понял ни вопроса, ни суть проблемы.
tmpnikl
Если Вы говорите о выводе на экран, то это два цикла вложенные друг в друга - внешний цикл перебирает элементы массива массивов, а внутренний перебирает элементы текущего массива. Примеров - мильён.
Если Вы говорите о выводе на экран, то это два цикла вложенные друг в друга - внешний цикл перебирает элементы массива массивов, а внутренний перебирает элементы текущего массива. Примеров - мильён.
Нет, я не о выводе на экран, вложенные циклы, я тоже знаю, задача в том, чтобы заполнить массивы неизвестной заранее длины, количество этих массивов, которое мы тоже не знаем. Поэтому вначале мы вводим количество массивов для заполнения, а потом начинаем их заполнять, длина этих масивов различна и также неизветстна...
Например вводим с консоли кол-во масивов 3
Далее цикл от 1 до 3
начинаем заполнять элементами первый массив
2;3;5;1 и т.д.
Вводим конец заполнения первого массива и приступаем заполнять второй массив и т.д.
получаем на выходе общий массив данных, где первый столбец это номер массива, а второй элемент массива..
Вот сделал примерно, но почему то выходит ошибка exitcode 201, видать надо как-то описать двумерный массив переменной длины...
Не нашел спулер, чтоб код туда запрятать...
PS: может знает кто ссылку на русский хелп FPC, а то что-то контексная помощь не работает у меня...
Например вводим с консоли кол-во масивов 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, а то что-то контексная помощь не работает у меня...
Неудививительно, массивы же переменной длины.
Код: Выделить всё
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;
Да нет, вывод элементов двухмерного массива мне не важно, важно заполнение двухмерного массива
Есть два предложения для тебя:
Используй одномерный массив в качестве двухмерного: вводи все элементы подряд в одномерный массив, а позиции конца каждого одномерного запоминай во втором динамическом одномерном массиве, ясно объяснил или подробнее нужно?
Второе:
напиши класс двухмерного массива, используя динамическое выделение памяти, но это сложнее, чем первый вариант.
Используй одномерный массив в качестве двухмерного: вводи все элементы подряд в одномерный массив, а позиции конца каждого одномерного запоминай во втором динамическом одномерном массиве, ясно объяснил или подробнее нужно?
Второе:
напиши класс двухмерного массива, используя динамическое выделение памяти, но это сложнее, чем первый вариант.
tmpnikl писал(а): read(N);
for i:=0 to N-1 do // нумерация начинается с 0
Вы забыли: SetLength(mass_elm, n );
Спасибо, я попробую первый вариант, т.к. классы писать что-то сложно
>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(*)>кол-во массивов ) и всё.., но вот надо в Паскале, и вот тут полный ступор... Сейчас буду делать одномерный массив переменной длины...
>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 писал(а):В том варианте, который я предполагал
В Вашем варианте после строки "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 писал(а):т.к. предложения от pihter » 11.12.2013 18:38:26 не совсем корректные (так нельзя программировать, хотя будет работать).
Это почему нельзя? Ладно первый способ - не очевидный костыль, но для школьной задачки в 30 строчек - вполне допустимо. А написать класс - вполне себе годный стиль.
Это почему нельзя? Ладно первый способ - не очевидный костыль, но для школьной задачки в 30 строчек - вполне допустимо. А написать класс - вполне себе годный стиль.
Зачем делать сложно то, что проще простого?
pihter писал(а):А написать класс - вполне себе годный стиль.
Frolik писал(а):Зачем делать сложно то, что проще простого?
Согласен с Frolik
