![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
динамический двумерный массви [D7, D2005, 2003]
Std © (2006-04-08 18:48:00)
uses
SysUtils;
var
arr:array of array of string;
r,i,j,n,q:integer;
str:string;
begin
randomize;
q:=1;
n:=0;
for I:=0 to 10 do
begin
r:=random(2);
if r<1 then
begin
SetLength(arr,10,q);
arr[i,n]:=inttostr(r);
inc(q);
inc(n);
end;
end;
for I :=0 to length(arr) do
begin
for j:= 0 to length('длинна подмасива') do
writeln(arr[j]);
end;
readln;
end.
вообщем нада создать массив массивов(двумерный массив) сколько в нем будет i-ых элементов известно(10), а вот сколько будет j-ых элементов заранее не известно. Вот чтото не могу я понять что и куда всунуть нада в код чтоб оно работало :(
Std (2006-04-09 00:43:00) [21]2Rial
не работает. так как StringList который содержит дату начала и дату конца недели в одной строке в виде 01.01.2006-07.01.2006
т.е. список имеет вид:
01.01.2006-07.01.2006
08.01.2006-14.01.2006
15.01.2006-21.01.2006
и т.д.
если не сложно подскажите пж как переделать что бы работало.
а то уже сил нет весь день сидеть над этим куском кода :((
Rial (2006-04-08 21:12:00) [22]
Type TArr=Array of Array of String;
function BuildSL(Out Arr:TArr;Const SL:TStringList;
Const FileName:String):Boolean;
{
SL - Тот самый список, в котором, однако, хнанятся только
даты окончания неделей.
В SL.Strings[0] хранится начальная дата.
}
Var FileSL:TStringList;//Данные фaйла
P,I,J,K,L,LL:Integer;
S:String;
begin
Result:=False;
FileSL:=TStringList.Create;
Try
Try
FileSL.LoadFromFile(FileName);
Except
Exit;
end;
FileSL.Sorted:=True;// =:= FileSL.Sort
L:=FileSL.Count;
LL:=SL.Count;
SetLength(Arr,L);
I:=0;
J:=0;
S:=SL.Strings[J];
While (I<=L-1)and(Copy(FileSL.Strings[I],1,10)<S)do
Inc(I);
While (I<=L-1)and(J<LL-1) do begin
P:=I;
Inc(J);
S:=SL.Strings[J];
While (P<=L-1)and(Copy(FileSL.Strings[P],1,10)<S)do
Inc(P);
If (P>I)then
SetLength(Arr[J-1],P-I);
For K:=0 to P-I-1 do
Arr[J-1][K]:=FileSL.Strings[I+K];
I:=P;
end;
SetLength(Arr,J-1);
Finally
FileSL.Free;
end;
Result:=True;
end;//BuildSL
Проверка:
Var SL:TStringList;
Arr:TArr;
begin
SL:=TStringList.Create;
Try
SL.LoadFromFile('2.txt');
BuildSL(Arr,SL,'1.txt');
Finally
SL.Free;
end;
<2.txt>
01.01.2006
03.01.2006
10.01.2006
10.04.2006
17.04.2006
<1.txt>
02.01.2006,слово1,слово2,слово3
03.01.2006,слово1,слово2,слово3
05.01.2006,слово1,слово2,слово3
10.04.2006,слово1,слово2,слово3
11.04.2006,слово1,слово2,слово3
12.04.2006,слово1,слово2,слово3
Все работает.
Std (2006-04-08 20:16:00) [23]Ладно, попробую обрисовать саму задачу, може подскажете какойто другой алгоритм ее решения...
есть файл в нем каждая строка имеет формат
Дата,слово1,слово2,слово3
есть StringList в котором каждая строка это дата_начала_недели-дата_конца_недели(чтото типа 01.01.2006-07.01.2006)
нада проверить весь файл и сгруппировать строки из файла по неделям
Например:
в файле есть строки:
02.01.2006,слово1,слово2,слово3
03.01.2006,слово1,слово2,слово3
05.01.2006,слово1,слово2,слово3
10.04.2006,слово1,слово2,слово3
11.04.2006,слово1,слово2,слово3
12.04.2006,слово1,слово2,слово3
нада чтобы в результате получился массив вида:
arr[0]
|
-->arr2[0]=02.01.2006,слово1,слово2,слово3
|
-->arr2[1]=03.01.2006,слово1,слово2,слово3
|
-->arr2[2]=05.01.2006,слово1,слово2,слово3
arr[1]
|
-->arr2[0]=10.04.2006,слово1,слово2,слово3
|
-->arr2[0]=11.04.2006,слово1,слово2,слово3
|
-->arr2[0]=12.04.2006,слово1,слово2,слово3
вот как раз згруппировать в такой массив и не получается.
Подскажите пж кто нибуть как делать
Std (2006-04-08 19:54:00) [24]Anatoly Podgoretsky
q это начальный размер второго массива.
большой массив указывается
SetLength(arr,10);
а q это уже начальный размер arr[0](маленького массива)
Rial
но тут же тоже приходится указывать размер AllocArray(Arr,[5,6,7,8]);
а я этого самог размера не знаю :(
Rial (2006-04-08 19:44:00) [25]program MyProject;
{$AppType Console}
Type MyType=Array of Array of String;
procedure AllocArray(Out Arr:MyType;
Const Sizes:Array of Integer);
Var I,L:Integer;
begin
L:=Length(Sizes);
SetLength(Arr,L);
For I:=0 to L-1 do
SetLength(Arr[I],Sizes[I]);
end;
Var Arr:MyType;
begin
Randomize;
AllocArray(Arr,[5,6,7,8]);
Arr[0,4]:='La-la !';
WriteLn(Arr[0,4]);
ReadLn;
end.
Anatoly Podgoretsky (2006-04-08 19:41:00) [26]q=1=одномерный массив
Std (2006-04-08 19:26:00) [27]ну q вроде как указывает сколько должно быть элементов в "маленьком" массиве. Если не правильно делаю подскажите пж как зделать правильно, а то уже пол дня сижу над этим массивом и ничерта н получается :(
Anatoly Podgoretsky (2006-04-08 19:21:00) [28]Зачем нужен двухмерный массив, если q=1?
Std (2006-04-08 19:18:00) [29]вот делаю вот так:
SetLength(arr,10);
n:=0;
q:=1;
for I:=0 to 9 do
begin
r:=random(2);
n:=0;
q:=1;
if r<5 then
begin
SetLength(arr[i],q);
arr[i,n]:=inttostr(r);
inc(q);
inc(n);
end;
end;
но добавляется оно вот так:
arr[0]
|
-->arr[0]=значение
arr[1]
|
-->arr[0]=пусто
|
-->arr[1]=значение
arr[2]
|
-->arr[0]=пусто
|
-->arr[0]=пусто
|
-->arr[1]=значение
такое впечетления что я не там делаю n:=0 q:=1
а куда его правильно всунуть не соображу никак :(
Std (2006-04-08 19:09:00) [30]в том то и дело что в var нада обявить только A:array of array of string;
а потом дальше уже указать размер большого массива, а потом размеры маленьких :(
begin...end (2006-04-08 18:58:00) [31]> нада создать массив массивов(двумерный массив) сколько в
> нем будет i-ых элементов известно(10), а вот сколько будет
> j-ых элементов заранее не известно.
var
A: array [1..10] of array of string;