PDA

Prikaži potpunu verziju : Problem sa kodom u paskalu


doom_lord
5.12.2005, 22:19
Imam za domaci da napisem program koji ce iz ucitanog niza navi najveci parni i najmanji neparni broj. Ja sam napisao takav program ali on pravi probleme sa negativnim neparnim braojevima. Evo programa:

program dz2;
uses crt;
Var
Pmax,NPmin,i,N : integer;
A:array [1..300] of integer;
begin
Repeat

Repeat
write ('Unesi broj elemenata niza: ');
read (N);
until (n>0) ;

Pmax:=1;
NPmin:=0;
For i:=1 to n do
Begin
write ('Unesi ',i,'-ti element niza: ');
readln(A[i]);
If ((abs(A[i]) mod 2=0) and ((A[i] > Pmax) or (Pmax=1))) then Pmax:=A[i];
If ((abs(A[i]) mod 2=1) and ((A[i] < NPmin) or (NPmin=0))) then NPmin:=A[i];
end;
If (Pmax=1) then
writeln ('Ne postoji ni jedan paran broj')
else
WriteLn ('Maximalan paran broj je ',Pmax);
If (NPmin=0) then
writeln ('Ne postoji ni jedan neparan broj')
else
WriteLn ('Minimalan neparan broj je ',NPmin);
Until (n<=1);
Readln;
end.

Reloader
9.12.2005, 22:13
Mislim da si previse zakomplikovao, moze to i lakse

Anak1n
9.12.2005, 23:52
until (n>0) ;



Mozda lupam al ako je n > 0 a kolko znam negativni su manji od nule :confused:
Nemam neko iskustvo sa programskim jezicima...

Reloader
10.12.2005, 0:29
Vidi se ;)

n je promenljiva...

3dM@niak
10.12.2005, 1:02
Evo ti kod:

var u,n,i,max,min,i1,i2:integer;
a:array [1..300] of integer;

begin
max:=0;
min:=0;
i1:=0;
i2:=0;

writeln('Unesite broj elemenata niza');
readln(n);

for i:=1 to n do
begin
writeln('Unesi broj');
readln(u);
a[i]:=u;

if ((u mod 2 = 0) and ((u>max) or (i1=0))) then
begin
max:=u;
i1:=1;
end;

if((abs(u mod 2) =1) and ((u<min) or (i2=0))) then
begin
min:=u;
i2:=1
end;

end;

if i1=1 then
writeln ('maximalni parni broj je',max)
else
writeln ('Nisu unoseni parni brojevi');

if i2=1 then
writeln ('minimalni neparni broj je',min)
else
writeln ('Nisu unoseni neparni brojevi');


end.


niz je tu chisto reda-radi, da se sacuvaju podaci... inache ti ni na treba...

Nemesis
10.12.2005, 16:12
Jedan savet za sve.
Nemojte odmah dodeljivati vrednost za min i max pre ulaska u petlju.

Pretpostavimo da je dat niz A tipa integer, promenljiva MAX koja treba da vrati najvecu vrednost niza, kao i da je uneta promenlijva N koja oznacava dimenziju niza...

Do greske ce doci ako na primer napisete:

max := 0;

for i := 1 to n do
if a[i] > max then max := a[i];


jer ako su u nizu svi elementi negativni program ce za MAX zadrzati 0.


Mnogo je bolje PRVI element niza proglasiti za najmanji / najveci, a potom sa njim uporedjivati. Npr:

max := a[1];

for i := 2 to n do
if a[i] > max then max := a[i];

doom_lord
10.12.2005, 16:13
Nasao sam gresku u mom kodu, to jest nije bila greska u kodu vec u tome sto nisam kompajlirao program pa je pokretao pogresnu verziju. U svakom slucaju hvala na pomoci.

PS: until (n<0) se odnosi na duzinu niza a ne na clanove niza.

3dM@niak
10.12.2005, 17:15
@nemesis: Da...ali ovde je problem sto imamo dva dela : pozitivne i negativne brojeve, pa bi se moglo desiti da se ne unese recimo neparan broj, i on za najmanji neparan ispishe prvi uneti broj... zato sam stavio i1 i i2 kao indikatore da li su uopste uneti parni i neparni brojevi.
eto, samo toliko....

doom_lord
10.12.2005, 18:03
@nemesis: kod mene je to reseno postavljanjem Pmax (NPmin) na neparan (paran) broj, i ako taj broj takav i ostane znaci da nema parnih (neparnih).

Nemesis
11.12.2005, 3:13
3dM@niak: U pravi si. Nisam se lepo izrazio. Hteo sam samo da napomenem generalni slucaj trazenja min/max u nizu, pa se deo koda odnosi na opsti problem, s obzirom da su takvi zadaci cesti.

Sto se konkretnog problema tvoj pristup je OK, jedino sto bih umesto i1 i i2 kao integer koristio boolean vrednosti. No, to je samo stvar ukusa.

3dM@niak
11.12.2005, 3:17
ok :)

kinteC
16.1.2006, 18:44
Jedan savet za sve.
Nemojte odmah dodeljivati vrednost za min i max pre ulaska u petlju.

Pretpostavimo da je dat niz A tipa integer, promenljiva MAX koja treba da vrati najvecu vrednost niza, kao i da je uneta promenlijva N koja oznacava dimenziju niza...

Do greske ce doci ako na primer napisete:

max := 0;

for i := 1 to n do
if a[i] > max then max := a[i];


jer ako su u nizu svi elementi negativni program ce za MAX zadrzati 0.


Mnogo je bolje PRVI element niza proglasiti za najmanji / najveci, a potom sa njim uporedjivati. Npr:

max := a[1];

for i := 2 to n do
if a[i] > max then max := a[i];

reklo bi se da je sve jedno, sta mislis?
ps: ovo je napisao moj ortak, valjda je u pravu :)