PASCAL:Podprogramy

Místo pro dotazy a rady ohledně programovacích jazyků (C++, C#, PHP, ASP, Javascript, VBS..) a tvorby webových stránek

Moderátor: Mods_senior

Potr
nováček
Příspěvky: 1
Registrován: duben 18
Pohlaví: Nespecifikováno
Stav:
Offline

PASCAL:Podprogramy

Příspěvekod Potr » 22 dub 2018 00:48

Potřeboval bych poradit jak tohle přesně udělat(matici mxn naplnit náhodnými čísly od 1 do 99,urči podprogramem součet prvku prvního sloupce a součet prvku posledního sloupce,zjisti který součet je nejnižši,zobraz matici)Tohle mám hotové prakticky se dá říct že všechno jen nevím jak s tím podprogramem. :/

program matice;
uses crt;
var a:array[1..10,1­..10] of integer;
m,n,i,j,s,r,s­ums,sumr:inte­ger;
begin
clrscr;
write('Zadej pocet radku matice:');
readln(m);
write('Zadej pocet sloupcu matice:');
readln(n);
randomize;
sums:=0;
sumr:=0;
write('Zadej sloupec matice pro soucet:');
readln(r);
if r>m then begin writeln('Zadej znovu cislo sloupce musi byt mensi nez ',m+1);
readln(r);
end;
write('Zadej sloupec matice pro soucet:');
readln(s);
if s>n then begin writeln('Zadej znovu cislo sloupce musi byt mensi nez ',n+1);
readln(s);
end;
for i:=1 to m do for j:=1 to n do a[i,j]:=random(99)+1;
for i:=1 to n do sumr:=sumr+a[i,r];
for i:=1 to m do sums:=sums+a[i,s];
for i:=1 to n do begin for j:=1 to n do write(a[i,j]:8);
writeln;
end;
writeln('Soucet prvku ',r,'. sloupce je:',sumr);
writeln('Soucet prvku ',s,'. sloupce je:',sums);
readln;
if sums>sumr
then
write('Prvni sloupec je mensi nez posledni')
else write('Posledni sloupec je mensi nez prvni');
writeln;
readln;
end.

Reklama
Uživatelský avatar
satik
Level 6
Level 6
Příspěvky: 3509
Registrován: leden 15
Bydliště: Krkonoše
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: PASCAL:Podprogramy

Příspěvekod satik » 22 dub 2018 02:05

Podprogramem je asi myšleno funkce (případně procedura, pokud nemá žádný výstup).

To znamená, že část kódu "vytrhneš" do té funkce/procedury ven, abys nemíchal zadání, výpis i výpočet na jednom místě.
PC: MSI RTX 4090 Suprim X, AMD Ryzen 9 7950x3D, ASUS Crosshair HERO X6670E, 64GB RAM@6000CL30, Fractal Define Torrent, Seasonic PRIME TX 1600W, SSD Seagate Firecuda 530 M2 2TB +
4TB + 4TB SATA Micron 5200 ECO
Periferie: Samsung Odyssey G9 Neo + 2x AOC AG271QG, Razer Deathadder, Ducky Shine7, Steelseries QcK+, Beyerdynamic MMX300, Valve Index

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: PASCAL:Podprogramy

Příspěvekod faraon » 22 dub 2018 11:29

Potr píše:Tohle mám hotové prakticky se dá říct že všechno jen nevím jak s tím podprogramem. :/

Hm, blíží se konec školního roku, dělají se závěrečné práce, zkusil jsi nahlédnout do nějaké učebnice?

Pro úplné začátečníky: http://pascal.webz.cz/kurs/lekce/lekce7.htm
Pro mírně pokročilé: https://web.archive.org/web/20170503085033/http://www.spsemoh.cz/vyuka/pascal/
Pro myslící bytosti: http://home.pf.jcu.cz/~edpo/program/kap05.html



  1. Zapracuj na odsazování, ať se v té nudli dá vyznat. A používej komentáře.
    Trochu jsem ti to zpřeházel, není to takhle čitelnější?

    Kód: Vybrat vše

    program matice;
    uses crt;



    var a:array[1..10,1..10] of integer;
        m,n,i,j,s,r,sums,sumr:integer;



    begin
    clrscr;
    write('Zadej pocet radku matice:');
    readln(m);
    write('Zadej pocet sloupcu matice:');
    readln(n);
    randomize;
    sums:=0;
    sumr:=0;

    {naplneni matice nahodnymi cisly}
    for i:=1 to m do
        for j:=1 to n do
            a[i,j]:=random(99)+1;

    {vypis cele matice}
    for i:=1 to n do
        begin
        for j:=1 to n do
            write(a[i,j]:8);
        writeln;
        end;

    {soucet sloupce matice}
    write('Zadej sloupec matice pro soucet:');
    readln(r);
    if r>m then
       begin
       writeln('Zadej znovu cislo sloupce musi byt mensi nez ',m+1);
       readln(r);
       end;
    for i:=1 to n do sumr:=sumr+a[i,r];
    writeln('Soucet prvku ',r,'. sloupce je:',sumr);

    {soucet sloupce matice}
    write('Zadej sloupec matice pro soucet:');
    readln(s);
    if s>n then
       begin
       writeln('Zadej znovu cislo sloupce musi byt mensi nez ',n+1);
       readln(s);
       end;
    for i:=1 to m do sums:=sums+a[i,s];
    writeln('Soucet prvku ',s,'. sloupce je:',sums);

    {porovnani souctu sloupcu}
    readln;
    if sums>sumr then
       write('Prvni sloupec je mensi nez posledni')
    else
       write('Posledni sloupec je mensi nez prvni');
    writeln;

    readln;
    end.

    To porovnání je blbě, pokud budou součty stejné, vypíše ti to "Posledni sloupec je mensi nez prvni", což je nesmysl. Budeš tam muset udělat ještě vnořenou podmínku, abys ošetřil všechny tři možnosti.
    Také se ti tam nějak pletou řádky a sloupce, jejich proměnné. I před tím tě ochrání použití podprogramů, aspoň v tomhle případě.
    .
  2. Zamysli se nad tím, jak rozdělit program na jednotlivé funkční celky, které budou samostatně provádět jednotlivé body ze zadání.
    Ono to vyplyne už z toho předchozího bodu, v podstatě stačí jednotlivé bloky "vytrhat" do podprogramů jak píše satik, a z jejich původního místa je volat, výhodou je i to, že opakující se části tak budeš mít v programu jenom jednou.
    Což byl kdysi dávno právě hlavní důvod pro vynalezení podprogramů, dokonce už v době kdy ještě neexistovaly programovací jazyky ;-)

    Kód: Vybrat vše

    program matice;
    {uses crt;}



    var a:array[1..10,1..10] of integer;
        m,n,i,j,s,r,sums,sumr:integer;



    {naplneni matice nahodnymi cisly}
    procedure naplnit;
              begin
              for i:=1 to m do
                  for j:=1 to n do
                      a[i,j]:=random(99)+1;
              end;



    {vypis cele matice}
    procedure vypsat;
              begin
              ???
              end;



    {soucet sloupce matice}
    function soucet: integer;

             var x: integer;

             begin
             ???
             end;



    {porovnani souctu sloupcu}
    procedure porovnat(x, y: integer);
              begin
              ???
              end;



    begin
    {clrscr;}
    write('Zadej pocet radku matice:');
    readln(m);
    write('Zadej pocet sloupcu matice:');
    readln(n);
    randomize;
    sums:=0;
    sumr:=0;

    {naplneni matice nahodnymi cisly}
    naplnit;

    {vypis cele matice}
    vypsat;

    {soucty sloupcu matice}
    sumr:=soucet;
    sums:=soucet;

    {porovnani souctu sloupcu}
    porovnat(sumr, sums);

    {cekani na ukonceni}
    readln;
    end.

    Máš tu na ukázku naplnění matice, ostatní podprogramy už snad dokážeš pomocí Ctrl+C a Ctrl+V vložit sám, bude tam pak ještě potřeba pár drobností doplnit a maličko pozměnit.
    .
  3. Proměnné, které používá jen určitý podprogram, není nutné deklarovat globálně, lepší je lokálně přímo v tom podprogramu, jako pomocná proměnná x v součtu sloupce. Tak se na ně ostatní nemůžou dostat a třeba je omylem poškodit. Pokud je potřebuje jiná procedura nebo funkce, tak je ten volající podprogram předá v parametrech.
  4. Kontroluj všechny vstupy od uživatele. Sice hlídáš horní mez v součtu sloupců, ale co když nějaký trouba zadá 0? Nebo chce matici větší než se vejde do pole...
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek

Zpět na “Programování a tvorba webu”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 8 hostů