Показать сообщение отдельно
  #2  
Старый 26.09.2010, 03:17
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Дяденька, за готовыми решениями вам в другой раздел - Работа.

Задачи 1-4 на массивы и циклы,
Задача 5 на простую графику,
Задача 6 на связанный список на указателях.
Все достаточно стандартные.
Единственная интересная задача - задача 4.
И то, только если рассматривать алгоритм навигации на массиве.

Задача 4 решается примерно так:
Код:
procedure TForm1.FillArray(N : Integer);
var
  A : Array Of Array Of Integer;
  I, J : Integer;
  dI, dJ : Integer;
  V : Integer;
begin
  // Create array
  SetLength(A,N);
  For I := Low(A) To High(A) Do
    SetLength(A[i],N);

  // Init array
  For I := Low(A) To High(A) Do
    For J := Low(A[i]) To High(A[i]) Do
      A[I,J] := 0;

  // Fill array
  I := Low(A); J := Low(A[i]);
  dI := 1; dJ := 0;
  V := 1;
  A[I,J] := V;
  While V <= N*N Do
    Begin
      A[I,J] := V;
      If Abs(dI) = 1
        Then
          Begin
            If dI = 1 Then
              Begin
                If (I + dI > High(A)) Or (A[I + dI, J + dJ] <> 0)
                  Then
                    Begin
                      dJ := 1;
                      dI := 0;
                    End;
              End
            Else
              Begin
                If (I + dI < Low(A)) Or (A[I + dI, J + dJ] <> 0) Then
                  Begin
                    dJ := -1;
                    dI := 0;
                  End;
              End;
          End
        Else
          Begin
            If dJ = 1 Then
              Begin
                If (J + dJ > High(A[i])) Or (A[I + dI, J + dJ] <> 0)
                  Then
                    Begin
                      dI := -1;
                      dJ := 0;
                    End;
              End
            Else
              Begin
                If (J + dJ < Low(A[i])) Or (A[I + dI, J + dJ] <> 0) Then
                  Begin
                    dI := 1;
                    dJ := 0;
                  End;
              End;
          End;
      I := I + dI;
      J := J + dJ;
      Inc(V);
    End;

  // Print array
  StringGrid1.ColCount := N;
  StringGrid1.RowCount := N;
  For I := 0 To N-1 Do
    For J := 0 To N-1 Do
      StringGrid1.Cells[I,J] := InttoStr(A[I,J]);

end;
Решение на граничных условиях.
Наверное, можно решить красивее, но пока не могу придумать. Кстати, данному алгоритму пофиг, четная размерность матрицы или нет.
Ответить с цитированием