Problem z losowaniem tablicy, norma macierzowa.

0

Witam.

Mam tablice n (rozmiar podany przez uzytkownika, tablica kwadratowa) elementowa, i musze wylosowac liczby, i do kazdego elementu powstawiac(1), nastepnie kazdy element podniesc do potegi(2), znaleŹĆ kolumne z najwyzsza srednia artmetyczna(3) i ja spierwiastkowac(4) Chcial bym robic to po kolei, i wypisywac tak jak ponumerowalem. Mam problem z losowaniem elementow, na razie chce uzupelnic tylko pierwszy wiersz, program sie kompiluje, ale podczs podania jakiejs wartosci dostaje "Program C:...\kam.exe exited with exitcode = 201"

program kam;

uses crt;

var
        tab : array of array of integer; //tablica dynamiczna
        n: byte; //rozmiar macierzy
        p: byte; //potega
        i: integer; //zmienna pomocnicza
        ran: integer; //losowana liczba
begin

        write('Podaj rozmiar tablic: ');
        readln(n); //wczytuje wielkosc tablicy
        SetLength(tab,n,n);
        Randomize;
        for i:=1 to n do

                begin
                ran:=(random(10)+1); //zakres od 1 do 10
                tab[1,i] :=tab[1,ran];
                end;

        readln;
end.
0

SetLength indeksuje od 0, a nie od 1

0

Zmienilem na i, j := 0, i troche dodalem do kodu, ale nadal ten sam blad. Jak zamienie dynamiczne tab, na stala i wszystkie n na 10, to zadziala. Czyli tak

 program kamila;

uses crt;

var
      //  tab : array of array of integer; //tablica dynamiczna
        n: byte; //rozmiar macierzy
        p: byte; //potega
        tab :array[1..10,1..10] of integer;
        i,j: integer; //zmienna pomocnicza
        ran: integer; //losowana liczba
begin

        write('Podaj rozmiar tablic: ');
        readln(n); //wczytuje wielkosc tablicy
     //   SetLength(tab,n,n);
        Randomize;
        for i:=1 to 10 do begin
                for j:=1 to 10 do begin
                                tab[i,j] :=random(10)+1;
                end;
        end;

        for i := 1 to 10 do begin
                for j:= 1 to 10 do begin
                        write(tab[i,j]:4);
                end;
                writeln;
        end;
        readln;
end.
0
 for i:=0 to n-1 do
0

Bardzo ladnie dziala, teraz sie zastanawiam nad potego, chyba nejlepiej bylo by wykozystac exp(a*ln(b) i dostane b^a. Niestety domyslam sie, ze trzeba dodac jakas bilioteke, pewnie Math. Ale uses Math nie chce zadzialac.

program bla;
begin
  writeln exp(5*ln(2);
end.
0

Zgubiłeś kilka nawiasów:

program bla;
begin
  writeln(exp(5*ln(2)));
end.
0

Wszytko idealnie, oprocz 1) potegowanie widze, ze do max 255 2) jedna postac a,b+E000x nie jest zbyt satysfkacjonujaca, jaki kolwiek typ zmiennej wpisze, i tak pokazuja taka postac, nie moge jakos jej do normalnej liczby przywolac, poza tym, jednak dziwnie liczy potegi. 7^2 powino dac 49 daje, 1.3E+0002 ew. moglo by dac 4,9E+xxx. ale dlaczego 13 ?

 Running "c:\fpc\2.4.2\bin\i386-win32\kam.exe "
Podaj rozmiar tablic: 5
Podaj potege:
2
Macierz wylosowana

   7   8   7   3   2

   4   4   2   7   9

   1   6  10   9   9

   2   3   3   1   7

   2  10   5   9   3

Macierz spierwiastkowana

 1.3E+0002 2.6E+0002 1.3E+0002 8.0E+0000 4.0E+0000
 1.6E+0001 1.6E+0001 4.0E+0000 1.3E+0002 5.1E+0002
 2.0E+0000 6.4E+0001 1.0E+0003 5.1E+0002 5.1E+0002
 4.0E+0000 8.0E+0000 8.0E+0000 2.0E+0000 1.3E+0002
 4.0E+0000 1.0E+0003 3.2E+0001 5.1E+0002 8.0E+0000
program kamila;

uses crt;

var
        tab : array of array of integer; //tablica dynamiczna
        n: byte; //rozmiar macierzy
        p: byte; //potega
    //    tab :array[1..10,1..10] of integer;
        i,j: integer; //zmienna pomocnicza
        ran: integer; //losowana liczba
procedure potega (a : real);
        begin
                for i:=0 to 10 do begin
                        a:= a*a;
                end;
        end;
begin

        write('Podaj rozmiar tablic: ');
        readln(n); //wczytuje wielkosc tablicy
        writeln('Podaj potege: ');
        readln(p);
        SetLength(tab,n,n);
        Randomize;
        for i:=0 to n-1 do begin
                for j:=0 to n-1 do begin
                                tab[i,j] :=random(10)+1;

           end;
        end;

                writeln('Macierz wylosowana');
                writeln;
        for i := 0 to n-1 do begin
                for j:= 0 to n-1 do begin
                        write(tab[i,j]:4);
                end;
                writeln;
                writeln;
        end;

                writeln('Macierz spierwiastkowana');
                writeln;
                for i := 0 to n-1 do begin
                for j:= 0 to n-1 do begin
                        write(exp(tab[i,j]*ln(p)):4);
                end;
                writeln;
        end;
        readln;
end.
 
0

Jak ktos by potrzebowal rozwiazanie.

Program liczy srednia z podanej macierzy kwadratowej, potege tej macierzy, norme i pierwiastek normy.

program kam2;

// definiujemy typy dla macierzy dynamicznych

type
  NReal = array of double; // typ wierszy
  MReal = array of NReal;  // typ macierzy

// procedura mnożenia macierzy
// C = A x B
//----------------------------

procedure mnoz(n : integer; A,B,C : MReal);

var
  i,j,k : integer;
  s     : double;

begin

 for i := 0 to n - 1 do
    for j := 0 to n - 1 do
    begin
      s := 0;
      for k := 0 to n - 1 do s := s + A[i][k] * B[k][j];
      C[i][j] := s;
    end;
end;

// procedura przepisuje macierz A do macierzy B
//---------------------------------------------

procedure przepisz(n : integer; A,B : MReal);

var
  i,j : integer;

begin
  for i := 0 to n - 1 do
    for j := 0 to n - 1 do B[i][j] := A[i][j];
end;

// procedura ustawia w macierzy A macierz jednostkową
//---------------------------------------------------

procedure jednostkowa(n : integer; A : MReal);

var
  i,j : integer;

begin
  for i := 0 to n - 1 do
  begin
    for j := 0 to n - 1 do A[i][j] := 0;
    A[i][i] := 1;
  end;
end;

// procedura wylicza potęgę k-tą macierzy A
//-----------------------------------------

procedure potega(k,n : integer; A : MReal);

var
  P,W : MReal;
  i   : integer;

begin
  if k = 0 then jednostkowa(n,A)
  else if k > 1 then
  begin

    // tworzymy macierze pomocnicze P i W

    SetLength(P,n);
    SetLength(W,n);
    for i := 0 to n - 1 do
    begin
      SetLength(P[i],n);
      SetLength(W[i],n);
    end;

    // macierz A zapamiętujemy w P

    przepisz(n,A,P);

    // w pętli wykonujemy kolejne mnożenia - wynik zawsze w A

    for i := 2 to k do
    begin
      mnoz(n,P,A,W);     // W <- P x A
      przepisz(n,W,A);   // A <- P x A
    end;

    // usuwamy macierze P i W

    for i := 0 to n - 1 do
    begin
      SetLength(P[i],0);
      SetLength(W[i],0);
    end;
    SetLength(P,0);
    SetLength(W,0);
  end;
end;

//*** PROGRAM GŁÓWNY ***
//----------------------

var
  A,D : MReal;
  n,i,j,k : integer;
  max :double;

begin

  // wczytujemy wykładnik k oraz stopień macierzy n
  write('Podaj potege: ');
  readln(k);
  write('Podaj wielkosc macierzy: ');
  readln(n);

  // tworzymy macierz dynamiczną i wczytujemy dane wierszami

  SetLength(A,n);
  for i := 0 to n - 1 do
  begin
    SetLength(A[i],n);
    for j := 0 to n - 1 do read(A[i][j]);
  end;

  //wyswietla macierz
     writeln('Macierz');
     writeln;
     max := 0;
  for i := 0 to n - 1 do
  begin
   for j := 0 to n - 1 do
   begin
      write(A[i][j]:10:2,' ');
      max := A[i,j] + max;
   end;
   writeln;
  end;
  writeln ('Srednia: ',max/(n*n):10:2);
  writeln;
  // obliczamy k-tą potęgę A

  potega(k,n,A);


  // wyświetlamy wyniki
  readln;
  writeln('Macierz spotegowana');
  writeln;

  for i := 0 to n - 1 do
  begin
    for j := 0 to n - 1 do write(A[i][j]:10:2,' ');
    writeln;
  end;
    writeln;
    max := 0;
    for i := 0 to n-1 do
    if max > max-1 then
        max :=  A[i,j] + max;
        write ('Norma: ');
        writeln (max:10:2);
        write ('Pierwiastek: ');
        writeln (sqrt(max):10:2);

  // usuwamy macierz A

  for i := 0 to n - 1 do SetLength(A[i],0);
  SetLength(A,0);
  readln;

end.

Oparte na [url=http://edu.i-lo.tarnow.pl/inf/alg/001_search/0072_a.php]klik[/url]

Do zamkniecia :D

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