gitweb on Svarog
projekti pod git sistemom za održavanje verzija -- projects under the git version control system--- a/skripta-spa1-sadrzaj.tex
+++ b/skripta-spa1-sadrzaj.tex
\newcommand{\autor}{Vladimir Kurbalija, Milos Radovanovic, Doni Pracner}
\newcommand{\naslov}{Skripta za vezbe iz predmeta "Strukture podataka
i algoritmi 1"}
-\newcommand{\datum}{Februar 2013, Novi Sad}
-\newcommand{\verzija}{ver 13b-\varijacija}
+\newcommand{\datum}{Februar 2014, Novi Sad}
+\newcommand{\verzija}{ver 14a-\varijacija}
%varijacija je definisana u fajlu koji ukljucuje ovaj
\title{\naslov -- \verzija}
sa kojim radimo. Da bi ga koristili moramo ga uvesti u program (isto
kao što uvozimo i komande).
-\begin{quote}U primerima se pretpostavlja da je ``f'' tipa \kod{File}, ``str'' niz
-znakova, ``i'' tipa \kod{INTEGER}, ``c'' tipa \kod{CARDINAL} i ``ch''
-tipa \kod{CHAR}. Dodatna promenljiva ``n'' tipa \kod{INTEGER} služi za
-formatiranje slično kao u modulu \kod{InOut}.
-\end{quote}
+\emph{U primerima se pretpostavlja da je ``f'' tipa \kod{File},
+ ``str'' niz znakova, ``i'' tipa \kod{INTEGER}, ``c'' tipa
+ \kod{CARDINAL} i ``ch'' tipa \kod{CHAR}. Dodatna promenljiva ``n''
+ tipa \kod{INTEGER} služi za formatiranje slično kao u modulu
+ \kod{InOut}, odnosno za ispis će biti zauzeto bar ``n'' znakova.}
+
+
+Ako otvaramo već postojeći fajl, poželjno je prvo proveriti da li on
+postoji -- u suprotnom naš program će se srušiti pri izvršavanju.
+Funkcija \kod{Exists(str)} vraća da li fajl postoji.
Promenljiva tipa \kod{File} se mora vezati za neki fajl
jednom od sledećih komandi:
\begin{itemize}
-\item \kod{f := Open(str);} -- otvara se postojeci fajl za čitanje\\
-\item \kod{f := Create(str);} -- kreira se fajl za pisanje\\
+\item \kod{f := Open(str);} -- otvara se postojeci fajl za čitanje
+\item \kod{f := Create(str);} -- kreira se fajl za pisanje; ako je već
+ postojao, biće zamenjen
\item \kod{f := Append(str);} -- otvara se postojeći fajl za
dopisivanje na kraj
\end{itemize}
-Po završetku rada fajl se mora zatvoriti, u našem primeru to bi bilo
-\kod{Close(f);}
+Po završetku rada fajl se mora zatvoriti, u našem primeru to bi bilo:
+\begin{itemize}
+\item \kod{Close(f);}
+\end{itemize}
Procedure za čitanje i pisanje su vrlo slične onima iz modula
\kod{IO}, osim što imaju dodatni parametar „\kod{f}“ koji označava
fajl sa kojim se radi.
\begin{itemize}
-\item \kod{RdStr(f,str)} -- učitava ceo red u string str\\
-\item \kod{RdItem(f,str)} -- učitava jednu reč u string str (učitava znakove iz fajla dok ne naiđe na separator)\\
-\item \kod{i:= RdInt(f); c:= RdCard(f)} -- učitava broj, koji se dobija kao rezultat procedure\\
+\item \kod{RdStr(f,str)} -- učitava ceo red u string str
+\item \kod{RdItem(f,str)} -- učitava jednu reč u string str (učitava
+ znakove iz fajla dok ne naiđe na separator)
+\item \kod{i:= RdInt(f); c:= RdCard(f)} -- učitava broj, koji se
+ dobija kao rezultat procedure
\item \kod{ch:= RdChar(f)} -- vraća jedan znak iz fajla
\end{itemize}
+Bitno je obratiti pažnju na specifičnost da postoje dve komande za
+čitanje stringova iz fajla i da se one ponašaju različito. Budući da
+razmak spada u separatore to znači da se korišćenjem \kod{RdItem} ne
+može učitati string koji ima u sebi razmake.
+
Analogne su i procedure za pisanje različitih tipova u fajl:
\begin{itemize}
-\item \kod{WrStr(f,str); WrInt(f,i,n);}\ \kod{WrCard(f,c,n);}\
- \kod{WrChar(f,ch);}
+\item \kod{WrStr(f,str);}
+\item \kod{WrInt(f,i,n);}
+\item \kod{WrCard(f,c,n);}
+\item \kod{WrChar(f,ch);}
\end{itemize}
+Treba primetiti da ne postoje dve komande za ispis stringa u fajl --
+potpuno je svejedno da li on ima razmake u sebi ili ne.
+
+Prelom reda se eksplicitno upisuje u fajl komandom
+\begin{itemize}
+\item \kod{WrLn(f);}.
+\end{itemize}
-Prelom reda se eksplicitno upisuje u fajl komandom \kod{WrLn(f);}.
Da bi odredili da li smo stigli do kraja fajla možemo koristiti
\kod{EOF}. U pitanju je logička promenljiva koja se uvozi iz modula
tome resetovati na \kod{FALSE}, pa na ovo treba obratiti pažnju pri
radu.
+
\subsection{Zadatak: ispis sadržaja fajla na ekran}
Potrebno je sve redove iz fajla učitati i ispisati ih na ekran.
-\begin{lstlisting}[style=codeblock]
-MODULE ispis;
-FROM FIO IMPORT File, Open, Close, EOF, RdStr;
-FROM InOut IMPORT WriteString, WriteLn, ReadString;
-
-PROCEDURE ispisF(ime: ARRAY OF CHAR);
-VAR
- f:File;
- s : ARRAY[1..100] OF CHAR;
-BEGIN
- f:=Open(ime);
- EOF := FALSE;
- WHILE NOT EOF DO
- RdStr(f,s);
- WriteString(s);
- WriteLn;
- END;
- Close(f);
-END ispisF;
-
-VAR
- ime: ARRAY[1..100] OF CHAR;
-BEGIN
- WriteString("unesite ime fajla:");
- ReadString(ime);
- ispisF(ime);
-END ispis.
-\end{lstlisting}
+\lstinputlisting[style=codeblock]{kodovi/fajlovi/ispis.mod}
\subsection{Zadatak: spisak studenata}
podatak o jednom studentu, redom prezime, ime i godina rođenja,
razdvojeni razmacima.
-\begin{lstlisting}[style=codeblock]
-MODULE nizslog;
-FROM InOut IMPORT WriteString, WriteLn,
- WriteCard, ReadCard, ReadString;
-FROM FIO IMPORT File, Open, Create, Close, EOF,
- RdItem, RdCard, WrStr, WrCard, WrLn;
-FROM Str IMPORT Compare;
-
-CONST
- MaxStud = 100;
-TYPE
- String = ARRAY[1..30] OF CHAR;
- Student = RECORD
- ime, prez: String;
- god: CARDINAL;
- END;
- Studenti = ARRAY[1..MaxStud] OF Student;
-
-PROCEDURE UcitajF(fajl:String;
- VAR spisak: Studenti; VAR n:CARDINAL);
-VAR
- f:File;
-BEGIN
- n:=0;
- f:= Open(fajl);
- EOF := FALSE;
- WHILE NOT EOF DO
- INC(n);
- RdItem(f, spisak[n].prez);
- RdItem(f, spisak[n].ime);
- spisak[n].god := RdCard(f);
- END;
- Close(f);
-END UcitajF;
-
-PROCEDURE Ispisi(spisak:Studenti; n:CARDINAL);
-VAR
- i: CARDINAL;
-BEGIN
- FOR i:=1 TO n DO
- WriteString(spisak[i].prez);
- WriteString(" ");
- WriteString(spisak[i].ime);
- WriteString(" ");
- WriteCard(spisak[i].god,1);
- WriteLn;
- END;
-END Ispisi;
-
-PROCEDURE IspisiF(fajl:String;
- spisak:Studenti; n:CARDINAL);
-VAR
- f:File;
- i: CARDINAL;
-BEGIN
- IF (n>0) AND (n<=MaxStud) THEN
- f:=Create(fajl);
- (* pravimo takav fajl da ne
- postoji zadnji prazan red *)
- FOR i:=1 TO n-1 DO
- WrStr(f,spisak[i].prez);
- WrStr(f," ");
- WrStr(f,spisak[i].ime);
- WrStr(f," ");
- WrCard(f,spisak[i].god,1);
- WrLn(f);
- END;
- WrStr(f,spisak[n].prez);
- WrStr(f," ");
- WrStr(f,spisak[n].ime);
- WrStr(f," ");
- WrCard(f,spisak[n].god,1);
- Close(f);
- END;
-END IspisiF;
-
-PROCEDURE NoviStudent(VAR spisak:Studenti;
- VAR n:CARDINAL);
-VAR
- stud,temp:Student;
- i:CARDINAL;
- dodaj:BOOLEAN;
-BEGIN
- IF n<MaxStud THEN
- WriteString("Prezime novog studenta?");
- ReadString(stud.prez);
- WriteString("Ime novog studenta?");
- ReadString(stud.ime);
- WriteString("Godina rodjenja");
- WriteString("novog studenta?");
- ReadCard(stud.god);
- (* proverimo da li vec postoji *)
- i:=1;
- dodaj := TRUE;
- WHILE (i<=n) AND dodaj DO
- temp := spisak[i];
- IF (temp.god = stud.god) &
- (Compare(temp.prez,stud.prez)=0) &
- (Compare(temp.ime,stud.ime)=0) THEN
- dodaj:=FALSE;
- END;
- INC(i);
- END;
- IF dodaj THEN
- INC(n);
- spisak[n]:=stud;
- ELSE
- WriteString("podaci vec postoje!");
- END;
- ELSE
- WriteString("popunjen kapacitet!");
- END;
-END NoviStudent;
-
-VAR
- spisak : Studenti;
- fajl:String;
- n:CARDINAL;
-BEGIN
- fajl:="studenti.txt";
- UcitajF(fajl, spisak, n);
- Ispisi(spisak, n);
- NoviStudent(spisak,n);
- IspisiF(fajl, spisak, n);
-END nizslog.
-\end{lstlisting}
+\lstinputlisting[style=codeblock]{kodovi/fajlovi/nizslog.MOD}
\sectionbreak
\section{Liste i pokazivači}
\paragraph{PolinomL.DEF} \
-\begin{lstlisting}[style=codeblock]
-DEFINITION MODULE PolinomL;
-TYPE
- Polinom = POINTER TO Monom;
- Monom = RECORD
- k : REAL;
- st : CARDINAL;
- veza : Polinom
- END;
-
-PROCEDURE Anuliraj(VAR p: Polinom);
-PROCEDURE Unos(VAR p: Polinom);
-PROCEDURE Stampaj(p: Polinom; d: CARDINAL);
-PROCEDURE Kopiraj(p: Polinom;
- VAR kopija: Polinom);
-PROCEDURE UbaciMonom(mon:Polinom;
- VAR p: Polinom);
-PROCEDURE PromeniZnak(VAR p: Polinom);
-PROCEDURE Saberi(p1, p2: Polinom;
- VAR zbir: Polinom);
-PROCEDURE SaberiNa(p: Polinom; VAR rez: Polinom);
-PROCEDURE Oduzmi(p1,p2: Polinom;
- VAR razlika: Polinom);
-PROCEDURE MonomPuta(p, mon: Polinom;
- VAR mp : Polinom);
-PROCEDURE Puta(p1, p2: Polinom; VAR pr: Polinom);
-PROCEDURE Kolicnik(p1, p2: Polinom;
- VAR kol, ost: Polinom;
- VAR ok : BOOLEAN);
-PROCEDURE PolinomNaN(p: Polinom; n: CARDINAL;
- VAR rez: Polinom);
-PROCEDURE DisposePolinom(VAR p: Polinom);
-
-END PolinomL.
-\end{lstlisting}
+\lstinputlisting[style=codeblock]{kodovi/polinomi/POLINOML.DEF}
\paragraph{PolinomL.MOD} \
-\begin{codeblock}
-(* Modul za rad sa polinomima preko listi
- verzija 2012, rev 1 *)
-IMPLEMENTATION MODULE PolinomL;
-FROM InOut IMPORT Write, WriteString, WriteLn,
- WriteCard, ReadCard, Done;
-FROM RealInOut IMPORT WriteReal, ReadReal;
-FROM Storage IMPORT ALLOCATE, DEALLOCATE;
-
-PROCEDURE Anuliraj(VAR p: Polinom);
-BEGIN
- p := NIL;
-END Anuliraj;
-
-PROCEDURE Kopiraj(p: Polinom; VAR kopija: Polinom);
-VAR
- pomocni: Polinom;
-BEGIN
- IF p = NIL THEN
- kopija := NIL
- ELSE
- NEW(kopija);
- kopija^ := p^;
- p := p^.veza;
- pomocni := kopija;
- WHILE p <> NIL DO
- NEW(pomocni^.veza);
- pomocni := pomocni^.veza;
- pomocni^ := p^;
- p := p^.veza
- END
- END
-END Kopiraj;
-
-PROCEDURE Stampaj(p: Polinom; d: CARDINAL);
-
- PROCEDURE StampajMonom(m : Polinom);
- BEGIN
- WITH m^ DO
- IF st <> 0 THEN
- IF ABS(k) <> 1.0 THEN
- WriteReal(ABS(k), d)
- END;
- Write('x');
- IF st <> 1 THEN
- Write('^');
- WriteCard(st, 1)
- END
- ELSE
- WriteReal(ABS(k), d)
- END
- END
- END StampajMonom;
-
-BEGIN
- IF p = NIL THEN
- WriteReal(0., d)
- ELSE
- IF p^.k < 0.0 THEN
- WriteString(' - ')
- END;
- StampajMonom(p);
- p := p^.veza;
- WHILE p <> NIL DO
- IF p^.k > 0.0 THEN
- WriteString(' + ')
- ELSE
- WriteString(' - ')
- END;
- StampajMonom(p);
- p := p^.veza
- END
- END
-END Stampaj;
-
-PROCEDURE UbaciMonom(mon:Polinom; VAR p: Polinom);
-VAR
- stari, tekuci, kopija: Polinom;
-BEGIN
- IF mon # NIL THEN
- NEW(kopija);
- kopija^ := mon^;
- tekuci := p;
- stari := NIL;
- WHILE (tekuci#NIL) AND (tekuci^.st>kopija^.st) DO
- stari := tekuci;
- tekuci := tekuci^.veza
- END;
- kopija^.veza := tekuci;
- IF tekuci = p THEN
- p := kopija
- ELSE
- stari^.veza := kopija
- END;
- IF (tekuci#NIL) AND (kopija^.st = tekuci^.st) THEN
- kopija^.k := kopija^.k + tekuci^.k;
- kopija^.veza := tekuci^.veza;
- DISPOSE(tekuci);
- IF kopija^.k = 0.0 THEN
- IF p = kopija THEN
- p := kopija^.veza
- ELSE
- stari^.veza := kopija^.veza
- END;
- DISPOSE(kopija)
- END
- END
- END
-END UbaciMonom;
-
-PROCEDURE Unos(VAR p : Polinom);
-VAR
- i, n: CARDINAL;
- novi: Polinom;
-BEGIN
- Anuliraj(p);
- REPEAT
- WriteLn;
- WriteString('Unesite broj monoma n (n>=0) ');
- ReadCard(n);
- UNTIL Done;
- WriteLn;
- FOR i := 1 TO n DO
- NEW(novi);
- WITH novi^ DO
- REPEAT
- WriteString('Unesite koeficijent monoma br.');
- WriteCard(i, 1);
- WriteString(' (<> 0) ');
- ReadReal(k);
- WriteLn
- UNTIL k <> 0.0;
- REPEAT
- WriteLn;
- WriteString('Unesite eksponent monoma br.');
- WriteCard(i, 1);
- WriteString(' (>=0) ');
- ReadCard(st);
- UNTIL Done;
- WriteLn;
- END;
- UbaciMonom(novi, p);
- DISPOSE(novi);
- END
-END Unos;
-
-PROCEDURE Saberi(p1, p2: Polinom; VAR zbir: Polinom);
-BEGIN
- Kopiraj(p1, zbir);
- WHILE p2 <> NIL DO
- UbaciMonom(p2, zbir);
- p2 := p2^.veza
- END
-END Saberi;
-
-PROCEDURE SaberiNa(p: Polinom; VAR rez: Polinom);
-BEGIN
- WHILE p <> NIL DO
- UbaciMonom(p,rez);
- p := p^.veza;
- END;
-END SaberiNa;
-
-PROCEDURE PromeniZnak(VAR p: Polinom);
-VAR
- t: Polinom;
-BEGIN
- t := p;
- WHILE t <> NIL DO
- t^.k := - t^.k;
- t := t^.veza
- END
-END PromeniZnak;
-
-PROCEDURE Oduzmi(p1,p2: Polinom; VAR razlika: Polinom);
-BEGIN
- Kopiraj(p2, razlika);
- PromeniZnak(razlika);
- WHILE p1 <> NIL DO
- UbaciMonom(p1, razlika);
- p1 := p1^.veza
- END
-END Oduzmi;
-
-PROCEDURE MonomPuta(p, mon: Polinom; VAR mp: Polinom);
-VAR
- tekuci: Polinom;
-BEGIN
- Anuliraj(mp);
- IF (mon <> NIL) AND (p <> NIL) THEN
- NEW(mp);
- mp^.k := p^.k * mon^.k;
- mp^.st := p^.st + mon^.st;
- p := p^.veza;
- tekuci := mp;
- WHILE p <> NIL DO
- NEW(tekuci^.veza);
- tekuci := tekuci^.veza;
- tekuci^.k := p^.k * mon^.k;
- tekuci^.st := p^.st + mon^.st;
- p := p^.veza
- END;
- tekuci^.veza := NIL
- END
-END MonomPuta;
-
-PROCEDURE Puta(p1, p2: Polinom; VAR pr: Polinom);
-VAR
- pomocni: Polinom;
-BEGIN
- Anuliraj(pr);
- IF (p1 <> NIL) AND (p2 <> NIL) THEN
- MonomPuta(p1, p2, pr);
- p2 := p2^.veza;
- WHILE p2 <> NIL DO
- MonomPuta(p1, p2, pomocni);
- REPEAT
- UbaciMonom(pomocni, pr);
- pomocni := pomocni^.veza
- UNTIL pomocni = NIL;
- p2 := p2^.veza
- END
- END
-END Puta;
-
-PROCEDURE Kolicnik(p1, p2: Polinom; VAR kol, ost: Polinom; VAR ok: BOOLEAN);
-
- PROCEDURE Deli(VAR kol, ost: Polinom);
- VAR
- novi, pomocni: Polinom;
- BEGIN
- IF ost <> NIL THEN
- IF ost^.st >= p2^.st THEN
- NEW(novi);
- novi^.k := - ost^.k / p2^.k;
- novi^.st := ost^.st - p2^.st;
- MonomPuta(p2, novi, pomocni);
- Saberi(ost, pomocni, ost);
- novi^.k := - novi^.k;
- UbaciMonom(novi, kol);
- DISPOSE(novi);
- Deli(kol, ost)
- END
- END
- END Deli;
-
-BEGIN (* Kolicnik *)
- ok := TRUE;
- Anuliraj(kol);
- IF p2 = NIL THEN
- ok := FALSE
- ELSE
- Kopiraj(p1, ost);
- Deli(kol, ost)
- END
-END Kolicnik;
-\end{codeblock}
-\manbreakJK
-\begin{codeblock}
-PROCEDURE PolinomNaN(p: Polinom; n: CARDINAL;
- VAR rez: Polinom);
-VAR
- i: CARDINAL;
-BEGIN
- IF n = 0 THEN
- NEW(rez);
- rez^.k := 1.0;
- rez^.st := 0;
- rez^.veza := NIL;
- ELSIF n = 1 THEN
- Kopiraj( p, rez );
- ELSE
- rez := p;
- FOR i := 2 TO n DO
- Puta(rez, p, rez)
- END
- END;
-END PolinomNaN;
-
-PROCEDURE DisposePolinom(VAR p: Polinom);
-VAR
- pomocni: Polinom;
-BEGIN
- pomocni := p;
- WHILE pomocni # NIL DO
- p := p^.veza;
- DISPOSE(pomocni);
- pomocni := p
- END
-END DisposePolinom;
-
-END PolinomL.
-\end{codeblock}
-
+\lstinputlisting[style=codeblock]{kodovi/polinomi/POLINOML.MOD}
\subsection{Zadatak: Sabiranje sa unapred određenim polinomom}
Želimo da ispišemo uneti polinom uvećan za\\ $x^5 - 3x^4 + 4x + 7$.
-\begin{lstlisting}[style=codeblock]
-MODULE polinom;
-FROM PolinomL IMPORT Polinom, Stampaj, Anuliraj, DisposePolinom, UbaciMonom, Unos, Saberi;
-FROM InOut IMPORT WriteString, WriteLn;
-FROM Storage IMPORT ALLOCATE, DEALLOCATE;
-
-VAR
- p,q,rez,pom : Polinom;
-
-BEGIN
- (* korisnik unosi prvi polinom *)
- WriteString("Unesite polinom:");
- WriteLn;
- Unos(p);
- (* drugi polinom kreiramo mi,
- monom po monom *)
- Anuliraj(q); (* isto sto i q:=NIL; *)
- (* formiramo monom x^5 *)
- NEW(pom);
- pom^.st:=5;
- pom^.k:=1.0;
- (* dodajemo ga u polinom *)
- UbaciMonom(pom,q);
- DISPOSE(pom);
- (* -3 x^4 *)
- NEW(pom);
- pom^.st := 4;
- pom^.k := -3.0;
- UbaciMonom(pom,q);
- DISPOSE(pom);
- (* 4 x *)
- NEW(pom);
- pom^.st := 1;
- pom^.k := 4.0;
- UbaciMonom(pom,q);
- DISPOSE(pom);
- (* 7 (x^0) *)
- NEW(pom);
- pom^.st := 0;
- pom^.k := 7.0;
- UbaciMonom(pom,q);
- DISPOSE(pom);
- (* saberemo polinome *)
- Saberi(p, q, rez);
- (* odstampamo rezultat *)
- Stampaj(rez,0);
- WriteLn;
- (* oslobadjanje zauzete memorije *)
- DisposePolinom(p);
- DisposePolinom(q);
- DisposePolinom(rez);
-END polinom.
-\end{lstlisting}
+\lstinputlisting[style=codeblock]{kodovi/polinomi/polinom.MOD}
\subsection{Zadatak: Suma k polinoma}
Napisati program koji ucitava broj k (1<=k<=50) i k polinoma, a nakon
toga izracunava njihovu sumu
-\begin{lstlisting}[style=codeblock]
-MODULE PolSuma;
-
-FROM PolinomL IMPORT Polinom, Anuliraj, DisposePolinom, Unos, Stampaj, SaberiNa;
-FROM InOut IMPORT WriteLn, WriteString, ReadCard, WriteCard;
-CONST
- maxk = 50;
-TYPE
- nizPol = ARRAY [1..maxk] OF Polinom;
-VAR
- i, k: CARDINAL;
- suma : Polinom;
- p : nizPol;
-BEGIN
- REPEAT
- WriteString('Unesite broj k (1 <= k <= ');
- WriteCard(maxk, 1);
- WriteString(') ');
- ReadCard(k);
- WriteLn;
- UNTIL (1 <= k) AND (k <= maxk);
- FOR i := 1 TO k DO
- WriteLn;
- WriteString('Unos ');
- WriteCard(i, 1);
- WriteString('. polinoma.');
- WriteLn;
- Unos(p[i])
- END;
- Anuliraj(suma);
- FOR i := 1 TO k DO
- SaberiNa(suma, p[i])
- END;
- WriteLn;
- WriteString('Njihova suma je:');
- WriteLn;
- Stampaj(suma, 4);
- DisposePolinom(suma);
- FOR i := 1 TO k DO
- DisposePolinom(p[i]);
- END;
-END PolSuma.
-\end{lstlisting}
+\lstinputlisting[style=codeblock]{kodovi/polinomi/PolSuma.MOD}
\sectionbreak
\section{Stek i red opsluživanja}
+\subsection{Primer: osnovno korišćenje steka i reda opsluživanja}
+
+\lstinputlisting[style=codeblock]{kodovi/stek-redopsl/stekred.mod}
+
\subsection{Zadatak: Ilustracija pisanja u fajl uz pomoć bafera}
\begin{lstlisting}[style=codeblock]
END
END Top;
\end{lstlisting}
-\manbreakJK
+
\begin{codeblock}
PROCEDURE Pop(VAR s : StekTip;
VAR ok : BOOLEAN);
\appendix
\sectionbreak
-\section{Native XDS Modula 2 -- kratko uputstvo}
-
-
-Ovo uputstvo ukratko pokriva kako se može nabaviti XDS Modula 2 za Windows
-sistem, njenu instalaciju, te kako napraviti i pokretnuti jednostavan program.
-
-\subsection*{Dobavljanje instalacije}
-
-
-Native XDS Modula 2 se može besplatno skinuti sa sajta proizvođača,
-\url{http://www.excelsior-usa.com/}, tačnije na adresi:
-
-\url{http://www.excelsior-usa.com/xdsdl.html}
-
-Prvo se prikazuje ugovor o korišćenju koji na dnu treba potvrditi da ste
-razumeli i da ćete ga se pridržavati.
-
-Na stranici koja se potom otvara je potrebno odabrati ``XDS 2.6 beta 2
-for Windows'' i snimiti je na računar.
-
-\subsection*{Instalacija okruženja}
-
-Osnovno okruženje (xds-x86...) se instalira pokretanjem prethodno pomenute
- instalacione arhive.
-
-\emph{Korisnicima Windows-a 7 preporučujemo da pokrenu instalacione
- pakete pomoću opcije ``Run as administrator'' do koje se stiže desnim
- klikom miša.}
-
-Pretpostavićemo u daljem tekstu da je program instaliran u
-\kod{C:/XDS/}
-
-\subsection*{Pokretanje okruženja}
-
-Po uspešnoj instalaciji bi trebalo da postoji ikonica na desktopu, kao
-i grupa sa programom u start meniju.
-
-Ukoliko iz bilo kakvog razloga ne postoje odgovarajuće prečice,
-okruženje se može pokrenuti uz pomoć izvršnog fajla
-\kod{C:/XDS/BIN/xds.exe} (ako je instalirano na podrazumevanoj
-lokaciji).
-
-\subsection*{Prvi projekat}
-
-Da bismo mogli da pišemo i pokrećemo svoj program, potrebno je prvo
-napraviti projekat za njega, što se radi na sledeći način:
-
-\begin{itemize}
-
-\item
- Iz menija se odabere Project->New.
-\item U dijalogu se klikne na gornje dugme ``Browse'', odabere se putanja gde
- će se kreirati projekat i ukuca se ime novog projekta.
-
-\item U drugom polju ``Template'' ne treba da piše ništa. Ukoliko
- postoji neki tekst, obrisati ga.
-
-\item Kliknuti na ``OK''
-
-\item Iskočiće dijalog na kome piše da ne postoji fajl za editovanje,
- kliknuti na ``OK'' da se on napravi.
-
-\item Pojavljuje se forma za kucanje programa, ukucati (na primer):
-
-\begin{minipage}{\columnwidth}
-\begin{lstlisting}[style=codeblock]
- MODULE Hello;
- FROM InOut IMPORT WriteString,WriteLn;
- BEGIN
- WriteString("Hello World");
- WriteLn;
- END Hello.
-\end{lstlisting}
-\end{minipage}
-
-\item Program se može pokrenuti na različite načine, pri čemu se
- automatski prevodi:
-
- \begin{itemize}
-
- \item Klik na ``Run'' ikonicu u toolbaru (plavi čovečuljak koji trči)
-
- \item Meni Debug->Run
-
- \item Prečica Ctrl+F9 na tastaturi
-
- \end{itemize}
-
-\item Ako je sve u redu sa programom, treba da se pojavi novi terminal
- u kome se ispisuje rezultat izvršavanja programa, u našem slučaju
- jednostavna pozdravna poruka.
-\end{itemize}
-
-Naravno moguće je i samo prevesti (kompajlirati) program, tako da se
-samo prikažu greške (ako ih ima) i bez pokretanja programa:
-\begin{itemize}
-\item Klik na ``Compile'' ikonicu u toolbaru
-\item Meni Tools->Compile
-\item Prečica F9 na tastaturi
-\end{itemize}
-
-Ukoliko u programu postoje greške, on neće biti pokrenut, već će se
-dobiti lista grešaka u donjem delu prozora. Na primer ako obrišemo ``S''
-u četvrtom redu i probamo da pokrenemo program, taj red će biti
-označen svetlo plavom bojom i dobićemo poruku:
-
-\kod{- Error in pro1.mod [4:5]: Undeclared identifier "Writeting"}
-
-Što znači da u četvrtom redu, kod petog karatkera postoji problem, da
-identifikator nije deklarisan, što najčešće znači da ga nismo uvezli,
-ili, kao u našem slučaju, da smo napravili grešku u kucanju.
-
-Stvar na koju isto treba obratiti pažnju je da se nekad greška
-prijavljue nešto kasnije u tekstu nego što je napravljena. Na primer,
-ako obrišemo ``;'' na kraju četvrtog reda i probamo da pokrenemo
-program, peti red će biti označen svetlo plavom bojom i dobićemo
-poruku:
-
-\kod{- Error in pro1.mod [5:5]: Expected symbol ";" }
-
-Ovo se desilo jer nedostaje tačka zarez na kraju četvrtog reda, ali će
-kompajler probati da je traži i dalje, pa će tek na početku petog reda
-prijaviti grešku.
-
-U spisku se takođe pojavljuje i upozorenje (Warning) o tome da se
-uvezena komanda WriteString ne koristi nigde u programu. Često se
-upozorenja mogu ignorisati, a pažnju uglavnom treba obraćati na
-greške, odnosno poruke koje počinju sa ``Error''.
-
-Takođe se često dešava da su druge prijavljene greške posledica prve,
-te je poželjno ponovo kompajlirati (ili pokretati) program posle svake
-ispravljene greške.
-
-\paragraph{Napomena o template-ovima pri kreiranju projekta:}
-Moguće je namestiti da u dijalogu za novi projekat drugo polje ``Template''
- uvek bude prazno. Potrebno je u tom istom dijalogu kliknuti na
- ``Configure'', a potom isprazniti polje ``default template''.
-
-\subsection{Mogući problemi}
-
-\subsubsection*{Nedostajući sistemski moduli}
-
-Verzije pre 2.6 nisu imale uključene u glavni paket sve module koji se
-koriste u okviru kursa, i bilo je neophodno da se dodatno instalira i
-``Top Speed Compatibility Pack'' (tscp-x86...). Bez njega je kompajler
-prijavljivao da ne postoje neki moduli - najčešće je problem bio da
-nedostaje \kod{FIO} modul.
-
-\subsubsection*{Problemi u pokretanju - nemoguće naći exe}
-
-Ako pri pokušaju kompajliranja/pokretanja programa kompajler prijavi
-da ne može da nađe exe i pri tome prijavljuje kraću putanju od one
-koja je stvarno u pitanju, obično se radi o tome da je postojao razmak
-u okviru putanje do modula. Npr ``C:\textbackslash Moj prvi program''
-će prouzrokovati probleme, a kompajler će prijaviti da ne može da nađe
-``C:\textbackslash Moj''.
-
-Ovo je nažalost problem okruženja i dok se ne ispravi u nekoj budućoj
-verziji ne može se zaobići, tako da je jedino rešenje premestiti
-fajlove, odnosno ako je moguće preimenovati problematične foldere.
+\pagenumbering{Roman}
+\input{xds-uputstvo}
\mainend
+
+%%% Local Variables:
+%%% mode: latex
+%%% TeX-master: "skripta-spa1-jk"
+%%% End: