Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/40: Рейтинг темы: голосов - 40, средняя оценка - 4.93
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 91

Создание многомерного массива

16.09.2012, 18:34. Показов 7653. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет всем.

Подскажите, пожалуйста, как в программе задать многомерный массив чисел, границы (количество строк и столбцов) которого будут выбраны пользователем через ввод в n:=SpinEdit1.Value; m:=SpinEdit2.Value;

Получается только явно задать границы массива и с ним работать.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.09.2012, 18:34
Ответы с готовыми решениями:

Сортировка многомерного массива
Здраствуйте, на этот раз меня интересуют варианты сортировки многомерного массива. Есть ли какой нибудь способ сортировать целиком? Что-то...

Обработка многомерного массива
Сначала для каждой страны программа вычисляет общее количество медалей и соответствующее ему количество очков. Затем, используя метод...

наибольший индекс многомерного массива
Как известно, функция high применительно к многомерному массиву возвращает значение наибольшего индекса для первого подмассива. А как...

24
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
16.09.2012, 18:37
Динамические массивы в Delphi
0
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 91
16.09.2012, 18:46  [ТС]
А разве не многомерный динамический массив?
На просторах интернета нашел информацию о том, что не задавать границы массива можно использованием "открытого массива".

Delphi
1
2
3
4
5
6
7
procedure ListAllIntegers(const AnArray: array of Integer);
var
  I: Integer;
begin
  for I := Low(AnArray) to High(AnArray) do
   WriteLn('Integer at ', I, ' is ', AnArray[I]);
end;
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
16.09.2012, 18:52
Ты что, не можешь перейти по ссылке и почитать о динамических массивах?
Delphi
1
2
3
4
5
6
7
8
Var
  Arr : Array Of Array Of Integer;
 
n:=SpinEdit1.Value; 
m:=SpinEdit2.Value;
SetLength(Arr,n,m); //Определили размерность Arr = Array[0..n-1,0..m-1]
....поработали
Finalize(Arr); //Освободили память массива
0
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 91
16.09.2012, 19:00  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
Ты что, не можешь перейти по ссылке и почитать о динамических массивах?
Delphi
1
2
3
4
5
6
7
8
Var
  Arr : Array Of Array Of Integer;
 
n:=SpinEdit1.Value; 
m:=SpinEdit2.Value;
SetLength(Arr,n,m); //Определили размерность Arr = Array[0..n-1,0..m-1]
....поработали
Finalize(Arr); //Освободили память массива
Я пробовал данный вариант. SetLength(Arr,n,m); - но по какой-то причине в этой строке была ошибка.
Сейчас попробую еще раз проверить.
SetLength(Arr,n,m); //Определили размерность Arr = Array[0..n-1,0..m-1]
Получается дальше в цикле программы не надо указывать, например, n-1, т.к. это предполагает уже данная функция?
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
16.09.2012, 19:13
Получается дальше в цикле программы не надо указывать, например, n-1, т.к. это предполагает уже данная функция?
Дальше ты работаешь с этим массивом, как будто ты его описал как в комментарии.
Например:
Delphi
1
2
3
For i:=0 To n-1 Do
For j:=0 To m-1 Do
Arr[i,j]:=Random(100)-50; //Заполнение...
В процессе работы можешь переопределять размерность той же процедурой SetLength.
Что там за ошибка?
0
 Аватар для Arcor
5709 / 2300 / 466
Регистрация: 20.11.2009
Сообщений: 7,721
Записей в блоге: 1
16.09.2012, 19:21
у меня в дельфи такая конструкция
Delphi
1
SetLength(Arr,n,m)
выдает ошибку на память сразу же

делать приходится
Delphi
1
SetLength(Arr,n+1,m+1)
0
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 91
16.09.2012, 19:37  [ТС]
Цитата Сообщение от Одиночка Посмотреть сообщение
Дальше ты работаешь с этим массивом, как будто ты его описал как в комментарии.
Например:
Delphi
1
2
3
For i:=0 To n-1 Do
For j:=0 To m-1 Do
Arr[i,j]:=Random(100)-50; //Заполнение...
В процессе работы можешь переопределять размерность той же процедурой SetLength.
Что там за ошибка?
Часть кода:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
begin
 
n:=SpinEdit1.Value; // Количество строк массива;
m:=SpinEdit2.Value; // Количество столбцов массива;
SetLength(Arr,n,m); //Определение размерности Arr = Array[0..n-1,0..m-1];
  Begin
  for i:=0 to n-1 do
  for j:=0 to m-1 do
  Arr[i,j]:=Random(1000000);
  End;
 
StringGrid1.RowCount:=n;
StringGrid1.ColCount:=m;
 
Begin
StringGrid1.cells[0,0]:='№';
StringGrid1.cells[1,0]:='X';
StringGrid1.cells[2,0]:='Y';
 
for i:=1 to n do //Цикл по строкам;
for j:=1 to m do //Цикл по столбцам;
StringGrid1.Cells[j,i]:=IntToStr(Arr[i,j]);
End;
Подскажи как в зафиксированных ячейках элемента StringGrid по горизонтали (0 строка) прописать алфавит (а если элементов больше то как в excel aa, ab, ac и т.д.) а по вертикали (0 столбец) пронумеровать.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
16.09.2012, 19:54
Вот по простому без всяких изысков. Может можно и проще.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
Var
  c,c1 : Char;
  b : Boolean;
begin
  n:=SpinEdit1.Value; // Количество строк массива;
  m:=SpinEdit2.Value; // Количество столбцов массива;
  SetLength(Arr,n,m); //Определение размерности Arr = Array[0..n-1,0..m-1];
 
  for i:=0 to n-1 do
  for j:=0 to m-1 do
  Arr[i,j]:=Random(1000000);
 
  StringGrid1.RowCount:=n+1; // +1 - чтобы фиксированные не считать
  StringGrid1.ColCount:=m+1;
 
  StringGrid1.cells[0,0]:='№';
  StringGrid1.cells[1,0]:='X';
  StringGrid1.cells[2,0]:='Y';
  //Заполним фиксированную строку...
  c:='a'; c1:='a'; b:=False;
  For i:=1 To StringGrid1.ColCount-1 Do
  Begin
    StringGrid1.cells[i,0]:=c;
    If b Then
    Begin
       StringGrid1.cells[i,0]:=c+c1;
       c1:=Succ(c1);
       If c1>'z' Then
       Begin
          c1:='a';
          c:=Succ(c);
       End;
    End Else
    Begin
      c:=Succ(c);
      If c>'z' Then 
      Begin
         b:=True;
         c:='a';
      End;
    End;
  End;
  //Заполним фиксированный столбец...
  For i:=1 To StringGrid1.RowCount-1 Do
  StringGrid1.cells[0,i]:=IntToStr(i);
 
  for i:=1 to n do //Цикл по строкам;
  for j:=1 to m do //Цикл по столбцам;
  StringGrid1.Cells[j,i]:=IntToStr(Arr[i-1,j-1]);
End;
Не забудь вставить Finalize перед завершением программы.
0
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 91
16.09.2012, 20:15  [ТС]
Одиночка, Спасибо большое. Использовал твой код. Но теперь в Stringпrid не выводится числовой массив.
И еще, подскажи, пожалуйста, куда и как прописать Finalize.

Delphi
1
2
procedure Finalize(var Buffer):
procedure Finalize(var Buffer; Count: Integer);
У меня массив - с именем "mas", т.е. как указать что при выходе очистить память выделенную на данный массив.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
16.09.2012, 20:25
Просто, когда уже не собираешься работать с массивом пиши:
Delphi
1
Finalize(mas);
Может в событии OnClose формы. Массив у тебя, естественно, описан глобально.
а если тебе достаточно вывести данные в грид - можешь описать его локально в этой процедуре заполнения, и в конце неё поставить эту команду.
Чего не заполняет сейчас проверю.
0
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 91
16.09.2012, 20:28  [ТС]
Одиночка, Спасибо большое. в Stringпrid некорректно выводится числовой массив рандомно созданный ранее. Когда программа сопоставляет (копирует, отображает) из ранее созданного массива данные из ячеек то она все пытается записать значения из них в фиксированные ячейки компонента StringGrid.

При рандомном заполнении массива, как указать что можно записывать только целые положительные и отрицательные числа?

Прошу помощи...

Delphi
1
2
3
4
5
Begin
for i:=1 to n+1 do //Цикл по строкам;
for j:=1 to m+1 do //Цикл по столбцам;
StringGrid1.Cells[j,i]:=IntToStr(Arr[i,j]);
end;
Вот весь код:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
procedure TForm1.Button1Click(Sender: TObject);
 
var
  Arr:array of array of integer;
  i,j,n,m, num:integer;
  c,c1 : Char;
  b : Boolean;
begin
 
n:=SpinEdit1.Value; // Количество строк массива;
m:=SpinEdit2.Value; // Количество столбцов массива;
SetLength(Arr,n,m); //Определение размерности Arr = Array[0..n-1,0..m-1];
  Begin
  for i:=0 to n-1 do
  for j:=0 to m-1 do
  Arr[i,j]:=Random(1000000);
  End;
 
StringGrid1.RowCount:=n+1; //+1 Пропуск фиксированных ячеек строк;
StringGrid1.ColCount:=m+1; //+1 Пропуск фиксированных ячеек столбцов;
 
//Заполнение фиксированной строки;
c:='a'; c1:='a'; b:=False;
  For i:=1 To StringGrid1.ColCount-1 Do
  Begin
    StringGrid1.cells[i,0]:=c;
    If b Then
    Begin
       StringGrid1.cells[i,0]:=c+c1;
       c1:=Succ(c1);
       If c1>'z' Then
       Begin
          c1:='a';
          c:=Succ(c);
       End;
    End Else
    Begin
      c:=Succ(c);
      If c>'z' Then
      Begin
         b:=True;
         c:='a';
      End;
    End;
  End;
 
 
//Заполнение фиксированного столбца;
Begin
For i:=1 To StringGrid1.RowCount-1 Do
StringGrid1.cells[0,i]:=IntToStr(i);
end;
 
Begin
for i:=1 to n+1 do //Цикл по строкам;
for j:=1 to m+1 do //Цикл по столбцам;
StringGrid1.Cells[j,i]:=IntToStr(Arr[i,j]);
end;
end;
end.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
16.09.2012, 20:38
У тебя и так будут только целые положительные числа. Потому, что Random(x) даёт значение от 0 до x-1. Просто ты не скопировал заполнение из моего кода. У меня мой код отлично заполняет. Пробовал на 1000 строк и 500 столбцов.
Delphi
1
2
3
4
  for i:=1 to n do //Цикл по строкам;
  for j:=1 to m do //Цикл по столбцам;
  StringGrid1.Cells[j,i]:=IntToStr(Arr[i-1,j-1]);
  Finalize(Arr); //И в конце делаем освобождение памяти
У тебя, скорее всего, программа вылетает при обращении к памяти за пределами массива. Обрати внимание, какая индексация массива будет при таком определении.
0
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 91
16.09.2012, 20:47  [ТС]
Одиночка, Снова выручил. Спасибо.

1. Но можно же рандомно в перемешку в массиве получить отрицательные и положительные числа?
2. В компоненте StringGrid можно кликнув мышью на ячейку с данными выделялась как ячейка так и порядковый номер строки и столбца? Может это есть в свойствах компонента?
3. Посоветуй в случае необходимости вывода сгенерированного массива в файл, то лучше использовать функцию записи в *.txt или экспорт в Excel?
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
16.09.2012, 21:01
1. Пиши, например: Random(10000)-5000; - будет от -5000 до 4999.
2. В свойстве Options грида установить флаг goRowSelect = True. При щелчке на любой ячейке - будет выделяться вся строка.
3. Что лучше - не знаю. С экспортом в Exel не работал.
0
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 91
16.09.2012, 21:03  [ТС]
Заметил такое что при вводе границ массива 0x0 или при вводе количество столбцов=0, то в stringrid фиксированные строки и столбцы при последующих заданных границ >0 становятся не фиксированными и теряют свой фон (сливаются с ячейками и данными в них из массива). Помогает только перезапуск программы.
0
 Аватар для Одиночка
3944 / 1869 / 337
Регистрация: 16.03.2012
Сообщений: 3,880
16.09.2012, 21:06
Заметил такое что при вводе границ массива 0x0 или при вводе количество столбцов=0
Ну так что, не можешь вставить проверку на некорректность размерности? Выдавай при этом сообщение:
'Вы что, издеваетесь?'
0
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 91
16.09.2012, 22:26  [ТС]
Вообще я думал ты просто подтвердишь то что при 0Х0 какое-то свойство данного компонента изменяется. Ну да лан.)
goRowSelect = True - выделяет только всю строку. А нельзя ли выделить еще столбец?
Т.е. свойствами компонента нельзя, опять же, как в Excel выделить только 3ячейки: ячейку выбранную + ячейку с порядковым номером строки + ячейку с порядковым номером столбца?

За ранее благодарен.

Добавлено через 25 минут
Подскажи, пожалуйста, еще пару вопросов:

1. Поставил проверку на n<0, m<0, n=0 and m=0 с выводом сообщения некорректности ввода размерности массива. В свойствах компонента StringGrind установил Visible:=False;
В случае правильного ввода размерности массива выполнить следующее..... + StringGrid1.Visible:=True;
Но даже после ввода 0х0, 0х1, 1х0 - выводится предупреждение, массив не создается, но появляется пустой (с одной фиксированной строкой и с столбцом) компонент StringGrid. Может что-нибудь посоветовать?

2. Можно ли сделать авто-размер формы программы:
2.1. При раскрытии формы на все окно - разносить элементы формы относительно увеличенной "рабочей" части формы (извини, не знаю как правильно это называется);
2.2. При запуске программы форма уменьшена, но при клике, например, на кнопку и создании массива - увеличить форму и добавить (вывести) компонент StringGrid.

Добавлено через 43 минуты
3. Использую компонент CheckBox объединенных в GroupBox. Подскажите, как сделать логику... при активации одного CheckBox не давать выбрать другой CheckBox в пределах одного и нескольких GroupBox (деактивируя его,затемняя его - даже если у него до этого стаял флажок активирован)? Знаю что можно для этих целей использовать другой компонент Delphi.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33419 / 21526 / 8239
Регистрация: 22.10.2011
Сообщений: 36,932
Записей в блоге: 12
16.09.2012, 22:33
Jil, а давай ты эти вопросы задашь в отдельных темах? Не надо делать свалку "обо всём и ни о чем". Тем более, что и Правило форума 5.16 говорит об этом
0
0 / 0 / 2
Регистрация: 12.09.2012
Сообщений: 91
17.09.2012, 05:51  [ТС]
UI, А может можно на эти вопросы получить ответы здесь, а если другие возникнут вопросы, то для них обязательно создам отдельные темы?)

Добавлено через 7 часов 14 минут
Подскажите, как записать многомерный массив в файл в виде таблицы или импортировать его в Excel.

Delphi
1
2
3
4
5
6
7
8
9
Begin
     AssignFile(F,'Array.txt');
     Rewrite(F);
      for i:=0 to n-1 do
      for j:=0 to m-1 do
      Write(F,Arr[i,j],'; ');
      Writeln(F);
      CloseFile(F);
End;
Чего-то не хватает в коде. Как-то должно быть распознавание конца строки массива и переход на новую строку.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.09.2012, 05:51
Помогаю со студенческими работами здесь

Запись многомерного массива в нетипизированный файл
Собственно как? Ну и чтобы потом его считать оттуда можно было.. Перебором всех значений через for както не охота. Про одномерный...

Создание многомерного массива
Создать многомерный массив 4x3 элементов. по данному примеру. Пример. #include &lt;stdio.h&gt; main() { Int mas; /* создаём...

Создание многомерного массива
Создать многомерный массив я смог, но как создать его такого вида? public class НовыйClass { public static void...

Создание многомерного массива
Здравствуйте. Подскажите пожалуйста, возможно ли в php такое? есть массив и переменная $path = array('body','text','t'); ...

Создание многомерного массива в JS
можно ли создать в JS массив без муторного описания типа: price_array = new Array(1,2); price_array = new Array(1,2); price_array =...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru