Darkies Den
Ointr essant.
(*****************************************************************
Programkonstruktion: Laboration 10
2010-02-06 - Pontus Rodling, DVK1 och Pontus Forslid, DVK1
*****************************************************************)
load "Int";
open TextIO;
(******************************
Problem 1
******************************)
(*
readInt(s)
TYPE: string -> int option
PRE: -
POST: strängen som har lästs in omgjord till en int option, annars NONE
SIDE-EFFECTS: s kommer att skrivas ut i terminalen och en eller flera rader kommer att läsas in från terminalen
EXAMPLES: -
*)
fun readInt(s) =
let
val x = ref NONE
val a = ref ""
in
while !x = NONE andalso !a <> "\n" do ( (* Loopa medan !x inte är NONE och !a inte är en tom rad *)
if !a <> "" then print("Felaktigt tal!\n") else (); (* Vi kunde inte konvertera strängen till en int *)
print(s ^ " "); (* Skriv ut prompten *)
a := inputLine(stdIn); (* Läs in en rad *)
x := Int.fromString(!a) (* Försök konvertera till en int option *)
);
!x
end;
(******************************
Problem 2
******************************)
(*
loggingAdder(f)
TYPE: string -> unit
PRE: -
POST: -
SIDE-EFFECTS: alla tal kommer att läsas in från terminalen, summan kommer att skrivas ut i terminalen och filen f kommer att skapas och innehålla alla tal som har matats in samt summan
EXAMPLES: -
*)
fun loggingAdder(f) =
let
val x = openOut(f) (* Filpekaren *)
val a = ref 0 (* Summan *)
val b = ref 1 (* Ska vi fortsätta läsa in tal? *)
in
while !b = 1 do (
case readInt("Ange ett tal:") of (* Läs in ett tal *)
SOME n => ( (* Addera tal *)
output(x, substring(" ", 0, 10 - size(Int.toString(n)))); (* Skriv tecken för högerjustering till filen *)
output(x, Int.toString(n) ^ "\n"); (* Skriv värdet till filen *)
a := !a + n (* Addera talet till summan *)
)
| NONE => ( (* Summera och avsluta *)
output(x, "----------\n"); (* Skriv avgränsaren till filen *)
output(x, substring(" ", 0, 10 - size(Int.toString(!a)))); (* Skriv tecken för högerjustering till filen *)
output(x, Int.toString(!a) ^ "\n"); (* Skriv summan till filen *)
b := 0 (* Vi vill inte köra längre *)
)
);
flushOut(x); (* Skriv ut all data till filen *)
closeOut(x); (* Stäng filen *)
print("Summan är " ^ Int.toString(!a) ^ "\n") (* Skriv ut summan i terminalen *)
end;
(******************************
Problem 3
******************************)
(*
readBlock(f)
TYPE: instream -> string list
PRE: -
POST: en lista med rader som har lästs från f mellan första raden och avgränsaren om det finns någon annars alla rader förutom första
SIDE-EFFECTS: alla rader fram t.om. avgränsaren kommer att läsas in från f och om ingen avgränsare finns kommer hela filen att läsas in
EXAMPLES: -
*)
fun readBlock(f) =
let
val d = inputLine(f) (* Läs in avgränsare *)
val l = ref [] (* Lista att lagra rader i *)
val x = ref ""; (* Senast inlästa rad *)
in
x := inputLine(f);
while !x <> d do ( (* Loopa medan den senaste raden som lästes in inte var samma som avgränsaren *)
l := !l @ [!x]; (* Lägg till raden i listan *)
if not (endOfStream(f)) then
x := inputLine(f) (* Läs in nästa rad *)
else
x := d (* Sätt x till avgränsaren för att stanna då filen är slut *)
);
!l (* Returnera listan *)
end;
(******************************
Problem 4
******************************)
(*
bubbleSort(v)
TYPE: int ref vector -> unit
PRE: -
POST: -
SIDE-EFFECTS: v kommer att sorteras och om v är en tom vektor utan typ kommer den att göras om till int ref vector
EXAMPLES: val a = #[ref 3, ref 1, ref 2]
bubbleSort(a)
a = #[ref 1, ref 2, ref 3]
*)
fun bubbleSort(v) =
let
val i = Vector.length(v) (* Vektorns längd *)
val n = ref (i - 1) (* Räknare för den yttre loopen *)
val m = ref 0 (* Räknare för den inre loopen *)
val t = ref 0 (* Temporär variabel som används vid byte av celler i vektorn *)
in
while !n > 0 do (
m := i - 1;
while !m > 0 do (
if !(Vector.sub(v, !m - 1)) > !(Vector.sub(v, !m)) then ( (* Jämför värdena i cellerna !m och (!m - 1) *)
t := !(Vector.sub(v, !m)); (* Lagra värdet i cellen !m temporärt *)
Vector.sub(v, !m) := !(Vector.sub(v, !m - 1)); (* Sätt cell !m till värdet i cell (!m - 1) *)
Vector.sub(v, !m - 1) := !t (* Sätt cell (!m - 1) till värdet i t *)
)
else
();
m := !m - 1 (* Minska värdet för den inre loopen *)
);
n := !n - 1
)
end;
Skrivet av Darkzealot, 2010-02-07 16:20
Kommentarsfunktionen är avslagen för detta inlägg.