fredag 26. oktober 2007

Fredag 26/10: Konstruktører og ordliste

Eksamen høst 2006 ble studert: 15 likt vektede deloppgaver på 6 timer gir
[kd@harr ~]$ bc -l
bc 1.06 Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
1/15
.06666666666666666666
360/15
24.00000000000000000000
altså 6.7 % vekt og 24 minutt tid per deloppgave. Vi så på oppgavene 3 a), b), c) og h) og brukte objektorientering (kap. 11.1) med konstruktør (nytt, s. 560):
[kd@harr ordliste]$ more ov.vb
Public Class ov
  Private _norsk As String
  Private _svensk As String

  Public Sub New(ByRef s1 As String, ByRef s2 As String)
      _norsk = s1                ' "konstruktør"
      _svensk = s2
  End Sub

  Public Property norsk() As String
      Get                        ' "getter"
          Return _norsk
      End Get
      Set(ByVal value As String) ' "setter"
          _norsk = value
      End Set
  End Property

  Public Property svensk() As String
      Get
          Return _svensk         ' "getter"
      End Get
      Set(ByVal value As String)
          _svensk = value        ' "setter"
      End Set
  End Property
End Class
og "hovedklassen" (som skaper brukerens visuelle inntrykk):
[kd@harr ordliste]$ more Form1.vb
Public Class Form1
  'Structure ov   ' vi kunne brukt Structure istedet for objekter
  '   Dim norsk As String
  '    Dim svensk As String
  'End Structure
  Dim o(4) As ov
  Dim nl As Integer = 0   ' Christer foreslo navnet
  Dim filnavn As String = "k:\in-kurs\IBE150\ordliste.txt"

  Private Sub Form1_Load(ByVal sender As System.Object, _
              ByVal e As System.EventArgs) Handles MyBase.Load
      lesfil(filnavn)
  End Sub

  Private Sub lesfil(ByVal n As String)
      Dim linjenr As Integer = 0
      Try
          Dim sr As IO.StreamReader = IO.File.OpenText(n)
          Do While Not sr.EndOfStream()
              nyoversettelse(sr.ReadLine(), sr.ReadLine())
              linjenr += 2
          Loop
      Catch ex As IO.IOException
          MsgBox("feil ved lesing av fil i linje " & linjenr)
      End Try
  End Sub

  Private Sub nyoversettelse(ByVal norsk As String, ByVal svensk As String)
      If nl > o.GetUpperBound(0) Then
          Return   ' full mage (ja, vi kunne utvidet)
      End If
      o(nl) = New ov(norsk, svensk)
      nl += 1
  End Sub

  Private Sub Button1_Click(ByVal sender As System.Object, _
           ByVal e As System.EventArgs) Handles Button1.Click
      nyoversettelse(InputBox("norsk ord: "), InputBox("svensk ord: "))
  End Sub

  Private Sub lagrefil(ByRef n As String)
      Dim sw As IO.StreamWriter
      Try
          sw = IO.File.CreateText(n)
          For i As Integer = 0 To nl - 1
              sw.WriteLine(o(i).norsk())
              sw.WriteLine(o(i).svensk())
          Next
      Catch ex As IO.IOException
          MsgBox("feil ved lagring")
      Finally
          sw.close()
      End Try
  End Sub

  Private Sub Button2_Click(ByVal sender As System.Object, _
             ByVal e As System.EventArgs) Handles Button2.Click
      lagrefil(filnavn)
  End Sub
End Class
Altså brukes en 1D-tabell av objekt (eller Structure, som nevnt i kommentarene). Man kunne (tredje alternativ) bruke et 2D-array med norsk og svensk i kolonne 0 og 1. Eller (fjerde mulighet), ha 1D-array med norsk og svensk ord i annethvert element.

Ingen kommentarer: