tirsdag 18. desember 2007

11/12: Eksamen

Eksamen er over. Du kan lese eksamenstekst (4 sider, PDF), eller hente hele eksamenstekst med kommentar og svarforslag (8 sider, PDF). Resultatet for de 13 som tok eksamen var: A (2 studenter), B (2), C (3), D (2), E (2), F (2, stryk). Dere finner deres eget resultat i Arena. Kontinuasjonseksamen (neste sjanse) gis i Juni 2008.

torsdag 1. november 2007

Torsdag 1/11: Arv og polymorfi

Eksemplet med "Animals" viser at "Inherits" angir arv, og at det arvede er implisitt (kan dras nytte av uten videre). Hvis "MustInherit" er angitt (som i "Shape") er klassen abstrakt og kan ikke lages objekt av. En funksjon som er "Overrides" angir polymorfi, at en arvet funksjon skal overstyres (slik at anden sier "gakk" og musen "pip", selv om begge jo er arvinger av "Animals"). En funksjon angitt som "MustOverride", har ingen innmat, den forsynes derimot av arvingene, f.eks. at "Circle" har den egentlige area(). Hensikten? Forenkle vedlikeholdet av programvaren (utvidelser, endringer, krymping).

tirsdag 30. oktober 2007

Sesongavslutning

Siste forelesning i kurset blir torsdag 1/11. Tema: arv og polymorfi (resten av kap. 11). Det gir tilsammen 28 forelesninger a 2 timer i semesteret, pluss ukentlige timer (av varierende mengde, riktignok) sammen i laboratoriet.

De resterende uker (ca. 45 dager til eksamen) oppfordres dere til å studere eksamenssettene, løse oppgaver i boken, se på notatene fra kurset og simulere det å løse oppgaver på papir. Neste uke blir det arrangert en simulert eksamen med et av eksamenssettene. Hjelpelærerne vil samle inn papirbesvarelsene og gi dere tilbakemelding i etterkant (uken etter).

ALLE HJELPEMIDLER TILLATES bortsett fra at man ikke kan kontakte andre personer under eksamineringen. Mobiltelefoner skal ikke brukes. Man kan ta med læreboken, kodelistinger og annet man klarer å bære med seg i lokalet.

For at flest mulig skal kunne ta eksamen (11. des.) blir det ikke angitt flere oblig (oblig 9 er den siste). Fristen for innlevering for oblig 1 til oblig 9 er ABSOLUTT: 16/11. De som IKKE har levert da gis IKKE ADGANG TIL EKSAMEN.

Send meg gjerne spørsmål. Jeg svarer til ibe150-listen, slik at det blir rettferdig (alle ser).

mandag 29. oktober 2007

Mandag 29/10: Metoder og frekvenstabell

Vi (8 oppmøtte!) besvarte 2006-eksamen (deloppgave 3 g) med en frekvensteller som spurte oversettelser hvilken bokstav de ville bli sortert etter (første bokstav i det norske ordet). Altså ble ov-klassen utvidet med en metode (nytt, s. 555) som alltid gir stor bokstav:
    Public Function sortBokstav() As Char
        Return _norsk.ToUpper().Substring(0, 1)
    End Function
Klienten (frekvenstelleren, se forøvrig s. 315 i pensum):
    Private Sub Button3_Click(ByVal sender As System.Object, _
                  ByVal e As System.EventArgs) Handles Button3.Click
        lagFrekTabell(o, lst)
    End Sub
    Private Sub lagFrekTabell(ByRef o() As ov, byref l as listbox)
        Dim antall(255) As Integer
        l.Items.Clear()
        Dim i As Integer
        For i = 0 To nl - 1
            Dim pos As Integer = Asc(o(i).sortBokstav())
            antall(pos) += 1
        Next
        For i = 65 To 90   ' a til z (se s. 605)
            l.Items.Add(Chr(i) & " eller " & Chr(i + 32) _
                & ": " & antall(i))
        Next
        i = 198  ' æ
        lst.Items.Add(Chr(i) & " eller " & Chr(i + 32) & ": " & antall(i))
        i = 216  ' ø
        lst.Items.Add(Chr(i) & " eller " & Chr(i + 32) & ": " & antall(i))
        i = 197  ' å
        lst.Items.Add(Chr(i) & " eller " & Chr(i + 32) & ": " & antall(i))
    End Sub
Til sist så vi på exercises 11.1.1 og 11.1.2 (s. 563).

fredag 26. oktober 2007

Oblig 9: Kyr som melker

Gjør oppgave 3 (deloppgaver a, b og c) fra eksamen 2004 (høst). Du anbefales å trene objektorientering (som i kap. 11.1) ved å lage en "class ku", men oppgaven sier ingenting om dette. Du kan eventuelt bruke en "structure ku" (som i kap. 7) hvis du vil trene på det istedet. Husk: "Option Strict On". Du leverer som vanlig i ClassFronter (frist 16/11). Hvis du vil (trene til eksamen): Gjør også resten av deloppgavene (d-f) -- de er ikke vanskelige men tar jo tid.

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.

torsdag 25. oktober 2007

Torsdag 25/10: Klasser og kakevern

Kap. 11.1 om Objektorientering. Vi studerte hvordan en (med Class) lager oppskrift (beskrivelsen), og med Private (default) verner egenskaper. Kakeeksempelet gir alle kaker et startnavn, som kan leses og skrives av klienter, men kun gjennom metoden sittnamn(). Klienten aner ikke at variabelen heter _navn. Oppskriften er
Public Class Kake
    Private _navn As String = "prinsessekake"
    Public Property sittnamn() As String
        Get                                    ' "getter"
            Return _navn
        End Get
        Set(ByVal v As String)                 ' "setter"
            _navn = v
        End Set
    End Property
End Class
Klienten lager 11 kaker som legges i et array, men den 12. kaken får ikke plass i den fulle mage (runtimefeil):
Public Class Form1
    Dim kaker(10) As Kake
    Dim kakenr As Integer = 0
    Private Sub Button1_Click(ByVal sender As System.Object, _
               ByVal e As System.EventArgs) Handles Button1.Click
        Dim k As Kake = New Kake()
        k.ShowDialog()
        k.sittnamn() = InputBox("hva er kakens navn? ")
        kaker(kakenr) = k
        kakenr += 1
        visKaker()
    End Sub

    Sub visKaker()
        For i As Integer = 0 To kakenr - 1
            lst.items.add(i & ": " & kaker(i).sittnamn())
        Next
    End Sub
End Class
Det ble påvist fra salen (Kim) at egenskaper kan angis som
   Public readonly navn as string
og da kan klienten bruke "navn" direkte sålenge det kun er LESING det dreier seg om. Det likeste er likevel at lesing og skriving skjer gjennom "getter" og "setter", slik tillatt med "Public Property".

mandag 22. oktober 2007

Mandag 22/10: Todimensjonalitet og potensregning

Vi gjenopplevde kap. 7.5 om 2D-tabeller, dvelte ved ReDim (r,s) der Preserve er greit hvis det kun er endring av siste dimensjon (antall kolonner). Mønsteret for 2D-traversering ble brukt i gruppearbeidene (s. 384, #1 til 5):
 For i = 0 to a.GetUpperBound(0)
    For j = 0 to a.GetUpperBound(1)
       ' gjør noe med a(i,j)
    Next
  Next
9 av 10 programmeringsmiljø har potensfunksjon. Mangler vi (mot all formodning) funksjonen potens(x,n) lager vi den ITERATIVT (trenger "n" antall multiplikasjoner)
  fun potens (x, n) as integer
    produkt = 1
    for i = 1 to n 
       produkt *= x
    next
    return produkt
  end fun
eller REKURSIVT (hvert kall halverer antall multiplikasjoner):
  fun potens (x, n) as integer
    if n = 1 then
       return x
    end if
    if isPartall (n) then
       r = potens (x, n/2)
       return r*r
    else
       r = potens (x, (n-1) / 2)
       return r * r * x
    end if
  end fun

søndag 21. oktober 2007

oblig 8: Todimensjonalitet

Målet er at du skal trene 2D ved å utvide tabellomformeren:
  • du trenger en egen 2D-tabell som du oppretter globalt med navn X2(0,0)
  • Bruker ser en enkelt godt synlig avkryssingsboks med ledeteksten "2D". Denne er ved oppstart ikke avkrysset.
  • Lag den boolske funksjon is2D( ) som returnerer True hvis 2D-feltet er avkrysset. Denne funksjonen skal kalles ALLE steder hvor du ønsker å vite om vi opererer med 2D -- ingen skal under noen omstendighet sjekke denne knappen selv.
  • Hvis 2D-feltet IKKE er avkrysset er det meningen at brukeren er i 1D-modus, og det er da X( ) som bearbeides. I 2D-modus er det X2( ) som bearbeides.
  • ved endring av størrelse skal (hvis 2D) også antall kolonner oppgis. En "Redim" for 2D kan (etter hva jeg forstår) kun preservere hvis det er den 2de dimensjon som endres (ikke første, les s. 380).
  • lag en sub (prosedyre) visTabell(a(,), l) som kan traversere 2D. Denne skal nå vise verdiene fra begge dimensjoner på samme linje, f.eks. for linje 10 med tabellverdier 23 og 37 blir output slik: "10: 23 37". Prosedyren kaller du visTabell(a(,),l). Her er første parameter annerledes "ByRef a(,) as Integer" enn i den eksisterende prosedyren, men den har samme navn. Når programmet har mer enn en prosedyre/funksjon med samme navn og ulike parametere bruker du en teknikk som kalles overloading (overlastede funksjoner).
  • Når brukeren klikker på knappen for elementEndring, må han oppgi to tall hvis is2D() returnerer true. Hvis is2D() er false oppgir bruker fortsatt bare et tall. Husk å kall visTabell(X2, lstA) når endringen er gjort (hvis 2D)
  • lag overlastede funksjoner for finnSum, finnSnitt, finnHoyeste, finnLaveste som tar 2D-tabeller som argument.Funksjonene har samme navn som variantene for 1D, men med to dimensjoner for tabell-parameteret. Funksjonene kontrollerer alle celler i 2D-tabellen.
  • leting etter verdi skjer linje for linje: kolonne 0, 1, 2 ... i linje 1, ditto i linje 2 ... inntil alle linjer er sjekket (eller verdien eventuelt er funnet). Meldingen til bruker skal angi linje og kolonne der funnet inntraff. Bare "finnesUsortert" skal kunne 2D. Hvis du vil: Tilpass "finnesSortert" og "finnesBinaerLet" slik at de kan 2D.
  • Når brukeren klikker på en av knappene som ikke er tilpasset 2D, skal det gis en melding til brukeren: "kan ikke 2D" dersom 2D er valgt.
  • Hvis du vil: Lag tilpasning av "les fil" og "lagre til fil". Bare de linjene i filen som har tall-verdier leses inn i tabellen. Linjer som ikke har tall utelates.. Fyll i med 0 (null) hvis det ikke er tilstrekkelig antall tall. strFeilmelding skal vise hvilke linjer dette gjelder.
  • Hvis du vil: Lag tilpasning av sjekkStigende, der du sjekker neste celle (i,j+1) mot (i,j). Ved linjens slutt, sjekker du siste i linje i mot starten av linje i+1.
  • Hvis du vil: Lag tilpasning av reversering. En 2D tabell (med Y linjer og X kolonner) revererses rundt tabellens "diagonal", slik at f.eks. a(3,7) og a(7,3) byttes. Til dette lager du en generisk prosedyre bytt2D (a, i, j).

fredag 19. oktober 2007

Fredag 19/10: Rekursjon og kursinnhold

Kursinnholdet for IBE150 (les studiehandboka) ble studert, og "Rekursjon" er ikke gjennomgått, men ikke omtalt i læreboken. Det engelske "recur" betyr "gjentakelse". Et fenomen skjer om igjen. Hittil har gjentakelser blitt skrevet ITERATIVT (Do-Loop, For-Next). Men, den kan skrives REKURSIVT. To viktige moment:
  • programmet skal kalle SEG SELV minst en gang
  • programmet skal bryte ut (med "Return" i VB) når det er ferdig -- dette kalles "base case". Uten dette vil rekursjonen gå for langt, hvert kall spiser minne og til slutt resultere i "Out of Memory" kjøretidsfeil (som jo kan fanges med try-catch).
Prøv gjerne eksemplene under på Deres eget apparat: I. Tabellviser. visTabell(X,l) har dere klokelig kodet iterativt:
 
Sub visTabell (a, l)  ' ITERATIV
 For i As Integer = 0 To a.getupperbound(0)
     l.items.add a(i)
 Next
end sub
Klienten kaller denne opp med visTabell(X,lstA) som i tabellomformeren. Men, prosedyren kan kodes rekursivt (selv om det er lurest å gjøre det iterativt):
Sub visTabell (a, l, Byval pos as integer)  ' REKURSIV
 if pos > a.getupperbound(0) Then
    return     ' ikke gå dypere (ferdig!)
 end if
 l.items.add a(pos)
 visTabell (a, l, pos+1)  ' gå dypere!
End Sub
Ved kjøring av en 4-linjers tabell graves en 4-nivås rekursiv brønn:
visTabell(X, lstA, 0)
   visTabell(a, l, 1)
      visTabell(a, l, 2)
         visTabell(a, 1, 3) -- her stoppes rekursjonen!
Eksempel II. Det "klassiske" eksempel er Fibonaccirekken, som Ole og andre Davincikode-lesere visste var 1, 1, 2, 3, 5, 8, 13 ... regel: Neste i rekken er summen av de to foregående. f(n) = f(n-1) + f(n-2) er en rekursiv definisjon, så vi lager en rekursiv kode:
 Function fib (byval n as integer) as integer  ' REKURSIV
    If n < 3 Then
       Return 1
    End If
    Return fib(n-1) + fib(n-2)
 End Function
Denne kan kalles med f.eks. msgbox ("fib 12 er " & fib(12)). Med fib(41) ble kjøretiden ikke bra. Problemet: Samme fibtall (f.ex. f(7)) regnes ut uhorvelig mange ganger. Den rekursive brønn for fib(5)
  fib(5) -- 3 + 2 = retur 2
     fib(4) -- 2+1 = retur 3
        fib(3) -- 1+1 = retur 2
           fib(2) -- retur 1
           fib(1) -- retur 1
        fib(2) -- retur 1
     fib(3) ... (om igjen!!) -- 1+1 = retur 2
        fib(2) -- retur 1
        fib(1) -- retur 1
Det er (også her) lurere å skrive iterativt og bygge en tabell f( ) fra grunnen av (hvert tall regnes da ut bare EN gang):
function fib (byval n as integer) as integer  ' ITERATIV
 dim f(n) as integer
 f(1) = 1
 f(2) = 1
 for i as integer = 3 to n
    f(i) = f(i-1) + f(i-2)  
 next
 return f(n)
end function

torsdag 18. oktober 2007

Torsdag 18/10: Split, join og avvikere

Tema var kap. 8.2 (Split og join) samt stuntprogrammering (av meg) av tabellomformer som leser alle 15000 av 15010 linjer og rapporterer 10 differensierte avvik med automatisk tabellutvidelse idet indeksen går utenfor, uten å glemme tallet som ikke ble lagt inn da kjørefeilen oppstod. To varianter av finnHoyeste(a):
max = a(0)              ' sa olav
max = integer.minvalue  ' sa jeg 
for i = 0 to a.upper                   
  if a(i) > max
    max = a(i)
return max

for i = 0 to a.upper    ' type b:  endrer originalen (hvis byval)
  if a(i) > a(i+1)      ' denne ble brukt i allefall av to studenter (oblig 6)
    a(i+1) = a(i)
return a(a.upper)

mandag 15. oktober 2007

Mandag 15/10: Fil og unntak

Foreleste kap 8.1 (og kap 3.5) om lesing OpenText() med Readline(), skriving med AppendText () eller CreateText() og Writeline), avslutningsvis (og så raskt som mulig) en Close() -- slik at vi ikke oppholder andre lesere (eller skrivere). I grupper besvarte dere Exercises 8.1, nr. 1-4. Etter pausen og Opdals studentundersøkelse gjennomgikk vi strukturert håndtering av avvik (unntak, exception), altså det språklige "try-catch-finally". Til sist gruppearbeidet dere veldig flinke svar til nr. 5-8.

oblig 7

Utvid tabellomformer slik at den leser data fra fil:
  • Bruker ser knapp for "les fil" (btnLesFil) som leser tall fra ei fil (bruker oppgir filnavnet med OpenFileDialog, s. 466).
  • Det første heltallet på linje N i fila legges i N'te element i tabell X. PRESISERING (kl. 13.15):
    • Dette forutsetter jo at alle linjene har legale heltall. Men, noen av linjene har jo ikke dette, og regelen blir da: Neste legale heltall legges i neste ledige element.
    • X skal jo her ha helt nytt innhold. Sett den derfor initielt slik at den har plass til intTabellBlokkstr (et heltall med verdien 100) element. Hvis tabellen (X) blir full kaller du subrutinen nyStorrelse() som du laget i oblig 5, slik at X hver gang utvides med intTabellBlokkstr. Idet du f.eks. legger inn det 101'ste element utvides tabellen til 200. Slik vokser X i etapper fra 100, til 200, 300 o.s.v. Hvis det er 549 virkelige heltall i filen vil X til slutt ha plass til 600 element. Hvis filen bare har 3 virkelige heltall forblir X med plass til 100 element. Filen 15000tall.txt brukes til testing.
  • Du skal bruke tall = Cint (eller din egenutviklede tall = hentHeltall(s)) der s er sist innleste streng fra fila, og lage differensiert behandling av unntak for overflyt (for store tall) og feil typekasting (ex. tom streng).
  • Idet du fanger en feil bygger du (med &-operator) en streng "strFeilmelding" (initielt tom streng). Etter at filen er lest i sin helhet har du en strFeilmelding som f.eks. "Linje 2: Overflyt, linje 17: Ikke heltall, linje 355: ...".
  • Programmet skal IKKE abortere, og ALLTID rapportere en melding (etter at filen er lest) ved å kalle visFeilmelding(strFeilmelding), en prosedyre du kan kalle fra flere steder. Til sist kalles visTabell(a,l) med X og lstA som argument. Du skal fange alle IO-relaterte feil (som beskrives i kap. 8.1) og bygge ut strFeilmelding med MENINGSFULLT innhold.
  • visFeilmelding(s) skal vise strengen s i en msgbox og (i tillegg, i samme msgbox) gi en beskjed om at "Du kan ringe tlf. xxx xxx eller sende ePost til tabellsjef@firmaet.mitt hvis du trenger hjelp". Telefonnumrene og ePost hentes ut av datastrukturen (s. 343) kontaktProgram. Denne er av typen Kontaktinfo (en "Structure Kontaktinfo") som igjen har strengene strNavn, strTelefon og strEPost.
Du kan (kun ved lesing) bruke filene tall.txt og 15000tall.txt som ligger på kursinfo: k:\in-kurs\IBE150. Bruker skal kunne lagre tabellen til fil.
  • Bruker ser knapp "lagre til fil" (btnLagreFil) som lagrer tabell X til en fil, slik at det Nte element i X blir Nte linje i filen.
  • La brukeren oppgi filen med OpenFileDialog (som over).
  • Hvis du vil: Hvis brukeren allerede har valgt "les fil" er det vanligvis greit at det filnavnet som da ble brukt, blir husket globalt (strFilnavn) og foreslått (slik at brukeren slipper all navigeringen)
  • Programmet skal kun reagere på IOException (samlekategori) og kalle opp visFeilmelding ("Feil oppstod ved lagring").

lørdag 6. oktober 2007

Oppgaver i kap. 7

Jeg har forelest kap. 7 om tabeller. Jeg mener dere til repetisjon (og, mens det er forelesningsfri) bør gjøre "Practice problems" og "Exercises" til hvert delkap. i 7. Noen oppgaver gjorde vi i gruppearbeidet, men en god del gjenstår. Oppgaver som kalles " Så finn deres favorittpartner og start arbeidet -- er mitt råd. Jeg kategoriserer dette som LURT!

fredag 5. oktober 2007

Fredag 5/10: Prøve og flere dimensjoner

Jeg oppsummerte oblig 5 og 6. Så hadde vi kontrollprøve der dere besvarte
  1. Lag Sum(a) som finner sum i tabell a
  2. Lag Snitt(a) som (ved gjenbruk av sum) finner snittet av tabell a
  3. Lag Max(a) som finner høyeste verdi i tabell a
Til disse tre har jeg gitt kommentar til 4 av svarene jeg samlet inn:
  1. Husk at sumvariabel må (med sikkerhet) starte på 0 (null)!
  2. Husk at sum(a) / a.getUpperBound(0) blir for høyt!
  3. Husk at HittilHøyeste må initielt være tilstrekkelig lav (f.eks. Integer.MINVALUE), slik at den med sikkerhet ikke overstiger høyeste verdi i tabellen a.
Flere dimensjoner (kap. 7.5): Vi så med lupe på kommentar 1 og 2 (s. 383). En 3D med temperaturer var a(31,24,11) med plass til 32 dager, 25 timer og 12 måneder. Hvis vi også skal huske hundre år tilbake i tid opprettes en 4D med a(31,24,11,99). Og, kommentar #2 forteller at vi ikke kan redimensjonere til flere dimensjoner -- kun flytte yttergrensene i de dimensjoner vi har! Redim av en 2D tabell til det dobbelte antall kolonner:
 
  Redim a ( _
    a.getUpperBound(0) , _
   (2*a.getUpperBound(1)) + 1 )

tirsdag 2. oktober 2007

Oblig 6: Utvidet tabellomformer

Hensikten er ytterligere styrking av kunnskap om tabeller, løkker og funksjoner. Du skal utvide tabellomformeren i oblig 5. Frist: 12/10.
  • Bruker ser en knapp for "Finn sum" (btnSum) som kaller funksjonen Sum(r) med X som argument. Resultatet fra sum() skrives i msgbox.
  • Bruker ser en knapp for "Finn snitt" (btnSnitt) som gjenbruker funksjonen Sum (se over) til utregning. Til sist skrives gjennomsnittet i msgbox.
  • Bruker ser en knapp for "Finn høyeste" (btnHoyest) som kaller funksjonen finnHoyeste(r) med X som argument og skriver resultatet i msgbox.
  • Bruker ser en knapp for "Finn Laveste" (btnLavest) som kaller funksjonen finnLaveste(u) med X som argument og skriver resultatet i msgbox.
  • Bruker ser en gruppeboks (grpLeting). Inni denne er en knapp for "Leting" (btnLeting), samt tre bokser for leteMetode, hvorav en (og bare en) skal være avkrysset. Hvis btnLeting trykkes skal du med inputboks (og hentHeltall) be brukeren oppgi intTall som det skal letes etter. Deretter iverksettes leting med valgt metode (sjekk radUsortert, radSortert eller radBinaerLet, s. 474). Ved oppstart (Form.Load) SKAL den MEST effektive letemetoden avkrysses! Eventprosedyren for grpLeting skal kalle en av tre boolske funksjoner og vise resultatet ved å farge bakgrunnen i lstA rosa (hvis ingenting ble funnet) -- det er jo oktober -- eller hvit (hvis True)! Du skriver derfor:
    • finnesUsortert(p,v) med X og intTall som argument -- denne antar at tabellen er usortert og må sjekke alle for å eventuelt avgjøre at tallet ikke finnes!
    • finnesSortert(p,v) med X og intTall som argument -- denne antar at tabellen er sortert stigende, begynner i posisjon 0 (null), og kan avbryte letingen hvis den har lett for langt!
    • finnesBinaerLet(p,v) med X og intTall som argument -- denne antar stigende sortert og leter binært (fjerner halvparten av leteområdet hver gang).
    Alle tre funksjonene skal telle antall sammenligninger (intAntSammenlgn). Hver funksjon SKAL selv kalle prosedyren visLeteresultat(hvem, tabell, tall, posisjon, intAntSammenlgn) som f.eks. (med argumentene "finnesSortert", x, 37, 11020 og 421) sier "finnesSortert: Fant 37 i posisjon 11020 av 14000. 421 sammenligninger!". Hvis argumentet "posisjon" oppgis til -1 mener letefunksjonen at den IKKE fant noe. Det er visLeteresultat() som SELV finner ut hvor stor tabellen var, f.eks. at oppgitt tabell x() hadde 14000 element!
Hvis du vil:
  • Bruker ser en knapp for "krymping" (btnKrymping) som ber brukeren oppgi heltallet intFaktor (inputboks og hentHeltall). Tallet sier hvor mye tabellen X skal krympes: Hvis 2 beholdes annethvert element, hvis 3 beholdes tredjehvert ... løkken starter med at element 0 (null) beholdes. De du beholder kan legges i en lokal hjelpetabell Y som er akkurat stor nok. Hvert element som beholdes kopieres da dit: Y(..) = X(..). Til sist fjerner du X og lar X settes til Y (s. 316).
  • Legg til funksjoner som var valgfrie i oblig 5 (randomiser, lineariser, sorter).

mandag 1. oktober 2007

Mandag 1/10: Lur leting og regning med tabeller

Vi leter etter "Truls" i en tabell a() med 1 million (N) element
  • hvis a() er usortert må vi lete gjennom alle N element før vi erklærer "ikke funnet"
  • hvis a() er sortert stigende kan vi avbryte etter posisjon k hvis a(k) > "Truls"
  • hvis a() er sortert kan vi gjøre et binærsøk (kap. 7.4). Ved å sjekke a(N/2), midtveis, kan en erklære halvparten av a() som uinteressant. Hver sjekk halverer søkeområdet. Hvis "Truls" ikke er i tabellen har vi gjort log2 (1,000,000) som er omtrent 20 sjekker (istedetfor å sjekke alle en million).
På tavla stod en tabell R() med { 0, -1, 6, 4 } som innhold. I gruppearbeid laget alle 9 :-( av dere, funksjoner for Sum(R), snitt(R) og median(R).
 Function sum (ByValRef a() as Integer) As Integer
   ' laget av Orjan og Johan
   Dim s as Integer = 0
   For i as Integer = 0 to a.getUpperBound(0)
      s += a(i)
   Next
   Return s
 End Function

 Function snitt (ByValRef x() as Integer) as Double
   ' laget av Orjan og Johan
   Return sum(x) / (x.getUpperBound(0)+1)
 End Function

 Function Median (ByValRef m() as Integer) as Double
   ' klassen viste meg hva median er (s. 376)
   Dim n as Integer = m.getUpperBound(0) + 1
   If isPartall(n)
      Return ... (ikke ferdig)
   Else
      Return ...
   End If
 End Function

 Function isPartall (DimByVal y as Integer) as Boolean
    If y Mod 2 = 0 ...
 End Function
Håpet om å lage funksjonene laveste(R) og høyeste(R) utsettes. Disse funksjonene vil nok kunne legges til tabellomformeren i oblig 5.

søndag 30. september 2007

Oblig 5: Tabellomformer

Du skal lage et program som (til venstre) lar brukeren oppgi HVA som skal skje med en tabell (ved navn X). Resultatet (X) vises i en scrollbar listboks (til høyre) ved navn lstA. Programmet har EN global variabel: En tabell av heltall ved navn X, initielt med 0 (null) element. Flere globale i ditt program tolereres IKKE! Det skal lages en rekke eventprosedyrer som tar seg av brukerens ønske og viser resultatet i lstA. Noen forslag til tillegg ("Hvis du vil") er angitt (men ikke obligatorisk).
  • Lag deg en funksjon hentHeltall(t) som returnerer et heltall fra parameter t (en String). Funksjonen SKAL brukes minst to steder!
  • Bruker ser en knapp for "størrelseendring" (btnStorrelseEndring) som, hvis trykket, ber brukeren med inputbox() oppgi en størrelse intAntElement. Bruk hentHeltall(). Hvis dette er identisk med X's lengde skriver du "Ingen endring!" i msgbox(). Hvis ikke, kaller du subrutinen nyStorrelse(a, n) med X og intAntElement som argument. Innholdet skal preserveres. Be brukeren med inputbox() bekrefte (ja/nei) hvis tabellen skal ned i omfang (og verdier kan bli borte!).
  • Brukeren ser en knapp for "elementendring" (btnElementEndring) som, hvis trykket, ber brukeren oppgi en index (intIndex) med inputbox() og hentHeltall(). Hvis legal index, skal brukeren oppgi ny verdi (intVerdi) med inputbox() og hentHeltall() som deretter legges inn i X i posisjon intIndex.
  • brukeren ser en knapp "Sjekk stigende" (btnSjekkStigende) som hvis trykket, skriver "tabellen er (ikke) stigende" i msgbox(), avhengig av resultatet fra den boolske funksjonen erStigende(a) som kalles med X som argument. Hvis du vil: Denne funksjonen (erStigende) skriver melding med msgbox() som sier f.eks. "erStigende: feil i linje 11 og 12".
  • brukeren ser en knapp "Reverser" (btnReverser), som hvis trykket, kaller rutinen reverser(a) med X som argument. Denne subrutinen (ikke funksjon!) snur opp ned på tabellen.
  • Hver gang bruker har gjort noe, og X blir endret, skal resultatet vises. Etter f.eks. reversering, kalles subrutinen visTabell(a,l) med X og lstA som argument. Denne visTabell(a,l) viser tabell-elementene som med nr og innhold, f.eks. "3: 77" hvis det ligger 77 i fjerde element.
Resten er Hvis du vil
  • Brukeren ser en knapp for "Lineariser" (btnLineariser), som hvis trykket, ber bruker oppgi intStartverdi og intStigningstall (med inputbox og hentHeltall). Deretter kalles subrutinen lineariser(a,start,k) med X, intStartverdi og intStigningstall som parameter. Subrutinen legger verdien start+k*i inn i element a(i). Hele tabell a skal fylles, slik at f.eks. en tre-elements tabell blir
    • { 3, 4, 5 } hvis start=3 og k=1 (stigende)
    • med 3 og -2 blir resultatet { 3, 1, -1 } (synkende)
    • med 4 og 0 (null) blir det { 4, 4, 4 } (alle blir lik)
  • Brukeren ser en knapp for "Randomiser" (btnRandomiser), som hvis trykket, spør bruker (med inputBox og hentHeltall) etter heltallene minV og maxV. Deretter kalles subrutinen randomiser(a, laveste, hoyeste) med X, minV og maxV som argument. Denne subrutinen legger tilfeldige verdier inn i alle plasser (i tabell a), ved hjelp av Math.Random (bak i boka).
  • brukeren ser en knapp "Sorter" (btnSorter), som hvis trykket kaller rutinen sorter(a) med X som argument. Denne tar seg av stigende boblesortering og skriver msgbox som sier "sorter: Gjorde 239 sammenligninger og 200 ombyttinger".
  • Opprett en lstB (til høyre for lstA). Etter at bruker ber om omforming av tabellen skal du først kalle visTabell(a,l) med X og lstB som argument. Slik blir X vist i lstB. Deretter endres tabellen. Etter endringen kalles visTabell(a,l) med X og lstA som argument. Nu kan du sammenligne!

fredag 28. september 2007

Forelesning uke 40

Jeg foreleser videre om tabeller f.k. mandag (1/10, sekvensiell vs. binaer leting, s. 365).

Torsdag er det forelesningsfri (jeg er ute).

Fredag blir det forelesning (flerdimensjonale tabeller, kap. 7.5).

Uka deretter er jeg ute igjen (ingen forelesninger noen av dagene).

Fredag 28/9: Bytting, sortering og reversering

To variabler, element (i og j) i en tabell, bytter innebyrdes verdi med mønsteret (s. 356)
   
  tmp = a(j)
  a(j) = a(i)
  a(i) = tmp
som kan skrives som VB subrutine (som jobber på originalen):
  
   Sub bytt (ByRef a() as Integer, i as Integer, j as Integer)
      Dim tmp as Integer = a(j)
      a(j) = a(i)
      a(i) = tmp
   End Sub
En tabell boblesorteres med prosedyren (der dere i grupper på to fant ut de tre grønne biter av koden):
   
   Sub sorter (ByRef a() As Integer)
      For i As Integer = a.getUpperBound(0)-1 To 0 Step -1
         For j As Integer = 0 to i
            If a(j) > a(j+1) Then
               Bytt (a, j, j+1)
            End If
         Next
      Next
   End Sub
Denne arbeider direkte på original (ByVal), og gjør samme arbeidet som s. 359 (men koden er skrevet noe annerledes). Fordelen med at denne er generell subrutine er (s. 132) at koden skrives ETT STED (blir ekspert) og kan gjenbrukes. De siste 15 minutt arbeidet gruppene med en reverseringsprosedyre, som f.eks. den under:
  
   Sub reverser (ByRef a() as Integer)
      Dim n as Integer = a.GetUpperBound(0)
      For i as Integer = 0 to n/2
         Bytt (a, i, n-i)
      Next
   End Sub

torsdag 27. september 2007

Torsdag 27/9: Tabellanalyse

Arbeid som gjøres med en tabell kan være (boka har flere eksempler):
  • funksjoner som regner ut tabellens sum, snitt, minste og høyeste verdi
  • subrutiner som reverserer innholdet
  • sortering, fletting
I grupper på to laget man funksjonen erStigende som en tenkt klient bruker som følger:
 dim t1() as integer = { 0, 2, 3, 3 }
 dim t2() as integer = { -2, 7, 9, 10 }
 if erStigende (t1) and erStigende (t2) then
   ...
 end if
Rudi og Johans forslag ble antatt (selv om ByVal gir kopiering av tabellen):
 Function erStigende (ByVal a() as Integer) As Boolean
   Dim n as Integer = 0
   Do
     If a(n) > a(n+1) Then
       Return False
     End If
     n += 1
   Loop Until n = a.GetUpperBound(0)
   Return True
 End Function
I labtimene ble gruppene bedt om å jobbe med prosedyren Reverser(a) som snur opp ned på innholdet i tabellen (og jobber på originalen).

mandag 24. september 2007

Mandag 24/9: Rekkefølge, leting og fletting

Tabeller kan være ORDNET (sortert stigende eller synkende), eller ikke-ordnet. Et SØK i en ordnet tabell kan avslutte tidligere enn i ikke-ordnede tabeller, der en ikke kan konkludere før alle elementene er sjekket. Som i oblig 4, der tabellen neppe er ordnet (sortert). To tabeller (A og B) kan slås sammen til en tredje C. Med FLETTING (merging) menes at C blir sortert som A og B. Algoritmen ble gjennomgått (kap. 7.2).

fredag 21. september 2007

Fort i svingene

Opprinnelig innlegg:
En liten påminnelse. Vi har snakket litt imellom oss i klassen og vi fant ut at det er "mange" som synes det vi holder på med i oppgavene er for vanskelig i forhold til det vi lærer ut ifra boka og i timene. Det er mange som synes du går litt fort frem. Jeg vil ønske for min del og for andre som har det samme problemet som meg, at du slakker ned litt til vi skjønner konseptet ved å programmere på forskjellige nivå. Kanskje dette kan gjøres ved å forklare litt om hver enkelt del av programmeringsspråket. Forenkle oppgavene hadde også vert lurt. En annen ide ville ha vert å gå igjennom boka, lese høyt og la oss lese høyt fra boka i klassen, for så å gå og programmere på lab'en etterpå. Noen av oss liker jo selvfølgelig den måten det er lagt opp på i dag, men jeg henviser virkelig til de ordene fra elevene dine til meg som tilsier at ting og tang går litt fort i svingene. Dette er ikke for å rakke ned på eller få noen til å føle seg dum eller for smart. Jeg sier det bare fordi jeg er glad i mine medelever, og ønsker dem den beste studietiden de kan få. Jeg kan ikke være en talsmann for de andre, men takk for at du forstår,
Til dette spurte jeg ibe150:
Jeg videresender en problembeskrivelse jeg fikk i posten fra en av ibe150-deltakerne og vil gjerne vite hva andre mener - slik at jeg kan finne ut hvor stor del av klassen dette gjelder (omfanget av problemet - hva betyr "mange"?).
Svar #1:
Jeg er enig i at det går litt for fort i svingene. Føler at jeg ikke får med meg alt jeg egentlig burde få med meg. Men ideen om at vi leser høyt ifra boka og går i lab etterpå hørest ut som en fin løsning, siden vi da får lært alt trinn for trinn.
Svar #2:
Jeg har ikke snakket med noen om dette, men jeg kan likevel si meg delvis enig i problembeskrivelsen. Jeg synes at fristen for obligene har vært en uke for tidlig. Jeg må ha hatt hjelp til å skrive kodene uten at jeg forstår godt nok hvorfor kodene skrives slik de skrives. Alternativet har vært å levere etter fristen, noe som medfører at jeg kommer i "bakleksa". Et godt eksempel er innleveringen til i morgen. Her må en ta i bruk både Array og Structure på en gang, uten at denne delen av pensum har fått synke skikkelig inn. Jeg tror at denne innleveringen burdfe hatt frist til fredag 28 september. Går det an å utsette rekkene av obliger en uke? Om progresjonen i forelesningene er for rask er litt vanskelig å svare på. Det er viktig at pensum er blitt gjennomgått minst 3-4 uker før eksamen, slik at en får anledning til å repetere og gjennomgå de deler av pensum en ikke har fått med seg. Etter 5 uker har vi kommet halveis i boken. Det betyr vel at pensum er gjennomgått i begynnelsen av november? Da har vi en måned igjen til eksamen, og såpass god tid bør vi nok ha til å repetere og gjennomgå de deler av pensum som en har problemer med.
Svar #3:
Sånn jeg oppfattet dette kurset er at det krever ganske mye selvstudie. Jeg liker å "ligge et skritt forran" det som blir gjennomgått i timene og derfor gjør jeg en del hjemme. Jeg setter av noen timer hver dag for å prøve og feile på nye ting. For meg personlig er det ikke tempoet noe problem, men det forutsetter at jeg gjør en del ekstra hjemmearbeid.
Svar #4:
Jeg må innrømme at jeg er ganske enig med det her. Jeg syns at programmering er kjempe spennende men isteden for å lære mer om det gjør jeg øvingsrelaterte ting for å rekke å levere alt i tide. Jeg vil gjerne havne på et nivå der jeg vet svaret ut fra å se på oppgaven isteden for å prøve meg fram, noe som tar veldig mye tid.

Fredag 21/9: Gruppearbeid med tabeller

Frist med oblig 4 utsettes en uke. Vi koste oss med oppgavene bak i kap. 7.1.: Nr. 1 (s. 316) belyste initialisering, redimensjonering og preservering av tabeller! I grupper ble der laget prognoser for rett svar til oppgave nr. 1-12 (s. 317-19), samt funnet feil i nr. 13-14 (s. 319-20), herunder syntaksfeil, runtimefeil og problemer med typeblanding og manglende initialisering. Endel oppgaver fant vi fasit til.

torsdag 20. september 2007

Forelesningsfri i Oktober

Torsdag 4/10 avlyses forelesningen (grunnet seminar). Neste uke deretter (8/10, 11/10 og 12/10) blir det heller ikke forelesning (ferieavvikling). Det blir likevel oblig for innlevering, fredager i begge disse ukene.

Torsdag 20/9: Godkjenning av brukere

Vi fortsetter fra mandagens problemer. Brukerne er derfor lest inn og ligger som "Bruker"-strukturer i array "brukere", og "antBrukere" er korrekt opptelt. Vi tok i dag HIPOens "Sjekk navn og passord". Det som er nytt av i dag ble:
Dim innlogget as Boolean = False

Sub OK_click () Handles OK.click
   If godkjent (txtNavn.Text, txtPassord.Text) Then
      innlogget = True
      lblMelding.Text = "Godkjent - du er innlogget!"
   Else
      lblMelding.Text = "Ikke godkjent - du er ikke innlogget!"
   End If
End Sub

Function godkjent (n, p) As Boolean
   Dim i as Integer = 0
   Do While brukere(i).navn <> n And i < antBrukere 
      i++
   Loop
   If i < antBrukere Then
      If brukere(i).passord = p Then
         Return True
      End If
   End If
   Return False
End Function

tirsdag 18. september 2007

Forelesningene flyttes EN time

Fra nu og ut semesteret vil forelesningene starte en time senere, altså 0915-1100. Det blir rom B135 (mandag), rom A202 (mandag og torsdag) og A285 (fredag).

mandag 17. september 2007

Kodekopiering

Kode kan kopieres meget enkelt. En gir da en referanser til hvor en har hentet koden (les hva skolen sier om "plagiering").

Mandag 17/9: Tabell og datastruktur

Med kap. 2's hierarisk input-processing-output (HIPO) lagde dere i grupper:
  • Reisevelger
    • Oppstart
      • Les inn brukere
    • Innlogging
      • Les inn navn og passord
      • Sjekk navn og passord
      • Gi svar
    • Velg reise
      • Les inn reisemål og priser
      • Ta imot valgt reisemål
      • Vis pris
Etter pausen laget vi et design for "Reisevelger:Oppstart:Less inn brukere". Først måtte datagrunnlaget designes (forslaget om database ble forkastet, det kommer senere!). Vi antar en tekstfil med en bruker per linje - hver linje har brukerens navn (pos 0-19), passord (20-39) og max. antall forsøk (resten). Logikken ble (nå, når datagrunnlaget er bestemt) uttrykt i et flytkart (kap. 2) med a) åpn fil, b) er det mer igjen så les neste bruker og husk denne, evt. c) hvis ingen flere, steng filen. Derpå brukte vi kap. 6's gjentakelser (med adaptive Do, for vi vet jo ikke hvor mange brukere som ligger i filen!) og fikk kap. 2's pseudokode:
f = åpne opp fil
Do While not f.endofstream()
 s = f.readline()
 b = lagbruker(s)
 huskbruker(b)
Loop
og brukte kap. 7's "Structure" til å lage Bruker og "Array" til å lage tabell av brukere.
Structure Bruker
  Dim navn as String
  Dim passord as String
  Dim maxAntallForsok as Integer
End Structure

Dim brukere(99) as Bruker
Dim antBrukere as Integer=0

Function lagBruker (ByVal s as String) As Bruker
Dim ny as Bruker
  ny.navn = s.substring (0,20).trim()
  ny.passord = s.substring (20,20).trim()
  ny.maxAntallForsok = CInt (s.substring(40).trim() )
 Return ny
End Function

Sub huskBruker (ByVal b as Bruker)
  brukere(antBrukere) = b
  antBrukere++
End Sub
Ingen kode ble skrevet inn (i VS). Det er plass til 100 brukere i tabellen, så prosessen vil krasje (runtime-feil) idet den 101. forsøkes innlagt.

fredag 14. september 2007

Leting etter valuta

Et tips til de som vil lage mer adaptive valutafinnere. Lag en stykk leter globalt (da det tar noe tid å lage et slikt objekt):
    Dim valutaMoenster As String = "^(?<valutakode>\w{3})\s+(?<kurs>\d*,?\d*)"
    Dim valutaLeter As Regex = New Regex(valutaMoenster)
    Dim treff As Match
Bruk leteren hver gang du er i tvil:
  Do While Not fil.EndOfStream()
      Dim s As String = fil.ReadLine()
      treff = valutaLeter.Match(s.Trim()) ' fjerner innledende blanke
      If treff.Success Then
          s = treff.Result("${valutakode} ${kurs}")
          cboValutakursMeny.Items.Add(s)
      End If
  Loop
Mønsteret består av:
  • "^": (ett tegn) markerer strengens start
  • "(?<valutakode>\w{3})": tre alfanumeriske (navngitt "valutakode")
  • "\s+": minst en blank
  • "(?<kurs>\d*,?\d*)": et desimaltall (navngitt "kurs"), som i "0,33", ",79" eller "3,88".
      "\d*": null eller flere siffer
    • ",?": ingen eller ett komma
    • "\d*": null eller flere siffer
Det blir ingen suksess med valutakurser som "EUR 4.2" (ikke komma), eller bare "EUR " (intet desimaltall).

Fredag 14/9: Valuta A til Z

Kap 2 omhandler metodikk. I dag laget vi analyse og design for oblig 3, del 3 (faktura) og del 4 (valuta). Valuta (del 4) mer spesifikt: I. Analyse: 1) kursene leses inn, slik at 2) de kan vises frem til bruker. Deretter kan 3) bruker velge en av disse kurs og 4) et beløp, fulgt av 5) output: Omregnet (beløp/valutakurs). II. UI-Design: UI har et INN-område (beløp, valutakursmeny og OK-knapp), samt et UT-område med omregnet beløp vist. III. Algoritmisk design (pseudokode, litt VB, litt "snakk"): To viktige hendelser: OK.click (bruker vil ha omregning) og Form.load (kursene skal leses inn).
  • OK.click() beregner omregnetBelop = hentbelop() * hentkursvalgt() og legger dette i UT-området.
  • hentbelop() returnerer et tall (Double) ved: Return Cdbl(innbelop.text).
  • hentkursvalgt() returnerer en double ved: Return Cdbl(valutaer.text.substring(4)).
  • Form.load() leser inn valutakursene. Filen åpnes, fulgt av en Do While Not fil.endofstream(): valutaer.items.add(fil.readline()) Loop.
Dette fungerte fint (laget valutafilen med notepad). IV. Koden ble:
Imports System.io

Public Class Form1

Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
   Dim B As Double = hentBelop()
   Dim K As Double = hentkursvalgt()
   Dim O As Double = B / K
   lblUtbelop.Text = CStr(O)
End Sub
Function hentBelop() As Double
   Dim s As String = txtBelop.Text
   Dim t As Double = CDbl(s)
   Return t
End Function
Function hentkursvalgt() As Double
   Dim s As String = cboValutakursMeny.Text
   Dim s2 As String = s.Substring(4) ' satser ALT
   Dim t As Double = CDbl(s2)
   Return t
End Function

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
   Dim filnavn As String = "m:\valutaer.txt"
   Dim fil As streamreader = file.opentext(filnavn)
   Do While Not fil.EndOfStream()
       Dim s As String = fil.ReadLine()
       cboValutakursMeny.Items.Add(s)
   Loop
   fil.Close()
End Sub
End Class
Vi foretok lite V. testing, og antar at endel feil kan skje (brukerfeil i input, filens plassering). Endelig skinner solen! Men: Vil dette under virke? Hva er eventuelt problematisk?

Public Class Form1
    Private Sub btnOK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnOK.Click
        lblUtbelop.Text = CStr(
              CDbl(txtBelop.Text) /
              CDbl(cboValutakursMeny.Text.substring(4)))
    End Sub
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim fil As streamreader = System.IO.file.opentext("m:\valutaer.txt")
        Do While Not fil.EndOfStream()
            cboValutakursMeny.Items.Add(fil.readLine())
        Loop
        fil.Close()
    End Sub
End Class

torsdag 13. september 2007

Torsdag 13/9: Gjenta lekser

Do lar oss gjenta noe vi ikke vet hvor ofte skal gjentas, mens For er bra hvis vi kjenner antallet (kap. 6). På boolsk vil det lettleselige EndOfStream() si om vi er ferdig (der boka foretrekker 80-tallets Peek). Evig gjentakelse fikk vi ikke med "For i = 11 to 5 Step 1" men med "Do While 0 < 5". Min temperaturhenter ble adaptiv (tilpasningsdyktig) med Do, men feiler (runtime "krasj") hvis temperaturene ikke fins.
 Sub Private hentTemperaturer()
   Dim readerTemp As StreamReader = File.OpenText("c:\temperaturer.txt")
   Do While Not readerTemp.endOfStream()
     strInn = readerTemp.readline() ' henter neste
   Loop
   readerTemp.close()
 End Sub

mandag 10. september 2007

Oblig 4

OBS: Frist utsatt en uke til 28/9. Oppgave 1: Strøm betales flere ganger i året. Lag et program som beregner strømkostnad (siden siste betaling), basert på prisliste (leses fra fil), samt forbruk (kWh) basert på forrige og nyeste måleravlesning (oppgis av bruker, som også må oppgi type abonnement, "flytende" eller "fastpris"). Bruker skal betale for nettleie og forbruk. Nettleien (for alle) er V0 øre/kWh og F0 kr/år. Forbruket koster V1 øre/kwH og F1 kr/år (for "fastpris") eller V2 øre/kwH og F2 kr/år (for "flytende"). Antallet regninger per år angis i første linje på fil, og fastpris fordeles på disse regningene.

Oppgave 2: Lag et program som a) krever brukernavn og passord (avvises etter et max antall forsøk), og hvis OK, b) lar brukeren velge reisemål og se prisen. Reisemål og pris ligger på tekstfil A (leses bare hvis innlogging gikk greit). Godkjente brukere (med passord og max. antall forsøk) leses fra fil B ved oppstart. Da listen over reisemål og -pris endres stadig må listen holdes (automagisk) oppdatert. Frekvensen ligger som første linje i fil A.

Krav til svaret: Sterk typesjekking, bruk av løkke, forståelige variabelnavn og korrekte prefiks, minst en subprosedyre og en funksjon, korrekt utregning. Frist: Fredag 2128/9.

Mandag 10/9: Lesing fra fil

Temperaturer lages (med Notepad). Oppdaterte temperaturer trengs fra tre "steder" i koden, så filen (med temperaturene) leses fra ny prosedyre HentTemperaturer() som jeg lager SELV.
  Imports System.IO
  ...
  Sub Private hentTemperaturer()
    Dim readerTemp As StreamReader = File.OpenText("c:\temperaturer.txt")
      ' filen har tre linjer
    Dim strInn as String
    strInn = readerTemp.readline() ' henter linje 1 "Molde 8"
    strInn = readerTemp.readline() ' henter linje 2 "Tingvoll 12"
    strInn = readerTemp.readline() ' henter linje 3 "Vigra 9"
    strInn = readerTemp.readline() ' gir "Nothing" 
    readerTemp.close()
  End Sub
OpenText() av ukjent fil gir RUNTIME-feil (programmereren kan ikke oppdage dette!). ReadLine() gir "Nothing" (ikke runtimefeil) hvis det ikke er mer å lese. Prosedyren kalles ved hendelsene form.Load (programmet starter), button1.click (bruker vil ha oppdaterte temperaturer) og timer1.tick (som vi satte til hvert 1000de millisekund).

Samtidighetsproblematikk: Hvis mitt program har filen åpen (for lesing) bør ikke andre (notepad) åpne den for skriving. Likens: Hvis andre har åpnet filen (for skriving), bør ikke mitt program få åpne filen (for lesing). Slik blokkering gir feilmelding, men er vanlig, for å sikre at leserne ikke er forvirret hva angår det EGENTLIGE innholdet i filen. For å redusere sjansen for blokkering må lesere og skrivere av delte filer åpne bare hvis absolutt nødvendig (en MÅ ha siste versjon), samt minimalisere tiden filen holdes åpen. Merk: Det er greit at flere lesere har samme fil åpen samtidig!

fredag 7. september 2007

Hente temperatur fra web

En liten demo på streng behandling av data fra web. Tallet som returneres blir ofte lavt.
  Imports System, System.Net, System.Text.RegularExpressions
    ...
    Function hentTempFraWeb() As Integer
        Dim url As String =  "http://www.yr.no/place/Norway/M%C3%B8re_og_Romsdal/Molde/Molde/"
        'http://met.no/more_og_romsdal/molde.html?steder"
        Dim req As WebRequest = WebRequest.Create(url)
        Dim resp As WebResponse = req.GetResponse()

        Dim inndata As IO.StreamReader = New IO.StreamReader(resp.GetResponseStream())
        Dim innString = inndata.ReadToEnd()

        Dim monster As String = "\d+.deg;"
        Dim minLeter As Regex = New Regex(monster)
        Dim treff As Match
        treff = minLeter.Match(innString)
        Dim funn As String = treff.ToString().Substring(0, 2)
        Return CInt(funn)
    End Function

Klassehierarki

Klassebibliotek i .NET er hierarkisk, med ei rot og forgreninger (som et tre, s. 582, pensumboka. Klassene like under "System" blir automatisk importert; alt annet importeres eksplisitt (som i "Imports System.Text.RegularExpressions"). Klassen Object er erkeklassen (rota i treet). Det har metodene equals(), finalize(), gethashcode() og tostring(), omtrent som i Java. Under Object kommer:
  • System (automatisk importert).
    • Integer
      • maxValue, minValue
    • Double
    • String
      • indexOf(), subString(),
    • Math
      • sqrt(), round(), ...
    • IO
      • File (s. 108 og kap. 8)
        • OpenText()
        • CreateText(), AppendText(),
      • StreamReader (s. 108)
      • StreamWriter (s. 412)
    • Text
      • RegularExpressions (se forel. 7/9, ikke i boka)
        • RegEx -- for å lete etter funn
        • Match -- for å lagre funn
  • Microsoft -- ikke studert enda
  • OppgaveN -- vår egen havner ofte her
Hierarkiet vises godt med "Object browser" som kan startes fra Alt/View.

torsdag 6. september 2007

Fredag 7/9: Leting etter tall

Data kommer ofte som tekst (String), hvorfra en henter ut (filtrerer) etter behov. En leter da etter mønster (pattern) i teksten, f.eks. en akseptabel temperatur. Vi kan bruke IndexOf() og SubString() som i boken, men det kraftigste og mest brukte redskap er regulære uttrykk (regular expressions), noe boken ikke tar opp. For heltall er letemønstret "\d+" noe som tilsvarer "[0123456789]+" eller, noe enklere skrevet, "[0-9]+". Plusstegnet er en KVANTIFIKATOR som angir at en vil ha minst ett av tegnene foran. Kodeeksempel:
  Imports System.Text.RegularExpressions 

  Function finn_IkkeNegativtHeltall (ByVal strInn As String) As Integer
    Dim strMoenster as String = "\d+"
    Dim tallLeter as RegEx = new RegEx (strMoenster)
    Dim treff as Match
    Dim strTall as String

    treff = tallLeter.Match( strInn )
    strTall = treff.ToString ()
    If IsNumeric ( strTall ) Then
      Return CInt ( strTall )
    Else
      Return -1
    End If
  End Function
For å hente alle tallene brukes en løkke (noe vi ikke har lært om enda) som går gjennom en treffliste, som under. "Ut" viser tallene atskilt med blank:
  Dim alletreff as MatchCollection
  alletreff = tallLeter.Matches ( strInn )
  For Each treff In alletreff
    Ut.Text = Ut.Text & treff.ToString() & " "
  Next
For å tillate negative tall setter en inn "-?" foran: "?" betyr at en vil ha null eller ett av foregående tegn ("-"). Hele mønsteret blir da "-?\d+". Hvis en bare vil akseptere heltall etterfulgt av "c", som i "-13c" blir mønsteret "-?\d+c". Tre kvantifikatorer er: "+" (1 eller flere), "?" (ingen eller 1) og "*" (0 eller flere).

Torsdag 6/9: Validering av inndata

Konstant sjekking av temperatur (korrekt og sannsynlig) er mulig som i koden under (finn en syntaksfeil!):
  Option Strict On
  Dim minTemp As Integer = -80, maxTemp As integer = 50

  Sub validerTemp (...) Handles txtboxTemp.TextChanged
    Dim innString as String = txtboxTemp.Text 
    Dim innTemp = 0  
    If IsNumeric ( innString ) Then
      innTemp = CInt ( innString ) ' sikring mot runtimefeil
      If IsTemp ( innTemp ) Then    
        temp = innTemp             ' sikring mot tulletemperatur
      Else
        MsgBox ( "Saerlig! " )
      End If
    Else
      MsgBox ( "Bare siffer godtas!" )
    End If
  End Sub

  Function IsTemp (ByVal temp as Integer) As Boolean
    Return temp >= minTemp And temp <= maxTemp
  End Function
CInt(x) gir feil ved runtime (under kjøring) hvis det forekommer annet enn tall og komma i "x" -- og: CInt(" 3 21 , 65 7") gir selvsagt "322". IsNumeric() forkaster minustegn, og fra salen ble det anbefalt at validering avventes inntil knapp var tastet!

mandag 3. september 2007

Mandag 3/9: Turdilemma

"Skal vi på tur" var eksempel, med beskrivelse (ord), analyse (flytskjema), design (UI) og kode (VB) - se kap. 2. Det ble et beslutningsstøtteverktøy med overtidskode:
  Private Sub btnBeregn_Click () Handles btnBeregn.Click
    v = finnutVaeret()
    krav = finnBrukersKrav()
    If ( (v.temp < krav.temp ) And
         (v.vind < krav.vind ) And
         (v.sol = krav.sol) And
         (v.nedbor = krav.nedbor) ) Then
      lblSvar.Text = "Ja!"
    Else
      lblSvar.Text = "Nei!"
    End If
  End Sub
Her er krav til sol og nedbør boolsk i seg selv, mens krav til temperatur og vind er maksimumskrav. "And" angir at alt må stemme (de fire delkrav evaluert til True) for at turen skal anbefales!

fredag 31. august 2007

Fredag 31/8: Funksjon og presedens

Man leser kap. 4.3 og laget f(x)
  
 Function f (ByVal x As Double) As Double
   Return ( 2*x + x^2 ) / 3 * Math.sqrt (x)
 End Function
og en "klient" som bruker f(.) setter s til 4.0 og t ved bruk av f().
  
  Dim s as Double = 4.0
  Dim t as Double = f(s)
Den sekvensielt arbeidende f() vil jobbe etter presedens og fra venstre mot høyre:
  1. første parantes (fra venstre):
    1. første (og eneste) potensiering (fra venstre): 4.0^2 blir 16.0
    2. første (og eneste) mult. el. div. (fra venstre): 2*4.0 blir 8.0
    3. første (og eneste) pluss el. minus (fra venstre): 8.0 + 16.0 blir 24.0
  2. første mult. el. div. (fra venstre): 24.0 / 3 gir 8.0
  3. neste mult. el. div.: 8.0 * Math.sqrt(4.0)
    1. Math.sqrt(4.0) blir (via funksjonen) 2.0
  4. 8.0 * 2.0 gir 16.0
  5. funksjonen returnerer 16.0
Klienten setter så sin variabel t til 16.0. Verdien av s er fremdeles 4.0. Forskjell mellom ByVal og ByRef er at ByVal gir funksjonen en KOPI av originalen. ByRef gir derimot originalen (en peker dit), som gir funksjonen mulighet til å ENDRE originalen. Fordel med ByRef: Sparer tid og plass hvis parametrene er store (gigabyte med data som skal kopieres hvis en brukte ByVal). Ulempen med ByRef er at klienten risikerer at originalen endres. I lab arbeidet man med 4.3

torsdag 30. august 2007

Oblig 3

Bruk streng typesjekk og lag program som beskrevet. Oppgave 1: Bruker oppgir telefonnummer (f.eks. "+47-71242133"). Plukk ut de tre nummerdelene, og vis de PENT i listboks (f.eks. "47-712-42133"). Oppgave 2: Utvid forrige slik at numrene leses fra en fil hvis bruker oppgir et filnavn. Filen har ett nummer per linje. Oppgave 3: (nytt program) Bruker oppgir navn, dato, antall arbeidstimer og varens pris. Faktura skrives i listbox med navn, dato, arbeidstimer, delekostnader, merverdiavgift (25 %) og totalsum. Bruk formatstreng. Oppgave 4: Gyldige valutakurser leses fra fil (en kurs per linje, f.eks "USD 5.99"). Bruker oppgir pengesum og velger valuta (blant gyldige, f.eks. "EUR"). Omregnet valuta vises. Frist: 14/9.

Torsdag 30/8: Typekasting og valg

Time 1: "Inn med teskje" tenkte nok enkelte da vi viste overgangen mellom tekst (i UI-objekt) og tall (i beregningene):
  Sub Private btnXYZ_Click (...) Handles btnXYZ.Click
    Dim antall as Integer
    Dim enhetspris as Integer = 11
    Dim total as Integer
    antall = CInt (Textbox1.Text)
    total = antall * enhetspris
    Textbox2.Text = CStr (total) & " kr."
  End Sub
Dette kan skrives enklere: Finn to feil i koden under:
  Sub Private btnXYZ_Click (...) Handles btnXYZ.Click
    Textbox2.Text = CStr ( Cint ( Textbox1.Text ) * 
               enhetspris ) ) & " kr."
  End Sub
Time 2: Kap. 5 decisions innledes med rabatteksempel:
  If antall > 100 Then enhetspris = 10 Else enhetspris = 11 End If
kan skrives
  enhetspris = 11  ' skjer hver gang
  If antall > 100 Then enhetspris = 10 End If
Har vi flere rabattmuligheter snevres mulighetene inn nedenfra
  If antall < 100 Then enhetspris = 11
  Elseif antall < 200 Then enhetspris = 10
  Elseif antall < 1000 Then enhetspris = 9
  Else enhetspris = 8 EndIf
(eller ovenfra). Forslag: Skriv reserverte ord i boka (permen) eller notisbok med "lure triks"

mandag 27. august 2007

Mandag 27/8: Tall og strenger

Klassene Integer, Double og String, samt Math. Regler for presedens som under (finn 1 logisk feil):
  skatt = ( inntekt - kostnad ) * skatteprosent
  skatt = inntekt - kostnad * skatteprosent
Sjekket konstanter for {Integer,Double}.{MinValue,MaxValue}. VS ga runtimefeil ved overflow men ikke Divide-by-zero! Typekasting mellom tekst (som i Listbox og Textbox) og tall (som vi regner med) skjer av og til automagisk (og litt forvirrende) i VS, ikke alltid i VB Express (bruk da Cstr, Cdbl og Cint). Lab: Jobbe med kap. 3.4 (strenger).

onsdag 22. august 2007

Fredag 24/8: Variabler, tall og debugger

Foreleste kap. 3.3 om numbers og 3.4 om strings. Muligens 3.5 om input (fra dialogbox) og output (til listbox). Viste debugging (F11). Lab blir å gjenta steg-for-steg fra kap. 3.3 og 3.4, samt gi svar til oppgavene for 3.3 og 3.4. I dag vil det ta mindre tid. Nytt: ClassFronter brukes til innlevering av Oblig!

Torsdag 23/8: Dag 1 med VS

Vil forelese kap. 3.1 og 3.2. Dagens lab (tidkrevende!): Les og gjenta stegvis, det som er vist i kap. 3.1 (bruk VS, start et prosjekt, legg inn enkle UI-kontroller). Gi svar til oppgavene i 3.1 (muntlig eller skriftlig, som dere vil). Deretter tar dere for dere kap. 3.2 (property, event, event-prosedyre), les og gjenta stegvis fra teksten, samt gi svar til oppgavene.

mandag 20. august 2007

Oblig 2

Du skal bli kjent med variabler, og godkjenning forutsetter at du har brukt variabler i alle sammenhenger. Oppgave 1: Lag et program for utregning av grisers levendevekt og slaktevekt. Bonden oppgir brystomfang (cm) som input. Gjeldende formler (for omfang mellom 90 og 104 cm): Slaktevekt = 53 + 1.64 * (brystomfang - 90) kilo. Levendevekt = 80 + 2.71 * (brystomfang - 90) kilo. Lag UI og prosedyrer som regner ut. Oppgave 2: En tannlege tilbyr rensing (kr. 150), fylling (kr. 500), rontgen (kr. 100), samt "diverse" (varierende pris). Lag program som tar imot pasientens navn, hvor mye som er gjort av hver tjeneste (med tekst og pris for "annet"), og skriver ut regning (med sum og totalsum) for pasienten. Oppgave 3 (ved sen levering): Lag program der brukeren oppgir kulediameter i centimeter. Volumet skal vises i desiliter. Frist: Fredag 7/9.

Mandag 20/8

Tjueen (21) studenter. Gjennomgikk kap. 1 og Bli kjent. Tavlen viste lagdelte datasystemer: Brukeren (nederst) kommer i inngripen via hardware (h/w): Input (tastatur, mus o.l.) og output (skjerm, skriver). Operativsystemet er software (s/w) som er politi (godkjenner), samt styrer signalene til rett prosess (brukerprogram som er igangsatt). Vi viste (med taskmgr.exe) prosesser og vektla forskjell mellom program (latente .exe-filer i et lager) og prosess (innlastede instruksjoner som ligger i RAM og hentes en-for-en inn til CPU).

fredag 17. august 2007

Oblig 1

Formål: Gjør deg kjent med redskapet for programmering. Du må ha lest t.o.m. s. 74 og The Group Box Control (s. 472), samt Radio Button Control (s. 474). Oppgave 1: Lag et program der brukeren får ett spørsmål, svarer ved blant svaralternativ og gis beskjed om resultatet.
  • Legg inn velkomsttekst øverst
  • Legg inn selvvalgt spørsmål
  • Legg inn tre selvvalgte svaralternativ (enten radioknapper, klikk, valg fra nedtrekksliste, innskriving)
  • Legg inn forklarende tekst
  • Etter valg, skal brukeren gis beskjed (galt eller rett svar)
  • Vinduet skal ha en knapp for ''avslutt''
  • Du velger farger for bakgrunn, tekst og fonter
Oppgave 2:
  • Lag nytt prosjekt med tittel ''Mitt første program'' og gul bakgrunn
  • Legg til avslutt-knapp (som avslutter programmet)
  • Legg til gruppeboks med tittel ''Velg språk''.
  • Boksen skal ha to valg (radioknapper) med tekst ''engelsk'' og ''norsk'', som (hvis valgt) endrer teksten (i ''avslutt''-knapp) til ''quit'' eller ''avslutt''.
Følg navnereglene for GUI-komponenter (s. 52). Vindu (Form, frm*), Etikett (Label, lbl*), Valgliste (Listbox, lst*), Knapp (Button, btn*), Tekstboks (Textbox, txt*), Gruppeboks (Groupbox, grp*), Radioknapp (Radiobutton, rad*), Avkrysning (Checkbox, chk*) og Nedtrekksliste (Combobox, cbo*). Koden skal skrives ut og forevises assistentene. Siste frist for godkjenning: Fredag 31/8. IN ENGLISH (new Sep 1, 2008): Purpose: Get to know the tool for programming. You must read up to page 74 and The Group Box Control (pg. 472), as well as Radio Button Control (pg. 474). Exercise 1: Make a program that asks the user one question. The user answers by choosing one of several alternatives. The program then informs the user about the result.
  • Add a welcome text in the upper area
  • Add a question text
  • Add three alternatives for answer (you can use radio buttons, click buttons, menus or text fields -- your choice!).
  • Give explanations (use labels)
  • When the user has made a choice, the user receives an information about the result (right or wrong).
  • The window must have an "Exit" button
  • You choose color, fonts and sizes yourself.
Exercise 2:
  • Make a new project entitled "My first program" (yellow background).
  • Add an exit button
  • Add a groupbox entitled "Choose language"
  • The groupbox has two choices (radio buttons), with the text "english" and "norwegian". The exit button shows "quit" or "avslutt" depending on which language is chosen.
Follow the labeling rules for GUI components (pg. 52): (Form, frm*), (Label, lbl*), (Listbox, lst*), (Button, btn*), (Textbox, txt*), (Groupbox, grp*), (Radiobutton, rad*), (Checkbox, chk*) and (Combobox, cbo*). Koden skal skrives ut og forevises assistentene. Siste frist for godkjenning: Fredag 31/8.

Om IBE150 Programmering

Fra http://himolde.studiehandbok.no (formell beskrivelse)
  • Forkunnskap: Kjennskap til datamaskiner.
  • Formål: Gi grunnleggende praktisk kunnskap om programmering slik at en kan utvikle egne enkeltstående (monolittiske) program.
  • Innhold: Det viktigste vil være bygging av program og logikk, med vekt på å forstå variabler og tilordning, datatyper (tall, strenger, tabeller, hash, objekt), typekasting og sammenligning, logiske uttrykk (enkel boolsk algebra) og valg, gjentagelser (løkker), modularisering (prosedyrer, funksjoner, klasser og metoder; overføring av parameter) og rekursjon.De viktigste algoritmer for sortering, fletting og søking beskrives.Teknikker i hendelsesstyrt kjøring blir belyst.Utover det rent programmerings-tekniske, gis enkel opplæring i henting av data (fra brukere, filer og eksterne kilder), presentasjon av data (i grafiske og tekstlige former), samt lagring. Kurset gir ikke opplæring i overordnede metoder for å lage større programsystem.
  • Arbeidskrav (som kreves for adgang til eksamen): En serie obliger med innlevering til gitte frister (samme obliger som i fjor!).
  • Eksamen: 4 t skriftlig. Alle hjelpemidler (trykte og skrevne). Teller 100 %.
  • Pensum: David Schneider, An Introduction to Programming, Prentice-Hall, 2006
I tillegg (detaljer for h'07)
  • Forelesninger: 6 t per uke. Mandag (rom 283), torsdag og fredag (rom 285). Kl. 0815-1000. Etterfulgt av 2 t lab.
  • I tillegg: hjelpelærer-timer med Knut E. Kjersem og Jostein Hestad, delt med IBE100. Detaljer om dette kommer senere.
  • Obliger skal godkjennes av Kjersem eller Hestad innen angitte frister. Det er KODEN som skal forevises og godkjennes (utseendet er lite viktig). Samme obliger som i fjor.
  • Eksamen: 11. Desember, 2007, kl. 0900-1300.
  • Kurset har en epostliste som ALLE MELDER SEG PÅ!
  • Materiell fra tidligere varianter av kurset: INF150 (2006)

Bli kjent

Del 1: Gruppearbeid (to per gruppe) kan skje i rom 009 (omtrent 15 PCer burde holde).
  • Logg inn (som en av de to i gruppen)
  • Start en nettleser (som Firefox, firefox.exe) og finn kursets hjemmeside. Meld dere begge opp til kurset ePostliste (IBE150). Sjekk om dere har tilgang til ClassFronter (og om dere finner IBE150).
  • Start Skriveblokka (notepad.exe, som s. 6 i DS)
  • Start en "explorer" (explorer.exe) og finn din "hjemmemappe" (filserver). Opprett derunder arbeidsmappe (folder, directory) for IBE150 -- den andre (som neppe er innlogget) tar dette ved en senere anledning
  • Skriv inn svar til 1.2 (alle deloppgavene) og lagre som IBE150/oppg1-2.txt
  • Send ePost til hverandre med svaret (som vedlagt fil). Skriv hvem dere er.
  • --- ta en pause ---
  • Skriv i IBE150/oppg1-3.txt med svar til 1.3. Bruk IBE150-mappa istedet for diskett (hvis dere da ikke har minnebrikker med dere). Til 1.3.13: Mappa "Ch09/Pictures" kan ligge under kursinfo (in-kurs/INF150). Let eller bruk en annen mappe.
Del 2: Alene (vel, en kan jo fortsette i gruppe, men alle vil til slutt tvinges gjennom dette alene)
  • PC i rom 009 (eller 070, 076, 075). Logg inn.
  • Start Visual Studio (VS) med sekvensen Startmeny, Programmer, Programvare Informatikk, Visual Studio ....
  • Velg eventuelt en profil (gjerne VS developer)
  • vent ... mye skal ordnes i starten
  • Avslutt og start VS om igjen (det skal starte raskt)
  • Logg ut
Installer eventuelt VB 2005 Express i egen PC (alene). Du finner det selv!

Lure program

  • Taskmanager (taskmgr.exe): Lar deg se prosesser du har i gang, eventuelt slette (avslutte) etter behov
  • Explorer (Utforsker, explorer.exe): Lar deg se og betjene dataressurser (filer, skrivere, kamera, m.m.) som finnes lokalt (din PC) eller andre steder (servere).
  • Notepad (notepad.exe): Skriveblokk av enkleste sort.
  • Nettleser som Firefox (firefox.exe) eller Internet Explorer (iexplore.exe)
  • Visual Studio (devenv.exe)

Hurtigtaster

Windows og de fleste brukerprogram (som VS):
  • Ctrl+Alt+Del: En tre-fingers salutt som starter Winlogon.
  • Ctrl+Esc: Gir startmenyen
  • Windowstast+M: Ikoniserer alle programmene
  • Windowstast+R: Snarvei til Start/Run (Run)
  • Alt+Tab: Aktiverer "neste" av mine igangsatte program
  • Ctrl+C: Kopier det som er markert til et utklippsbuffer
  • Ctrl+V: Kopier fra buffer til der cursor er
  • Ctrl+X: Fjern det som er markert (blir ikke liggende i bufferJo, det blir liggende i buffer!)
  • Ctrl+Z: Angre det siste.
  • Tab og Shift+Tab: Ruller fokus for input
  • Alt+F4: Avslutter prosess (eller Windows)
  • Alt+Shift: "System"meny (nordvestlige ikon i vindusramma!).
  • ... (flere kommer)
Visual Studio:
  • Alt+S: Lagrer koden (*.vb, *.sln etc.) -- VS lagrer også før hver kjøring!
  • DEBUG:
    • F5: start, Shift+F5: stopp,
    • F11: Gå inn i neste, F10: Hopp over neste,
    • F9: sett stoppeplass (breakpoint). Ctrl+Shift+F9: Fjern alle stoppeplasser.
  • F4: Gå til properties (egenskapene til aktiv kontroll)
  • Ctrl-C/X/V og Del brukes (som ellers) for klipp-og-lim o.l.
  • Ctrl+Tab: Hopp mellom faner (fra kode til design til objektbrowser...)
  • Alt/Tools/Options/Fonts endring av skrift (velg "settings for": "All text tool windows")
  • ... (mere kommer)
+ angir at tastene trykkes samtidig.