Programmeringsteknisk översiktskurs för yrkeshögskoleprogram Föreläsning 12 Våren 2005
Innehåll Palindrom Hur man hittar fel i program, debuggning Felhantering, hur man förhindrar program att krascha Ev. lite filhantering Läsanvisningar: Kapitel 13 + ev. Kapitel 15 F12 Lena Kallin Westin, kallin@cs.umu.se 2005 2
Problem: Skriv en funktion som tar en sträng och avgör om strängen är ett palindrom eller ej. Ett palindrom är en text som är likadan om man läser den bakifrån som framifrån om man bortser från versaler/gemener och tecken som,!? etc anna, dallassallad, sirap i paris, ni talar bra latin, A man, a plan, a canal, Panama Dromedaren Alpotto planerade mord saippuakivikauppias längsta enstaka ordet finska tvålstensförsäljare enligt susning.nu där påstås det också att det finns ett palindrom som är över 64000 ord långt! F12 Lena Kallin Westin, kallin@cs.umu.se 2005 3
Fel i koden, debugging Grace Brewster Murray Hopper (1906-1992) Skrev den första kompilatorn på början av 50-talet. Var med och skapade programspråket COBOL 1955 Myten säger att hon upptäckte" den första buggen 1945 Datorn, Mark II, slutade fungera och orsaken var en skalbagge (bug). F12 Lena Kallin Westin, kallin@cs.umu.se 2005 4
Hur finner man fel? Läsa koden och kommentarerna en extra gång Kan lyckas i de enklaste fallen men svårt då man arbetar med större program. Spårutskrifter Man kontrollerar variablers värde genom att skriva ut dem till skärmen. Bra för mindre program ohanterligt många utskrifter vid större program. Debugger F12 Lena Kallin Westin, kallin@cs.umu.se 2005 5
Debugger Ett hjälpmedel som gör att man kan stega igenom koden rad för rad. Man kan följa variablernas värde och hur de förändras under körning. Kan sätta breakpoints som bestämmer vart programmet ska stanna. Kan välja att gå in i subrutiner/procedurer Step into eller att gå förbi dem Step. Fungerar vår strängräknare och palindromfunktion som de ska? F12 Lena Kallin Westin, kallin@cs.umu.se 2005 6
Felhantering Vissa fel beror på användaren. Ange ett filnamn som inte finns. Ge text när man vill ha siffror. Klicka på en knapp innan allt är ifyllt. De flesta fel kan man förutse och programmera bort. Bara visa namn på filer som finns. Gör så att knappen inte går att klicka på förrän allt är ifyllt. Göra en kontroll av värden som matas in. Man kan också använda sig av undantagshantering. F12 Lena Kallin Westin, kallin@cs.umu.se 2005 7
Undantagshantering Exempel: Dela två givna tal med varandra. Fungerar i alla fall utom då nämnaren är 0. Kan föra in en felkontroll i koden. if nämnare = 0 then Kan också skriva undantagshantering. Gör att användaren meddelas om felet och programmet kan fortsätta köras F12 Lena Kallin Westin, kallin@cs.umu.se 2005 8
Undantagshantering Private Sub beräkning2() On Error GoTo lblfel Om ett fel uppkommer gör det som står vid lblfel! txtresultat.text = txttäljare.text / txtnämnare.text Exit Sub Används för att inte resten av rutinen ska köras lblfel: txtresultat.text = "Division med 0 ej tillåten" Exit Sub End Sub Här bestäms vad som ska hända om fel uppkommer On Error ska alltid stå först i rutinen och själva felhanteringen sist F12 Lena Kallin Westin, kallin@cs.umu.se 2005 9
Undantagshantering Ibland vet man inte varför det gått fel. Err en funktion som ger en felkod för felet (heltal) Error en funktion som kan översätta felkoden till (engelsk) text Private Sub beräkning3() On Error GoTo lblfel txtresultat.text = txttäljare.text / txtnämnare.text Exit Sub lblfel: MsgBox(Error(Err)) Exit Sub End Sub F12 Lena Kallin Westin, kallin@cs.umu.se 2005 10
Finns två val avsluta rutinen (Exit Sub) När felet hanterats fortsätta exekveringen på raden efter det att felet uppkom (Resume Next) Resume Next ska användas med försiktighet Inte bra att fortsätta köra om filen inte gick att öppna... F12 Lena Kallin Westin, kallin@cs.umu.se 2005 11
Filhantering För att läsa från/skriva till en fil måste man göra tre saker 1. Öppna filen 2. Läsa/skriva 3. Stänga filen En textfil kan läsas av exempelvis Notepad/Anteckningar och består av vanliga tecken, radslutstecken och ett filslutstecken. Omvandlingen från ettor och nollor sker automatiskt och tecknen tolkas med hjälp av en ASCII-tabell (s 429) F12 Lena Kallin Westin, kallin@cs.umu.se 2005 12
Öppna filen När vi öppnar filen måste vi tala om ifall vi ska läsa eller skriva Input, Output, Append Vi vet filens namn men programmet behöver en egen koppling till filen. Vi måste ange fullständig sökväg (path) till filen. App.Path är en funktion knuten till applikationen/projektet I VB ges filen ett nummer. Man kan ha flera filer öppna samtidigt så numret måste vara unikt. FreeFile ger ett nytt unikt nummer Vi måste koppla samman filnamnet och programmets unika nummer. F12 Lena Kallin Westin, kallin@cs.umu.se 2005 13
Exempel öppna en fil för läsning Vi har filen testfil.txt i samma katalog som projektet och vill läsa från filen. Open App.Path + \testfil.txt For Input As #1 Om vi vill ha ett unikt nummer: Dim FilNr As Integer FilNr = FreeFile Open App.Path+ \testfil.txt For Input As #FilNr F12 Lena Kallin Westin, kallin@cs.umu.se 2005 14
Läsa från filen Läser radvis och lagrar raderna i en sträng Dim strline As String Line Input #1, strline eller #FilNr Oftast vill man läsa in hela filen, upprepa tills filen slut EOF(nr) kollar om filen med nummer nr är slut While Not EOF(1) Eller EOF(FilNr) Läs in och arbeta med en rad i taget Wend F12 Lena Kallin Westin, kallin@cs.umu.se 2005 15
Stänga filen Stänger en fil med hjälp av rutinen Close Close #1 eller Close #FilNr Filer stängs automatiskt när programmet avslutas men det är god programmeringsmetodik att stänga dem kontrollerat, dvs så fort de inte behövs längre. F12 Lena Kallin Westin, kallin@cs.umu.se 2005 16
Exempel Ett formlär som visar innehållet i filen testfil.txt i en textruta. Inläsningen sker i subrutinen Main och formuläret visas först när inläsningen är klar. F12 Lena Kallin Westin, kallin@cs.umu.se 2005 17
Öppna filen med Output Att skriva till en fil Dim FilNr As Integer FilNr = FreeFile Open App.Path + \testfil.txt For Output As #FilNr Skriv till filen med Print Print #FilNr, strline Stäng filen Close #FilNr Om man vill lägga till i en befintlig fil använder man Append istället för Output F12 Lena Kallin Westin, kallin@cs.umu.se 2005 18