Diskuze: PASCAL - matice

Ostatní jazyky Ostatní programovací jazyky PASCAL - matice

Aktivity (1)
Avatar
Tunndr
Člen
Avatar
Tunndr:14.5.2015 23:27

Dobrý den, ve škole jsem dostal za úkol napsat 6 programů, ale vážně v tom plavu a nevím si rady. Kdyby mi někdo pomohl, byl bych mu opravdu vděčný.

  1. Dvě matice 5x5 naplnit náhodnými čísly od 0-9, sečtěte navzájem si odpovídající prvky z těchto matic a uložte do třetí matice, všechny matice zobrazit
  2. Matici MxN naplnit náhodnými čísly 1-99, sudé prvky vlož do pole S, liché prvky do pole L, matici a prvky polí S a L zobraz
  3. Matici MxN naplnit náhodnými čísly 1-99, sudé prvky zmenší na polovinu, liché zdvojnásobí, zobraz matici před a po úpravách
  4. Matice MxM naplnit náhodnými čísly 1-99, vypiš prvky vedlejší diagonály, vypočti jejích součet, zobraz matici
  5. Matici MxN naplnit náhodnými čísly 1-99, urči součet prvků prvního řádku a součet posledního řádku, zjisti který součet je vyšší, zobraz matici
  6. Matici MxN naplnit náhodnými čísly 1-99, urči průměr lichých prvků, a průměr sudých prvků

V každém programu musí byt podprogram, ale nikdy mi to s ním nefunguje. Zatím mám tohle:

uses Crt;
const
m = 5;
n = 5;
var i,j,c: Integer;
    m1,m2,m3: array [1..5] of array [1..5] of Integer;
begin
  WriteLn(' --- Soucet odpovidajicich si prvku matic ---');
  WriteLn;
  Randomize;
  for i := 1 to 5 do
    for j := 1 to 5 do
    begin
      c := Random(10); //nahodne cislo od 0 do 9
      m1[i,j] := c;
      c := Random(10);
      m2[i,j] := c;
      m3[i,j] := m1[i,j]+m2[i,j];
    end;
  WriteLn;
  WriteLn(' matice 1:');
  for i := 1 to 5 do
  begin
    for j := 1 to 5 do
      Write('  ',m1[i,j]:2);
    WriteLn;
  end;
  WriteLn;
  WriteLn(' matice 2:');
  for i := 1 to 5 do
  begin
    for j := 1 to 5 do
      Write('  ',m2[i,j]:2);
    WriteLn;
  end;
  WriteLn;
  WriteLn(' matice 3:');
  for i := 1 to 5 do
  begin
    for j := 1 to 5 do
      Write('  ',m3[i,j]:3);
    WriteLn;
  end;
  ReadLn;
end.
 
Odpovědět 14.5.2015 23:27
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Tunndr
Martin Dráb:15.5.2015 0:11

Zdravím,

co znamená výraz "nefunguje mi to"? Vždy piš, podle čeho soudíš, že ti to nefunguje (že to třeba píše chybyovou hlášku, nebo to špatně zobrazuje data atd.).

Jinak, zápis

array [1..5] of array [1..5] of Integer;

lze zkrátit na

array [1..5, 1..5] of Integer;

V zadání píšou, že máš vytvořit šest programů, takže to celé nemusíš cpát do jednoho (velkého) programu. Fakt, že v každém z nich musí být podprogram, bude splněn celkem triviálně, protože se ti bude hodit si udělat třeba podprogram na výpis matice (ale nejen na to). Ono ty jednotlivé podrpogramy pak půjdou celkem dobře zrecyklovat v dalších programech.

Nahoru Odpovědět 15.5.2015 0:11
2 + 2 = 5 for extremely large values of 2
Avatar
Tunndr
Člen
Avatar
Odpovídá na Martin Dráb
Tunndr:15.5.2015 0:29

Pascal vůbec neovládám, takže jsem tam ten podprogram určitě vložil špatně. Ten program co jsem vložil výš jsem složil s toho co jsem našel na internetu. Potřebuji poradit s tím jak tam ty podprogramy vložit, a ještě s těmi operacemi mezi maticemi. :/

 
Nahoru Odpovědět 15.5.2015 0:29
Avatar
Tunndr
Člen
Avatar
Tunndr:15.5.2015 1:05

Kdyby mi někdo pomohl jích pár vyřešit, zachránil by mě :/

 
Nahoru Odpovědět 15.5.2015 1:05
Avatar
Martin Dráb
Redaktor
Avatar
Martin Dráb:15.5.2015 1:33

Hm, sice jsem se nedozvěděl, jakým způsobem ses pokoušel ten podprogram napsat a použít, ale nevadí. Zkusím dát příklad, jak se to obvykle dělává.

Předpokládám, že N, o kterém se zmiňuje zadání, je konstanta definovaná ve zdrojáku, například:

const
  N = 10;

Pak si můžeš zadefinovat datové typy TMaticeNxN a TPolePrvkuNxN.

Type
  TmaticeNxN = Array [1..N,1..N] Of Integer;
  TPolePrvkuNxN = Array [1..N*N] Of Integer;

A pak můžeš mít třeba podprogram pro naplnění zadané matice náhodnými čísly:

Procedure NaplnMatici(Var M:TMaticeNxN; Min:Integer; Max:Integer);
Var
  I, J : Integer;
begin
For J := 1 To N Do
For I := 1 To N Do
  M[I, J] := Random(Max - Min + 1) + Min;
end;

A podrpogram pro výpis matice:

Procedure VypisMatici(Var M:TMaticeNxN);
Var
  I, J : Integer;
begin
For I := 1 To N Do
  begin
  For J := 1 To N Do
    Write(' ', M[I, J]);

  Writeln;
  end;
end;

A podrpogram pro sečtení matic A a B do matice C:

Procedure SetciMatice(Var A:TMaticeNxN; Var B:TMaticeNxN; Var C:TMaticeNxN);
Var
  I, J : Integer;
begin
For I := 1 To N Do
For J := 1 To N Do
  C[I, J] := A[I, J] + B[I, J];
end;

Tyhle podprogramy ti přímo dávají stavební kameny, jak vyřešit bod (1) zadání. Konkrétně takto:

...
Const
  N = 5;

Type
...
Var
  A : TMaticeNxN;
  B : TMaticeNxN;
  C : MaticeNxN;
begin
NaplnMatici(A, 0, 9);
naplnMatici(B, 0, 9);
SectiMatice(A, B, C);
Writeln('Matice A:');
VypisMatici(A);
Writeln('Matice B:');
VypisMatici(B);
Writeln('Matice C:');
VypisMatici(C);
end.

Netvrdím, že tohle řešení je nějak efektivní, ale vystačí si s celkem základními vlastnostmi jazyka. Pro splnění bodu (2) budeš muset napsat podprogram, který do pole L a S (mohou být typu TPoleprvkuNxN) načte liché a sudé prvky. Ty podrpogramy se budou v zásadě dost podobat těm, co jsem tu uváděl jako příklad.

P.S.
Hádám správně, že se blíží zkouška/zápočet?

Nahoru Odpovědět 15.5.2015 1:33
2 + 2 = 5 for extremely large values of 2
Avatar
Tunndr
Člen
Avatar
Tunndr:15.5.2015 1:43

Zkouška ne, jen musíme každý odevzdat 1 program,diagram a popis programu, abychom prošli do dalšího ročníku, a já blbec jsem si vzal programy od dalších 5ti lidí, to jen proto že jsem zvládal základy jazyka a myslel jsem si že tohle zvládnu taky ;( A teď tady nad tím sedím a vůbec si nevím rady

 
Nahoru Odpovědět 15.5.2015 1:43
Avatar
Michalisko Pascalos:19. dubna 10:49

Zdravím potreboval bych pomoct s UKOLEM, jsem byl nemocny 2 mesice a nepochytil jsem ukol...muzete mi prosim napsat jeden tenhle program? ZADÁNÍ: Matice MxM naplnit nahodnymi cisly od1 do 99,vypis prvky vedlejsi DIAGONALY, vypocti jejich soucet pomoci podprogramu,zobraz vysledek a matici.

 
Nahoru Odpovědět 19. dubna 10:49
Avatar
Odpovídá na Michalisko Pascalos
Michal Haňáček:19. dubna 12:40

Mno, duplicitně to tady na síti být asi nemusí, že?

Ale k tvému úkolu. Jde o triviální úkol, který by jsi s trochou snahy (když to hooodně přeženu) měl za víkend hotový. A protože za lenost se platí, ptám se. Co za to"?

Nahoru Odpovědět 19. dubna 12:40
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Michal Haňáček
Martin Dráb:19. dubna 15:32

Bohužel už asi nic.

Nahoru Odpovědět 19. dubna 15:32
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Michal Haňáček:19. dubna 15:43

Obětoval ses? :D

Nahoru Odpovědět 19. dubna 15:43
Každé rozhodnutí a každý krok v životě nás někam posune. Bohužel jen některé nás posouvají dopředu.
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Michal Haňáček
Martin Dráb:19. dubna 15:50

To víš, povelikonoční akce :-).

Nahoru Odpovědět 19. dubna 15:50
2 + 2 = 5 for extremely large values of 2
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.