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

Evo onog programa:
Program plivac;
Var n,i,p: integer; s,a:real;
Begin
Writeln(‘Unesi broj dana’);
Readln(n);
Writeln (‘Unesi normu prvog dana’);
Readln(a);
Writeln (‘Unesi procenat uvecanja norme’);
Readln(p);
s:=a
Writeln (‘1 dan ‘ , A:5:2);
For i=2 to n do
Begin
If i=0 then a:=a+a/100*p
Else a:=a;
Writeln(I, ‘ dan ‘ , A:5:2);
End;
Writeln (‘Ukupno je presao plivajuci ‘ , S:5:2);
End.
 
Pa znaš li šta će da napiše kao konačan ishod? Prvu vrednost od a.
Plus ne znam šta si se petljao sa ovim uslovima, ako unese da je n nula, onda nema smisla da ispisuje "1. dan...",a i ako ispiše 1 za n, onda mislim da će doći do konflikta u for petlji, jer ako i ide od veće ka manjoj vrednosti, koristi se "downto" umesto "to". Pogledaj malo to.
 
Banci:
Da pokrenuo sam ga i radi.
Lepo mi napise koliko je za svaki dan preplivao i koliko je ukupno preplivao.
Napisi program u Paskalu pa vidi.
Malo je nepregledno napisano, pa zato nije lako pročitati šta u stvari sve piše, ali to je moj problem.
Kod:
...
s:=a
Writeln (‘1 dan ‘ , A:5:2);
For i=2 to n do
       Begin
       If i=0 then a:=a+a/100*p
                 Else a:=a;
       Writeln(I, ‘ dan ‘ , A:5:2);
       End;
...
Ono što sigurno nije dobro je da se promenljiva koja sadrži broj ukupno preplivanih kilometara s samo inicijalizuje na vrednost preplivanih kilometara prvog dana i posle se više ne menja. Sem toga promenljiva i nikada nije nula, pa proizlilazi da svakoga dana prepliva isti broj kilometara.

Ukoliko tebi program ispiše ono što treba, dakle radi tačno ono što piše u zadatku, onda izvorni kod program koji koristiš nije jednak ovome koji si ovde napisao.
 
bojan p:
Malo je nepregledno napisano, pa zato nije lako pročitati šta u stvari sve piše, ali to je moj problem.
Kod:
...
s:=a
Writeln (‘1 dan ‘ , A:5:2);
For i=2 to n do
       Begin
       If i=0 then a:=a+a/100*p
                 Else a:=a;
       Writeln(I, ‘ dan ‘ , A:5:2);
       End;
...
Ono što sigurno nije dobro je da se promenljiva koja sadrži broj ukupno preplivanih kilometara s samo inicijalizuje na vrednost preplivanih kilometara prvog dana i posle se više ne menja. Sem toga promenljiva i nikada nije nula, pa proizlilazi da svakoga dana prepliva isti broj kilometara.

Ukoliko tebi program ispiše ono što treba, dakle radi tačno ono što piše u zadatku, onda izvorni kod program koji koristiš nije jednak ovome koji si ovde napisao.
Pa pregledno sam napisao nego me zeznuo ovaj brzi odgovor na krstarici.
Program je dobar, onda verovatno nisam dobro objasnio tacno sta treba uraditi.
U svakom slucaju hwala.
 
Evo primer slicnog programa koji sam uspeo da uradim.

Mirko i Slavko su opljackali banku. Napraviti program koji ce im omoguciti podelu novca. Zna se da su uzeli na novcanica od a apoena i nb novcanica od b apoena.


Program pljacka;
Var na,nb,a,b,i,j:integer;
Begin
Writeln( ' Unesi broj novcanica i vrednost novcanica ' );
Readln(na,a);
Readln(nb,b);
If (na*a+nb*b)mod2=0 then

Begin
For i:=0 to 3 do
For j:=o to 3 do
If i*(a+j*b)=((na-i)*a+(nb-j)*b) then
Writeln( ' Slavko ',i,' novcanica od',a, 'dinara');
Writeln(' Mirko ',j,' novcanica od',b,'dinara');
End;

Else Writeln(' Ne mogu podeliti');
End.
 
Banci:
Evo primer slicnog programa koji sam uspeo da uradim.

Mirko i Slavko su opljackali banku. Napraviti program koji ce im omoguciti podelu novca. Zna se da su uzeli na novcanica od a apoena i nb novcanica od b apoena.
Мирко и Славко су управо опљачкали банку из које су однели неку суму новца у новчаницама типа А и типа Б. Да не би дошло до велике свађе, њих двојица треба да поделе плен на једнаке износе. Међутим, испоставило се да то и није тако лако. Ваш задатак је да им помогнете да поделе новац на једнаке износе, уколико је то могуће.

У првом реду текстуалног фајла ZAD2.DAT налазе се два броја, na број украдених новчаница из банке типа А и а вредност новчанице типа А. У другом реду фајла ZAD2.DAT налазе се два броја, nb број украдених новчаница типа Б и b вредност новчанице типа Б, 1<=na,nb<=1000000, i 1<=a,b<=1000.

Излазне податке треба уписати у фајл ZAD2.RES. Ако је могуће поделити плен на тачно два једнака дела тада у излазни фајл уписати два броја mpa број новчаница типа А које је добио Мирко, mpb број новчаница типа Б које је добио Славко. Уколико није могуће поделити плен на два једнака дела, само исписати реч "немогуће".
Пример: Ако су украдене 2 новчанице вредности 3 и 3 новчанице вредности 6, тада је
ZAD2.DAT
2 3
3 6
ZAD2.RES
2 1
 
Banci:
Evo primer slicnog programa koji sam uspeo da uradim.

Mirko i Slavko su opljackali banku. Napraviti program koji ce im omoguciti podelu novca. Zna se da su uzeli na novcanica od a apoena i nb novcanica od b apoena.


Program pljacka;
Var na,nb,a,b,i,j:integer;
Begin
Writeln( ' Unesi broj novcanica i vrednost novcanica ' );
Readln(na,a);
Readln(nb,b);
If (na*a+nb*b)mod2=0 then
Begin
// PROBLEM POCINJE OVDE - tj. ovde si napravio gresku
For i:=0 to 3 do
For j:=o to 3 do
If i*(a+j*b)=((na-i)*a+(nb-j)*b) then
Writeln( ' Slavko ',i,' novcanica od',a, 'dinara');
Writeln(' Mirko ',j,' novcanica od',b,'dinara');
End;
// OVDE SE ZAVRSAVA DEO KODA KOJI TREBA PROMENITI
Else Writeln(' Ne mogu podeliti');
End.

*******************************************************
Dakle ovaj zadatak nije pravilno resen. Ako uneses recimo da ima 2 novcanice vrednosti 3 i 2 novcanice vrednosti 2, videces da izbacuje nesto bezveze. Umesto da Svaki od njih dobije po jednu novcanicu od 3 i po jednu od 2. Znaci svako dobija po 5. Primeti da si ti napravio neki uslov u petlji koji kao izlaz ima samo da da jednom x novcanica vrednosti a; drugom y novcanica vrednosti y. Stvar je u tome da moze jednom da da x novcanica vrednosti a i y novcanica vrednosti c ; drugom z novcanica vrednosti b i w novcanica vrednosti d. Pozdrav!
 
Dok sam malo razgledao zadatke uocio sam da sam onaj sa brasnom radio, nije tezak. Naj lakse ga je uraditi brutal force sa tri for petlje jedna u drugoj. Tog drugog je daleko najbrze resenje KNAPSACK alogoritam, ali kad imaju samo dvije vrste kovanica obicna rekuryija je dovoljna. Sutra cu staviti resenja, veceras moram zavrsiti neki program il ode glava.

Off Topic: Od sledece sedmice pocinju mije pripreme za ovogodisnja takmicenja sta znaci nastavak moje teme Alogoritmi.

Pozz!
 
Evo resenja na ova dva zadatka sa brasnom i Pljackom.

Kompajlirani su sa Delphi 2006

Zadatci su veoma jednostavni ali ako ima neko pitanja neka pita.

Brasno

Kod:
program Forum_03;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i, j, k, T : integer;

begin
  WriteLn('Unesite kolicinu koju trebate isporuciti');
  ReadLn(T);
  for i := T div 17 downto 0 do
    for j := T div 12 downto 0 do
      for k := T div 10 downto 0 do
        if ((i * 17) + (j * 12) + (k * 10)) = T then
          begin
            Writeln('Treba isporuciti: ' + IntToStr(i) +
                    ' od 17, ' + IntToStr(j) + ' od 12, ' +
                    IntToStr(k) + ' od 10 vreca brasna!');
            ReadLn;
            exit;
          end;
  WriteLn('Nemoze se isporuciti!');
  ReadLn;
end.

i Pljacka

Kod:
program Forum_02;

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  i, j, k, UV, na, nb, a, b : integer;

begin
  WriteLn('Unesite broj kovanica a i b:');
  ReadLn(na, nb);
  Writeln('Unesite vrijednost kovanica a i b:');
  ReadLn(a, b);
  UV := ((na * a) + (nb * b));
  if  UV mod 2 <> 0 then
    begin
      //Vrijednost je neparna kovanice se
      //nemogu podijelite
      WriteLn('Nemoze se podijeliti');
      ReadLn;
      exit;
    end;
  for i := 0 to na do
    for j := 0 to nb do
      begin
        if ((i * a) + (j * b)) = UV div 2 then
          begin
            WriteLn('Lice 1 dobija:');
            for k := 1 to i do
              WriteLn('a');
            for k := 1 to j do
              WriteLn('b');
            WriteLn('Lice 2 dobija:');
            for k := i + 1 to na do
              WriteLn('a');
            for k := j + 1 to nb do
              WriteLn('b');
            ReadLn;
            exit;
          end;
      end;
  WriteLn('Nemoze se podijeliti');
  ReadLn;
end.

A sad moram ici raditi neki program.
 
Evo malo potpunije varijante (naravno i teze) zadatka sa brasnom. Tekst zadatka je dat u kodu. Promena nije velika, ali je resenje dosta elegantno :-). Pozz svim programerima!

Kod:
program brasno;
{*ZADATAK: U prodavnici brasna postoje dzakovi od <a> kg, <b> kg i <c> kg. Broj dzakova od <a> kg je x,
    broj dzakova tezine <b> je y i broj dzakova tezine <c> je z.Kako
      isporuciti <trazena_tezina> kg kupcu bez otpakovanja?*}

{$APPTYPE CONSOLE}

uses
  SysUtils;

var
  a,b,c: integer;      // tezina dzakova od najmanje ka najvecoj
  x,y,z: integer;      // broj dzakova od redom a, b, c kilograma
  trazena_tezina: integer;   // tezina koja treba da se dobije kombinovanjem dzakova
  brresenja: integer;  //broj resenja
  i,j,k,n:integer;  //brojaci (j se odnosi na dzak c, k se odnosi na dzak b, n se odnosi na dzak a
  resenja: array[0..5000] of string;  //niz u kome se cuvaju validna resenja
begin
  brresenja:=0;
  write('Koje su tezine dzakova (od najmanje ka najvecoj -> 3 vrste dzakova): ');
  readln(a,b,c);
  write('Broj dzakova istim redosledom je: ');
  readln(x,y,z);
  write('Koja je tezina potrebna da se dobije kombinovanjem dzakova? ');
  readln(trazena_tezina);
  for j:=x downto 1 do begin
    for k:=y downto 1 do begin
      for n:=z downto 1 do begin
        if (n*a)+(k*b)+(j*c)=trazena_tezina then begin
          resenja[brresenja]:= IntToStr(n) + ' dzakova od '+IntToStr(a)+', '+ IntToStr(k) +' dzakova od '+ IntToStr(b)+ 'kg, '+ IntToStr(j) +' dzakova od ' + IntToStr(c)+ 'kg';
          brresenja:=brresenja+1;
        end;
      end;
    end;
  end;

  //Stampanje rezultata (ako ih ima)
  if brresenja <> 0 then begin
    writeln;
    writeln('Resenja ima: ',brresenja);
    writeln('*******************************');
    for i:=0 to brresenja-1 do writeln(i,'. ',resenja[i]);
  end
  else writeln('Zadatak nema resenja!');
  readln;
end.


Program je uspesno kompajliran sa FreePascal i izvrsen.
 
Program sam radio u delphiju pa SysUtils je unit sa osnovnim procedurama i funkcijama. U FreePascal-u i Borland Pascal-u taj unit se podrazumjeva i netreba ga deklarisati. IntToStr finkcija prima arugument tipa Integer a vraca u tipu string.

U zadatku brasno vanjska for petlja je za najveci dzak pa sve sto dublje to je za manji dzak. To sam uradio tako jer zadatak koji sam radio prije trazi za uslov da isporuka bude u sto manjem broju dzakova, a ovakom organizacijom petlji to se i postize
 
A ja sam taj zadatak sa brasnom resio ovako:


Program isporuka;
Uses crt;
Const pakovanje1=17; pakovanje2=12; pakovanje3=10;
Var a,b,c,d : integer;
Begin
Clrscr;
Writeln (‘ Unesi kolicinu pakovanja koju treba isporuciti ‘);
Readln(a);
For b:=0 to a div pakovanje1 do
For c:=0 to a div pakovanje2 do
For d:=0 to a div pakovanje3 do
If (d*10+c*12+b*17)=a then
Writeln (b,’ ‘,c,’ ‘,d);
Readkey;
End.
 

Back
Top