Hledání prvočísel v matici - funkce – Pascal – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Hledání prvočísel v matici - funkce – Pascal – Fórum – Programujte.comHledání prvočísel v matici - funkce – Pascal – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Nikolishe
~ Anonymní uživatel
4 příspěvky
26. 12. 2013   #1
-
0
-

Dobrý den, 

chtěla bych vás požádat o pomoc. Můj úkol zní: Naplňte matici A náhodnými čísly. Určete sumu všech prvočísel v matici. Matici a sumu vypište.

Naplnit a vypsat matici mi problém nedělá, jenže nemůžu se dostat přes hledání prvočísel v matici za pomocí funkce. Jsem v tom nová a nemohla jsem nic najít co by mi pomohlo, tak prosím o popostrčení :-)

můj kód vypadá zatím takto: (začátek funkce vypadá dost šíleně ale ta matice mi dělá opravdu problém :-( )

program project1;

const
  M = 10;
  N = 10;

type
  matice = array [1..M,1..N] of integer;

var
  i,j,:integer;
  A:matice;
procedure napln (var x:matice);
begin

  for i := 1 to M do
        for j := 1 to N do
           x[i,j] := random(100);

end;
procedure vypis (x:matice);
begin
  for i := 1 to M do
       begin
        for j := 1 to N do
           write(x[i,j],' ');
        writeln;
       end;
end;
function prvocislo(x:matice):integer;
begin
     for i:=1 to M do
     for j:=1 to N do
     begin
     if x[i,j] <= 1 then
     else if x[i,j] mod 2 = 0 then
     else if x[i,j] mod 3 = 0 then
     else if x[i,j] mod 5 = 0 then
     else if x[i,j] mod 7 = 0 then
     else
     writeln(x[i,j]);
     end;
end;

Nahlásit jako SPAM
IP: 86.61.166.–
Reklama
Reklama
Honzc
~ Anonymní uživatel
220 příspěvků
26. 12. 2013   #2
-
0
-

#1 Nikolishe
Zkus si projít následující program http://www.ms.mff.cuni.cz/…vocislo.html a udělej si z něho funkci, která místo toho výpisu, pokud to bude prvočíslo, ho přičte do nějaké proměnné soucet, ve které se budou ta prvočísla sčítat.

Jinak bych ještě v tom plnění natice to udělal takto: x[i,j] := random(99)+1; (pak ti to bude matici plnit čísly od 1 do 99) (tobě to teď plní matici čísly od 0 do 99) a pak ještě výpis

write(x[i,j],' '); zkus přepsat na write(x[i,j] :3);

Nahlásit jako SPAM
IP: 86.61.178.–
Nikolishe
~ Anonymní uživatel
4 příspěvky
26. 12. 2013   #3
-
0
-

Děkuji. Předělala jsem ten uvedený program na funkci, všechno mi funguje tak jak má, tak jsem se pustila do předělávání mojí práce, ale nedaří se mi s maticí.

Při spuštění mí program vypíše(sečte) poslední číslo v matici pokud je zrovna prvočíslo a ostatní čísla v matici mi ignoruje. Nevím jak napsat kód aby mi vyhledával s sčítal prvočísla v celé matici.

Útržek mého kódu vypadá takto:

var
  i,j,D,pocet,soucet:integer;
  A:matice;

function prvocislo(x:matice):integer;
begin
  prvocislo:= x[1,1];
  for i := 1 to M do
        for j := 1 to N do
            if x[i,j] <= 0 then
            else if x[i,j] = 1 then
            else begin
                pocet := 0;
                D := 2;
                soucet:=0;
                while (pocet = 0) and (D < sqrt(x[i,j])) do begin
                        if x[i,j] mod D = 0 then pocet := pocet + 1;
                        D := D + 1;
                        end;
                if pocet = 0 then
                begin
                soucet:=soucet + x[i,j];
                end;
            end;
end;

begin

   randomize;
   napln(A);
   vypis(A);
   writeln;
   prvocislo(A);
   writeln('Soucet: ', soucet);
   readln;

end.

Nahlásit jako SPAM
IP: 86.61.166.–
Nikolishe
~ Anonymní uživatel
4 příspěvky
26. 12. 2013   #4
-
0
-

Tak jsem zjistila že ten kód v tom odkazu je špatně, protože tvrdí i na složené číslo že je prvočíslo, takže jsem opět na začátku :-( Prosím Vás kdyby někdo měl nějaký nápad poraďte, už to pomalu začínám vzdávat

Nahlásit jako SPAM
IP: 86.61.166.–
JoDiK
~ Anonymní uživatel
981 příspěvků
26. 12. 2013   #5
-
0
-

#4 Nikolishe
Kód v odkazu je asi správně, a tobě to sčítá jen poslední číslo, protože součet prvočísel nuluješ kde? Před zkoumáním každého jednoho čísla z matice...

Nahlásit jako SPAM
IP: 88.103.233.–
dzejkob
~ Anonymní uživatel
7 příspěvků
26. 12. 2013   #6
-
0
-

#4 Nikolishe
Je to sice trapné, už si ale nepamatuju jak se pracuje s prvočísly. Ovšem pokud tam dáte místo tohoto:

while (pocet = 0) and (D < sqrt(x[i,j])) do begin

bez odmocniny:

while (pocet = 0) and (D < x[i,j]) do begin

tak by to mělo fungovat. Logicky bude číslo dělitelné maximálně půlkou, takže bych to vydělil dvěma:

while (pocet = 0) and (D < x[i,j] / 2) do begin

určitě existují efektivnější algoritmy, jak zjistit prvočíslo, tohle by ale mělo fungovat.

Nahlásit jako SPAM
IP: 89.176.232.–
Mircosoft+1
Věrný člen
26. 12. 2013   #7
-
0
-

V tom programu se nějak vůbec nevyznám. Chtělo by to vyřešit to po kouscích.

První krok: napiš si funkci, která ti řekne, jestli dané číslo je prvočíslo:

function JePrvocislo(cislo:integer):boolean;
Begin
...
End;

Odzkoušej ji v samostatném prográmku, ve kterém ji budeš ručně krmit různými čísly a sledovat, jestli z ní vypadne true nebo false:

writeln('konci se zadanim nuly');
 repeat
 write('cislo k otestovani: ');
 readln(cislo);
 if JePrvocislo(cislo) then writeln('je')
                       else writeln('neni');
 until cislo=0;

Jakmile si budeš jistá, že funkce funguje správně, pusť ji na tu matici. Projdi všechny prvky matice a u každého otestuj, jestli je prvočíslo. Jestli jo, přičti ho k součtu. Jestli ne, nedělej nic.

soucet:=0;
for i:=1 to m do
 for j:=1 to n do if JePrvocislo(matice[m,n]) then ...

Na konci budeš mít hledaný součet všech prvočísel v matici.

Nahlásit jako SPAM
IP: 194.228.20.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Mircosoft+1
Věrný člen
26. 12. 2013   #8
-
0
-

Jinak k tomu určování prvočíselnosti: číslo je prvočíslo, pokud se nedá ničím vydělit beze zbytku. Tedy pokud dělením všemi čísly od 2 do toho čísla dají nenulový mod. Stačí na to jeden cyklus typu for a jedna proměnná typu boolean. Tu na začátku nastav na true (předpokládáme, že to je prvočíslo) a kdykoli ti vyjde nulový mod, změň ji na false (není to prvočíslo). Pokud na true vydržela až do konce, prvočíslo to je.

Rozsah cyklu můžeme zkrátit. Třeba když zkoušíme číslo 7 dělit dvojkou, vyjde nám trojka a nějaký zbytek. Pak už ho nemusíme dělit trojkou, protože by nám vyšla dvojka a tu už jsme jednou testovali (3*2=2*3). Takže můžeme skončit ve chvíli, kdy nám dělitel začne převyšovat podíl, tedy na odmocnině z toho testovaného čísla (sqrt). Výsledek bude stejný, jenom se počítač míň nadře a bude to mít dřív hotové.

Nahlásit jako SPAM
IP: 194.228.20.–
Chceš-li lepší odpověď, polož lepší otázku.
Moje stránka.
Nikolishe
~ Anonymní uživatel
4 příspěvky
26. 12. 2013   #9
-
0
-

Děkuji moc všem :-)) od všech jsem si něco vzala a konečně se mi povedlo projekt dokončit. Kód na určování prvočísla není zrovna efektivní ale přepočítavala jsem 4x součty a výsledek byl správně.

Tady dávám konečný kód:

program project1;

const
  M = 10;
  N = 10;

type
  matice = array [1..M,1..N] of integer;

var
  i,j,D,soucet:integer;
  A:matice;

procedure napln (var x:matice);
begin

  for i := 1 to M do
        for j := 1 to N do
           x[i,j] := random(99)+1;

end;
procedure vypis (x:matice);
begin
  for i := 1 to M do
       begin
        for j := 1 to N do
           write(x[i,j] :3);
        writeln;
       end;
end;
function prvocislo(x:matice):integer;
begin
  soucet:= 0;
  for i := 1 to M do
        for j := 1 to N do
            if x[i,j] <= 0 then
            else if x[i,j] = 1 then
            else begin
                D := 2;
                while x[i,j] mod D <> 0 do
                        D := D + 1;
                if D = x[i,j] then
                begin
                soucet:=soucet + x[i,j];
                end;
            end;
end;

begin

   randomize;
   napln(A);
   vypis(A);
   writeln;
   prvocislo(A);
   writeln('Soucet prvocisel je ', soucet);
   readln;

end.

Nahlásit jako SPAM
IP: 86.61.166.–
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, 19 hostů

Podobná vlákna

Hledani v matici — založil slezikán

Hledání slov v matici — založil Bery

Seznam prvočísel — založil Luke

Sucet prvych X prvocisel — založil RedSoul

Moderátoři diskuze

 

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