Форум программистов, компьютерный форум, киберфорум
Free Pascal
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/274: Рейтинг темы: голосов - 274, средняя оценка - 4.94
1 / 3 / 4
Регистрация: 02.07.2011
Сообщений: 90
1

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

11.09.2011, 20:32. Показов 50925. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Хеллоу, помогите, пожалуйста, написать программу, создающую динамический массив размером, указанным пользователем, и заполняющую его числами от 1 до размера массива.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2011, 20:32
Ответы с готовыми решениями:

Передача массива данных в Excel или создание двумерного динамического массива
Нашел на просторах вот такое: Dim oExcel As Object Dim oBook As Object Dim oSheet As...

Создание динамического массива
Добрый день! Хочу выделить память под массив, только после того как буду знать его длину. Длину...

Создание динамического массива
Добрый вечер! Подскажите пожалуйста, что необходимо сделать, чтобы заменить статический массив...

Создание динамического массива
Первое задание помогите пожалуйста.

18
Почетный модератор
64301 / 47596 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
11.09.2011, 20:43 2
Лучший ответ Сообщение было отмечено как решение

Решение

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
uses crt;
var a:array of integer;
    n,i:integer;
begin
clrscr;
write('n=');
readln(n);
setlength(a,n);
for i:=0 to n-1 do
 begin
  a[i]:=i+1;
  write(a[i],' ');
 end;
readln
end.
4
1 / 3 / 4
Регистрация: 02.07.2011
Сообщений: 90
11.09.2011, 21:22  [ТС] 3
А что означает uses crt и clrscr?
0
Почетный модератор
64301 / 47596 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
11.09.2011, 21:25 4
Crt модуль для работы с экраном и клавиатурой? clrscr процедура из этого модуля, очищает экран.
Не нравится, убери обе строки.
1
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
11.09.2011, 23:39 5
Лучший ответ Сообщение было отмечено как решение

Решение

В FP можно обращаться с указателями точно так же, как и в языке C. Поэтому можно сделать ещё и так
Pascal
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
program test;
 
{$mode fpc}
 
var
  n: integer;
  i: integer;
  a: pinteger; // указатель целого типа
begin
  Write('Input n: ');
  ReadLn(n);
 
  // выделям область памяти достаточную для хранения n элементов типа integer
  GetMem(a, n * sizeof(integer)); 
 
  // заполняем массив цифрами от 1 до n(индексация в динамическом массиве начинается с 0)
  for i:= 0 to n-1 do
    a[i]:= i+1;
  
  // выводим массив на экран
  for i:= 0 to n-1 do
    WriteLn(a[i]); // можно записать и так WriteLn((a+i)^);
 
  // освобождаем память
  FreeMem(a);
 
  ReadLn;
end.
для двумерного динамического массива M*N всё немного сложнее, сначало нужно выделить память под M указателей, а затем выделить память для каждого из них, как для одномерного массива из N элементов. Освобождение памяти происходит в обратном порядке, сначала освобождается каждый из одномерных массивов, а затем и массив указателей.
Pascal
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
program prog;
 
{$mode fpc}
 
var
  m, n: integer;
  i, j: integer;
  // чтобы перемещаться по массиву из целых чисел нужен указатель,
  // а для чтобы премещаться по массиву указателей на целые числа нужен указатель на указатель )
  a: ^pinteger;
begin
  Write('Input m: ');
  ReadLn(m);
 
  Write('Input n: ');
  ReadLn(n);
 
  // выделяем память
  GetMem(a, m * sizeof(integer));
  for i:= 0 to m-1 do
    for j:= 0 to n-1 do
      GetMem(a[i], n * sizeof(integer));
 
  // заполняем массив случайными числами
  Randomize;
  for i:= 0 to m-1 do
    for j:= 0 to n-1 do
      a[i][j]:= Random(10);
 
  // выводим на экран
  for i:= 0 to m-1 do begin
    for j:= 0 to n-1 do
      Write(a[i][j]:4);
    WriteLn;
  end;
 
  // освобождаем память
  for i:= 0 to m-1 do
    FreeMem(a[i]);
  FreeMem(a);
 
  ReadLn;
end.
3
Почетный модератор
64301 / 47596 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
12.09.2011, 06:39 6
И в Турбо Паскале можно сделать также, только с помощью типизированных указателей.
Например вот здесь.
Замените нулем все элементы, предшествующие первому нечетному отрицательному числу
1
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
12.09.2011, 10:57 7
Да, но в TP это скорее некий трюк, чем встроенная возможность
0
Почетный модератор
64301 / 47596 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
12.09.2011, 11:08 8
Что поделаешь, таков уж ТП, зато думать учит как обойти препоны, студенты, работающие в Делфи с набором кнопок и кучей функций, не прошедшие школу Паскаля, вообще мало кто думать умеет.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
10.05.2012, 00:27 9
У меня, кстати говоря, ошибка во втором листинге. В 19-ой строке выделяется память под массив указателей, поэтому вместо
Pascal
1
GetMem(a, m * sizeof(integer));
должно быть
Pascal
1
GetMem(a, m * sizeof(pinteger));
0
7 / 7 / 0
Регистрация: 13.08.2012
Сообщений: 250
02.07.2013, 09:39 10
Хочу проверить, чему равно значение в массиве указателей по умолчанию, но происходит что-то не то.
Пишу:
Pascal
1
2
3
4
5
6
7
type pnode = ^integer;
var list: array of pnode;
begin 
    list[0] := nil; //опционально
    if list[0] = nil then writeln ('yeah');
    readln;
end.
При запуске окно сразу закрывается.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
32850 / 21185 / 8150
Регистрация: 22.10.2011
Сообщений: 36,437
Записей в блоге: 8
02.07.2013, 12:31 11
Не надо пытаться обращаться к элементу массива, пока ты не выставил его размер. В тот момент, когда ты обращаешься к list[0], этот элемент еще не существует.

Смотри:
Создание динамического массива


И что произойдет при попытке разыменования nil-а?
1
7 / 7 / 0
Регистрация: 13.08.2012
Сообщений: 250
02.07.2013, 13:46 12
Всё понял. Не обратил внимания на setlength().
Спасибо.
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
27.10.2016, 00:56 13
А что бы Ramdom заполнялся от 0 до 1?
а размер задается пользователем.
0
Почетный модератор
64301 / 47596 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
27.10.2016, 07:01 14
Pascal
1
2
3
4
5
6
7
var n,i:integer;
     a:array[1..100] of real;
begin
wite('n=');
readln(n);
for i:=1 to n do
a[i]:=random;
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
27.10.2016, 10:02 15
Pascal
1
2
3
4
5
6
7
var n,i:integer;
a:array[1..100] of real;
begin
wite('n=');
readln(n);
for i:=1 to n do
a[i]:=random;
размер задается с клавиатуры,а заполняется рандомно числами от 0 до 1
0
Почетный модератор
64301 / 47596 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
27.10.2016, 10:11 16
Что еще не так?
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
28.10.2016, 02:43 17
вот это не так
и просьба заменить массив на список
Создание динамического массива

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Program HELLO; 
 
uses crt,math;
var 
    a:array[1..100] of real;
    n,i:integer;
begin
clrscr;
write('Ведите к-во елементов массива n=');
readln(n);
setlength(a,n);
for i:=0 to n do
 begin
a[i]:=random;
 end;
readln ;
end.
0
25 / 9 / 17
Регистрация: 22.12.2015
Сообщений: 2,097
28.10.2016, 03:14 18
Ошибка кода 217
компилируется без ошибок
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Program HELLO; 
 
uses crt,math;
var 
    a:array  of real;
    n,i:integer;
    
    
begin
clrscr;
write('Ведите к-во елементов массива n=');
readln(n);
setlength(a,n);
 
 
Randomize;
for i:=0 to n do
 begin
a[i]:=random;
write(a[i],' ');
 end;
readln 
end.
Создание динамического массива
0
Модератор
Эксперт Pascal/DelphiЭксперт NIX
7774 / 4602 / 2825
Регистрация: 22.11.2013
Сообщений: 13,083
Записей в блоге: 1
30.10.2016, 18:22 19
scherbakovss201,
глазки разуйте, книжек почитайте, не применяйте SetLength к статическому массиву...

Добавлено через 1 минуту
Не стоит некропостить.
0
30.10.2016, 18:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2016, 18:22
Помогаю со студенческими работами здесь

Создание динамического массива
Как создать динамически массив размера n если n вводиться с клавиатуры. А еще и двумерный cin>>n...

Создание динамического массива
Доброго времени суток. Как правильно создать что-то подобное? Чё-т не очень получается void...

Создание динамического массива
const int Num=5; const int SIZE=4096 * Num; SHORT Buf; как такое заменить, если Num-...

Создание динамического массива
Объявите указатель на массив типа double и предложите пользователю выбрать его размер. Далее...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru