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

Ljudi upomoc!

Mladjem bratu treba, a ja nemam pojma. Ako je neko voljan da pomogne, biću mu zauvek zahvalan...

imam par zadataka u Pascalu, pa ukoliko ima neko da može da resi nabrzaka neka se javi!

1. Napisati program koji će izracunati slobodan prostor na disketi ako se na nju snimi jedna datoteka odredjene velicine. Velicina datoteke i praznog prostora na disketi se izrazava u KB, a disketa je kapaciteta 1,44 MB.

2. Napisati program koji datom cetvorocifrenom broju određuje broj koji se dobija ispisom cifara u obrnutom poretku. Broj se unosi preko jedne promenljive. Uneti potrebne komentare.

3. Data su tri realna broja. Napisati program za ispitivanje koji od datih brojeva pripada intervalu (a,b). Velicine a i b su takođe date.

4. Napisati program koji racuna funkciju f na sledeci nacin:

f = } a² - cos(a)/3-b za x≥3
3*a/b za 0<x<3
|b+1| - a za x=0
nije definisano za x<0

gde je a=x/y i
b=x-y

HVALA UNAPRED!!!
 
Ljudi upomoc!

Mladjem bratu treba, a ja nemam pojma. Ako je neko voljan da pomogne, biću mu zauvek zahvalan...

imam par zadataka u Pascalu, pa ukoliko ima neko da može da resi nabrzaka neka se javi!
1. Napisati program koji će izracunati slobodan prostor na disketi ako se na nju snimi jedna datoteka odredjene velicine. Velicina datoteke i praznog prostora na disketi se izrazava u KB, a disketa je kapaciteta 1,44 MB.

2. Napisati program koji datom cetvorocifrenom broju određuje broj koji se dobija ispisom cifara u

obrnutom poretku. Broj se unosi preko jedne promenljive. Uneti potrebne komentare.

3. Data su tri realna broja. Napisati program za ispitivanje koji od datih brojeva pripada

intervalu (a,b). Velicine a i b su takođe date.

4. Napisati program koji racuna funkciju f na sledeci nacin:

f = } a² - cos(a)/3-b za x≥3
3*a/b za 0<x<3
|b+1| - a za x=0
nije definisano za x<0

gde je a=x/y i
b=x-y

HVALA UNAPRED!!!

Znači, ovako:

1. Važi da je 1 MB = 1024 KB. Dakle, 1,44 MB = 1474,56 KB. Rešenje je razlika ovog broja i unetog broja koji predstavlja veličinu datoteke. Pretpostavimo da je veličina datoteke manja od 1,44 MB.
Kod:
program zad1;

const
  kapacitet = 1474.56;

var
  velicina, rezultat : real;

begin  // glavni deo koda
  readln (velicina);                 // ulaz
  rezultat := kapacitet - velicina;  // dobijanje resenja
  writeln (rezultat, ' KB');         // izlaz
end.

2. Koliko sam ja shvatio, ide nekako ovako:
n = 4513
4513 -> 3154
Ono što treba uraditi jeste dodeliti svakoj cifri posebnu promenjivu, tj. za ovaj primer izdvojiti a1 = 3; a2 = 1; a3 = 5; a4 = 4. Ideja izdvajanja cifara je ta da treba primeniti kombinacije operacija MOD i DIV. Postupak dobijanja svake od promenljivih može se obaviti na razne načine, a jedan od njih je:
a1 := n mod 10;
a2 := (n mod 100) div 10;
a3 := (n mod 1000) div 100;
a4 := n div 1000;
Svaki od ovih primera analiziraj.
Recimo da je broj koji treba da se ispiše m. Tada je m = 1000 · a1 + 100 · a2 + 10 · a3 + a4. Time je zadatak rešen!
Jedino ne znam gde su ti "obavezni" komentari - oni samo pomažu programeru da se u svom kodu snađe.
Kod:
program zad2;

var
  n, m           : integer;                 // n - polazni broj; m - izlazni broj
  a1, a2, a3, a4 : byte;                    // moze i integer ako ne zna koja je razlika

begin  // glavni deo koda
  readln (n);                               // ulaz
  a1 := n mod 10;                           // izdvajanje cifara
  a2 := (n mod 100) div 10;
  a3 := (n mod 1000) div 100;
  a4 := n div 1000;
  m := 1000 * a1 + 100 * a2 + 10 * a3 + a4; // resenje
  writeln (m);                              // izlaz
end.

3. Ovo se radi preko običnog IF grananja. Recimo da se u prvoj liniji unose a i b, a u drugoj x, y i z. Tada bi jedan primer izgledao ovako:
Unesi granice intervala -> -3.4 11.58
Unesi tri realna broja -> 8.9 -7.1 5
Prvi broj pripada datom intervalu.
Drugi broj ne pripada datom intervalu.
Treci broj pripada datom intervalu.

Svaki od tri broja (x, y, z) treba da prođe kroz testiranje - da li pripada datom intervalu. Broj k pripada intervalu (m, n) (za n > m) ukoliko važe dve stvari:
I) k > m
II) k < n
Pretpostavljam da se u postavci zadatka podrazumeva da je a < b. Ako ne, to se lako može ispraviti zamenom njigovih vrednosti.
Moguće je uraditi i ovo: recimo da testiramo promenljivu x. Prvo ćemo napisati 'Prvi broj ' pomoću write (), a onda ćemo testirati da li x NE pripada intervalu (a, b). Ako ne pripada, onda u istom redu ispisuje 'ne '. Nakon te provere ispisujemo 'datom intervalu.' i prelazimo u novi red. Tada testiramo sledeću promenljivu.
Nepripadanje intervalu možemo uraditi na dva načina:
I) korišćenjem NOT u uslovu (not ((k > m) and (k < n)))
II). korišćenjem OR ((k ≤ m) or ( k ≥ n))
Ja ću koristiti ovaj prvi način. Takođe, radi čitljivosti, ostavio sam razmak između nekih delova koda.
Kod:
program zad3;

var
  a, b    : real;
  x, y, z : real;

begin  // glavni deo koda
  write ('Unesi granice intervala -> ');
  readln (a, b);
  writeln ('Unesi tri realna broja -> ');
  readln (x, y, z);

  write ('Prvi broj ');
  if not ((x > a) and (x < b)) then
    write ('ne ');
  writeln ('pripada datom intervalu.');

  write ('Drugi broj ');
  if not ((y > a) and (y < b)) then
    write ('ne ');
  writeln ('pripada datom intervalu.');

  write ('Treci broj ');
  if not ((z > a) and (z < b)) then
    write ('ne ');
  writeln ('pripada datom intervalu.');

end.

4. Očigledno, da bismo odredili ovu funkciju f (x, y), nephodne su nam realne promenljive x i y. :) Takođe, biće nam potrebne dve pomoćne promenljive, a i b. Rešenje će biti zaokruženo na četiri decimale. Sve ostalo je običan razgranat algoritam.
Međutim, zadatak je neodređen i ne kazuje šta treba da se radi u slučaju da je y = 0. Zato ću dodati još jedan uslov koji će, u slučaju da je y = 0, ispisati "nije definisano". Takođe, ukoliko je x = y i 0 < x < 3 opet imamo deljenje nulom.
Takođe, pošto je moguće da funkcije još nisu rađene, apsolutna vrednost zahteva još jedan IF.
Što se provere pripadnosti intervalu tiče, pogledaj rešenje prethodnog zadatka:
Kod:
program zad4;

var
  x, y : real;
  a, b : real;
  m    : real;

begin  // glavni deo koda
  readln (x, y);
  if y = 0 then
    writeln ('nije definisano')
  else
    begin
      a := x / y;
      b := x - y;
      if x < 0 then
        writeln ('nije definisano')
      else
        begin
          if x = 0 then
            if b + 1 < 0 then
              writeln (-(b + 1) - a : 0 : 4)
            else
              writeln (b + 1 - a : 0 : 4)
          else
            if (x > 0) and (x < 3) then
              if x = y then
                writeln ('nije definisano')
              else
                writeln (3 * a / b : 0 : 4)
            else
              writeln (sqr (a) - cos (a) / 3 - b : 0 : 4);
        end;
    end;
end.

Nadam se da je ovo bilo od pomoći i da nije bilo konfuzno. :)
 
Poslednja izmena:
Dupli post.
Ovaj put rešenje zadatka postavljenog pre oko dve nedelje.
Kako je zadatak neodređen, ja sam uočio dva moguća slučaja koje ću prikazati crtežima. Oba su duhovita.

I)
---o---
--o-o--
-o---o-
o-o-o-o
Nazovimom obimom tog trougla broj loptica. Taj broj je jednak n + (n - 1) + (n - 2), odnosno 3n - 3 = 3(n - 1).
Sledeće godine stranica trougla je m. m = n + 1. Prema tome, obim ovog novog trougla bi bio 3(m - 1) = 3n.
Ovako se vidi da je razlika stalna - za svako n je rešenje 3. Specijalan slučaj postoji za n = 1, kada je rešenje 2.
Kod:
program car;

var
  n : integer;

begin
  readln (n);
  if n = 1 then
    writeln (2)
  else
    writeln (3);
end.

II)
---o---
--o-o--
-o-o-o-
o-o-o-o
Ovde je neophodno samo dodati još pet loptica. 5 = 4 + 1, a n = 4 u ovom slučaju. Prema tome, rešenje je n + 1.
Kod:
program car;

var
  n : integer;

begin
  readln (n);
  writeln (n + 1);
end.

Deluje mi logičnije da je u pitanju ovo drugo, jer u prvom primeru ne postoji skoro nikakva zavisnost između n i dobijenog broja.
 
Nikako ne mogu da skapiram gde se piše ;. Je l` može neko da mi kaže?

; se koristi posle svake naredbe. Svrha ; je ta da ih razdvoji.
U mnogim dijalektima PASCAL-a važe sledeća pravila:

1. Ništa se ne stavlja nakon uses, var, const, begin, do, then, repeat, case of...
Kod:
uses
  crt;
  graph;

const
  pi = 3.14159;
  e = 2.71828;

var
  a, b, c : integer;
  k : char;
...
2. Ukoliko se koristi if-then-else grananje, važi da ne treba da postoji ; između kraja nabrojenih naredbi u slučaju istinitosti uslova i između else.
a)
Kod:
if uslov then
  x := 1
else
  x := 0;
b)
Kod:
if uslov then
  begin
    x := 1; // unutar begin-end bloka su obavezni ;
    // itd.
    writeln (k); // vidi 4. - ovde ne mora ;, mada i moze
  end // ovde se niposto ne stavlja ;
else
  x := 0;
3. end na kraju koda se uvek završava tačkom (.).
4. ; ne mora da se stavi iza naredbe neposredno pred neko end.
 
www.z-trening.com je u pitanju, dobar je sajt, ali me nepvira sto nema test primera za download da vidim gde gresim jer me mnogo trpaju neki zadaci.
Ima, kako nema? Poslaljes kod, i proveri ga odma na 10 test primera cini mi se...

Inace, evo ovo trenutno pokusavam da uradim...


Mali Z je dizajnirao svoj prvi procesor, i treba mu pomoc oko testiranja

Procesor ima K registara, svi registri su inicijalizovani na 0. Odnosno vrednost zapisana u svakom od njih je 0. Takodje svaki od registara radi "U MODULU 10000" odnosno ukoliko se u registar A ucitava broj N, registar A ce u sebi da zapamti broj N mod 10000

Procesor podrzava sledece instrukcije:

1. INC R N - Sadrzaj registra R se uvecava za vrednost N, gde je N celobrojni broj u opsegu [0..5000]. Znaci Sadrzaj[R] = (Sadrzaj[R] + N) mod 10000
2. ADD R1 R2 R3 - Sabira se sadrzaj registara R1 i R2, i dobijena vredost se pamti u registru R3
3. MUL R1 R2 R3 - Mnozi se sadrzaj registra R1 i R2, i dobijena vredost se pamti u registru R3
4. OUT R - Sadrzaj registra R se ispisuje na standardni izlaz

Napisite program koji za zadate instrukcije simulira rad procesora.

Ulaz:
Sa prve linije standardnog ulaza se ucitava broj N, to je broj registara procesora (1 <= N <= 100). Zatim se u narednih N linija ucitavaju imena registara, imena svakog od registara se sastoji od malih i velikih slova engleskog alfabeta, i od brojeva (ime registra je duzine ne vece od 15 karaktera). Nakon toga se ucitava broj K, koji predstavlja broj instrukcija zadataih procesoru (1 <= K <= 1000). I nakon toga se ucitava K instrukcija opisanih u tekstu zadatka, svaka u jednom redu. Instrukcije se izvrsavaju u redu u kome se ucitavaju sa ulaza.

Izlaz:
Na standardni izlaz treba ispisati L brojeva, svaki u novoj liniji, gde L predstavlja broj OUT instrukcija zadatih u ulazu.

Primer:

Ulaz:
2
AX
BX
6
INC AX 10
INC BX 10
MUL AX BX AX
OUT AX
ADD AX BX BX
OUT BX

Izlaz:
100
110


* U ulazu ce uvek postojati bar jedna OUT instrukcija
 
mozes na 2 nacina:

Kod:
if a>=16 then
   if a<=19 then
      writeln('malo') else
      if a<=23 then
         writeln('srednje') else
         if a<=27 then
            writeln('dobro') else
            if a<=31 then writeln('previse');

To je bio komplikovaniji nacin. Takodje, tu se stvara problem sto recimo hoces da napises else ali ne za prethodni if nego za neki pre njega i ona ovaj prethodni morass da stavis izmedju begin i end jer se else odnosi na prvi if pre njega koji nema else.

Drugi nacin, koji je laksi bi bio:

Kod:
case a of
   16..19: writeln('malo');
   20..23: writeln('srednje');
   24..27: writeln('dobro');
   28..31: writeln('previse');
end;

Ako ti treba vise naredbi za neki od uslova stavis samo begin i end na kraju.
 
Poslednja izmena:
Ima li neko da zna da resi ovu zadacinu? :)
Na velikom turniru u igranju kompjuterskih igrica postoje ekipna takmicenja u kojima 2 ekipe igraju jedna protiv druge.
U prvom kolu, u prvoj grupi igrale su 3 ekipe cije su oznake bile 1 2 3. Prvu rundu su odigrale ekipe sa oznakama 1 i 2
i zabelezeni su njihovi ostvareni poeni ( za ekipu 1 e11 i za ekipu 2 e12), potom u drugoj rundi su igrale ekipe 1 i 3 i na kraju
u trecoj ekipe 2 i 3. U odigranoj rundi pobedjuje ona ekipa koja ima vise poena. Ukoliko ekipe imaju isti broj poena, pobeda se
ne racuna ni jednoj ekipi. Nakon odigrane sve tri runde odredjuje se pobednik kola. Pobednik je ona ekipa koja ima najveci broj
pobeda. Ukoliko 2 ekipe imaju jednak broj pobeda koji je veci od broja pobeda 3 ekipe ili sve ekipe imaju isti broj pobeda, igraju se dodatne partije i stampa se to obavestenje, inace se stampa redni broj pobednicke ekipe.
Hvala unapred... :)
 
Eh,procitala sam sve vase postove vezano za Pascal.Zanimljivi zadaci,ali ne bas razumljivi s obzirom da sam pocetnik.Nego imam zadatak pa me zanima nesto u vezi njega.Ovako ide tekst:
'Prebrojati koliko je brojeva od donje granice do gornje granice djeljivo sa tri,a nije djeljivo sa dva'.Pri tom su donja i gornja granica deklarisane kao konstante.Ovaj zadatak bi trebao biti rijesen pomocu repeat until.E,sad nije mi jasno da li je to moguce ako ne koristim i funkciju if...?Hvala ako neko uspe da odgovori..
 
Eh,procitala sam sve vase postove vezano za Pascal.Zanimljivi zadaci,ali ne bas razumljivi s obzirom da sam pocetnik.Nego imam zadatak pa me zanima nesto u vezi njega.Ovako ide tekst:
'Prebrojati koliko je brojeva od donje granice do gornje granice djeljivo sa tri,a nije djeljivo sa dva'.Pri tom su donja i gornja granica deklarisane kao konstante.Ovaj zadatak bi trebao biti rijesen pomocu repeat until.E,sad nije mi jasno da li je to moguce ako ne koristim i funkciju if...?Hvala ako neko uspe da odgovori..

Treba da koristis i if naravno. Mada, moglo bi nesto da se ispetlja i bez if-a ali je besmisleno to raditi.
 

Back
Top