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.
Mislim da si previse zakomplikovao, moze to i lakse
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...
Vidi se ;)
n je promenljiva...
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...
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).
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.
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 :)
vBulletin® v3.8.7, Copyright ©2000-2024, vBulletin Solutions, Inc.