Rozwiązywanie układów równań metodą wyznaczników na tablicach

0

Witam

Na lekcje programowania miałem za zadanie napisać program który będzie rozwiązywał układ równań metodą wyznaczników. Mieliśmy to zrobić dla 3 niewiadomych, ale na piątkę mieliśmy to zrobić na tablicach i ograniczyć się do 8 niewiadomych. Napisałem prawie cały kod, ale nie do końca działa. Dla danych:
5a+2b+1c=1
3a+4b+5c=1
9a+8b+1c=1 W oblicza dobrze czyli -108. Jednak Wa, Wb i Wc jest źle. W innych przykładach niekiedy W wychodzi niekiedy nie. Nad kodem siedzę już dobrze 3h i nie potrafię znaleźć błędów. Może ktoś pomoże:

program uklady_rownan;
{Grzegorz Zajac kl 2i}
uses crt;
var kl:char;
    tablica:array [1..17,1..17] of integer;
    kopia_tablicy:array [1..17,1..17] of integer;
    wod:array [1..17] of integer;
    pomocnicza:array [1..17] of integer;
    w,n,i,j,k,l,licznik,pomoc:integer;
begin
    repeat
      clrscr;
      licznik:=0;
      repeat
        writeln('Podaj ilosc rownan <2,8>');
        readln(n);
      until (n>1) and (n<9);
      for i:=1 to n do pomocnicza[i]:=1;
      for i:=1 to n do wod[i]:=0;
      for i:=1 to n do
        for j:=1 to n+1 do
          begin
            writeln('Wpisz liczbe ',i,' w kolumnie ',j);
            readln(tablica[i,j]);
            writeln;
          end;
      for i:=1 to n do
        for j:=1 to n+1 do kopia_tablicy[i,j]:=tablica[i,j];
      writeln('Tablica:');
      writeln;
      for i:=1 to n do
        begin
          for j:=1 to n+1 do
            begin
              if (j=n) then write(tablica[i,j]:3,chr(96+j),'=')
              else if (j=n+1) then write(tablica[i,j]:3)
              else write(tablica[i,j]:3,chr(96+j),'+');
            end;
          writeln;
        end;
      writeln;
      writeln('Tablica po przesunieciu:');
      writeln;
      for i:=1 to n do
        begin
          tablica[i,n*2]:=tablica[i,n+1];
        end;
      for i:=1 to n do
        for j:=1 to n-1 do
          begin
            tablica[i,j+n]:=tablica[i,j];
          end;
      for i:=1 to n do
        begin
          for j:=1 to n*2 do
            begin
              if (j=n*2-1) then write(tablica[i,j]:3,chr(96+j),'=')
              else if (j=n*2) then write(tablica[i,j]:3)
              else write(tablica[i,j]:3,chr(96+j),'+');
            end;
          writeln;
        end;
      writeln;
      for k:=1 to n do
        begin
          i:=0; j:=k-1; pomoc:=1;
          repeat
            inc(i); inc(j);
            pomoc:=pomoc*tablica[i,j];
          until (i=n);
          pomocnicza[k]:=pomoc;
        end;
      licznik:=n+1;
      for k:=1 to n do
        begin
          i:=1; j:=1+licznik; pomoc:=1;
          dec(licznik);
          repeat
            pomoc:=pomoc*tablica[i,j];
            inc(i); dec(j);
          until (i=n+1);
          pomocnicza[k+n]:=pomoc;
        end;
      w:=0;
      for i:=1 to n do
        begin
          w:=w+pomocnicza[i];
        end;
      for i:=n+1 to n*2 do
        begin
          w:=w-pomocnicza[i];
        end;

      for l:=1 to n do
        begin
          for i:=1 to n do for j:=1 to n+1 do tablica[i,j]:=0;
          for i:=1 to n do for j:=1 to n+1 do tablica[i,j]:=kopia_tablicy[i,j];
          for i:=1 to n do tablica[i,l]:=tablica[i,n+1];
          for i:=1 to n do
            begin
              tablica[i,n*2]:=tablica[i,n+1];
            end;
          for i:=1 to n do
            for j:=1 to n-1 do
              begin
                tablica[i,j+n]:=tablica[i,j];
              end;
          for k:=1 to n do
            begin
              i:=0; j:=k-1; pomoc:=1;
              repeat
                inc(i); inc(j);
                pomoc:=pomoc*tablica[i,j];
              until (i=n);
              pomocnicza[k]:=pomoc;
              write(pomocnicza[k],' ');
            end;
          licznik:=n+1;
          for k:=1 to n do
            begin
              i:=1; j:=1+licznik; pomoc:=1;
              dec(licznik);
              repeat
                pomoc:=pomoc*tablica[i,j];
                inc(i); dec(j);
              until (i=n+1);
              write(pomocnicza[k],' ');
              pomocnicza[k+n]:=pomoc;
            end;
          for i:=1 to n do
            begin
              wod[i]:=wod[i]+pomocnicza[i];
            end;
          for i:=n+1 to n*2 do
            begin
              wod[i]:=wod[i]-pomocnicza[i];
            end;
        end;

      {_______WYSWIETLANIE_WYNIKOW_______}
      writeln('W= ',w);
      for i:=1 to n do
        begin
          writeln('W',chr(96+i),'= ',wod[i]);
        end;
      if w<>0 then
        for i:=1 to n do writeln(chr(96+i),'= ',wod[i] div w)
      else if w<>0 then writeln('Brak rozwiazan');
      writeln;
      writeln('Jesli chcesz wyjsc nacisnij ESC, jesli nie nacisnij dowlony klawisz...');
      kl:=readkey;
    until (kl=#27);
end. 

P.s. Program nie jest dokończony :P Chciałbym tylko wiedzieć gdzie są błędy :/

0

Chciałbym tylko wiedzieć gdzie są błędy

To użyj debuggera.

0

Używałem, ale i tak nie znalazłem miejsca gdzie mam błąd :/

0

Poprawiłem i działa :D Błędnie podstawiało mi wyrazy wolne pod dane kolumny. Wywaliłem też niepotrzebne beginy i endy oraz dodałem wyświetlanie :) Macie kod bo może się komuś przydać:

program uklady_rownan;
{Grzegorz Zajac kl 2i}
uses crt;
var kl:char;
    tablica:array [1..17,1..17] of integer;
    kopia_tablicy:array [1..17,1..17] of integer;
    wod:array [1..17] of integer;
    pomocnicza:array [1..17] of integer;
    w,n,i,j,k,l,licznik,pomoc:integer;
    nieoznaczony:boolean;
begin
    repeat
      clrscr;
      licznik:=0;
      nieoznaczony:=false;
      repeat
        writeln('Podaj ilosc rownan <2,8>');
        readln(n);
      until (n>1) and (n<9);
      for i:=1 to 17 do pomocnicza[i]:=1;
      for i:=1 to 17 do wod[i]:=0;
      for i:=1 to n do
        for j:=1 to n+1 do
          begin
            writeln('Wpisz liczbe ',i,' w kolumnie ',j);
            readln(tablica[i,j]);
            writeln;
          end;
      writeln('Tablica:');
      writeln;
      for i:=1 to n do
        begin
          for j:=1 to n+1 do
            begin
              if (j=n) then write(tablica[i,j]:3,chr(96+j),'=')
              else if (j=n+1) then write(tablica[i,j]:3)
              else write(tablica[i,j]:3,chr(96+j),'+');
            end;
          writeln;
        end;
      writeln;
      writeln('Tablica po przesunieciu:');
      writeln;
      for i:=1 to n do tablica[i,n*2]:=tablica[i,n+1];
      for i:=1 to n do for j:=1 to n-1 do tablica[i,j+n]:=tablica[i,j];
      for i:=1 to n do for j:=1 to n*2 do kopia_tablicy[i,j]:=tablica[i,j];
      for i:=1 to n do
        begin
          for j:=1 to n*2 do
            begin
              if (j=n*2-1) then write(tablica[i,j]:3,chr(96+j),'=')
              else if (j=n*2) then write(tablica[i,j]:3)
              else write(tablica[i,j]:3,chr(96+j),'+');
            end;
          writeln;
        end;
      writeln;
      for k:=1 to n do
        begin
          i:=0; j:=k-1; pomoc:=1;
          repeat
            inc(i); inc(j);
            pomoc:=pomoc*tablica[i,j];
          until (i=n);
          pomocnicza[k]:=pomoc;
        end;
      licznik:=n+1;
      for k:=1 to n do
        begin
          i:=1; j:=1+licznik; pomoc:=1;
          dec(licznik);
          repeat
            pomoc:=pomoc*tablica[i,j];
            inc(i); dec(j);
          until (i=n+1);
          pomocnicza[k+n]:=pomoc;
        end;
      w:=0;
      for i:=1 to n do w:=w+pomocnicza[i];
      for i:=n+1 to n*2 do w:=w-pomocnicza[i];

      for l:=1 to n do
        begin
          for i:=1 to n do for j:=1 to (n*2)+1 do tablica[i,j]:=0;
          for i:=1 to 17 do pomocnicza[i]:=1;
          for i:=1 to n do for j:=1 to n*2 do tablica[i,j]:=kopia_tablicy[i,j];
          for i:=1 to n do tablica[i,l]:=tablica[i,n*2];
          if (l<>n) then for i:=1 to n do tablica[i,l+n]:=tablica[i,n*2];
          for k:=1 to n do
            begin
              i:=0; j:=k-1; pomoc:=1;
              repeat
                inc(i); inc(j);
                pomoc:=pomoc*tablica[i,j];
              until (i=n);
              pomocnicza[k]:=pomoc;
            end;
          licznik:=n+1;
          for k:=1 to n do
            begin
              i:=1; j:=1+licznik; pomoc:=1;
              dec(licznik);
              repeat
                pomoc:=pomoc*tablica[i,j];
                inc(i); dec(j);
              until (i=n+1);
              pomocnicza[k+n]:=pomoc;
            end;
          for i:=1 to n do wod[l]:=wod[l]+pomocnicza[i];
          for i:=n+1 to n*2 do wod[l]:=wod[l]-pomocnicza[i];
        end;

      {_______WYSWIETLANIE_WYNIKOW_______}
      writeln('W= ',w);
      for i:=1 to n do write('W',chr(96+i),'= ',wod[i],',  ');
      writeln;
      if w<>0 then for i:=1 to n do write(chr(96+i),'= ',wod[i] / w:0:2,', ');
      for i:=1 to n do if wod[i]=0 then nieoznaczony:=true;
      if (w=0) and (nieoznaczony=false) then writeln('Brak rozwiazan')
      else if (w=0) and (nieoznaczony=true) then writeln('Uklad nieoznaczony');
      writeln;
      writeln('Jesli chcesz wyjsc nacisnij ESC, jesli nie nacisnij dowlony klawisz...');
      kl:=readkey;
    until (kl=#27);
end. 

http://haker.nie-spamuj.eu/sieci.html

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