Prosím o radu – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Prosím o radu – Pascal – Fórum – Programujte.comProsím o radu – Pascal – Fórum – Programujte.com

 

Tom
~ Anonymní uživatel
434 příspěvků
24. 5. 2014   #1
-
0
-

Ahoj potřeboval bych vytvořit fungující program v Pascalu zadání zní takto:

Matici MxN naplnit náhodnými čísly od 1 do 99, urči součet prvků prvního řádku a součet prvků posledního řádku, zjisti který součet je vyšší , zobraz matici (pomocí podprogramu )

Už si s tím dlouho lámu hlavu a většinou je to ve finále nefunkční, tudíž žádám o radu či sestavení programu .

Děkuji za nápady.

Tom

Nahlásit jako SPAM
IP: 85.135.82.–
Lorin0
Návštěvník
24. 5. 2014   #2
-
0
-

Pascal neovládám, takže ti to napíšu jen v pseudokódu. Přepsat to by neměl být problém:

// Tyto proměnné je nutné načíst - buď z parametrů předaných skriptu, od uživatele nebo ze souboru.
integer sloupcu;	// Tohle je šířka matice (M)
integer radku;		// Tohle je výška matice (N)

// Dvourozměrné pole alokované s dostatkem místa pro naše čísla
integer matice[radku][sloupcu];

// Předběžné proměnné pro sumu prvního a posledního řádku
integer suma_prv_radek = 0;
integer suma_pos_radek = 0;

for( integer radek = 0; radek < vyska; radek++ ) {

	for( integer sloupec = 0; sloupec < sirka; sloupec++ ) {

		// Vygenerujeme náhodné číslo od 0 do 99 a uložíme ho do matice
		matice[radek][sloupec] = rand( 1, 99 );
		
		// Pokud pracujeme s prvním řádkem, rovnou si připočteme aktuální hodnotu k sumě prvního řádku.
		if ( radek == 0 ) {
			suma_prv_radek += matice[radek][sloupec];
		}

		// Pokud pracujeme s posledním řádkem, rovnou si připočteme aktuální hodnotu k sumě posledního řádku.
		if ( radek == vyska-1 ) {
			suma_pos_radek += matice[radek][sloupec];
		}
	}
}

function zobrazMatrix( integer pole[][], integer radky, integer sloupce ) {
	for ( integer x = 0; x < radky; x++ ) {
		for( integer y = 0; y < sloupce; y++ ) {
			// Vypíše do konzole hodnotu pole a mezeru
			output( pole[x][y] );
			output( " " );
		}
		// Odsadí nový řádek matice
		output( "\n" );
	}
}

// Zobrazíme matrix do konzoly
zobrazMatrix( matrix, radku, sloupcu );

// Vypíšeme, výsledek
if( suma_prv_radek > suma_pos_radek ) {
	output("Suma prvního řádku je větší než suma posledního řádku.");
} else if( suma_prv_radek < suma_pos_radek ) {
	output("Suma posledního řádku je větší než suma prvního řádku.");
} else {
	output("Součet hodnot prvního i posledního řádku jsou stejné.");
}

Kód ber jen orientačně, psal jsem ho narychlo. Snad pomůže ;).

Nahlásit jako SPAM
IP: 89.190.72.–
miHan0
Návštěvník
24. 5. 2014   #3
-
0
-

#1 Tom
Postni sem co máš napsaný a nějako to upravíme ...

Nahlásit jako SPAM
IP: 62.204.249.–
Tom
~ Anonymní uživatel
434 příspěvků
25. 5. 2014   #4
-
0
-

#3 miHan
Zatím mám jen toto, problém mám jak vyšíst součet prvního řádku.Díky za nakopnutí  

program matice_generovani;
  uses
    crt;
  var
    A:array[1..10,1..10] of integer;
    PocetM,PocetN,M,N,S,suma_prv,suma_pos:integer;
  begin
    clrscr;
    randomize;
                           {nacteni velikosti matice}
    write('Zadej pocet radku M a sloupcu N: ');
    read(PocetM,PocetN);

                             {naplnime prvky matice}
    for M:=1 to PocetM do
      for N:=1 to PocetN do

        A[M,N]:=random(100);    {vygenerujeme cisla od 0 do 99}

                                {tisk matice}
    writeln('Tisk naší MATICE');
    for M:=1 to PocetM do
      begin
        for N:=1 to PocetN do
          write(A[M,N]:8);
        writeln;
      end;

      suma_prv:=0;                       {prvni radek suma}
    writeln('Suma prvniho radku');
    for M:=1 to N do
      begin
       suma_prv:=suma_prv+A[M,N];

           writeln;
          end;
          write(suma_prv:2);

    suma_pos:=0;
     writeln;                   {posledni radek suma}
    writeln('Suma posledniho radku');
    for N:=1 to N do
      begin
       suma_pos:=suma_pos+A[M,N];

           writeln;
          end;
          write(suma_pos:0);

          if suma_prv>suma_pos
            then
          write('Prvni řádek je větší než poslední ':2)
      else write('Poslední řádek je větší než první!');
            writeln;

           readkey;
  end.

Nahlásit jako SPAM
IP: 85.135.82.–
Lorin0
Návštěvník
25. 5. 2014   #5
-
0
-

Jestli to chápu dobře, nejprve vytvoříte proměnné PocetM a PocetN. Do nich načtete počet sloupců a řádků. Pole A ale máte vytvořeno předem pouze pro 10 prvků. Zápis by měl být spíše:

A:array[1..pocetM,1..pocetN] of integer;

S tím, že pole vytvoříte až poté, co víte jak velké bude (po načtení hodnot do PocetM a PocetN). 

Funkce random vrací čísla od 0 do 99, což neodpovídá zadání. Přičtěte jedničku a pak jen kontrolujte, zda číslo není větší než 99 (pak ho nastavte na 99).

mojeNahodneCislo = random(100) + 1;

if mojeNahodneCislo > 99 then
begin
	mojeNahodneCislo := 99;
end;

Poslední dva cykly for vypadají divně. Pokud M jsou řádky a N jsou sloupce, první řádek je na M = 0, stačí iterovat N. Stejně tak poslední řádek je na M = PocetM a stačí iterovat N

Pro rychlejší běh bych doporučoval omezit počet for v kódu na absolutní minimum. Cokoli lze udělat při prvním průběhu, udělejte to! Například sčítat první a poslední řádek lze při vytváření čísel. To samé by platilo o výpisu matice do konzoly, zadání však požaduje volání funkce.

Nahlásit jako SPAM
IP: 89.190.72.–
Mircosoft+1
Věrný člen
13. 6. 2014   #6
-
0
-

Starší vlákno, ale zasloužilo by si nějaký závěr, aby nemátlo příští generace :-). Takže:

1) Definice matice. Pole v Pascalu nemůže mít dynamickou velikost (pokud to neobejdeme přes ukazatel a dynamickou alokaci, což teď asi neřešíme), takže pevně zadané maximální rozměry jsou správně. Chyba ovšem je, že si uživatel může zadat pocetm a pocetn jaký chce a program to po něm nezkontroluje, takže pak může dojít k zápisu mimo pole (program provedl nepovolenou operaci a bude ukončen...). Chce to přidat nějaký if a aspoň chybovou hlášku s haltem, ideálně cyklus a nový pokus.

2) Plnění matice. Číslo od 1 do 99 dá výraz random(99)+1. Cykly jsou v pořádku.

3) Výpis je OK, přepsání na podprogram (proceduru) bude triviální záležitost.

4) Sčítání. Úvodní vynulování sum je správně, zbytek špatně. Když procházíme první řádek, je první index konstantně 1 a druhý běží od 1 do pocetn. Podobně pro poslední řádek: m je trvale rovno pocetm a n zase běží od 1 do pocetn. Cyklus je tedy v obou případech for N:=1 to PocetN, indexy jsou [1,N], resp. [pocetM,N].

Teď už by sis s tím měl poradit.

Zasláno z mobilního telefonu.

Nahlásit jako SPAM
IP: 185.26.182.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
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, 1 host

Podobná vlákna

Prosím o radu !!! — založil ospalka123

Prosím o radu — založil dave3++

Prosím o radu — založil Berry309

Prosím o radu — založil sparky29

Prosím o radu — založil Pavel00

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ý