PDA

Просмотр полной версии : помогите разобраться с динамическими массивами



kai.nbt
07.05.2007, 14:29
здравствуйте,товарищи!:)
задача такая:дан массив C произвольной длины N, нужно сделать новый массив P из C, чтобы каждый его элемент равнялся сумме всех предыдущих элементов массива C.как это сделать я знаю,но не знаю как описать "произвольную длину N".
помогите пожалуйста!;) заранее спасибо!

Колядин Максим
07.05.2007, 15:22
var m: array [1..32767] of integer;
n,i: integer;
begin
readln(n);
for i:= 1 to n do
...
...
end.

Колядин Максим
07.05.2007, 15:37
Если нужен, то вот полный код программы:


var c,p: array [1..10000] of integer;
n,i,j,sum: integer;
begin
readln(n); {размер массива}
for i:= 1 to n do readln(c[i]);
for i:= 1 to n do begin
sum:=0;
for j:= 1 to i do sum:=sum+c[j];
p[i]:=sum;
end;
end.

BBB
07.05.2007, 16:25
Колядин Максим,
А если пользователь укажет n > 10000 ??

Может, лучше воспользоваться динамическим выделение памяти через GetMem ?

BBB
07.05.2007, 16:32
for i:= 1 to n do begin
sum:=0;
for j:= 1 to i do sum:=sum+c[j];
p[i]:=sum;
end;
И, поскольку для каждого I (2 < I <= N) выполняется:
P [I] = Сумма (C[1] + ... C[I-1] ), то
справедливо равенство:
P [I + 1] = Сумма (C[1] + ... C[I-1] + C[I] ) = Сумма (C[1] + ... C[I-1]) + C[I] = P [I] + C [I]

И алгоритм можно соптимизировать:


P [i] = 0;
for i:= 2 to N do begin
P [I] = P [i - 1] + C [i - 1];
end;

somewhere
08.05.2007, 10:06
for i:= 1 to n do readln(c[i]);

А если пользователь укажет n > 10000 ??
Ага, и прикинь их потом все забивать? :-))

Хыиуду
08.05.2007, 10:23
Если это Дельфи - лучше использовать setlength(c,N);

kai.nbt
08.05.2007, 11:21
Колядин Максим,
А если пользователь укажет n > 10000 ??

Может, лучше воспользоваться динамическим выделение памяти через GetMem ?

спасибо за совет!только я не знаю как это)
а можно ввести размерность матрицы в режиме диалога?то есть вводишь N и создается матрица NxN.
п.с. это не дельфи:( а паскаль

kai.nbt
08.05.2007, 11:51
Если нужен, то вот полный код программы:


var c,p: array [1..10000] of integer;
n,i,j,sum: integer;
begin
readln(n); {размер массива}
for i:= 1 to n do readln(c[i]);
for i:= 1 to n do begin
sum:=0;
for j:= 1 to i do sum:=sum+c[j];
p[i]:=sum;
end;
end.


Большое спасибо!:) я наверное так и сделаю.только array[1..65535] сделаю,ибо препод урод,может и заставить


Ага, и прикинь их потом все забивать? :-))

:D

BBB
08.05.2007, 12:12
спасибо за совет!только я не знаю как это)
а можно ввести размерность матрицы в режиме диалога?то есть вводишь N и создается матрица NxN.Вроде, изначально решь шла об одномерном массиве?

kai.nbt
08.05.2007, 12:26
Вроде, изначально решь шла об одномерном массиве?

да.но разницы нет) так можно сделать так,чтобы при вводе N в режиме диалога СОЗДАВАЛСЯ массив(все равно сколько-мерный)с размерностью N?:)
И вот еще вопрос: мне друг дал код, который почему-то не работает, хотя сделал вроде все по лекции. Выдает ошибку Invalid Qualifier, что там не так?
Прога ищет максимальное значение в массиве, и набивает другой массив номерами элементов, равных максимальному.
вот код:

Procedure CreateMassive (var B;N:integer;var C;k:integer);
Type vector=array [1..100] of real;
var i:integer;
Max:real;
Begin
Max:=Vector(B[1]); <- в этой строке
For i:=1 to N do
if Max<Vector(B[i]) then Max:=Vector(B[i]);
k:=0;
For i:=1 to N do
If Vector(B[i])=Max then
begin
k:=k+1;
Vector(C[k]):=i;
end;
End;

Заранее еще раз спасибо:)

BBB
08.05.2007, 13:17
kai.nbt,
Если создавать массив динамически разница есть.
Принцип такой. Объявляется указатель на "большой массив":


type tHugeArray : array [1..32767] of integer;
pDynamicArray : ^tHugeArray;

Затем, когда пользователь укзал размерность N, выделяешь сколько нужно памяти динамически:

pDynamicArray := GetMem (N * SizeOf (pDynamicArray^[1]));

(При этом еще надо помнить, что в Pascale ограничение: одним оператором GetMem нельзя выделить памяти больше 64 Kb)

Для двумерного массива ты не сможешь объявить такой "обстрактрный тип" и затем выделить ДВУМЕРНЫЙ массив. Хотя это можно смоделировать логически. Ведь что такое двумерный массив MxN ? Это те же (M * N) ячеек памяти, просто ты адресуешься к ним не "подряд" (одним инндексом), а двумя.

То есть, если пользоваель задал M и N, то можно выделить динамически одномерный массив:

pDynamicArray := GetMem (M * N * SizeOf (pDynamicArray^[1]));

А затем адресоваться к "логическому" элементу A [i][j] как:
pDynamicArray [(i - 1) * M + j]


Invalid qualifier потому, что переменная B - параметр без типа, а в той строке попытка обратиться к ней как к массиву.

Колядин Максим
08.05.2007, 14:37
Вроде, изначально решь шла об одномерном массиве?
А где ты увидел здесь двумерный массив?

Naeel Maqsudov
08.05.2007, 23:46
Для Delphi
См. справку по теме Dynamic arrays. Там есть примеры.


var
A: array of Integer;
n:integer;
begin
n:=strtoint(inputbox('Введите N','Введите N',''));
SetLength(A, N);
for i:=0 to pred(n) do begin
A[i]:=.......;
.....
end;
end;

Naeel Maqsudov
09.05.2007, 00:01
Для Pascal

BBB уже привел пример с GetMem. Остается только добавить, что для того, чтобы не смущало 32768 ставят 0..0, но выключают опцию компилятора Range Checking.



type
{$R-}
TDinArrayItem = Integer;
TDinArray = array[0..0] of TDinArrayItem;
PDinArray = ^TDinArray;
var
DinArray : PDinArray;
i, n : integer;
begin
Readln(n);
GetMem(DinArray, n*sizeof(TDinArrayItem));
for i:=0 to pred(n) do begin
DinArray^[i]:=......;
......
end;
end.

BBB
10.05.2007, 09:39
А где ты увидел здесь двумерный массив?
Вот тут вот:
а можно ввести размерность матрицы в режиме диалога?то есть вводишь N и создается матрица NxN.

BBB
10.05.2007, 09:42
Для Pascal

BBB уже привел пример с GetMem. Остается только добавить, что для того, чтобы не смущало 32768 ставят 0..0, но выключают опцию компилятора Range Checking.Можно диапазон индексов обявить и 1..1, если кто привык считать элементы от 1, а не от 0. (Иногда, таки, это удобнее)

TDinArray = array[1..1] of TDinArrayItem;