[ DarkShadow @ 26.12.2011. 22:25 ] @
imam jedan problem u Pascalu, dobili smo u skoli zadatak a ja sam nema sanse da znam da ga uradim pa ako bih neko mogao pomoci, unaprijed se zahvaljujem.
zadatak glasi:

Napisati program koji pronalizi koliko se puta broj 2 ponavlja za unijete brojeve.
npr. ja unesem brojeve: 27, 39, 1268, 22567, 3926... i trebam napisati program koji ce pronaci koliko se puta u ovom program ponavlja cifra dva i ispisuje rezultat(ovdje je rezultat 5)
smejete koristiti sledece naredbe: IF THEN, IF ELSE, CASE, FOR-petlju, WHILE-petlju, REPEAT-petlju.

Ja stvarno nemam nikakvu ideju kako da ovo uradim, i ako bih mi neko mogao i objasniti taj zadatak bio bih mu zahvalan.



Unaprijed hvala.

[ savkic @ 26.12.2011. 23:38 ] @
> Napisati program koji pronalizi koliko se puta broj 2 ponavlja za unijete brojeve.
> npr. ja unesem brojeve: 27, 39, 1268, 22567, 3926... i trebam napisati program koji ce pronaci koliko se puta u ovom program ponavlja cifra dva i ispisuje rezultat(ovdje je rezultat 5)
> smejete koristiti sledece naredbe: IF THEN, IF ELSE, CASE, FOR-petlju, WHILE-petlju, REPEAT-petlju.

Jedna ideja je da odrediš cifre svakog od unetih brojeva i proveriš da li je neka jednaka 2. Evo primera za rastavljanje broja na cifre.

Code:

var
  Broj: Integer;
begin
  Readln(Broj);

  while Broj > 0 do
  begin
    Writeln(Broj mod 10);
    Broj := Broj div 10;
  end;

  Readln;
end.
[ reiser @ 27.12.2011. 02:29 ] @
Napravis repeat..until ili while..end petlju u kojoj ce se unositi brojevi, posle svakog unosa racunas koliko se cifra 2 pojavljuje u tom broju i dodajes to na jednu promenljivu koja je pre pocetka petlje inicijalizovana na 0. Iz petlje stavis da se izlazi kada se recimo unese broj 0. Evo kako bi pseudokod izgledao:

Code:

rezultat = 0; // inicijalizuj promenljivu u kojoj ces cuvati rezultat, tj koliko se 2 ponavlja u brojevima, na nulu

repeat // pocetak petlje
  korisnik unosi broj
  racunas koliko se puta cifra 2 ponavlja u broju i to dodajes na promeniljivu "rezultat", koristis kod koji ti je savkic dao
until broj = 0; // ovde petlja proverava da li je uneti broj jednak nuli, ako nije, izvrsavanje programa se vraca na pocetak petlje, ako jeste, prekida se izvrsavanje petlje i ide se na liniju ispod

ispisi rezultat
[ DarkShadow @ 27.12.2011. 17:43 ] @
nisam se prije mogao javiti, skola, ali evo stigao sam:

ja sam to shvatio otprilike ovako, ali program nesto nevalja tj. ne ispisuje sta bih trebao
pa ako bih me neko mogao ispraviti i objasniti unaprijed hvala


Code:

program blabla;
 uses wincrt;
  var
   broj,rezultat:integer;
  begin
   rezultat:=0;
    repeat
     readln(broj);
      while broj>0 do
       begin
    writeln(broj mod 10);
    broj:=broj div 10;
         begin
      if broj mod 10 = 2 then
      rezultat:=rezultat+1;
         end;
       end;
    until broj=0;
   writeln(rezultat);
end.



[ reiser @ 27.12.2011. 18:06 ] @
Code:

1    writeln(broj mod 10);
2     broj:=broj div 10;
3          begin
4       if broj mod 10 = 2 then
5       rezultat:=rezultat+1;
6         end;


Prva linija ti ispisuje zadnju cifru broja. Razmisli, jel ti ovo potrebno u programu ?
Druga linija ti deli broj sa 10 i smesta celobrojnu vrednost deljenja u broj. Dakle, ako je broj = 12345, posle ove linije, broj ce biti 1234
Cetvrta linija se onda pita da li je zadnja cifra broja jednaka 2, i ako jeste u petoj liniji se rezultat poveceva za jedan.
Treca i sesta linija su ti neportrebne, njih mozes da izbacis, nista ne postizes tim begin..end blokom.

Uzmi npr da je uneti broj 12345 i simuliraj izvrsavanje programa u glavi i videces sta ne valja:

Code:

readln(broj); // unosi se broj 12345
while broj>0 do begin
  broj = broj div 10; // prvobitna vrednost broja je 12345, posle ove linije je 1234
  if broj mod 10 = 2 then // ovde je broj vec 1234 i ti ispitujes da li je njegova zadnja cifra jednaka dvojci. Jesi ispitao peticu ? Nisi, jer si je u prethodnoj liniji eliminisao bez da prvo proveris da li je jednaka dvojci
    rezultat := rezultat + 1;
end;


[ dusansilni95 @ 30.12.2011. 16:40 ] @
kao prvo:
morao sam da pravim novi profil, na ovom starom(DarkShadow) mi se promijenila sifra i email adresa, nemam pojma kako, al uglavnom otislo nepovratno

a kao drugo:
izgleda da za mene nema nade, nisam uspio rijesiti onaj zadatak, pa bih zamolio da mi ga neko rijesi(da cijeli kod) i ako je moguce objasni zasto,kako?
[ dusansilni95 @ 30.12.2011. 17:30 ] @
i imam jos jedan problem,
trebam napisati program koji provjerava da li je unijeti broj savrse, tj. ako jeste da ispise 'Broj je savrsen' a ako nije 'Broj nije savrsen'.
evo koda, kako bi po meni otprilike trebalo biti;

Code:

program blabla;
 uses wincrt;
  var
   i,n,s:integer;
  begin
   writeln('Unesi jedan broj:');
   readln(n);
    for i:=1 to n-1 do
     begin
      if n mod i = 0 then
      s:=s+i;
     end;
     begin
      if s mod n = 0 then
      writeln('Broj je savrsen') else;
      writeln('Broj nije savrsen');
     end;
end.



ali nesto ne valja.
[ reiser @ 30.12.2011. 17:48 ] @
Oko ovog zadatka sa savrsenim brojem...

1) Brojac nemas potrebe da postavljas do n-1, nego do n div 2, jer broj moze biti deljiv sa najvise svojom polovinom, ako je paran.
2) Inicijalizuj s na nulu pre brojaca za svaki slucaj
3) Posle brojaca ti pitas if s mod n = 0, a to znaci da n moze da bude 1, s da bude bilo koji broj, i ti ces dobiti TRUE kao rezultat tog upita. Trebas da pitas if s = n
[ dusansilni95 @ 30.12.2011. 18:20 ] @
zahvaljujem se reiser-u na pomoci .
uradio sam zadatak i sad mi radi kako treba.
evo koda, pa ako neko bude imao isti ili slican zadatak nek se posluzi. mada sumnjam ovo je za vecinu ovdje smijesno:

Code:

program blabla;
 uses wincrt;
  var
   i,n,s:integer;
  begin
   writeln('Unesi jedan broj:');
   readln(n);
   s:=0;
    for i:=1 to (n div 2) do
     begin
      if n mod i = 0 then
      s:=s+i;
     end;
     begin
      if s=n then
      writeln('Broj je savrsen') else
      writeln('Broj nije savrsen');
     end;
end.