Pascal og Algoritmer med Delphi Oktober 2002, NF
Indholdsfortegnelse Indholdsfortegnelse...2 Vigtige komponenter i Delphi...3 Form:...3 Edit:...3 Button:...3 Label:...3 Properties/Egenskaber...3 Memo:...3 RichEdit:...4 Image:...4 Canvas:...4 Simple datatyper i Delphi...5 Integer...5 Real...5 String...6 Char...6 Boolean...6 Strukturerede datatyper...7 String:...7 Array:...8 Record (post):...8 Sekvenser...9 Assignment statement/tildelingssætning:...9 Compound Statement/Sammensat sætning:...9 Forgreninger...10 IF sætning:...10 IF, THEN, ELSE sætning:...10 CASE sætning:...10 Løkker...11 While løkken:...11 Repeat-Until løkken:...11 FOR løkken:...11 Moduler...12 Procedurer:...12 Funktioner:...13 Rekursion:...13
Datalogi, Pascal, Vigtige komponenter i Delphi 10-10-02, NF Side 3 af 14 Vigtige komponenter i Delphi I det følgende skal vi se lidt på fem forskellige komponenter/objekter i Delphi, nemlig: Form (programmets vindue), Edit (edit-boks til input og output af en tekstlinie), Button (en knap til udførsel af en handling), Label (et fast) og Memo (input og output af flere linier af tekst). Hvert af de følgende afsnit omtaler en komponent, med egenskaber, metoder og handlinger: Form: Oprettes når Delphi startes og er programmets vindue. I denne komponent placeres programmets øvrige komponenter. Properties/Egenskaber: Name: Angiver formens individuelle navn. Standard: Form1, Form2 osv. Caption: Angiver den tekst der skal vises i vinduets titelbjælke øverst. Edit: Findes under fanen Standard. En edit-box er et felt som kan anvendes af programmet til at vise en tekststreng (output), eller til at læse en tekststreng (input) fra brugeren. Properties/Egenskaber: Name: Angiver edit-boxens individuelle navn. Standard: Edit1, Edit2 osv. Text: Angiver den tekst, der skal vises i edit-boxen. Denne variabel kan af programmet tildeles en tekststreng, men det er også i denne variabel, at en tekststreng skrevet af brugeren lagres. Button: Findes under fanen Standard. Button er en knap, som udfører en af programmøren defineret programkode, når brugeren klikker på den med musen. Properties/Egenskaber: Name: Angiver knappens individuelle navn (dette gælder generelt for alle Delphi komponenter). Standard er Button1, Button2 osv. Caption: Angiver den tekst, som brugeren kan læse på knappen, når programmet kører. Events/Handlinger: OnClick: Er den handling/hændelse (event), som vil finde sted, hvis brugeren klikker på knappen med musen. Label: Findes under fanen Standard. En label er en tekststreng, som valgfrit kan placeres på en form. Properties/Egenskaber Name: Standard er Label1, Label2, Caption: Angiver den tekst, som den pågældende label skal indeholde Memo: Findes under fanen Standard. En memo er et felt på formen, der fungerer på samme måde, som en tekst editor. Properties/Egenskaber:
Datalogi, Pascal, Vigtige komponenter i Delphi 10-10-02, NF Side 4 af 14 Name: Angiver memoens navn. Dette navn kommer også til at stå øverst i memoens felt på formen. Standard er Memo1, Memo2 osv. ScrollBars: Angiver hvilke retninger denne memo skal kunne 'scrolle' (rulles) i. Vælg mellem: ssnone, sshorizontal, ssvertical og ssboth. Meningen er indlysende. Methods/Metoder: Lines.Clear: Sletter indholdet af Memo. Lines.Add( abc ): tilføjer en linie til memoen: abc. RichEdit: Findes under fanen Win32. Komponent som udvider funktionaliteten af Memo. Den har blandt andet en metode til udskrivning indbygget. Methods/Metoder: Print: Udskriver indholdet af RichEdit. Image: Findes under fanen Additional. Komponent som kan anvendes til visning og fremstilling af grafik. Properties/Egenskaber: Name: Som ovenfor. Standard er Image1, Image2 osv. Canvas/Lærred: En abstrakt egenskab, som indeholder egenskaber og metoder til fremstilling af grafik i billedfeltet (se nedenfor). Canvas: Egenskab (objekt) for Image. Denne egenskab indeholder grafiske egenskaber og funktioner. Properties/Egenskaber: Pixels[x, y]: Denne egenskab benyttes til at læse eller skrive til enkelte pixels i et billede. Methods/Metoder: MoveTo(x, y): Flytter pennen til positionen x, y i billedet. LineTo(x, y): Trækker en ret linie fra pennens position til positionen x, y i billedet og opdaterer pennens position. FillRect(ClientRect): Sletter indholdet af Image. Hvis man i programkoden f.eks. har brug for at få adgang til en edit-box Text egenskab, skriver man navnet på edit boxen derefter et punktum (. ) og afslutter med Text, Eksempel: Edit1.Text := I edit boxen står dette nu. ; Hvis man vil beskrive en handling/hændelse for f.eks. en knap, dobbeltklikker man på den pågældende knap, og man kan derefter beskrive handlingen/hændelsen med programkode.
Datalogi, Pascal, Simple datatyper 10-10-02, NF Side 5 af 14 Simple datatyper i Delphi En datatype er en definition på hvilken type data, der kan gemmes i en bestemt variabel. De 5 datatyper der er mest grundlæggende er: Integer, Real, String, Char og Boolean. Her følger en beskrivelse af datatyperne og en beskrivelse af konverteringfunktioner i Delphi til at konvertere en datatype til en anden. Alle variable i Delphi defineres enten som globale eller lokale variable under en Var sektion. Globale variable defineres før brug, normalt før alle procedurerne lige før eller efter sektionen Implementation. Lokale variable defineres før det første Begin i den procedure de skal bruges i. Forskellen på lokale og globale variable er den, at lokale variable kun kan bruges i den procedure de er defineret i, mens globale variable kan bruges overalt i den Unit, de er defineret i. Integer En variabel af typen Integer er et heltal dvs. en Integer variabel kan antage værdierne...,-3,-2,- 1,0,1,2,3,... Talområdet går fra ca. 2E9 til +2E9. De to konverteringsfunktioner der er blevet gennemgået er IntToStr og StrToInt. Syntaksen for disse to funktioner er: IntToStr(heltal); { har typen String } StrToInt(streng); { har typen Integer } IntToStr omformer en integer variabel fra et heltal til en tekststreng dvs. hvis variablen er heltallet 954 bliver tekststrengen teksten 954. StrToInt er den modsatte funktion dvs. den laver f.eks. tekststrengen 954 om til heltallet 954. Real En variabel af typen real er et reelt tal dvs. en Real variabel kan antage alle værdier fra 1E38 til 1E38. Hvis man benytter typen Extended foregår beregningerne hurtigere, mere nøjagtigt og med et større talområde: 1E4932 til 1E4932. Det nemmeste vil være at indføje en type erklæring: TYPE Real = Extended De to konverteringsfunktioner der er blevet gennemgået er FloatToStr og StrToFloat. Grunden til at det hedder Float og ikke Real er at man også kalder reelle tal for flydende tal, samt at de også virker på andre typer som f.eks Extended. Syntaksen for disse to funktioner er: FloatToStr(reelt tal); { har typen String } StrToFloat(streng); { har typen Real } FloatToStr omformer en Real variabel fra et reelt tal til en tekststreng, dvs. hvis variablen er det reelle tal 9,54 bliver tekststrengen teksten 9,54. StrToFloat er den modsatte funktion, dvs. den laver f.eks. tekststrengen 9,54 om til det reelle tal 9,54.
Datalogi, Pascal, Simple datatyper 10-10-02, NF Side 6 af 14 String En variabel af typen String er en rækkefølge af bogstaver, tal eller tegn af enhver form inkl. mellemrum f.eks. "ff^s, w'. - å"6%". De fire konverteringsfunktioner, der er blevet gennemgået, er IntToStr, StrToInt, FloatToStr og StrToFloat. Beskrivelser af disse funktioner kan findes under Integer og Real. Char En variabel af typen Char er et tegn repræsenteret ved en tegnværdi. Der findes forskellige kodninger (ASCII, ANSI mm.). Her er ASCII-værdier for almindelige tegn fra 32 til 255 for skrifttypen Times New Roman: Tegnværdier for Times New Roman skrifttypen: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 32! " # $ % & ' ( ) * +, -. / 48 0 1 2 3 4 5 6 7 8 9 : ; < = >? 64 @ A B C D E F G H I J K L M N O 80 P Q R S T U V W X Y Z [ \ ] ^ _ 96 ` a b c d e F g h i j k L m n o 112 P q r s t u V w x y z { } ~ 128 ƒ... ˆ Š Œ 144 ' ' " " - - (tm) š Œ Ÿ 160 (c) ª «- (r) 176 ± ² ³ µ * ¹ º» 1/4 1/2 3/4 192 À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î 208 Ï Ð Ñ Ò Ó Ô Õ Ö Ø Ù Ú Û Ü Ý Þ 224 ß à á â ã ä Å Æ ç è é ê Ë ì í î 240 Ï ð Boolean En variabel af typen Boolean er en logisk variabel, der kan antage de to værdier True og False. Den benyttes f.eks. ved forgreninger og i løkker.
Datalogi, Pascal, Strukturerede datatyper 10-10-02, NF Side 7 af 14 Strukturerede datatyper String: Tekst kan lagres i en variabel af typen String. Der kan maksimalt lagres 255 tegn. String typen er en tabel på 256 tegn. De enkelte tegn repræsenteres ved der ASCII værdi (se tabel). Det første tegn har en værdi svarende til antallet af tegn i strengen, herefter følger de enkelte tegn i rækkefølge. De enkelte tegn i strengen kan adresseres ved at angive indeks i tabellen som vist herunder. Indeks starter med 0. VAR s: String; s := 'ABC'; (* s[0] = chr(3), tegn nr. 3 *) s[1] := 'C'; s[3] := 'A'; Nyttige funktioner: Copy(s: String; Index: Integer; Count: Integer): String kopierer en delstreng ud af strengen s, startende ved positionen Index med Count tegn. Pos(subs, s: String): Integer beregner position af delstreng subs i s. Hvis subs ikke findes i s returneres 0. AnsiUpperCase(s: String): String konverterer en streng til store bogstaver.
Datalogi, Pascal, Strukturerede datatyper 10-10-02, NF Side 8 af 14 Array: Hvis flere dataelementer af samme type skal lagres sammen, kan man benytte et Array (en tabel). Denne tabel kan være i flere dimensioner: VAR fem_tabellen: ARRAY [1..10] OF Integer; Den_lille_tabel: ARRAY[1..10; 1..10] OF Integer; Record (post): Hvis flere dataelementer af forskellig type skal lagres sammen, kan man benytte en Record (en post). Normalt angiver man først posten som type, og derefter anvender man den i en variabel. Hvis man vil have en hel database i lageret på en gang, kan man lave en variabel som et ARRAY af poster: TYPE ElevpostType = RECORD navn: String[40]; tlf: String[15]; VAR Elevpost: ElevpostType ElevDB: ARRRAY [1..100] OF ElevpostType;
Datalogi, Pascal, Simple Programstrukturer 10-10-02, NF Side 9 af 14 Sekvenser I Pascal udføres sætninger i den rækkefølge de står. Sætninger er adskilt af semikolon. Eksempler på sætninger: Assignment statement/tildelingssætning: Simpel: i := 2; Beregning af udtryk: r := 2/(3+4); Beregning af funktionsværdi: r := sqrt(i); r := sin(pi/6); r := ln(2); Compound Statement/Sammensat sætning: En sekvens af sætninger kan omformes så de virker som én sætning. Eksempel: <Sætning1>; <Sætning2>; <Sætning3>; Opgave: Beregn 22/7 og 355/113 og disse tals relative afvigelse fra π.
Datalogi, Pascal, Simple Programstrukturer 10-10-02, NF Side 10 af 14 Forgreninger Der findes 3 måder at lave forgreninger på i Pascal: IF sætning: IF <Logisk udtryk> THEN <Sætning>; Hvis det logiske udtryk sandt udføres <Sætning>, ellers udføres intet. IF, THEN, ELSE sætning: IF <Logisk udtryk> THEN <Sætning1> ELSE <Sætning2>; Hvis det logiske udtryk er sandt udføres <Sætning1>, ellers udføres <Sætning2>. CASE sætning: Eksempel: CASE i OF 1: <Sætning1>; 2: <Sætning2>; ELSE <Sætning3>; Hvis variablen i er 1 udføres <Sætning1>, hvis variablen i er 2 udføres <Sætning2>, eller udføres <Sætning3>. Opgave: Lav et program, der udskriver løsningerne til 2. gradsligningen. Brug diskriminanten og to IF-THEN-ELSE sætning til at skelne mellem nul, en eller to løsninger.
Datalogi, Pascal, Simple Programstrukturer 10-10-02, NF Side 11 af 14 Løkker Der findes 3 måder at lave løkker på i Pascal: While løkken: WHILE <Logisk udtryk> DO <Sætning>; Udføres sålænge det logiske udtryk sandt, nul eller flere gange. Repeat-Until løkken: REPEAT <Sætning> UNTIL <Logisk udtryk>; Udføres indtil det logiske udtryk er sandt, en eller flere gange. FOR løkken: FOR i:=<startværdi> TO <Slutværdi> DO <Sætning>; Udfører sætning med heltallige værdier for kontrolvariablen i fra Startværdi til Slutværdi begge inklusive.. Der foretages derfor ialt <Slutværdi> - <Startværdi> + 1 gennemløb. Opgave: Lav et program i Delphi, som lister alle løsninger til retvinklede trekanter med heltallige sidelængder mindre end 100. Den første løsning er 3, 4, 5. Der må ikke forekomme dubletter, og programmet skal kunne skrive løsningerne ud på papir.
Datalogi, Pascal, Strukturerede Programmer 10-10-02, NF Side 12 af 14 Moduler Der findes 2 måder at lave moduler på i Pascal: Procedurer: En procedure er et delprogram, som først skal defineres, og som derefter kan anvendes af hovedprogrammet. Eksempel: PROCEDURE Ombyt(var a, b: Char); VAR c: Char; c := a; a := b; b := c; Procedurens navn er Ombyt. Den ombytter 2 tegn a og b, der angives som parametre i parentes. Den kan f.eks. benyttes i forbindelse med sortering af bogstaver i alfabetisk rækkefølge. Proceduren kaldes fra hovedprogrammet. Eksempel: PROGRAM BobleSorter; VAR TegnOmbyt: Boolean; s: String; PROCEDURE Ombyt... TegnOmbyt := True; WHILE TegnOmbyt DO TegnOmbyt := False; FOR i := 1 TO Length(s)-1 DO IF s[i]>s[i+1] THEN Ombyt(s[i], s[i+1]); TegnOmbyt := True; END. Parametrene til denne procedure er såkaldte var-parametre. Det betyder, at de lokale variable a og b i proceduren virker direkte på de globale variable s[i] og s[i+1], som angives i procedurekaldet. Det er de globale variables adresser, der overføres til proceduren.
Datalogi, Pascal, Strukturerede Programmer 10-10-02, NF Side 13 af 14 Hvis ordet var udelades er parametrene såkaldte værdi-parametre. Disse overfører en værdi til proceduren, men kan ikke aflevere resultater til programmet udenfor proceduren. Eksempel: PROCEDURE CirkelBeregning(r: Real; var o, a: Real); o := 2*pi*r; a := pi*r*r; Her er r en værdiparameter og overfører talværdien for radius for en cirkel til proceduren. De to varparametre o og a bliver brugt til at aflevere værdien af cirklens omkreds og areal til det kaldende program. Funktioner: En funktion er et delprogram som først skal defineres, og som derefter kan anvendes af hovedprogrammet. Funktioner kan afleveres én funktionsværdi. Eksempel: FUNCTION Fak(n: Integer): Integer; VAR i, produkt: Integer; produkt := 1; FOR i := 1 TO n DO produkt := produkt*i; Fak := produkt; Fakultetsfunktionen beregnes her ved at gange alle tal fra 1 til funktionens parameterværdi sammen og aflevere resultatet i variablen Fak. I et program kan denne funktion kaldes. Eksempel: PROGRAM Fakultet; VAR F: Real; FUNCTION Fak... F := Fak(5); END. Rekursion: Procedurer og funktioner kan benyttes på en særlig måde, hvor proceduren/funktionen kalder sig selv. Dette kaldes rekursion. Eksempel på en rekursiv funktion:
Datalogi, Pascal, Strukturerede Programmer 10-10-02, NF Side 14 af 14 FUNCTION Fak(n: Integer): Integer; IF n=0 THEN Fak := 1 ELSE Fak := n*fak(n-1); Denne funktion benytter, at n! = n*(n-1)! Stopklodsen, der afslutter funktionskaldene er betingelsen n=0, hvor funktionen returnerer 1 (0!=1). Hvis man foretager funktionskaldet Fak(3) foregår beregningen således: fak(3) = 3* fak(2) fak(2) = 2* fak(1) fak(1) = 1* fak(0) fak(0) = 1 = 3* 2* 1* 1 = 6 Et andet eksempel er Fibbonnaci talfølgen - næste tal er lig summen af de to forgående (start med to et-taller): FUNCTION Fib(n: Integer): Integer; IF n<=2 THEN Fib := 1 ELSE Fib := Fib(n-2)+Fib(n-1); Denne funktion benytter, at Fib(n) = Fib(n-2) + Fib(n-1). Stopklodsen, der afslutter funktionskaldene er betingelsen n<=2, hvor funktionen returnerer 1 (de to første tal i talfølgen). Hvis man foretager funktionskaldet Fib(4) foregår beregningen således: fib(4) = fib(2) + fib(3) = 1 + fib(1) + fib(2) = 1 + 1 + 1 = 3 Opgave: Lav et program i Delphi, som lister forholdet fib(n)/fib(n+1) for de første 20 værdier for n. For store n tilnærmer disse værdier sig til Det gyldne Snit. Sammenlign værdierne med udtrykket: 5 1 2