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
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}