Avatar
Tunndr
Člen
Avatar
Tunndr:

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:

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:

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:

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:

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:

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
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 6 zpráv z 6.