Reseni ispiti

Embed Size (px)

Citation preview

  • 7/25/2019 Reseni ispiti

    1/31

    SSETF

    [PROGRAMIRANJE 1]Materijali za prvu godinu iz predmeta programiranje 1, zadaci. Autori zadataka su navedeni ispod

    datuma zadatka.

    elimo Vam srean i uspean rad!Va SSETF, Filip Zecevic

  • 7/25/2019 Reseni ispiti

    2/31

    [PROGRAMIRANJE 1] SSETF

    2

    Januar 2012 zadatak 2

    Autor:nepoznat

    Data je atoteka ponue.txt u kojoj se u svakom reu nalaze poaci o jenoj ponui, i to: ifra ponue(ceo broj), minimalni broj porubina a bi ponua uspela (ceo broj), jeinina cena ponue (ceo broj) i

    popust koji de biti oobren ukoliko ponuda uspe (ceo broj). Datoteka porudzbine.txt u svakom redu

    sari

    poatke o jenoj porubini, i to: ifru poruioca (ceo broj), ifru ponue (ceo broj) i broj porubina

    (ceo

    broj). Da bi ponua uspela, potrebno je a minimalni broj porubina ukupno za svaku ponudu bude

    poruen,

    u suprotnom ponua nije uspela. Napisati program na programskom jeziku Pascal koji ita opisane

    datoteke i

    ispisuje koje su ponue uspele (ime ponuaa i naziv ponue). Pore toga, program treba a ispie i

    koliko

    iznosi najvedi ukupni ostvareni popust meu uspelim ponuama. Broj reova u atotekama nije unapre

    poznat. Svaku atoteku je ozvoljeno proititi samo jenom.

    Resenje:

    program p118012012z2;

    type porudzbina=record

    {ne treba sifra porucioca}

    sifra:integer; {sifra porudzbine}broj:integer; {broj porudzbina}

    end;

    pokazivac=^element;

    element=record

    p:porudzbina;

    sledeci:pokazivac;

    end;

    var prvi:pokazivac; {pokazivac na pocetak liste}

    tekuci:pokazivac;

    ponude, porudz:text;

    temp:porudzbina;sifbzvz, brojponuda:integer;

    sifp, minbrpor, jedcena, popust:integer;

    maxpopust:integer;

    brojreda:integer;

    procedure obrisilistu(var prvi:pokazivac);

    var tekuci:pokazivac;

    begin

  • 7/25/2019 Reseni ispiti

    3/31

    [PROGRAMIRANJE 1] SSETF

    3

    while prvi nil do begin

    tekuci:=prvi^.sledeci;

    dispose(prvi);

    prvi:=tekuci;

    end;

    end;

    procedure ubaciulistuk(var prvi:pokazivac; por:porudzbina); {menja se tip onoga sto se dodaje}

    var tekuci, novi:pokazivac;

    begin

    new(novi);

    novi^.p:=por;

    novi^.sledeci:=nil;

    if prvi = nil then

    prvi:=novi

    else begin

    tekuci:=prvi;

    while tekuci^.sledeci nil do

    tekuci:=tekuci^.sledeci;

    tekuci^.sledeci:=novi;

    end;

    end;

    begin

    prvi:=nil; {lista je uvek prazna na pocetku}

    assign(ponude, 'ponude.txt');

    assign(porudz, 'porudzbine.txt');

    reset(ponude);

    reset(porudz);

    while not eof(porudz) do begin

    readln(porudz, sifbzvz, temp.sifra, temp.broj);

    ubaciulistuk(prvi, temp);

    end;

    brojreda:=0;

    writeln('Uspele ponude:');

    while not eof(ponude) do begin

    readln(ponude, sifp, minbrpor, jedcena, popust);

    brojponuda:=0;

    tekuci:=prvi;

    while tekuci nil do begin

    if (sifp = tekuci^.p.sifra) then brojponuda:=brojponuda+tekuci^.p.broj; {prebroj

    sve ponude}

    tekuci:=tekuci^.sledeci;

    end;

  • 7/25/2019 Reseni ispiti

    4/31

    [PROGRAMIRANJE 1] SSETF

    4

    if (brojponuda >= minbrpor) then begin

    writeln(sifp, ';');

    if (brojreda=0) then begin

    maxpopust:=brojponuda*jedcena*popust div 100;

    brojreda:=brojreda+1;

    endelse

    if (brojponuda*jedcena*popust div 100) > maxpopust) then

    maxpopust:=brojponuda*jedcena*popust div 100;

    end;

    end;

    writeln('Najveci popust:');

    writeln(maxpopust, ' dinara');

    close(ponude);

    close(porudz);

    obrisilistu(prvi); {!!!}

    end.

  • 7/25/2019 Reseni ispiti

    5/31

    [PROGRAMIRANJE 1] SSETF

    5

    Oktobar 2011 zadatak 2

    Autor:DarioM

    Napisati program na programskom jeziku Pascal koji pomae serviseru u otkrivanju kvarova na

    mobilnom telefonu. U atoteci kvarovi.txt at je spisak svih mogudih kvarova. U svakom reuove atoteke zapisane su informacije o tano jenom kvaru i to u sleedem formatu: naziv kvara

    (jena re o 20 znakova) i potom o 10 celih brojeva koji prestavljaju ifre simptoma koji se

    pojavljuju ko tog kvara. Serviser sa stanarnog ulaza unosi ifre simptoma (o 10 celih brojeva) koji su

    primedeni ko pokvarenog telefona, a program treba a na stanarni izlaz ispie nazive svih mogudih

    kvarova ko kojih se pojavljuju svi uoeni simptomi (npr. neka kvar X ima simptome 2 34 8 20, a serviser

    je uoio simptome 2 i 8; zato treba ispisati kvar X kao mogudi kvar; a je serviser kojim sluajem uoio

    simptome 2 7 i 8, kvar X uopte ne bi trebaloispisati, jer nisu uoeni svi simptomi).

    Resenje:

    PROGRAM KvaroviTelefona (input, output, ulaz);

    VAR

    naziv : string[20];

    c : char; (* pomocu njega citamo naziv *)

    simptomi : array [1..10] of integer; (* simptomi u fajlu *)

    broj : integer; (* broj simptoma ucitanih iz jedne linije fajla *)

    s : array [1..10] of integer; (* simptomi ucitani sa standardnog ulaza *)

    n : integer; (* broj simptoma ucitanih sa standardnog ulaza *)

    i, j : integer; (* pomocne varijable - brojaci *)

    ulaz : text;

    moguci, postoji : boolean; (* moguci -> kvar, ako svi elementi postoje i u liniji fajla *)(* postoji -> ako jedan od simptoma sa standardnog ulaza postoji u liniji fajla *)

    (* koristi se u unutrasnjoj petlji u provjeri *)

    BEGIN

    assign (ulaz, 'kvarovi.txt');

    reset (ulaz);

    (* citanje simptoma sa glavnog ulaza - u varijablu s *)

    n := 0;

    WHILE ( (NOT eoln(input)) AND (n < 10) ) DO

    BEGINn := n + 1;

    read (input, s[n])

    END;

    WHILE NOT eof(ulaz) DO

    BEGIN

    (* citanje naziva jednog kvara iz fajla *)

    naziv := ''; (* naziv = nulti string *)

  • 7/25/2019 Reseni ispiti

    6/31

    [PROGRAMIRANJE 1] SSETF

    6

    read (ulaz, c);

    WHILE (c ' ') DO

    BEGIN

    naziv := naziv + c;

    read (ulaz, c)

    END;(* citanje simptoma za dati kvar iz fajla *)

    broj := 0;

    WHILE ( (NOT eoln(ulaz)) AND (broj

  • 7/25/2019 Reseni ispiti

    7/31

    [PROGRAMIRANJE 1] SSETF

    7

    Jun 2011 zadatak 1

    Autor:zmajciki

    Neka se u datoteci biblio.txt nalaze podaci o knjigama koje poseduje neka biblioteka. Svaki

    re sari ifru knjige (ceo broj), broj raspoloivih kopija (ceo broj) i naslov knjige o kraja rea (ne uio 255 karaktera). U atoteci izato.txt se nalaze poaci o knjigama koje su izate na itanje po

    sleedem formatu: ifra knjige (ceo broj) i ifra korisnika (ceo broj) koji je pozajmio knjigu na itanje.

    Napisati program na programskom jeziku Pascal koji proita saraj naveenih atoteka i na glavnom

    izlazu ispie naslove svih onih knjiga ije su sve kopije izate na itanje korisnicima. Voiti rauna o

    ispravnom koridenju zauzetih resursa.

    Resenje:

    PROGRAM jun2011_zadatak1(output, biblioteka, izdato);

    TYPE knjiga = RECORD

    sifra, brojKopija :integer;

    naslov :string[255];

    END;

    pelem = ^elem;

    elem = RECORD

    info :knjiga;

    sled :pelem;

    END;

    {dodavanje na kraj ulancane liste}

    PROCEDURE dodaj(VAR lista :pelem; k :knjiga);

    VAR novi, tek :pelem;

    BEGIN

    new(novi);

    novi^.info:= k;

    novi^.sled:= NIL;

    IF lista = NIL THEN {ako je lista prazna}

    lista:= noviELSE BEGIN

    tek:= lista;

    WHILE tek^.sled NIL DO

    tek:= tek^.sled;

    tek^.sled:= novi;

    END;

    END;

  • 7/25/2019 Reseni ispiti

    8/31

    [PROGRAMIRANJE 1] SSETF

    8

    {brisanje liste}

    PROCEDURE obrisi(VAR lista :pelem);

    VAR tek, stari :pelem;

    BEGIN

    tek:= lista;WHILE tek NIL DO BEGIN

    stari:= tek;

    tek:= tek^.sled;

    dispose(stari);

    END;

    lista:=NIL;

    END;

    {ucitavanje datoteke u listu}

    PROCEDURE ucitajKnjige(VAR dat :TEXT; VAR lista :pelem);

    VAR k :knjiga;

    BEGIN

    reset(dat);

    WHILE NOT eof(dat) DO BEGIN

    readln(dat, k.sifra, k.brojKopija, k.naslov);

    dodaj(lista, k);

    END;

    close(dat);

    END;

    {na osnovu ifre nalazi knjigu i umanje broj kopija za 1}

    PROCEDURE izdajKnjigu(lista :pelem; sifra:integer);VAR tek :pelem;

    nasao :boolean;

    BEGIN

    tek:= lista;

    nasao:= FALSE;

    WHILE (tek NIL) AND (NOT nasao) DO BEGIN

    IF tek^.info.sifra = sifra THEN BEGIN

    tek^.info.brojKopija:= tek^.info.brojKopija - 1;

    nasao:= TRUE;

    END;tek:= tek^.sled;

    END;

    END;

    {ispis knjiga ije su sve kopije izate}

    PROCEDURE ispisiIzdate(lista :pelem);

    VAR tek :pelem;

  • 7/25/2019 Reseni ispiti

    9/31

    [PROGRAMIRANJE 1] SSETF

    9

    BEGIN

    tek:= lista;

    WHILE tek NIL DO BEGIN

    IF tek^.info.brojKopija = 0 THEN

    writeln(output, tek^.info.naslov);

    tek:= tek^.sled;END;

    END;

    {glavni program}

    VAR biblioteka, izdato :TEXT;

    knjige :pelem;

    sifra :integer;

    BEGIN

    assign(biblioteka, 'biblio.txt');

    assign(izdato, 'izdato.txt');

    ucitajKnjige(biblioteka, knjige);

    reset(izdato);

    WHILE NOT eof(izdato) DO BEGIN

    realn(izato, sifra); {ita se samo ifra knjige, korisnik nam nije potreban}

    izdajKnjigu(knjige, sifra);

    END;

    close(izdato);

    ispisiIzdate(knjige);

    obrisi(knjige);END.

  • 7/25/2019 Reseni ispiti

    10/31

    [PROGRAMIRANJE 1] SSETF

    10

    Januar 2011 zadatak1

    Autor: zmajciki

    Data je atoteka profesori.txt u kojoj se nalazi po jean re za svakog profesora, koji sari

    jenu ili vie ifara premeta koje taj profesor preaje, ge su ifre formirane o tacno 6 znakova, aizmeu ifara se nalazi po jean blanko znak. Napisati program na programskom jeziku Pascal koji

    formira jenostruko ulancanu listu premeta u kojoj svaki element sari ifru premeta i broj profesora

    koji predaju taj predmet. Na osnovu formirane liste ispisati na glavnoj izlaznoj jedinici, u posebnim

    redovima,ifre onih premeta koje preaje samo jean profesor. Voiti racuna o ispravnom koricenju

    zauzetih resursa.

    Resenje:

    PROGRAM zad1_19_01_2011(profesori, output);

    TYPE SifraPredmeta = string[6];

    Pelem = ^Elem;

    Elem = RECORD

    sifra:SifraPredmeta;

    brojProfesora:integer;

    sled:Pelem;

    END;

    {dodavanje na kraj liste}

    PROCEDURE dodaj(VAR lista:Pelem; s:SifraPredmeta; br:integer);

    VAR novi, tek:Pelem;

    BEGIN{pravimo novi element}

    new(novi);

    novi^.sifra:=s;

    novi^.brojProfesora:=br;

    novi^.sled:=nil;

    {ako je lista prazna}

    if (lista = nil) then

    lista:=novi

    {ako nije prazna trazimo kraj liste}

    else begin

    tek:=lista;while (tek^.sled nil) do

    tek:=tek^.sled;

    tek^.sled:=novi;

    end;

    END;

    {brisanje liste}

    PROCEDURE brisi(VAR lista:Pelem);

  • 7/25/2019 Reseni ispiti

    11/31

    [PROGRAMIRANJE 1] SSETF

    11

    VAR tek, stari:Pelem;

    BEGIN

    tek:=lista;

    while (tek nil) do begin

    stari:=tek;

    tek:=tek^.sled;dispose(stari);

    end;

    lista:=nil;

    END;

    {trazi zadatu sifru u listi i vraca adresu pronadjenog elementa ili nil ako ne postoji}

    FUNCTION trazi(lista:Pelem; kljuc:SifraPredmeta):Pelem;

    VAR tek:Pelem;

    BEGIN

    tek:=lista;

    trazi:=nil; {pretpostavimo da necemo naci element}

    while (tek nil) do begin

    if (tek^.sifra = kljuc) then

    trazi:=tek; {kada smo nasli element pamtimo njegovu adresu}

    tek:=tek^.sled;

    end;

    END;

    VAR profesori:text;

    lista, tek:Pelem;

    sifra:SifraPredmeta;

    c:char;

    BEGIN

    assign(profesori, 'profesori.txt');

    reset(profesori);

    lista:=nil; {lista je prazna}

    {dok ne dodjemo do kraja datoteke}

    while not eof(profesori) do begin

    {dok ne dodjemo do kraja reda}

    while not eoln(profesori) do begin{citamo sifru predmeta}

    read(profesori, sifra);

    read(profesori, c); {gutamo prazan znak}

    {ako postoji dobijamo pokazivac na odovarajuci element liste}

    tek := trazi(lista, sifra);

    {proveravamo da li sifra postoji}

    if tek nil then

    {ako sifra postoji povecavamo broj profesorai za 1}

  • 7/25/2019 Reseni ispiti

    12/31

    [PROGRAMIRANJE 1] SSETF

    12

    tek^.brojProfesora:= tek^.brojProfesora + 1

    else

    {ako ne postoji upisuje novi element}

    dodaj(lista, sifra, 1);

    end;

    readln(profesori); {prelazak u novi red}end;

    {ispisujemo samo predmete koje drzi jedan profesor}

    tek:=lista;

    while tek nil do begin

    if (tek^.brojProfesora = 1) then

    writeln(output, tek^.sifra);

    tek:=tek^.sled;

    end;

    brisi(lista);

    close(profesori);

    readln

    END.

  • 7/25/2019 Reseni ispiti

    13/31

    [PROGRAMIRANJE 1] SSETF

    13

    Januar 2011 zadatak 2

    Autor: stefanvozd uz pomoc forumasa

    Napisati program na programskom jeziku Pascal koji pronalazi trougao najvede povrine. Trouglovi

    se zaaju pomodu va niza realnih brojeva, najvede uine 100, koji prestavljaju osnovice i visinetrouglova. Program treba a uita nizove, izrauna povrine svih trouglova, a zatim pronae i ispie

    poatke o trouglu najvede povrine: uinu osnovice i visine, i povrinu. Uitavanje, raunanje

    povrine i pronalaenje trougla najvede povrine realizovati kao zasebne potprograme. Potprogrami

    sa glavnim programom smeju a komuniciraju iskljuivo putem svojih argumenata i povratne

    vrenosti. Program treba a ponavlja prethone korake sve ok se za uinu nizova ne unese

    nekorektna vrednost.

    Resenje:

    program drugizad;

    type

    osnovice=array[1..100] of integer;

    visine=array[1..100] of integer;

    var

    a:osnovice;

    h:visine;

    i,n:integer;

    max_p,max_o,max_h:real;

    procedure izracunaj(a:osnovice; h:visine; p:integer; var max_p,max_o,max_h:real);

    var

    i:integer;

    povrsina:real;

    begin

    max_p:=0;

    for i:=1 to p do

    povrsina:=a[i]*h[i]/2;

    if povrsina>max_p then

    begin

    max_p:=povrsina;

    max_o:=a[i];

    max_h:=h[i];end;

    end;

    procedure ispisi(max_p,max_o,max_h:real);

    begin

    writeln('Najveca povrsina troulga je',max_p:0:2);

    write('Osnovice i visine tog trougla su');

  • 7/25/2019 Reseni ispiti

    14/31

    [PROGRAMIRANJE 1] SSETF

    14

    write(max_o:8:2);

    write(max_h:8:2);

    end;

    begin

    writeln('Ucitaj duzinu niza');readln(n);

    while((n>0) and (n

  • 7/25/2019 Reseni ispiti

    15/31

    [PROGRAMIRANJE 1] SSETF

    15

    //funkcija za ucitavanje visina i osnovica trouglova u odgovarajuce nizove

    function UcitajNizove(var nizO, nizV: nizRB; var brEl: integer; maxBrEl: integer): boolean;var

    i: integer;

    begin

    //vrednost funkcije je na pocetku 'true' - pretpostavljamo da ce nizovi

    //biti ucitani (nece biti uneta nedozvoljena vrednost za broj elemenata)

    UcitajNizove:= true;

    writeLn('Unesite broj trouglova:');

    //ucitavamo uneti broj elemenata/trouglova

    readLn(brEl);

    //ako je ta vrednost dozvoljena za broj elemenata/trouglova

    if (brEl > 0) and (brEl

  • 7/25/2019 Reseni ispiti

    16/31

    [PROGRAMIRANJE 1] SSETF

    16

    begin

    //za svaki trougao

    for i:= 1 to brEl do

    //izracunavamo njegovu povrsinu i smestamo u niz

    nizP[i]:= nizO[i] * nizV[i] / 2;

    end; //function

    //procedura za pronalazenje trougla sa najvecom povrsinom

    //i ispis informacija o tom trouglu (osnovica, visina, povrsina)

    procedure PronadjiNajvecu(nizO, nizV, nizP: nizRB; brEl: integer);

    var

    i: integer;

    maxP, visina, osnovica: real;

    begin

    //postavljamo najvecu povrsinu na nemogucu vrednost

    maxP:= -1;

    //zatim, za svaki trougao

    for i:= 1 to brEl do

    begin

    //proveravamo da li je njegova povrsina veca od

    //trenutno najvece pronadjene povrsine

    if nizP[i] > maxP then

    begin//ako jeste, pamtimo novu povrsinu

    maxP:= nizP[i];

    //i podatke o tom trouglu

    osnovica:= nizO[i];

    visina:= nizV[i];

    end; //if

    end; //for

    //deo za ispis

    writeLn;

    //ispisujemo najvecu povrsinu (dve decimale)

    writeLn('Maksimalna povrsina: ', maxP:0:2);

    //ispisujemo osnovicu trougla sa najvecom porsinom (dve decimale)

    writeLn('Osnovica trougla sa maksimalnom povrsinom: ', osnovica:1:2);

  • 7/25/2019 Reseni ispiti

    17/31

    [PROGRAMIRANJE 1] SSETF

    17

    //ispisujemo visinu trougla sa najvecom povrsinom (dve decimale)

    writeLn('Visina trougla sa maksimalnom povrsinom: ', visina:1:2);

    //malo praznih linija da bi lepse izgledalo

    writeLn;writeLn;

    writeLn;

    end; //function

    //glavni program

    begin

    //ako uspesno ucitamo nizove (to jest, ako je uneta dozvoljena vrednost

    //za broj truglova, funkcija vraca true)

    while UcitajNizove(niz_osnovica, niz_visina, broj_elemenata, max_br_el) do

    begin

    //onda ulazimo u petlju i pozivamo proceduru za izracunavanje svih povrsina,

    IzracunajPovrsine(niz_povrsina, niz_osnovica, niz_visina, broj_elemenata);

    //proceduru za pronalazenje trougla sa najvecom povrsinom i

    //ispis trazenih podataka o tom trouglu (povrsina, visina, osnovica)

    PronadjiNajvecu(niz_osnovica, niz_visina, niz_povrsina, broj_elemenata);

    end; //whileend. //program

  • 7/25/2019 Reseni ispiti

    18/31

    [PROGRAMIRANJE 1] SSETF

    18

    Februar 2010 zadatak 2

    Autor:persefona

    U tekst datoteci kupovina.txt nalaze se podaci o obavljenoj kupovini. U svakom redu se nalaze

    poaci o jenom kupljenom proizvou i to: ifra proizvoa (ceo broj) i koliina (ceo broj). Poaci ojednom proizvodu se pojavljuju samo u jednom redu datoteke. U datoteci cenovnik.txt nalaze se podaci

    o proizvoima i cenama, zapisani tako a svaki re sari: ifru proizvoa i cenu po jeinici mere (realan

    broj). Cenovnik sari najvie 1000 proizvoa.

    Resenje:

    program Kupovina (ulaz1, ulaz2, output);

    type

    proizvod = record

    id : integer;

    kolicina : integer;

    end;

    cenovnik = record

    sifra, brcena : integer;

    cena : real;

    end;

    var

    ulaz1, ulaz2 : text;

    i : integer;s : real;

    kupljeno : proizvod;

    niz : array [1..1000] of cenovnik;

    begin

    assign (ulaz1, 'C:\kupovina.txt');

    reset (ulaz1);

    assign (ulaz2, 'C:\cenovnik.txt');

    reset (ulaz2);

    s := 0.0;

    i := 1;while not eof (ulaz2) do

    begin

    read (ulaz2, niz[i].sifra, niz[i].cena);

    i := i + 1; brcena := brcena + 1;

    end;

    close (ulaz2);

    while not eof (ulaz1) do

    begin

  • 7/25/2019 Reseni ispiti

    19/31

    [PROGRAMIRANJE 1] SSETF

    19

    read (ulaz1, kupljeno.id, kupljeno.kolicina);

    for i := 1 to brcena do

    begin

    if niz[i].sifra = kupljeno.id then

    s := s + kupljeno.kolicina * niz[i].cena;end;

    end;

    writeln (output, 'Vas racun je: ', s:5:2);

    readln;

    close (ulaz1);

    end.

  • 7/25/2019 Reseni ispiti

    20/31

    [PROGRAMIRANJE 1] SSETF

    20

    Januar 2010 zadatak 1

    Autor:zmajciki

    U tekst datoteci ulaz.txt nalaze se podaci o stanovima. U svakom redu datoteke nalazi se podatak oaresi stana (ulica, najvie 30 znakova, i broj), zatim broj prostorija, nakon ega slee imenzije svake

    prostorije. Na primer: "Beogradska 11 3 10 4 5 5 3 3", znai a je aresa stana Beograska 11, stan ima 3

    prostorije, a dimenzije prostorija su 10x4, 5x5, 3x3, respektivno. Broj stanova (redova u datoteci) kao i

    broj prostorija svakog stana nije unapred poznat. Na osnovu podataka o prostorijama, izraunati

    povrinu svakog stana. Poatke o prostorijama nije potrebno uvati. Napisati program na programskom

    jeziku Pascal koji uitava poatke o stanovima iz atoteke, zatim sa stanarnog ulaza uitava

    informacije o donjoj i gornjoj granici povrine za koju je korisnik zainteresovan, i u izlaznu atateku ispie

    najpre jedan red sa zadatim granicama, a onda u posebnim redovima adrese stanova koji zadovoljavaju

    postavljeni uslov. Potrebno je obezbeiti a se program izvrava sve ok korisnik ne unese negativnu

    vrednost za jednu od granica.

    Resenje:

    PROGRAM zadatak1_januar2010(input, ulaz, izlaz);

    TYPE Stan = RECORD

    ulica: STRING[30];

    brojSoba: INTEGER;

    povrsina: REAL;

    END;

    {Procedura koja cita jednu rec iz nevedene datoteke i smesta je u string

    preskacuci pri tom sve blanko znake ispred reci ako postoje}

    PROCEDURE citajRec(VAR dat:TEXT; VAR rec:STRING);

    VAR c:CHAR;

    BEGIN

    rec := '';

    {gutanje razmaka i hvatanje prvog znaka}

    repeat

    if (not eof(dat)) and (not eoln(dat)) then read(dat,c)

    else break;

    until (c ' ');

    {citanje stringa do prvog razmaka}

    while (c ' ') and (not eoln(dat)) and (not eof(dat)) do begin

  • 7/25/2019 Reseni ispiti

    21/31

    [PROGRAMIRANJE 1] SSETF

    21

    rec := rec + c;

    read(dat,c);

    end;

    {zakrpa za citanje poslednjeg slova ako se rec nalazi na kraju reda, koje bi se inace preskocilo}

    if eoln(dat) OR eof(dat) then rec := rec + c;

    END;

    {Procedura koja iz jednog reda zadate datoteke cita sve podatke o stanu,

    racuna povrsinu i prelazi u novi red datoteke. Ova procedura

    prakticno opanasa proceduru readln, ali za podatak tipa Stan}

    PROCEDURE ucitajStan(VAR dat:TEXT; VAR podatak:Stan);

    VAR duzina, sirina: REAL;

    i: INTEGER;

    broj: STRING[5];

    BEGIN

    {citanje ulice}

    if not eof(dat) then begin

    {cita ulicu}

    citajRec(dat, podatak.ulica);

    {cita broj, kao string}

    citajRec(dat, broj);

    {dodaje string broj}

    podatak.ulica:= podatak.ulica + ' ' + broj;

    end;

    {citanje broja soba}

    if not eof(dat) then read(dat, podatak.brojSoba);

    {citanje podataka o sobama i racunanje povrsine}

    podatak.povrsina:= 0;

    for i:= 1 to podatak.brojSoba do

    if not eof(dat) then begin

    read(dat, duzina, sirina);

    podatak.povrsina:= podatak.povrsina + duzina*sirina;

    end;

    {prelazak u novi red}

    readln(dat);

    END;

    VAR ulaz, izlaz: TEXT;

    podatak: Stan;

  • 7/25/2019 Reseni ispiti

    22/31

    [PROGRAMIRANJE 1] SSETF

    22

    min, max: REAL;

    i: INTEGER; {i sluzi za kreiranje imena izlazne datoteke}

    broj: STRING[5]; {broj sluzi za kreiranje imena izlazne datoteke}

    BEGIN

    {pridruzivanje ulazne datoteke i datotecke promenljive}assign(ulaz, 'ulaz.txt');

    {citanje minimalne i maksimalne povrsine}

    writeln('Unesite minimalnu i maksimalnu zeljenu povrsinu stana');

    readln(input, min, max);

    {glavna obrada}

    i:=0;

    while (min>=0) and (max>=0) do begin

    {priprema datoteku za citanje}

    reset(ulaz);

    {priprema datoteku za pisanje}

    {i se dodaje na ime izlazne datoteke da bi svaki put pisali u novu datoteku

    sa imenima 'izlaz1.txt', 'izlaz2.txt', itd.; u principu ovo je nepotreban deo :)}

    inc(i); str(i,broj); {konvertuje i u string}

    assign(izlaz, 'izlaz'+broj+'.txt');

    rewrite(izlaz);

    {ispis minimalne i maksimalne povrsine u datoteku zaokruzenih na dve decimale}

    writeln(izlaz, min:2, ' ', max:2);

    {citanje datoteke i ispis}while not eof(ulaz) do begin

    ucitajStan(ulaz, podatak);

    if (podatak.povrsina >= min) and (podatak.povrsina

  • 7/25/2019 Reseni ispiti

    23/31

    [PROGRAMIRANJE 1] SSETF

    23

    Jun 2009 zadatak 1

    Autor:stefanvozd

    Data je tekstualna atoteka polinom.txt koja sari poatke o jenom polinomu. U prvom

    reu atoteke se nalazi ceo broj N (maksimalna vrenost 100) koji ozna ava re polinoma. Unarednom redu se nalazi N+1 celih nenegativnih brojeva koji ozna avaju koeficijente polinoma o

    koeficijenta najvede teine an o koeficijenta najmanje teine a0. Napisati program na programskom

    jeziku Pascal koji proita atu tekstualnu atoteku, ispie u itani polinom, a zatim izrauna i ispie

    vrednost polinoma za vrenost x koja se unosi sa stanarnog ulaza. Ispis i ra unanje polinoma

    realizovati kao zasebne potprograme koji sa pozivajudim programom komuniciraju iskljuivo putem

    argumenata i povratne vrednosti. Prilikom ispisivanja polinoma, ne ispisivati lanove iji koeficijenti

    imaju vrednost 0.

    Resenje:

    program polinomt;

    type

    niz=array[1..101] of integer; {dakle u zadatku je receno da najveci stepen moze biti 100, a ovo 101 je

    mesto ostavljeno ako budemo imali 100stepen, pa za broj n+1 koji je takodje naznacen u zadatku}

    var

    f:text; { f ce nam biti promenljiva vezana za tekstualni faj}

    n,x,i:integer; {n ce nam biti stepen, x ce nam trebati na kraju kada budemo hteli da izraznunamo P(x) i I

    ce nam biti brojac}

    a:niz; {radi lepseg pisanja deklarisacemo da nam je a niz umesto da pisemo niz[i] pisacemo a[i]}

    {Korak po korak kako sam ja radio bice oznacen, nadjite gde su koraci 1,2,3 i po tom redosledu citajte.}

    procedure ispisiPolinom( n:integer; a:niz); {>>>2.KORAK!!!3.korak!!!

  • 7/25/2019 Reseni ispiti

    24/31

    [PROGRAMIRANJE 1] SSETF

    24

    suma:=a[1]*exp(n*ln(x)); {na pocetku je suma jednaka samo prvom clanu niza ax^n gde je n stepen,

    exp je ugradjena fja za racunanje stepena na n-ti}

    for i:=2 to n+1 do {krecemo od drugog clana jer smo prvi izracunali}

    begin

    suma:=a[i]*exp((n-1)*ln(x))+suma; {odavde sabiramo sve clanove tipa ax^n i dodajemo ih na sumu}

    end;izracunaj:=suma; {rezultat koji ce nam ispisivati fja- ce biti jednak sumi koju smo izracunali}

    end;

    begin {>>>1.KORAK

  • 7/25/2019 Reseni ispiti

    25/31

    [PROGRAMIRANJE 1] SSETF

    25

    Jun 2009 zadatak 2

    Autor: DarioM

    Napisati program na programskom jeziku Pascal koji rauna uinu zatvorene izlomljene linije u

    ravni prestavljene pomodu liste taaka. Program treba najpre auita sa stanarnog ulaza realnekoorinate taaka u ravni. Broj taaka nije unapre poznat, ved se unos taaka vri sve ok se ne oformi

    zatvorena linija (ok se ponove koorinate polazne ta ke). Potom je potrebno ispisati sve unete take i

    obim figure koju unete take formiraju. Program treba a ponavlja prethono opisani postupak sve ok

    se ne unese linija nulte uine (prva i ruga taka su ientine). Voiti rauna o ispravnoj alokaciji i

    ealokaciji inamike memorije.

    Resenje:

    PROGRAM izl_linija (input, output);

    TYPE Tacka = RECORD

    x, y : REAL;

    END;

    ElemPok = ^Elem;

    Elem = RECORD

    t : Tacka;

    sled : ElemPok;

    END;

    VAR

    t : Tacka;kraj : BOOLEAN;

    lista, posl, novi : ElemPok; (* lista je zapravo pokazivac na prvi element liste *)

    (* obrisi () ima zadatak da, ako argument nije vec prazan, da ga isprazni, obrise i postavi na nil *)

    PROCEDURE obrisi (var lista : ElemPok; var posl : ElemPok);

    VAR stari : ElemPok;

    BEGIN

    WHILE (lista NIL) DO

    BEGINstari := lista;

    lista := lista^.sled;

    DISPOSE (stari);

    END;

    posl := NIL;

    lista := NIL; (* nisam siguran treba li ovaj red nakon dispose, ali ne moze da skodi *)

    END;

  • 7/25/2019 Reseni ispiti

    26/31

    [PROGRAMIRANJE 1] SSETF

    26

    (* dodaj ima zadatak da tacku koja je vec provjerena na uslove za kraj rada doda u listu *)

    (* da ne bismo prolazili svaki put kroz citavu listu, sto pri velikim listama zna biti ogroman gubitak *)

    (* pamticemo pokazivac na poslednji ucitani element liste, to je ona varijabla posl *)

    PROCEDURE dodaj (var lista, posl : ElemPok; el : ElemPok);BEGIN

    IF (lista = NIL) THEN

    lista := el

    ELSE

    posl^.sled := el;

    posl := el;

    END;

    (* iste je funkcija koja vraca true ako su tacke proslijedjene kao argumenti iste, a false ako nisu iste *)

    FUNCTION iste (e1 : ElemPok; e2 : ElemPok) : BOOLEAN;

    BEGIN

    IF (e1 NIL) AND (e2 NIL) AND (e1^.t.x = e2^.t.x) AND (e1^.t.y = e2^.t.y) THEN

    iste := TRUE

    ELSE

    iste := FALSE;

    END;

    (* rastojanje () mjeri rastojanje izmedju dva elementa/tacke *)

    FUNCTION rastojanje (e1 : ElemPok; e2 : ElemPok) : REAL;BEGIN

    rastojanje := SQRT ( (e2^.t.x - e1^.t.x)*(e2^.t.x - e1^.t.x) + (e2^.t.y - e1^.t.y)*(e2^.t.y - e1^.t.y) );

    END;

    (* ispis koordinata i obima mnogougla *)

    PROCEDURE ispisi (lista : ElemPok);

    VAR

    tek : ElemPok;

    obim : REAL;BEGIN

    tek := lista;

    obim := 0;

    WRITE ('[');

    WHILE (tek NIL) DO

    BEGIN

    WRITE ('(', tek^.t.x:5:2, ',', tek^.t.y:5:2, ')');

    IF (tek^.sled NIL) THEN

  • 7/25/2019 Reseni ispiti

    27/31

    [PROGRAMIRANJE 1] SSETF

    27

    obim := obim + rastojanje (tek, tek^.sled)

    ELSE

    obim := obim + rastojanje (tek, lista);

    tek := tek^.sled;

    END;

    WRITELN (']');WRITE ('Obim: ', obim:5:2);

    WRITELN ();

    READLN ();

    END;

    BEGIN

    kraj := FALSE;

    WHILE (kraj = FALSE) DO

    BEGIN

    WRITELN ();

    REPEAT

    NEW (novi);

    WRITE ('Unesite koordinate (x,y): ');

    READLN (novi^.t.x, novi^.t.y);

    novi^.sled := NIL;

    IF (iste (posl, novi) = TRUE) THEN

    kraj := TRUE;

    ELSE IF (iste (lista, novi) = FALSE) THEN

    dodaj (lista, posl, novi);

    UNTIL (lista novi) AND (iste (lista, novi) = TRUE); (* lista novi uslov omogudava a ne

    proslijeimo jenu te istu taku u va argumenta, tj. postavljamo uslov a se ne posmatra sluaj ka

    lista i novi pokazuju na istu taku. Ako pokazuju na istu taku, tj. ka unesemo prvi element, ona uslovnede biti ispunjen, pa de opet a vrti petlju. *)

    IF (iste (posl, novi) = FALSE) THEN (* ako iskoimo u kraj := TRUE; bloku, nedemo oati novi na

    kraj liste, jer ne ulazimo u ELSE IF granu, pa ova provjera vai i ovje *)

    BEGIN

    ispisi (lista);

    obrisi (lista, posl);

    END;

    END;

    DISPOSE (novi); (* kad unesemo dva puta iste koordinate i zavrimo program, nismo povezali novi u

    listu, pa moramo posebno a ga obriemo *)

    obrisi (lista, posl); (* takoe moramo opet a obriemo listu jer nismo uli u ispisi (lista); obrisi (lista);blok *)

    END.

  • 7/25/2019 Reseni ispiti

    28/31

    [PROGRAMIRANJE 1] SSETF

    28

    Septembar 2008 zadatak 1

    Autor:DarioM

    Neka su graovi neke regije oznaeni brojevima o 1 o n. Postojanje puta o graa 1 o graa 2

    oznaeno je parom 1 2. Niz ovakvih parova at je u atoteci parovi.txt, ge je svaki par zaat uposebnom redu. Potrebno je utvrditi da li je putanja izme u graova zatvoren kruni put, tj. a li se,

    kretanjem o prvog naveenog graa u atoteci (gra 1 u primeru) moe stidi naza u taj gra, tako a

    se prou svi putevi naveeni u atoteci. Smatrati a je reosle parova u atoteci proizvoljan, kao i a

    su putevi jenosmerni (tj. a put 3 1 ne moe biti zamenjen putem 1 3). Napisati program na

    programskom jeziku PASCAL koji proita tekstuelnu atoteku parovi.txt, a zatim orei a li je efinisana

    putanja zatvorena. U sluaju a jeste, program na stanarnom izlazu ispie "Zatvorena" a u suprotnom

    "Nije Zatvorena". Maksimalan broj parova je 100.

    Resenje:

    PROGRAM Putanja (ulaz, output);

    TYPE

    par = RECORD

    elem1, elem2 : integer;

    END;

    VAR

    parovi : par;

    ulaz : text;

    put1, put2 : ARRAY [1..100] OF par;i, j, n : INTEGER;

    nadjen : BOOLEAN;

    BEGIN

    ASSIGN (ulaz, 'C:\parovi.txt'); reset(ulaz);

    n := 1;

    WHILE NOT EOF (ulaz) DO

    BEGIN

    READ (ulaz, put1[n].elem1, put1[n].elem2);

    n := n+1;

    END;n := n - 1;

    put2[1] := put1[1];

    i := 1;

    nadjen := TRUE;

    WHILE nadjen DO

    BEGIN

    nadjen := FALSE;

    FOR j := 2 TO n DO

  • 7/25/2019 Reseni ispiti

    29/31

    [PROGRAMIRANJE 1] SSETF

    29

    BEGIN

    IF put2[i].elem2 = put1[j].elem1 THEN

    BEGIN

    i := i+1;

    put2[i] := put1[j];

    nadjen := TRUE;END;

    END;

    END;

    IF (put2[1].elem1 = put2[n].elem2) AND (i = n) THEN

    writeln (output, 'Zatvorena')

    ELSE

    writeln (output, 'Nije zatvorena');

    CLOSE (ulaz);

    END.

  • 7/25/2019 Reseni ispiti

    30/31

    [PROGRAMIRANJE 1] SSETF

    30

    Jun 2007 zadatak 1

    Autor:parkins

    U nizu o najvie 200 elemenata se nalaze poaci o masama paketa koje treba transportovati

    kamionima nosivosti 5t. Paketi ija je masa preko 1000kg se ne transportuju i podatke o njima trebaizbaciti iz niza. Nakon toga, paketi se u kamione utovaruju po reosleu iz niza sve ok zbirna teina

    paketa nije veda o nosivosti kamiona. Potrebno je ispisati koliko je kamiona potrebno za transport svih

    paketa, a za svaki kamion ukupnu masu paketa koji de biti transportovani. Izbacivanje elemenata iz niza i

    ispis realizovati kao odvojene potprograme, koji sa glavnim programom komuniciraju samo putem

    povratnih vrednosti i/ili liste argumenata.

    Resenje:

    program kamioni (input, output);

    type pok = ^element;

    element = record

    masa : integer;

    sledeci : pok;

    end;

    var slog : pok;

    glava : pok;

    procedure izbacivanjeelemenata (glava : pok);

    var tekuci : pok;begin

    tekuci := glava;

    while tekuci^.sledeci nil do

    begin

    if tekuci^.sledeci^.masa > 1000 then

    begin

    glava := tekuci^.sledeci;

    tekuci^.sledeci := glava^.sledeci;

    dispose (glava);

    end

    elsetekuci := tekuci^.sledeci;

    end;

    end;

    procedure ispisliste (glava:pok);

    begin

    while glava nil do

  • 7/25/2019 Reseni ispiti

    31/31

    [PROGRAMIRANJE 1] SSETF

    begin

    write (output,glava^.masa, ' ');

    glava := glava^.sledeci;

    end;

    end;

    procedure obrada (var glava : pok);

    var brojkamiona, suma : integer;

    tekuci : pok;

    begin

    tekuci := glava;

    suma := glava^.masa;

    brojkamiona := 1;

    while glava^.sledeci nil do

    begin

    if (suma + glava^.sledeci^.masa) > 5000 then

    begin

    writeln('kamion broj ', brojkamiona, ' ce nositi ', suma, 'kg');

    suma := 0; brojkamiona := brojkamiona + 1;

    end

    else

    begin

    suma := suma + glava^.sledeci^.masa;

    end;

    tekuci := glava;

    glava := glava^.sledeci;

    dispose (tekuci);

    end;

    writeln ('ukupno je iskorisceno ', brojkamiona, 'kamiona');end;

    BEGIN

    glava := nil;

    writeln ('unesi mase');

    while not eoln (input) do

    begin

    new (slog);

    read (input,slog^.masa);

    slog^.sledeci := glava;

    glava := slog;end;

    ispisliste (glava);

    izbacivanjeelemenata (glava);

    writeln (output);

    ispisliste (glava);

    obrada (glava);

    END.