gitweb on Svarog

projekti pod git sistemom za održavanje verzija -- projects under the git version control system
todo i changelog
[spa1skripta-public.git] / skripta-spa1.tex
index f8923ee..b5f0fe1 100644 (file)
@@ -196,9 +196,12 @@ pdfauthor={\autor}%
 
 
 Programi u ovoj skripti su testirani sa kompajlerom 'Native XDS Modula
-2' sa instaliranim dodatnim paketom TSCP (Top Speed Compatibility
-Pack), potrebnim za neke od modula koji se ne nalaze u ISO standardu
-Module 2.
+2'. Za verzije pre 2.60 je neophodno dodatno instalirati i TSCP (Top
+Speed Compatibility Pack), pošto je potreban za neke od modula koji se
+ne nalaze u ISO standardu Module 2. U novijim verzijama su i ovi
+moduli uključeni u standardnu instalaciju.
+
+Sav sadržaj se može koristiti u skladu sa {\ttfamily CC-BY-NC-SA} licencom. \url{http://creativecommons.org/licenses/by-nc-sa/3.0/}
 
 \tableofcontents
 
@@ -559,6 +562,52 @@ BEGIN
 END MaxNiza4.
 \end{codeblock}
 
+\section{Stringovi}
+
+
+Stringovi -- odnosno nizovi znakova -- ne postoje kao ugrađeni tip u
+jeziku Modula 2. Ovo daje slobodu da se niz znakova definiše na dužinu
+najadekvatniju za konkretnu primenu. U opštem slučaju definišemo npr:
+\begin{codeblock}
+  TYPE
+     String = ARRAY [1..30] OF CHAR;
+\end{codeblock}
+
+Operacije nad stringovima se najčešće uvoze iz modula \kod{Str}. One
+sve prihvataju \emph{otvorene nizove znakova} (strukture definisane sa
+\kod{ARRAY OF CHAR}), tako da im se može proslediti niz proizvoljne
+dužine.
+
+Određivanje stvarne dužine stringa (tj koliko od maksimalnog
+kapaciteta niza je zapravo zauzeto sadržajem) se može izvesti na
+sledeći način:
+\begin{codeblock}
+     duzina := Length(str)
+\end{codeblock}
+    
+Leksikografsko poređenje dva stringa se ne može vršiti standardnim
+operatorima kao što su \kod{< > =}. Ovo je delom zato što se radi o
+nizovima, a delom i zato što se ne vidi direktno koji deo niza je
+popunjen stvarnim sadržajem. Za ovo se koristi komanda \kod{Compare},
+koja prihvata dva stringa kao parametre, a vraća broj koji predstavlja
+njihov odnos. Taj broj će biti 0 ako su stringovi jednaki, veći
+od nule ako je prvi string ``veći'', i manji od nule ako je prvi
+string ``manji''. Ovo se lako pamti kad primetimo da je odnos
+između \kod{Compare} i 0 isti kao i između prvog i drugog stringa.
+
+\begin{codeblock}
+  IF    Compare(str1, str2) > 0 THEN
+     WriteString("Prvi string je veci");
+  ELSIF Compare(str1, str2) < 0 THEN
+     WriteString("Prvi string je manji");
+  ELSE (* moraju biti jednaki *)
+     WriteString("Jednaki su");
+  END;
+\end{codeblock}
+
+Postoji i modul \kod{Strings} koji ima nešto drugačije definisane
+procedure, no na njih se sada nećemo fokusirati.
+
 \section{Rad sa fajlovima}
 
 \subsection{Modul FIO}
@@ -1083,6 +1132,43 @@ BEGIN
   END;
 END IzbaciIzListe;
 
+PROCEDURE IzbaciIzListeSve(VAR lista:brojevi; 
+                        br: CARDINAL):CARDINAL;
+(* izbacuje sve brojeve 'br' iz liste, naravno ako 
+   postoje i vraca koliko ih je bilo *)
+VAR
+  temp,prethodni:brojevi;
+  brojac : CARDINAL;
+BEGIN
+  brojac := 0;
+  (* uklanjamo sa pocetka koliko je potrebno *)
+  WHILE (lista # NIL) AND (lista^.info = br) DO
+    temp:=lista;
+    lista :=lista^.veza;
+    DISPOSE(temp);
+    INC(brojac);
+  END;
+  (* trazimo u ostatku liste *)
+  IF (lista # NIL) THEN
+    temp:=lista;
+    WHILE (temp^.veza # NIL)  DO
+        (* idemo do poslednjeg elementa liste *)
+        prethodni:=temp;
+        temp := temp^.veza;
+        IF temp^.info = br THEN
+          (* prevezemo listu oko elementa *)
+          prethodni^.veza:=temp^.veza;
+          DISPOSE(temp);
+          INC(brojac);
+          (* vracamo se jedan korak da bi 
+          u novom krugu proverili i ovaj element *)
+          temp := prethodni;
+        END;
+    END;
+  END;
+  RETURN brojac;
+END IzbaciIzListeSve;
+
 (* - procedure sa interakcijom sa korisnikom - *)
 
 PROCEDURE IzbacivanjeEl(VAR lista:brojevi);
@@ -1100,6 +1186,21 @@ BEGIN
   WriteLn;
 END IzbacivanjeEl;
 
+PROCEDURE IzbacivanjeElSvi(VAR lista:brojevi);
+(* izbacuje sve primeke unetog broj iz liste 
+   koristeci proceduru IzbaciIzListeSve *)
+VAR
+  br, ukupno:CARDINAL;
+BEGIN
+  WriteString("unesite broj za izbacivanje: ");
+  ReadCard(br);
+  ukupno := IzbaciIzListeSve(lista,br);
+  WriteString("Iz liste je izbaceno ");
+  WriteCard(ukupno,3);
+  WriteString(" el.");
+  WriteLn;
+END IzbacivanjeElSvi;
+
 PROCEDURE IzbacivanjeK(VAR lista:brojevi);
 (* izbacuje k-ti element iz liste *)
 VAR
@@ -1180,29 +1281,32 @@ BEGIN
      WriteLn;
      WriteString("=============================");
      WriteLn;
-     WriteString("s - stampa");WriteLn;
-     WriteString("u - unos");WriteLn;
-     WriteString("i - izbacivanje br iz liste");
+     WriteString("s - Stampa");WriteLn;
+     WriteString("u - Unos");WriteLn;
+     WriteString("i - Izbacivanje br iz liste");
+     WriteLn;
+     WriteString("v - izbacivanje svih br iz liste");
      WriteLn;
-     WriteString("e - izbacivanje k-tog el.");
+     WriteString("e - izbacivanje k-tog El.");
      WriteLn;
      WriteString("k - stampanje k-tog elementa");
      WriteLn;
-     WriteString("m - minimalni broj u listi");
+     WriteString("m - Minimalni broj u listi");
      WriteLn;
-     WriteString("p - pretraga el. u listi");
+     WriteString("p - Pretraga el. u listi");
      WriteLn;
      WriteLn;
-     WriteString("q - kraj rada (quit)");WriteLn;
+     WriteString("q - kraj rada (Quit)");WriteLn;
       REPEAT
         menu := CAP(RdKey());
-      UNTIL menu IN skupZn{'S','U','E','I',
+      UNTIL menu IN skupZn{'S','U','E','I','V',
                            'M','K','P','Q'};
       IF menu#'Q' THEN
         CASE menu OF
          'S' : Stampaj(lista);|
          'U' : Unos(lista);|
          'I' : IzbacivanjeEl(lista);|
+         'V' : IzbacivanjeElSvi(lista);|
          'E' : IzbacivanjeK(lista);|
          'K' : StampajK(lista); |
          'M' : StampajMinimum(lista); |
@@ -1584,6 +1688,8 @@ END PolinomL.
 \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;
@@ -1592,13 +1698,10 @@ FROM Storage IMPORT ALLOCATE, DEALLOCATE;
 
 PROCEDURE Anuliraj(VAR p: Polinom);
 BEGIN
-  IF p # NIL THEN
-    DisposePolinom(p);
-  END;
+  p := NIL;
 END Anuliraj;
 
-PROCEDURE Kopiraj(p: Polinom;
-                  VAR kopija: Polinom);
+PROCEDURE Kopiraj(p: Polinom; VAR kopija: Polinom);
 VAR
   pomocni: Polinom;
 BEGIN
@@ -1659,8 +1762,7 @@ BEGIN
   END
 END Stampaj;
 
-PROCEDURE UbaciMonom(mon :Polinom; 
-                     VAR p: Polinom);
+PROCEDURE UbaciMonom(mon:Polinom; VAR p: Polinom);
 VAR
   stari, tekuci, kopija: Polinom;
 BEGIN
@@ -1679,8 +1781,7 @@ BEGIN
     ELSE
       stari^.veza := kopija
     END;
-    IF (tekuci#NIL) AND 
-           (kopija^.st = tekuci^.st) THEN
+    IF (tekuci#NIL) AND (kopija^.st = tekuci^.st) THEN
       kopija^.k := kopija^.k + tekuci^.k;
       kopija^.veza := tekuci^.veza;
       DISPOSE(tekuci);
@@ -1712,17 +1813,17 @@ BEGIN
     NEW(novi);
     WITH novi^ DO
       REPEAT
-        WriteString('koeficijent monoma br.');
+        WriteString('Unesite koeficijent monoma br.');
         WriteCard(i, 1);
-        WriteString(' (<> 0):');
+        WriteString(' (<> 0) ');
         ReadReal(k);
         WriteLn
       UNTIL k <> 0.0;
       REPEAT
         WriteLn;
-        WriteString('eksponent monoma br.');
+        WriteString('Unesite eksponent monoma br.');
         WriteCard(i, 1);
-        WriteString(' (>= 0): ');
+        WriteString(' (>=0) ');
         ReadCard(st);
       UNTIL Done;
       WriteLn;
@@ -1732,8 +1833,7 @@ BEGIN
   END
 END Unos;
 
-PROCEDURE Saberi(p1, p2: Polinom; 
-                 VAR zbir: Polinom);
+PROCEDURE Saberi(p1, p2: Polinom; VAR zbir: Polinom);
 BEGIN
   Kopiraj(p1, zbir);
   WHILE p2 <> NIL DO
@@ -1742,8 +1842,7 @@ BEGIN
   END
 END Saberi;
 
-PROCEDURE SaberiNa(p: Polinom; 
-                   VAR rez: Polinom);
+PROCEDURE SaberiNa(p: Polinom; VAR rez: Polinom);
 BEGIN
   WHILE p <> NIL DO
     UbaciMonom(p,rez);
@@ -1762,8 +1861,7 @@ BEGIN
   END
 END PromeniZnak;
 
-PROCEDURE Oduzmi(p1,p2: Polinom; 
-                 VAR razlika: Polinom);
+PROCEDURE Oduzmi(p1,p2: Polinom; VAR razlika: Polinom);
 BEGIN
   Kopiraj(p2, razlika);
   PromeniZnak(razlika);
@@ -1773,8 +1871,7 @@ BEGIN
   END
 END Oduzmi;
 
-PROCEDURE MonomPuta(p, mon: Polinom; 
-                    VAR mp: Polinom);
+PROCEDURE MonomPuta(p, mon: Polinom; VAR mp: Polinom);
 VAR
   tekuci: Polinom;
 BEGIN
@@ -1815,9 +1912,7 @@ BEGIN
   END
 END Puta;
 
-PROCEDURE Kolicnik(p1, p2: Polinom; 
-                   VAR kol, ost: Polinom; 
-                   VAR ok: BOOLEAN);
+PROCEDURE Kolicnik(p1, p2: Polinom; VAR kol, ost: Polinom; VAR ok: BOOLEAN);
 
   PROCEDURE Deli(VAR kol, ost: Polinom);
   VAR
@@ -1860,7 +1955,7 @@ BEGIN
     rez^.st := 0;
     rez^.veza := NIL;
   ELSIF n = 1 THEN
-    Kopiraj( rez, p );
+       Kopiraj( p, rez );
   ELSE
     rez := p;
     FOR i := 2 TO n DO
@@ -2872,20 +2967,13 @@ Native XDS Modula 2 se može besplatno skinuti sa sajta proizvođača,
 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 sledeće pakete za
-download:
-
-* Native XDS-x86 2.51 for Windows (6.5MB)
-\url{http://www.excelsior-usa.com/download/xds25x/xds-x86-251-enduser-win32.exe}
-
-* TSCP add-on (2.4MB)
-\url{http://www.excelsior-usa.com/download/xds25x/tscp-x86-251-enduser-win32.exe}
+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}
 
-Prvo treba instalirati osnovno okruženje (xds-x86...), a potom i Top
-Speed Compatibility Pack (tscp-x86...), koji je potreban za neke
-module koji se koriste.
+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
@@ -3000,6 +3088,28 @@ 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.
 
 \mainend
 
Svarog.pmf.uns.ac.rs/gitweb maintanance Doni Pracner