Projekt Macierze – wskazanie kolumny o największej sumie kodów

0

Hej, robię swój pierwszy projekt w Pascalu i w jednym punkcie mam problem. Mianowicie mam zrobić "wskazanie kolumny o największej sumie kodów". Jest to macierz 6x6 a mój program jak na razie wygląda tak:

program macierz;

{$mode objfpc}{$H+}

uses
  {$IFDEF UNIX}{$IFDEF UseCThreads}
  cthreads,
  {$ENDIF}{$ENDIF}
  Classes
  { you can add units after this };

type
   Macierze = array [1..36] of char;

procedure losoweGenerowanie(var macierz: Macierze);
var i: integer;
begin
    For i:=1 to 36 do
    begin
       macierz[i]:= chr(Random(255)); //funkcja chr zmienia liczbe na znak
    end;
  end;

procedure wyswietlanie(var macierz: Macierze);
var i,n: integer;
begin
    For n:=1 to 6 do
    begin;
      For i:=1 to 6 do
      begin
         write(macierz[(n-1)*6+i]);
         write(' ');
      end;
    writeln();
    end;
    end;

procedure sumaLiczb(var macierz: Macierze);
var i, j: integer;
begin
j:=0;
    For i:=1 to 36 do
    begin
    j:=j+ord(macierz[i]);
    end;
    writeln(j);
  end;

procedure slowoZglownej(var macierz: Macierze);
var i:shortstring;
      begin
     i:=macierz[1]+macierz[8]+macierz[15]+macierz[22]+
     macierz[29]+macierz[36];
     writeln(i);
     end;

  procedure ileNieLiterCyfr(var macierz: Macierze);
  var i, d, p: integer;
begin
    p:=0;
      for i:=1 to 36 do
      begin
      d:=ord(macierz[i]);
     if ( d > 47) and(d < 58 )or (d > 64)and (d < 91)or (d > 96) and (d < 123 )
     then p:=p+1;
     end;
      p:=36-p;
     writeln(p);
     end;



var acierz : Macierze;
  Begin

  Randomize;
  losoweGenerowanie(acierz);
  wyswietlanie(acierz);
  sumaLiczb(acierz);
  slowoZglownej(acierz);
  ileNieLiterCyfr(acierz);
  readln();
end.

Mógłby ktoś tę procedurę napisać?
Dzięki z góry

1
bbr napisał(a):

Mianowicie mam zrobić "wskazanie kolumny o największej sumie kodów". Jest to macierz 6x6 […]

Nie, to nie jest macierz 6x6, a 1x36. Deklaracja macierzy 6x6 wygląda tak:

type TMatrix = array [0 .. 5, 0 .. 5] of Char;

ewentualnie:

type TMatrix = array [1 .. 6, 1 .. 6] of Char;

Użyj więc odpowiedniego typu danych.


Edit: Dla wyjaśnienia – jeśli chce się móc traktować macierz jako jednowymiarową i dwuwymiarową (w zależności od potrzeb), bez konieczności kopiowania danych i innych dziwnych czynności, wystarczy zadeklarować sobie dwa typy danych:

const
  MATRIX_DIM = 6;

type
  TMatrix1D = array [0 .. MATRIX_DIM * MATRIX_DIM - 1] of Char;
  TMatrix2D = array [0 .. MATRIX_DIM - 1, 0 .. MATRIX_DIM - 1] of Char;

Niech ten pierwszy będzie typem używanym w większości przypadków, a ten drugi jako pomocniczy. Deklarujemy zmienną o typie podstawowym, czyli w tym przypadku jako macierz jednowymiarowa:

var
  Matrix: TMatrix1D;

Używamy jej wszędzie. Jeśli jakakolwiek procedura ma pobierać w parametrze referencję do tej macierzy, deklarujemy odpowiedni parametr o takim samym typie, czyli TMatrix1D. Jeśli któraś z procedur potrzebuje potraktować macierz z parametru jako dwuwymiarową, wystarczy skorzystać z absolutowania:

procedure Foo(var AMatrix: TMatrix1D);
var
  LMatrix: TMatrix2D absolute AMatrix;
begin
  // tu używamy LMatrix
end;

Dzięki zmiennej LMatrix możemy traktować macierz z parametru w odmienny sposób (tu: dwuwymiarowy). Zmienna ta jest – w pewnym sensie – wyłącznie aliasem parametru, więc nie zostaje dla niej przydzielona dodatkowa pamięć.


Edit2: Innym sposobem jest deklaracja macierzy jako variant record. Rozmiar kontenera nie urośnie, a z drugiej strony, składnia stanie się czytelna dla każdego przypadku. Przykładowa deklaracja ”polimorficznej” macierzy:

type
  TPolymorphicMatrix = packed record
    case Integer of
      0: (As1D: array [0 .. 7] of Char);
      1: (As2D: array [0 .. 1, 0 .. 3] of Char);
      2: (As3D: array [0 .. 1, 0 .. 1, 0 .. 1] of Char);
  end;

W zależności od przypadku, możemy uzyskać dostęp do pamięci używając składni dla macierzy jednowymiarowej, dwuwymiarowej lub trójwymiarowej. Czyli dostępne są poniższe zapisy:

var
  Matrix: TPolymorphicMatrix;

{..}

Matrix.As1D[0]       := 'f';  // jako macierz 1D
Matrix.As2D[1, 2]    := 'p';  // jako macierz 2D
Matrix.As3D[1, 0, 1] := '!';  // jako macierz 3D

Pełne demo tutaj – https://ideone.com/TY0BPg

1 użytkowników online, w tym zalogowanych: 0, gości: 1