Delphi Tablice, Pętle. Konkretne zadanie.

0

Cześć jestem nowy na tym forum i mam pewien problem. Mianowicie mój program ma spełniać takie dwa wymagania:

(ii) dla podanych przez użytkownika wymiarów tablicy m i n (m; n sa wczytane z klawiatury1)
wypełnia te macierz, tzn wpisuje wartości elementów w i-tym wierszu i j-tej kolumnie
wg wzoru
i + j; gdy i + j jest liczba parzysta
i - j; gdy i + j jest liczba nieparzysta
(iii) wypisuje te tablice na ekran (w sposób przejrzysty, czyli żeby było widać kolumny)

I utkwiłem na pierwszym. Teoretycznie zrobiłem go dobrze i program się uruchamia, jednak wyskakuje błąd w samym już programie. Byłbym wdzięczny za sugestie i pomoc. Dodam że jestem w temacie programowanie zielony, choć staram się to zmienić. Piszę w Delphi 7. Oto kod źródłowy tego co zdążyłem napisać:

 
var
  MojaTablica : array of array of integer;
  m, n, i, j : Integer;
begin
repeat
writeln('Podaj pierwszy wymiar tablicy, liczbe CALKOWITA DODATNIA');
  readln(m);
writeln('Podaj drugi wymiar tablicy, liczbe CALKOWITA DODATNIA');
  readln(n);
until (m>0) and (n>0);
  SetLength(MojaTablica, m, n);
  for i:=1 to m do
    for j:=1 to n do
      if (((i+j) mod 2)= 0)
        then
          begin
          MojaTablica[i,j]:=i+j;
          end
        else
           begin
           MojaTablica[i,j]:=i-j;
           end;
writeln;
end.
1
  for i:=0 to m-1 do
    for j:=0 to n-1 do
0

Zmieniłem według sugestii. Jednak wciąż jest coś źle. Dodałem też funkcję wyświetlenia tablicy. Piszę w Delphi 7. Oto kod:

var
  MojaTablica : array of array of integer;
  m, n, i, j : Integer;
begin
repeat
writeln('Podaj pierwszy wymiar tablicy, liczbe CALKOWITA DODATNIA');
  readln(m);
writeln('Podaj drugi wymiar tablicy, liczbe CALKOWITA DODATNIA');
  readln(n);
until (m>0) and (n>0);
  SetLength(MojaTablica, m, n);
  for i:=0 to m-1 do
    for j:=0 to n-1 do
      if (((i+j) mod 2)= 0)
        then
          begin
          MojaTablica[i,j]:=i+j;
          end
        else
           begin
           MojaTablica[i,j]:=i-j;
           end;
      write(MojaTablica[i,j]);
writeln;
end.
0

Mamy zgadywać jaki błąd, co się dzieje?

0

Zamień:
SetLength(MojaTablica, m, n);
na:
SetLength(MojaTablica,m)
for i:=0 to m-1 do SetLength(MojaTablica[i],n);
zaś odwołania:
MojaTablica[i,j]
na:
MojaTablica[i][j]
i wszystko powinno zadziałać:

0

Program się uruchamia. Prosi o podanie dwóch liczb. Podaje liczby i program się wyłącza. Tuż przed wyłączeniem pojawia się w programie jakiś napis, którego nie zdążę odczytać. Zdaję się, że zaczyna się od słowa Error. Podałbym więcej szczegółów gdybym zdążył rozczytać co jest tam napisane.

uses
  SysUtils;

var
  MojaTablica : array of array of integer;
  m, n, i, j : Integer;
begin
repeat
writeln('Podaj pierwszy wymiar tablicy, liczbe CALKOWITA DODATNIA');
  readln(m);
writeln('Podaj drugi wymiar tablicy, liczbe CALKOWITA DODATNIA');
  readln(n);
until (m>0) and (n>0);
  SetLength(MojaTablica,m);
for i:=0 to m-1 do SetLength(MojaTablica[i],n);
    for j:=0 to n-1 do
      if (((i+j) mod 2)= 0)
        then
          begin
          MojaTablica[i][j]:=i+j;
          end
        else
           begin
           MojaTablica[i][j]:=i-j;
           end;
      write(MojaTablica[i][j]);
writeln;
end. 

O to chodzi? Jeśli tak, to wciąż jest coś źle. Powinno wyświetlać mi już tablice, prawda(sam nie jestem pewien)? A tego nie robi. Poza tym wciąż pojawia się ten komunikat, i to chyba nie jest error tam napisane. Jednak coś jest, a program wciąż nie działa.

0

Uruchom przez CMD.
Dodałeś
{$APPTYPE CONSOLE}
?

0

Przez CMD też nie działa. Jestem raczej kiepski w te klocki, a do programowanie jestem zmuszony. Za to wyświetlił się problem: napis głosi exception eaccessviolation in module

1
  SetLength(MojaTablica,m,n);
  for i:=0 to m-1 do
  begin
    WriteLn;
    for j:=0 to n-1 do
    begin
      if ((i+j) mod 2)=0 then MojaTablica[i,j]:=i+j else MojaTablica[i,j]:=i-j;
      Write(MojaTablica[i,j]:4);
    end;
  end;
  ReadLn;
0

A czy ktoś mógłby mi pomóc jeszcze z dodaniem takich funkcji:
dla podanego przez użytkownika wiersza2 zmienia wartości w tym wierszu na losowe
liczby z przedziału [-15; 15], wypisuje zmieniona macierz na ekran,
dla podanej przez użytkownika liczby szuka za pomocą pętli while czy ona jest w
tablicy i wyświetla albo informacje ze jej nie ma albo wyświetla nr wiersza i kolumny znalezionego
elementu,
dla podanego przez użytkownika nr-u kolumny3 oblicza i wyświetla średnia arytmetyczna
i średnią ważoną elementów tej kolumny (wagami są nr-y wierszy tych elementów)4,

Naprawdę byłbym wdzięczny. Tylko tych mi brakuje, resztę dorobiłem sam lub jak dwie opisane powyżej z pomocą.

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