T Pascal, procedura szykająca min macierzy 2x


(underface) #1

mam problem z procedurą nowy_wektor, która utworzy wektor B zawierajacy wartosci minimalne dla poszczegolnych wierszy macierzy A.

Oto cały program

program zestaw_2;

{napisz program, ktory dla macierzy A (4x4) liczb rzeczywistych wykona następujące czynnosci:

a) zastąpi elementy glownej przekatnej macierzy wartoscia maksymalna dla kolumny 4,

b) utworzy wektor B zawierajacy wartosci minimalne dla poszczegolnych wierszy macierzy A.

Macierz powinna byćy wypełniona przez uzytkownika (dane podane z klawiatury). Wykorzystaj funkcje/procedury}

{$APPTYPE CONSOLE}

uses

  SysUtils;


{tworzenie nowych typów}

type

macierz = array [1..4, 1..4] of real;

wektor = array [1..4] of real;


{zmienne globalne}

var

A,Nowa:macierz;

B:wektor;



{procedury i funkcje}


{procedura wczytująca dane do macierzy}

procedure wczytaj (var X:macierz);

  var i,j:integer;


  begin

    writeln ('Podaj odpowiednie wartosci dla macierzy A');

    writeln ('nacisnij ENTER aby rozpocząc');

    readln;

    for i:=1 to 4 do

      for j:=1 to 4 do

        begin

          write ('A[',i,',',j,']=');

          readln (X[i,j]);

        end;

  end;


{funkcja szukajaca maksymalnej wartosc kolumny 4}

function maks(X:macierz):real;

  var i:integer;

      z:real;

  begin

    Z:=X[i,4];

    for i:=1 to 4 do

      if z< x[i,4] then z:=X[i,4];

      maks:=z;

  end;


{procedura zamieniająca przekatna macierzy A maksymalna wartoscia kolumny 4}

procedure zamien (X:macierz; var Y:macierz);

  var i,j:integer;

      maksymalna:real;

  begin

  maksymalna:=maks(x);

    for i:=1 to 4 do

      for j:=1 to 4 do

        if i=j then Y[i,j]:=maksymalna else

          Y[i,j]:=X[i,j];

  end;


{procedura tworzaca wektor B z minimalnych wartosc poszczegolnych wierszy macierzy A}

procedure nowy_wektor (X:macierz; var W:wektor);

  var i,j:integer;

      min:real;


  begin

    min:=X[1,1];

    for i:=1 to 4 do

      for j:=1 to 4 do

        begin

          if min > X[i,j] then min:=X[i,j];

          W[i]:=min;

        end;

  end;


  {procedura wyswietlająca macierz}

  procedure wyswietl_m (X:macierz);

    var i,j:integer;

    begin

    writeln ('Nowa macierz');

      for i:=1 to 4 do

        for j:=1 to 4 do

          writeln (X[i,j]:5:5);

    end;

  {procedura wyswietlająca wetkor}

procedure wyswietl_w (w:wektor);

    var i:integer;

    begin

      writeln ('wektor B');

      for i:=1 to 4 do

         writeln (w[i]:5:5);

    end;




begin

  { TODO -oUser -cConsole Main : Insert code here }

  wczytaj (A);

  zamien(A,Nowa);

  nowy_wektor (A,B);

  wyswietl_m (Nowa);

  wyswietl_w (B);

  readln ;

end.

(Marcin 110) #2
procedure nowy_wektor (X:macierz; var W:wektor);

var i,j:integer;

   min:real;


begin

   { min:=X[1,1]; } { >----+ }

   for i:=1 to 4 do { | }

   begin { | }

      min:=X[i,1]; { <-----+ tu przestawic}

      for j:=2 to 4 do

      begin

         if min > X[i,j] then min:=X[i,j];

         W[i]:=min;

      end;

   end;

end;

Radzę zdefiniować jakąś stałą, np. N = 4 i wyrzucić wszystkie pozostałe '4' z kodu. Niepotrzebnie kopiujesz macierz X, zamiast tego możesz zrobić podobnie jak z przekazywaniem przez var, ale możliwości zmiany, czyli "const X:macierz".

EDIT:

Poprawiłem, coby widoczność była lepsza :wink:


(underface) #3

co przestawić bo nie rozumiem skąd się to tam wzieło :smiley: