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

Ae pomozi pls...ne ide ovo.Znam da su uslovi i mod 3=0 i i mod 2 <>0 i da trebam uvecati brojac kad se uslov ispuni...ali nezz kako da izvedem ovo sa repeat...:dash:
Pazi, za ovo se najčešće koristi for petlja, koja u svakom svom ciklusu menja vrednost promenljive u funkciji brojača.
Takođe, for petlja se može prikazati i preko while i preko repeat/until petlje. To se u Pascal-u često radi jer je for petlja ograničena celim brojevima i njihovim uvećanjima - samo oni tada mogu biti brojači i brojač se uvećava/smanjuje za 1, dok su ostale petlje fleksibilnije. U ovom slučaju je to besmisleno.
Recimo, ova tri dela koda rade isto:
Kod:
for i := a to b do
  // radi nesto
Kod:
i = a;
while i <= b do
  begin
    // radi nesto
    i := i + 1;
  end;
Kod:
i := a;
repeat
  // radi nesto
  i := i + 1;
until i > b;
To možeš proveriti ako iscrtaš algoritme svih ovih petlja.
E, sad, ni tvoja logika nije u potpunosti tačna. Dobri su ti uslovi, ali posledica je netačna - brojač se uvećava bez ikakve zavisnosti od samih uslova.
Dakle, ideja je ova (pseudokod):
Kod:
za svako i (a <= i <= b) ponavljaj
  da li (i mod 2 <> 0) i (i mod 3 = 0)?
    -> da: štampaj vrednost i
    -> ne: ništa
Prema tome, to u Pascal-u izgleda ovako:
Kod:
program zadatak;

const donja = 40; gornja = 100; // recimo da su ovo granice

var i : integer;

begin
  i := donja;
  repeat
    if (i mod 2 <> 0) and (i mod 3 = 0) then
      writeln (i);
    i := i + 1;
  until i > gornja;
end.
Nadam se da sam bio od pomoći i da je sve jasno.
 
Poslednja izmena:
Hvala puno Andrei Ivasko xD.Nego..u mom zadatku treba da se ispise koliko brojeva ispunjava taj uslov,a ne koji su to brojevi.Ipak sam na kraju rijesila (nadam se) :D.

program pearl;
uses wincrt;
var i,gornjagranica,donjagranica,brojac:integer;
begin
writeln('unesi donju granicu');readln(donjagranica);
writeln('unesi gornju granicu');readln(gornjagranica);
i := donjagranica;
brojac:=0;
repeat
if (i mod 2 <> 0) and (i mod 3 = 0) then
brojac:=brojac+1;
i := i + 1;
until (i>gornjagranica);
writeln(brojac);
end.
 
Poslednja izmena:
OK ti je. Samo da te posavetujem:
1) trenutno ti nije potrebno uses wincrt, to se uglavnom koristi za formatiranje izlaza u konzoli;
2) neka ti postane navika da uvlačiš.

Ovaj ne razumijem te ovo za uses wincrt to uvijek stavljam,javlja mi gresku u suprotnom.
Sta ti je ovo sto sam boldovala?:)
Nadam se da cu raditi i dalje zadatke,pa da posvetim paznju i na estetiku koda :).
Hvala na savjetima i na pomoci.:ok:
 
zdravo
imam jedan problem
uradio sam zadatak koji na osnovu unosa broja od 1 do beskonacno
radi samo da pokaze koji je dan

kod je sledeci

program K_ti_Dan_u_Godini;
uses crt;
var k:integer;
begin
clrscr;
writeln('Unesi redni broj dana');
readln(k);
case k mod 7 of
1:writeln('Ponedeljak');
2:writeln('Utorak');
3:writeln('Sreda');
4:writeln('Cetvrtak');
5:writeln('Petak');
6:writeln('Subota');
0:writeln('Nedelja')
else writeln('ne postoji dan');
end;
readln;
end.


Trebam pomoc da ogranicim unos da bude od 1 do 366
da neradi za unos veci od 366 i manji od 1


hvalaaa
 
Kod:
program K_ti_Dan_u_Godini;
uses 
   crt;
var 
   k:integer;
begin
   clrscr; 
   writeln('Unesi redni broj dana');
   readln(k);
   while (k<1) or (k>366) do
   begin 
      writeln('Uneli ste broj koji nije u intervalu [1,366], probajte ponovo, sa brojem iz tog intervala.');
      readln(k);
   end;
   case k mod 7 of
      1:writeln('Ponedeljak');
      2:writeln('Utorak');
      3:writeln('Sreda');
      4:writeln('Cetvrtak');
      5:writeln('Petak');
      6:writeln('Subota');
      0:writeln('Nedelja')
   else 
      writeln('ne postoji dan');
   end; 
   readln;
end.

S tim da ti taj program nije tacan jer ne pocinje svaka godina ponedeljkom.
 
Treba da ogranicim unos da bude od 1 do 366
da ne radi za unos veci od 366 i manji od 1

Исто онако као што си написао, само што сваки израз мора у заграду. Дакле, не:

if k<0 or k>366

него:

if (k<0) or (k>366)

Програм треба да ти изгледа овако:

Kod:
program K_ti_Dan_u_Godini;

uses crt;

var k:integer;

begin
  clrscr;
  writeln('Unesi redni broj dana');
  readln(k);
  if (k>0) and (k<=366) then case k mod 7 of
    0: writeln('Nedelja');
    1: writeln('Ponedeljak');
    2: writeln('Utorak');
    3: writeln('Sreda');
    4: writeln('Cetvrtak');
    5: writeln('Petak');
    6: writeln('Subota')
  end
  else writeln('Unos nije u intervalu 1-366.');
  readln;
end.

Примедбе:

1. не треба ти 'else' код наредбе 'case' јер је k mod 7 увек један од бројева 0..6 и та ставка се никад неће извршити.

2. мора се пре наредбе 'case' проверити да ли је k из интервала 1..366 и обезбедити да ако није у дозвољеном интервалу, да се наредба 'case' ни не изврши. Онако како си ти замислио, да провериш на крају да ли је у интервалу, ако би унео на пример 510, он би рачунао 510 mod 7, добио резултат 6, штампао ти на екран "Субота", а онда пошто утврди да k није у дозвољеном интервалу штампао обавештење о грешки, па би имао истовремено и испис резултата и обавештење о грешци.

3. Програм је тачан једино ако се претпостави да је први дан у години понедељак.
 
Kod:
program K_ti_Dan_u_Godini;
uses 
   crt;
var 
   k:integer;
begin
   clrscr; 
   writeln('Unesi redni broj dana');
   readln(k);
   while (k<1) or (k>366) do
   begin 
      writeln('Uneli ste broj koji nije u intervalu [1,366], probajte ponovo, sa brojem iz tog intervala.');
      readln(k);
   end;
   case k mod 7 of
      1:writeln('Ponedeljak');
      2:writeln('Utorak');
      3:writeln('Sreda');
      4:writeln('Cetvrtak');
      5:writeln('Petak');
      6:writeln('Subota');
      0:writeln('Nedelja')
   else 
      writeln('ne postoji dan');
   end; 
   readln;
end.

S tim da ti taj program nije tacan jer ne pocinje svaka godina ponedeljkom.

Овако је још боље. Тражимо да се унесе k све док се не унесе на правилан начин. :ok:
 
e ovako treba mi pomoc, znaci radim zadatak i ne znam gde mi je greska pa ako moze pomoc :), inace ovo nije konacno ja sam zamisljao nesto ovako, pa ako ima neko neku ideju nek akze
zadatak:
pronalazi i ispisuje sve elemente zadatog niza celih brojeva čiji je faktorijel veći od trećeg
stepena broja koji unosi korisnik; uzeti da su svi elementi ulaznog niza u opsegu [0..7];

source code:
program zadatak;
const max=100;
type niz=array[1..max] of integer;
var
niza:niz;
i,n:integer;
s,f;integer;
function fak (n:integer):integer;
var b,c:integer;
begin
b:=1l
for c:=b to n do
b:=b*c;
fak:=b;
end;

function stepen (n:integer):integer;
var
b,e:integer;
begin b:=1;
b:=sqr(n)*n;
stepen:=b;
end;

begin
repeat
write('unesite duzinu niza ');
read(n);
if n > 0 then
begin
writeln('unesite clanove niza u opsegu od 0 do 7');
for i:=1 to n do
readln(niza);
if (niza >7) or (niza <1) then
writeln('uneli ste pogresne elemente')
else
for i:=1 to n do
begin
f:=fak(niza;
s:=stepen(niza;
if f > s then
writeln(f)
end;
end;
until (n <100) or (n>1)
end.
 
program zadatak;
const max=100;
type niz=array[1..max] of integer;

var
niza:niz;
i,n:integer;
broj:integer;
Label A;

function fak (n:integer):integer;
var b,c:integer;
begin
b:=1;

for c:=1 to n do
begin
b:=b*c;
end;
fak:=b;
end;


function stepen (n:integer):integer;
var
b,e:integer;

begin
b:=1;
b:=sqr(n)*n;
stepen:=b;
end;

begin

write('unesite duzinu niza ');
readln(n);
if n > 0 then
begin
write('unesi broj');
readln(broj);

writeln('unesite clanove niza u opsegu od 0 do 7');

for i:=1 to n do
begin
A:
readln(niza);
if (niza>7) or (niza<0) then goto A;
end;

for i:=1 to n do
begin
if fak(niza)>stepen(broj) then writeln(niza);
end;
end;
readln;
end.
 
e ovako treba mi pomoc, znaci radim zadatak i ne znam gde mi je greska pa ako moze pomoc :), inace ovo nije konacno ja sam zamisljao nesto ovako, pa ako ima neko neku ideju nek akze
zadatak:
pronalazi i ispisuje sve elemente zadatog niza celih brojeva čiji je faktorijel veći od trećeg
stepena broja koji unosi korisnik; uzeti da su svi elementi ulaznog niza u opsegu [0..7];
Stavljaj kod u
Kod:
 tag i uvlači - tako ćeš uočiti grešku.
Takođe, ideja ti je loša. Najbrži način da ovo uradiš je sledeći: pošto su ti elementi niza mali, možeš lako da odrediš faktorijele i treće stepene. Faktorijeli: 1, 1, 2, 6, 24, 120, 720, 5040. Kubovi: 0, 1, 8, 27, 64, 125, 216, 343. Sada možeš da upoređuješ:
1 > 0; 1 = 1; 2 < 8; 6 < 27; 24 < 64; 120 < 125; 720 > 216; 5040 > 343. Dakle, za 0, 6 i 7 je faktorijel elementa niza veći od njegovog kuba.
Ono što treba da se uradi jeste da se učitavaju brojevi, ali se neći smeštati ni u kakav niz - tako bismo samo preopteretili računar. Samo nule, šestice i sedmice će ulaziti u niz.
Takođe, najverovatnije ti nije ni potrebna ona grana koja pita da li je broj u intervalu [0, 7], jer se najverovatnije podrazumeva da će ulazni podaci biti takvi. Program bi radio onako kako si ti zamišljao da si stavljao begin ... end nakon IF. U glavnom delu programa koristiš repeat ... until na način koji nema smisla. Postavka zadatka mi deluje malo čudno - očekivao bih da se traži broj takvih elemenata.
Evo i rešenja:[SPOILER]
[CODE]program zadatak;
const max = 100;
type TNiz = array [1 .. max] of integer;
var
  a, b       : TNiz;
  n, i, k, c : smallint;
begin
  write ('Unesi broj elemenata niza: ');
  readln (n);
  k := 1;
  write ('Unesi elemente niza: ')
  for i := 1 to n do
    begin
      read (c);
      if (c = 0) or (c = 6) or (c = 7) then
        begin
          a [k] := c;
          b [k] := i;
          k := k + 1;
        end;
    end;
  writeln ('Elementi niza koji zadovoljavaju uslov su (pozicije su u zagradama):');
  for i := 1 to k - 2 do
    write (a [i], ' (', b [i], '), ');
  writeln (a [k - 1], ' (', b [k - 1], ')');
end.
[/SPOILER]
 
Poslednja izmena:
e treba da napisem program koji racuna zbir kvadrata parnih i kubova neparnih brojeva u intervalu n do m.....i iskucam taj program a on mi uvek pominje neki error 97 vezan za for naredbu...evo programski kod pa mi pomozite ako vam nije problem... e dada se ne bih mucio i kucao ovako sve na krsti kako da kopiram kod iz pascala i zalepim ga ovde?

program baklava;
var p,np,s,m,n,i:real;
begin
writeln('unesite granicne vrednosti n i m');
readln(n,m);
if m>n then
begin
for i:=n to m do
if i mod 2=0 then p:=i;
else np:=i;
s:=sqr(p)+(sqr(np)*np);
writeln('s=',s:0:3);
end;
else writeln('greska, proverite da li je m>n');
end.
 
ovako :sanke::
imam jedan niz u .txt koji glasi:
Summe Tag : 01:53:51 00:39:45 00:53:42 00:05:39 00:14:45 i nastavak redova :
Login Tag :
Logoff Tag :
0,61
14:32:20
16:23:35
18 - Dez 103 3 11 5 1 123 0,61
potrebno mi je iz ovih podataka samo :

01:53:51 103 00:39:45 3 11 5 1 123 00:53:42 00:05:39 00:14:45 0,61

i tako se opet sve ponavljaju 1mil redova koje bih trebao rucno da prekucavam i trebalo bi mi jedno 1mil godina postoji li nacin da se preko notepad++ uradi skripta koja ce procitati .txt folder i uzeti sto mi treba????:zskace:
 
for, while i repeat se zovu petlje

one sluze kad hoces vise puta da izvrsis isti niz naredbi


for radi odredjen broj puta
while dok god je uslov ispunjen
a repeat dok uslov ne postane ispunjen

ako treba da napises prvih 100 celih brojeva, to mozes ovako da uradis

Kod:
for i:=1 to 100 do
   writeln(i);

ili

Kod:
i:=0;
while i<100 do
   begin
      i:=i+1;
      writeln(i);
   end;

ili

Kod:
i:=0;
repeat
   i:=i+1;
   writeln(i);
until i=100;

kod while-a i fora ako ima samo jedna naredba onda ne mora begin i end a ako ih ima vise onda stavi

case nije petlja vec je slicna if-u, i zove se naredba grananja
razlika je sto if ima samo 2 slucaja, kad je uslov tacan i kad je netacan, a case moze da ima vise slucajeva.

npr:

Kod:
case ocena of
   1: writeln('pao');
   2..5: writeln('polozio');
end;

ili

Kod:
case ocena of
   1: writeln('nedovoljan');
   2: writeln('dovoljan');
   3: writeln('dobar');
   4: writeln('vrlo dobar');
   5: writeln('odlican');
   else writeln('greska');
end;

takodje, ako kod nekog slucaja ima vise naredbi, treba staviti begin i end
 
for, while i repeat se zovu petlje

one sluze kad hoces vise puta da izvrsis isti niz naredbi


for radi odredjen broj puta
while dok god je uslov ispunjen
a repeat dok uslov ne postane ispunjen

ako treba da napises prvih 100 celih brojeva, to mozes ovako da uradis

Kod:
for i:=1 to 100 do
   writeln(i);

ili

Kod:
i:=0;
while i<100 do
   begin
      i:=i+1;
      writeln(i);
   end;

ili

Kod:
i:=0;
repeat
   i:=i+1;
   writeln(i);
until i=100;

kod while-a i fora ako ima samo jedna naredba onda ne mora begin i end a ako ih ima vise onda stavi

case nije petlja vec je slicna if-u, i zove se naredba grananja
razlika je sto if ima samo 2 slucaja, kad je uslov tacan i kad je netacan, a case moze da ima vise slucajeva.

npr:

Kod:
case ocena of
   1: writeln('pao');
   2..5: writeln('polozio');
end;

ili

Kod:
case ocena of
   1: writeln('nedovoljan');
   2: writeln('dovoljan');
   3: writeln('dobar');
   4: writeln('vrlo dobar');
   5: writeln('odlican');
   else writeln('greska');
end;

takodje, ako kod nekog slucaja ima vise naredbi, treba staviti begin i end

Hvala bratac.z:mrgreen:
 
Ako neko moze da mi resi negi od ovih zaokruzenih zadataka.Hitno mi je potrebno do sutra,jer sutra polazem programiranje .
 

Prilozi

  • programiranje1.jpg
    programiranje1.jpg
    31,7 KB · Pregleda: 13
Pozdrav ljudi!

Vidite ovako, imam pismeni iz informatike sutra, tek smo ove godine počeli da radimo sve ovo, i verujem da ovakvi zadaci neće biti problem pošto sam bacila pogled na postove i videla koliko su komplikovaniji. Ali sve u svemu, iz određenih razloga ja nisam baš pratila informatiku ove godine i nemam pojma kako da uradim zadatke. Sutra imam pismeni. :(

Jel' može neko da ih uradi i da mi pošalje, biće otprl takvi dakle ne vredi mi da bubačim, neće biti baš ti, ali da pokušam da shvatim kako sve funkcioniše, kroz rešene zadatke.

1 Dat je ceo br. Izracunati zbir njegovih parnih cifara
2 Data su dva broja M i N. IZracunati koliko ima brojeva izmedju M i N koji su deljivi sa 7.
3 Dat je prirodan broj. Izracunati proizvod njegovih delilaca.
4 Za brojeve 200 - 300 odstampati sve deljive sa 6.

Hvala unapred. :)
 
Kod:
var
   n,z,c:integer;
begin
   readln(n);
   z:=0;
   while n>0 do
      begin
         c:=n mod 10;
         n:=n div 10;
         if c mod 2=0 then
            z:=z+c;
      end;
   writeln(z);
end.
Kod:
var
   m,n,r,i:integer;
begin
   readln(m,n);
   r:=0;
   for i:=m to n do
      if i mod 7=0 then
         r:=r+1;
   writeln(r);
end.
Kod:
var
   n,p,i:integer;
begin
   readln(n);
   p:=1;
   for i:=1 to n do
      if n mod i=0 then
         p:=p*i;
   writeln(p);
end.
Kod:
var
   i:integer;
begin
   for i:=200 to 300 do
      if i mod 6=0 then
         writeln(i);
end.
 

Back
Top