PASCAL - Zadaci, resenja, problemi, izazovi...

Stvarno nisam lenja, ali mi treba pomos oko Pascala- naredba FOR... Na casovima smo radili samo najlakse primere, a na pismenom smo dobili nesto sto nismo umeli ni da procitamo... Program koji je resenje glasi

Zadatak je nacrtati algoritam i napisato program kojim se za uneto n izracunava suma S=3+3^2+3^3+...+3^n ... Ovo je najlaksi... Ali bi mi pomogla objasnjenja kako se sta radi, ne znam sta predstavlja s, i, i p koji se kasnije javljaju u programu...?
 
S, i i p su promenljive koje je taj neko ciji si program citala koristio. Ti mozes da koristis koje god promenljive ti odgovaraju. Jedino je uobicajeno da se promenljive i,j,k koriste kao brojaci u for petlji.

Ovde ti je potrebno to n koje treba da ucitas, i kao brojac u for petlji da ide od 1 do n, neko step recimo gde cuvas 3^i i neko rez gde cuvas resenje.

Kod:
var
   n,i,step,rez:integer;
begin
   readln(n);
   rez:=0;
   step:=1;
   for i:=1 to n do
      begin
         step:=step*3;
         rez:=rez+step;
      end;
   writeln(rez);
end.
 
Imam sutra pismeni iz informatike u vezi programiranja iz cega stvarno nista ne znam,pa ako neko moze da mi pomogne da resim neki od zadataka....HVALA UNAPRED!!

1.Napisati algoritam i program kojim se zadati cetvorocifreni broj zapisuje u inverznom obliku...
2.Napisati algoritam i program kojim se ispituje da li su resenja kvadratne jednacine pozitivna ili negativna...
 
Kod:
var
   a,b:integer;
begin
   readln(a);
   b:=0;
   while a>0 do
      begin
         b:=b*10+(a mod 10);
         a:=a div 10;
      end;
   writeln(b);
end.

Kod:
var
   a,b,c,x1,x2:real;
begin
   writeln('Za kvadratnu jednacinu oblika a*x^2+b*x+c=0 unesite a,b i c,');
   write('a=');
   readln(a);
   write('b=');
   readln(b);
   write('c=');
   readln(c);
   x1:=(-b-sqrt(b*b-4*a*c))/(2*a);
   x2:=(-b+sqrt(b*b-4*a*c))/(2*a);
   if x1>0 then 
      writeln('Resenja su pozitivna.') else
      if x2>0 then
         writeln('Resenja su razlicitog znaka.') else
         writeln('Resenja su negativna.');
end.

Drugi i nije bas najbolje odradjen, ali me mrzi da ga kuckam kako treba a i samo bih te zbunio sa poredjenjem realnih brojeva posto ne moze samo sa manje i vece da se poredi kako treba.
 
Mislim da mozes na dva nacina.
Jedan je da je ulaz dvocifren broj sa istim ciframa pa da se proverava. Prvo konstanta bude jedan, posle se uveca za jedan. Krece se od jedinice koja se dize na kvadrat (moze a i ne mora) i sabira sa kvadratom sledeceg broja (trenutni plus konstanta). Ako se dobije broj isti koji je na ulazu prekida se i ide sledeci broj, ili ako se dobije broj veci od broja na ulazu.
Sledeci broj je prva cifra plus 1 i druga cifra plus 1.. ukupno 9 brojeva.

Drugi je da se redom sabiraju kvadrati brojeva pocevsi od jedan i uvecavajuci za konstantu (prvo put 1, sledece ponavljanje +1) i kada se dobije broj kome su obe cifre iste, ispisuje ga. Kada zbir predje 99 konstanta se uvecava za 1 i krece se od pocetka. Kada kvadrat prvog broja (pre dodavanja konstante) bude veci od 99 nema smisla dalje..

Nisam razumeo da li je konstanta jedan od uslova koji bi se uneo na pocetku ili za razlicite brojeve moze biti razlicita.

i nije mi jasno da li ti je problem kod ili sta program treba da radi. Ako je ovo drugo evo ideje... ako je prvo.. slozi ovo fino, malo je zapetljano ali mislim da nije mnogo tesko.
 
Kod:
var
   i:integer;

function moze(n:integer):boolean;
var
   i,c,s,t:integer;
begin
   moze:=false;
   for i:=1 to 9 do
      for c:=1 to 8 do
         begin
            s:=0;
            t:=i;
            while s<n do
            begin
               s:=s+t*t;
               t:=t+c;
            end;
            if s=n then
               moze:=true;
         end;
end;

begin
   for i:=1 to 9 do
      if moze(11*i) then
         writeln(11*i);
end.

Ovo bi trebalo da radi ali mislim da ti kod nista ne vredi ako ne umes da osmislis algoritam.
 
Majstore ako ti nije problem,možeš da mi objasniš zašto program ne radi ako stavim da je vrijednost b:=0 van petlje?I da kod ovoga:

if b>max then
begin
max:=b;
res:=i;
zašto program ne radi ako odmah stavim :
if b>max then res:=i;

To me buni.

***,ne verujem kako mi Repeat i While idu od ruke,a ova petlja u petlji nikako.

Uzgred,hvala unapred. ;)
 
Ako b:=0 stavis van petlje on ce na pocetku biti nula a kasnije samo dodavati po 1. Poenta je da u b cuvas broj delioca broja i tako da b moras postaviti na 0 kad god i dobije novu vrednost.

Max cuva broj delilaca broja sa najvise delilaca do sad. Ako si naisao na broj sa vise delilaca, tad ce b biti vece od max. Ako tad ne postavis max:=b onda ces sledeci put opet proveravati za prethodnu vrednost maxa koja nije najveca jer si malopre nasao b koje je vece od toga.
 
Nemanja treba mi pomoć.:mrgreen:

Zadatak glasi ovako:

Neka se unese broj predmeta koje je učenik pohađao.Pa neka se unesu zaključne ocene iz predmeta.
Ako učenik ima negativnu ocenu,program treba da ispiše "Nedovoljan",u suprotnom se ispisuje prosjek i uspjeh.

E ovde sam zapeo:
Kod:
program dnevnik;
var
o: array [1..5] of integer;
i,n,x,y,p,s:integer;
pros:real;
begin
writeln ('broj predmeta');
readln (p);
s:=0;
n:=0;
for i:=1 to p do
  begin
  writeln ('Unesi ocjenu iz predmeta');
  readln (o[i]);
  s:=s+o[i];
  n:=n+1;
  end;
  pros:=s/n;
[B]if o[i]=1 then writeln ('nedovoljan')[/B]
else
begin
   if  (pros<2.5) and (pros>1) then writeln ('Dovoljan ',pros:0:2) else
  if  (pros>=2.5) and (pros<3.5) then writeln ('Dobar ',pros:0:2) else
  if  (pros>=3.5) and (pros<4.5) then writeln ('Vrlo dobar ',pros:0:2) else
  if (pros>=4.5) and (pros<=5) then writeln ('Odlican ',pros:0:2) ;
end;
readln;
end.

E da ako sam se negdje izvalio,nemoj da se smiješ.;)

E da,šta je ustvari problem kod mog programa...
Pa problem je to što ja kad unesem 1 on to uvrsti za računanje prosjeka?!
Ovo što je boldovano,kao i da ne izvršava?
 
1. Promenljiva n ti je nepotrebna, jer ti je p broj predmeta a kasnije racunas n tako sto jedan po jedan dodajes dok ne dobijes isti broj kao i p.
2. Mnogo bi bilo citkije kad bi probao da uvlacis delove koda koji su celine tj. u okviru neke petlje, procedure, dela programa(var, const, type)...
3. Kad se zavrsi for petlja, i tad ima vrednost p ako se ne varam tako da ti proveravas za o[p] a ne za svako o pa zato ne radi program tj. ispisace nedovoljan samo ako je poslednja ocena 1. Mozes recimo da napravis promenljivu tipa boolean koja ti cuva da li je bilo jedinica.
4. Nema potrebe da stavljas 2 uslova u one ifove na kraju jer je prosek uvek veci od 1 a ako nije manji od 2,5 onda je sigurno veci ili jednak itd.

Program bi mogao da izgleda ovako:
Kod:
program dnevnik;
var
   p,s,i,o:integer;
   nedovoljan:boolean;
   prosek:real;
begin
   write('Unesite broj predmeta: );
   readln(p);
   nedovoljan:=false;
   s:=0;
   for i:=1 to p do
      begin
         write('Unesite ocenu iz ',i,'-og predmeta: );
         readln(o);
         s:=s+o;
         if o=1 then
            nedovoljan:=true;
      end;
   write('Ucenik je ');
   if nedovoljan then 
      writeln('nedovoljan.') else
      begin
         prosek:=s/p;
         case trunc(prosek+0.5) of
            2: writeln('dovoljan.');
            3: writeln('dobar.');
            4: writeln('vrlo dobar.');
            5: writeln('odlican.');
         end;
      end;
end.
 
Postoji procedura random. Ako stavis npr random(n), dobices nasumice izabran broj iz skupa {0,1,2,...,n-1}. Tako npr. ako ti treba neki br iz skupa {1,2,3,...n} onda koristis random(n)+1.

Postoji i procedura randomize koja se poziva jednom u programu pre koriscenja random funkcije kako bi kompjuter generisao neke random brojeve tj da random(n) ne bi uvek vracalo isti rezultat.

Primer:

Kod:
program loto;
var
   i,a:integer;
   izvucen:array[1..39] of boolean;
begin
   for i:=1 to 39 do
      izvucen[i]:=false;
   randomize;
   for i:=1 to 7 do
      begin
         repeat
            a:=random(39)+1;
         until not izvucen(a);
         izvucen[a]:=true;
      end;
   write('Izvuceni brojevi su:');
   for i:=1 to 39 do
      if izvucen[i] then
         write(' ',i);
   writeln(.);
end.
 
Nemanja problemi fataju.:mrgreen:

Interesuje me,ima li Pascal funkciju da velika slova pretvara u mala i obrnuto?

Konkretno,zadatak kaze da provjeri da li je ucitani string palindrom,da se zanemare razmaci i da se zanemare UpCase,odnosno DownCase slova.

Dovde sam stigao:
Kod:
program palindrom;
var
   d,i:string ;
   j,k:integer;
begin
    readln (i);
     for k:=1 to length(i) do
       begin
        if i[k]=' ' then delete(i,k,1);
         end;
           for k:=length(i) downto 1 do
           d:=d+i[k];
           if i=d then writeln ('Jeste') else writeln ('Nije');
    readln;
end.
Sredio sam ove razmake,ali ne znam kako da zanemarim slova?

Hvala unapred.
 
ne znam za to verovatno ima nesto, mada ja takve stvari ne ucim nikad napamet, mozes da napravis sam nesto slicno

npr evo funkcija koja od malih slova daje velika a sve ostalo ostavlja isto

Kod:
function Velika(s:string);
var 
   i:integer;
begin
   for i:=1 to length(s) do
      if s[i] in 'a'..'z' then
         s[i]:=chr(ord('A')+ord(s[i])-ord('a'));
end;

Radi na sledecem principu: Za svaki znak u stringu proveri da li je medju malim slovima. Ako jeste, tad od tog malog slova pravi veliko koristeci funkcije chr i ord. Svako slovo i svaki znak imaju svoj ascii kod preko kojih ih kompjuter prepoznaje i kako ih on zaista i posmatra. Ascii kodovi slova a,b,c,d,... se razlikuju za 1 i svaki je veci od prethodnog. Isto vazi i z A,B,C,D,... ord(znak) vraca broj koji predstavlja ascii kod tog znaka. Posto odgovarajuci znaci imaju uzastopni ascii kod, vazi sledece ord(maloslovo1)-ord(maloslovo2)=ord(velikoslovo1)-ord(velikoslovo2). Npr ord('a')-ord('g')=ord('A')-ord('G'). e sad ako g predstavlja slovo za koje proveravas, izrazis ord('G') odavde i dobijes njegov ascii kod. Chr(broj) daje znak ciji je ascii kod broj. Jedino mozes da proveris npr koliko je ord('A')-ord('a') pa da umesto toga stavis npr taj broj da ne bi uvek racunao tu razliku. Mislim da je 32 ili -32 ili tako nesto ali nij ni bitno. ascii kodove mozes naci na netu ako ti zatrebaju nekad.
 
Znaci pripremam se za kantonalno takmicenje... radim pascal al' nikako nemogu da shvatim zasto mi ne cita matricu 10x10 pravilno iz datoteke...
radim zadatak Potapanje brodova ;)

0010000010
0000001000
0010001010
0000100000
0010101000
0000001010
1001000000
0000000000
0000001000
0100000000

znaci jednice predstavljaju brodove... eh . .sada po ovom kodu :

Kod:
uses crt;
var
  i,j,k1,k2,b,t :integer;
  a:array [1..10,1..10] of integer;
  ulaz,izlaz:text;
begin
  ClrScr;
  Assign(ulaz,'C:\brodovi.txt');
  reset(ulaz);
  Assign(izlaz,'C:\brodovio.txt');
  rewrite(izlaz);
  while not eof(ulaz) do
  begin
   for i := 1 to 10 do
    begin
     for j := 1 to 10 do
      begin
       Readln(ulaz, a[i,j]);
      end;
    end;
   for i := 1 to 10 do
    begin
     for j := 1 to 10 do
      begin
       Write(a[i,j]);
       Write(izlaz,a[i,j]);
      end;
     Writeln;
    end;
  end;
Readln;
close(ulaz);
end.

Ispisuje slijedece u datoteku ..to sam uzeo za primjer samo da vidim kako je cita... i ne cita dobro .. ostatak programa je prelagan za uraditi..
znaci ovo printa u izlaznu datoteku:

-269981000-25998-3107284561010313601000-7936
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000
0000000000

a treba smao da printa onu matricu .. molim pomoc hitno mi je moram do petka da ovo uradim

znaci samo da vidim gdje sma pogrijesio pri citanju matrice
 
Imamo kontrolni paaaa... ako bi neko mogao da mi pripomogne sa ovim zadacima, i to ne samo meni već celom odeljenju jer smo isprepadani od kad smo ih ugledali budući da ništa slično ni blizu nismo radili na časovima, sad ni petičari ne znaju šta da rade a kamoli mi sa četvorkama ili trojkama..
Daaakle...

Odštampati sve dane, sate i minute u periodu: 1.5.2007. 00:00 - 15.5.2007 23:59.

Odštampati tablicu množenja 3-7

Odštampati sve šeste datume u mesecu za period 2004-2009 (6.1.2004 do 6.12.2009.)

Odštampati sve sate minute i sekunde od 15.00.00 do 19.59.59

Hvala unapred! :)
 
Znaci pripremam se za kantonalno takmicenje... radim pascal al' nikako nemogu da shvatim zasto mi ne cita matricu 10x10 pravilno iz datoteke...
radim zadatak Potapanje brodova ;) ......
Kod:
uses crt;
var
  i,j,k1,k2,b,t :integer;
  a:array [1..10,1..10] of integer;
  ulaz,izlaz:text;
begin
  ClrScr;
  Assign(ulaz,'C:\brodovi.txt');
  reset(ulaz);
  Assign(izlaz,'C:\brodovio.txt');
  rewrite(izlaz);
  while not eof(ulaz) do
  begin
   for i := 1 to 10 do
    begin
     for j := 1 to 10 do
      begin
       Read(ulaz, a[i,j]);
      end;
     readln;
    end;
   for i := 1 to 10 do
    begin
     for j := 1 to 10 do
      begin
       Write(a[i,j]);
       Write(izlaz,a[i,j]);
      end;
     Writeln;
    end;
  end;
Readln;
close(ulaz);
end.

Koristis proceduru readln, a ona radi sledece, ucita to sto se trazi a zatim predje u sledeci red. Treba ti procedura read koja posle ucitavanja ostane u istom redu. Ispravio sam ti kod, i sad bi trebalo da radi.
 
Imamo kontrolni paaaa... ako bi neko mogao da mi pripomogne sa ovim zadacima, i to ne samo meni već celom odeljenju jer smo isprepadani od kad smo ih ugledali budući da ništa slično ni blizu nismo radili na časovima, sad ni petičari ne znaju šta da rade a kamoli mi sa četvorkama ili trojkama..
Daaakle...

Odštampati sve dane, sate i minute u periodu: 1.5.2007. 00:00 - 15.5.2007 23:59.
Kod:
var
   dan,sat,minut:integer;
begin
   for dan:=1 to 15 do
      for sat:=0 to 23 do
         for minut:=0 to 59 do
            writeln(dan,'.5.2007. ',sat,':',minut);
end.
Odštampati tablicu množenja 3-7
Kod:
var
   i,j:integer;
begin
   write(' ');
   for i:=3 to 7 do
      write(i:3);
   writeln;
   for i:=3 to 7 do
      begin
         write(i);
         for j:=3 to 7 do
            write(i*j:3);
         writeln;
      end;
end.
Odštampati sve šeste datume u mesecu za period 2004-2009 (6.1.2004 do 6.12.2009.)
Kod:
var
   dan,mesec,godina,danp,dank,dant:integer;
begin
   dant:=0;
   for godina:=2004 to 2009 do
      for mesec:=1 to 12 do
         begin
            if (godina=2004) and (mesec=1) then
               danp:=6 else
               danp:=1;
            if (godina=2009) and (mesec=12) then
               dank:=6 else
               if mesec in [1,3,5,7,8,10,12] then
                  dank:=31 else
                  if mesec in [4,6,9,11] then
                     dank:=30 else
                     if godina mod 4=0 then
                        dank:=29 else
                        dank:=28;
            for dan:=danp to dank do
               inc(dant);
            if dant mod 6=0 then
               writeln(dan,'.',mesec,'.',godina);
         end;
end.
Odštampati sve sate minute i sekunde od 15.00.00 do 19.59.59
Kod:
var
   sat,minut,sekund:integer;
begin
   for sat:=15 to 19 do
      for minut:=0 to 59 do
         for sekund:=0 to 59 do
            writeln(sat,':',minut,':',sekund);
end.
 

Back
Top