Matice, funkce – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Matice, funkce – Pascal – Fórum – Programujte.comMatice, funkce – Pascal – Fórum – Programujte.com

 

petr
~ Anonymní uživatel
746 příspěvků
7. 2. 2012   #1
-
0
-

ahoj... po dlouhe dobe jsem se zacal znovu ucit pascal.. take hlavne kvuli doucovani, ktere obcas davam... mam problem ale uz se zaklady. delam program, ktery na obe diagonaly matice nacte jednicky. a delam to pomoci funkci. ale porad mi to vypisuje jednicky vsude. mohl by jste mi na to nekdo kouknout prosim a poradit. prikladam svuj kod. diky moc. petr


program mat_diag_jednicky;
uses crt;
const jedna = 1;
var    mat : array[1..10,1..10] of integer;
        i, j:integer;

function vycisti(i,j : integer):integer;
begin
        for i:=1 to 10 do begin
                for j:=1 to 10 do begin
                        mat[i][j]:=0;
                        vycisti:=mat[i][j];
                end;
        end;
end;

function zapis(i,j:integer):integer;
begin
        for i:=1 to 10 do begin
                for j:=1 to 10 do begin
                        if i = j then mat[i][j]:=jedna;
                end;
        end;

        for i:=1 to 10 do begin
                for j:=1 to 10 do begin
                        zapis:=mat[i][j];
                end;
        end
end;

begin
clrscr;
        for i:=1 to 10 do begin
                for j:=1 to 10 do begin
                        write(vycisti(i,j));
                end;
        writeln;
        end;

        writeln;
        readln;

        for i:=1 to 10 do begin
                for j:=1 to 10 do begin
                        write(zapis(i,j));
                end;
        writeln;
        end;

        readln;

end.
 

Nahlásit jako SPAM
IP: 147.230.179.–
JoDiK
~ Anonymní uživatel
987 příspěvků
7. 2. 2012   #2
-
0
-

#1 petr
Nejdřív si prosímtě udělej jasno v tom co chceš, co skutečně děláš a pak se nebudeš divit, že program dělá jen to, cos mu naprogramoval.

Takže evidentně nechceš udělat program "ktery na obe diagonaly matice nacte jednicky" ale program, který vynuluje matici a na hlavní diagonály zapíše jedničky.

Pak si připomeň k čemu je funkce a k čemu procedura.

Zjednodušeně řečeno:

Funkce něco spočítá a vrátí jednu hodnotu - nejčastěji výsledek výpočtu nebo jestli se něco povedlo nebo ne.

Procedura většinou provede nějakou činnost a taky může vracet libovolné množství hodnot.

Takže tvoje funkce sice nastavuje (velmi pracně) do diagonál jedničky, ale ty nejenže ji voláš znovu a znovu (100x) ale taky pokaždé vypíšeš tu jednu hodnotu co vrátí (poslední zapsaná jednička)

Nahlásit jako SPAM
IP: 88.103.233.–
JoDiK
~ Anonymní uživatel
987 příspěvků
7. 2. 2012   #3
-
0
-

#1 petr
Doporučení: udělej jednu proceduru, která vynuluje matici (bez výpisů). Další proceduru, která ji vypíše. Další proceduru, která nastaví jedničky do obou diagonál (zase bez výpisů a nebude na to potřebovat dva vnořené cykly). V rámci procvičení si udělej třeba i nějaké funkce, třeba funkci, která zkontroluje, jestli jsou v diagonále samé jedničky...

Hlavní program pak už bude jen volat ty procedury:

begin

  VynulujMatici;

  VypisMatici;

  NastavJednickyDoDiagonal;

  VypisMatici;

end.

Nahlásit jako SPAM
IP: 88.103.233.–
petr
~ Anonymní uživatel
746 příspěvků
7. 2. 2012   #4
-
0
-

tak uz to mam... nakonec jsem na to prisel sam a musim rict ze jsem asi totalne zmagorel... mam to takhle:

program mat_diag_jednicky;
uses crt;
const jedna = 1;
var     mat : array[1..10,1..10] of integer;
        i, j:integer;

function zapis(i,j:integer):integer;
begin

                        if i = j then begin
                                mat[i][j]:=jedna;
                                zapis:=mat[i][j];
                        end
                        else zapis:=0;

                        mat[i][11-i]:=jedna;
                        zapis:=mat[i][j];
end;

begin
clrscr;

        for i:=1 to 10 do begin
                for j:=1 to 10 do begin
                        write(zapis(i,j),' ');
                end;
        writeln;
        end;

        readln;

end.

Nahlásit jako SPAM
IP: 147.230.179.–
zlz
~ Anonymní uživatel
634 příspěvků
7. 2. 2012   #5
-
0
-

  

for i := 1 to 10 do begin
    for j := 1 to 10 do begin
        mat[i,j] := integer((i = j) or (11 - i = j));
        write(mat[i,j], ' ');
    end;
    writeln;
end;
Nahlásit jako SPAM
IP: 213.211.51.–
JoDiK
~ Anonymní uživatel
987 příspěvků
9. 2. 2012   #6
-
0
-

#4 petr
Pokud jsi s tímto řešením spokojen, tak OK, ale já bych měl pár výhrad:

1. proč tam dvakrát přiřazuješ

zapis:=mat[i][j];

2. Tento příkaz:

else zapis:=0;

je tam zbytečně, i když se tam přiřadí nula, o dva řádky níž tu nulu přepíšeš hodnotou z matice.

3. neuvedl jsi přesné zadání, především co se má dít s ostatními hodnotami v matici mimo diagonály? Mají se nulovat? Nebo mají zůstat beze změny?

Nahlásit jako SPAM
IP: 88.103.236.–
JoDiK
~ Anonymní uživatel
987 příspěvků
9. 2. 2012   #7
-
0
-

#5 zlz

Ze zadání není tak úplně jasné, že se prvky mimo diagonálu mají vynulovat, ty to ovšem děláš.

Moje řešení (pokud ostatní prvky mají zůstat beze změny):

for i:=1 to 10 do begin
        mat[i,i]:=1;
        mat[i,11-i]:=1;
end;

Nahlásit jako SPAM
IP: 88.103.236.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 2 hosté

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý