Practicum: schets-editor

Slides:



Advertisements
Verwante presentaties
KINN 2010 •OOP •O Object •O Georiënteerd •P Programmeren.
Advertisements

Van domeinklasse tot implementatie
Hoofdstuk 10.2 Rekenmachine-casus.
Het type int Tekenen met Java operatoren
Hoofdstuk 6: Controle structuren
Hoofdstuk 2 Hallo, C# !.
Array nDeclaratie nCreatie nOpvragen nWijzigen nLengte String [ ] a; a = new String[10]; ……a[5]…… a[5] = ……; …a.Length… …is eigenlijk overbodig! List a;
Hoofdstuk 8.5 Subklassen. versie-management problematiek Voortborduren op eerder gedaan werk nEerste poging: “knip&plak” class Twee { int x, y; int oud.
Hoofdstuk 8 Objecten en klassen.
JAVA -- H51 CONSTRUCTOR –- COPY-CONSTRUCTOR 1Constructor: Dezelfde naam als de klasse Wordt uitgevoerd d.m.v. new Initialisatie van de (private) attributen.
Consoletoepassing Variabelen Klassen
LauwersCollege Buitenpost Java Applet programma dat op een website zichtbaar is Java Application programma dat zelfstandig werkt Javascript Scripttaal.
Opgave 2a nMet een InputStream lees je bytes uit een binare file nMet een Reader lees je characters uit een tekstfile.
KINN 2010 OOP O Object O Georiënteerd P Programmeren.
Hoofdstuk 5 Interactie. Controls Form Label Button Label TextBox.
Animatie nAnimatie: “tekenfilm” programma toont automatisch veranderende beelden nGemakkelijk te programmeren met gebruik van de klasse Thread “draadje”
Hoofdstuk 11.3 Algoritmen: Zoeken in een netwerk.
Tircms03-p les 4 Klassen. Abstracte datatypes in C struct stack { char info[100]; int top; }; void reset(stack *s) { s->top = -1; } void push(stack *s,
Hoofdstuk 8.5 Subklassen. versie-management problematiek Voortborduren op eerder gedaan werk nEerste poging: “knip&plak” class Twee { int x, y; int oud.
Hoofdstuk 14.1 Algoritmen: Zoeken in een netwerk.
Hoofdstuk 10.3 Tekst-editor: MDI-interface Dialogen Files lezen Abstracte klassen.
Hoofdstuk 3 Methoden om te tekenen.
Over-erving nObjecten van een subklasse erven variabelen en methoden&properties van de superklasse kleiner straal CirkelGroei geërfd zelf gede- clareerd.
Programma zonder window commandline interface. Commandline programma public static void main (String [ ] params) { System. out. println (“Hoi allemaal!”);
2e Deeltentamen nNagekeken werk ligt voor in de zaal (alfabetisch op achternaam) nOmcirkeld: tentamen2 Achter pijltje: gemiddelde tot nu toe nNeem het.
Reader en Writer Stream FileStream MemoryStream NetworkStream BufferedStream GZipStream CryptoStream TextWriter StreamWriter StringWriter BinaryWriter.
Programma opdrachten methoden klasse variabelen en Geheugen objecten klasse zijn gegroepeerd in hebben als type veranderen bewerken.
Hoofdstuk 2 Hallo, C# !. Opbouw broncode nOpdrachten om het geheugen te veranderen nOpdrachten zijn gegroepeerd in methoden nMethoden zijn gegroepeerd.
Gelijkheid van Strings static bool Gelijk( string s, string t) { } int m = s.Length; int n = t.Length; for (i=0; i
Programma opdrachten methoden klasse variabelen en Geheugen objecten klasse zijn gegroepeerd in hebben als type veranderen bewerken.
Eerste deeltentamen nNagekeken werk ligt voor in de zaal nNeem je eigen werk mee: in het college wordt het besproken nVragen over de beoordeling: in de.
1e Deeltentamen nNagekeken werk ligt voor in de zaal (alfabetisch op achternaam) nNeem het even mee, de uitwerking wordt in het college besproken nDiscussies.
Aangepaste timing nTheorie (16 colleges + 2 deeltentamens) nPraktijk (16 keer, 3 inleveropdrachten) college Tent. 1 Tent. 3 college prakt. 1 prakt. 3 prakt.
Windows-applicatie class HalloWin1 { static void Main ( ) { } Form scherm; scherm = new Form( ); Application.Run(scherm); using System.Windows.Forms; scherm.Text.
Opbouw van het Netwerk void Lees (string filenaam ) { while ( (regel=sr.ReadLine()) != null ) { string [] r = regel.Split(" ", StringSplitOptions.RemoveEmpty.
Exceptions Exception: nUitzonderlijke toestand die door een methode wordt opgeworpen nDe situatie moet door de aanroeper van de methode worden opgevangen.
Windows-applicatie using System.Windows.Forms; using System.Drawing;
Aanroep van een methode voert opdrachten uit in de body daarvan
Lezen en schrijven van tekst
2e Deeltentamen Nagekeken werk ligt voor in de zaal (alfabetisch op achternaam) Neem het even mee, de uitwerking wordt in het college besproken Discussies.
Voortborduren op eerder gedaan werk
ISensorEventListener
1e Deeltentamen Nagekeken werk ligt voor in de zaal (alfabetisch op achternaam) Neem het even mee, de uitwerking wordt in het college besproken Discussies.
Reader en Writer leest en schrijft bytes leest string en char
string versus char string char klasse primitief type
Wat gaan we doen? Theorie (14 colleges + 3 deeltentamens)
Windows-applicatie using System.Windows.Forms; using System.Drawing;
Gameprogrammeren: Methoden
vandaag èn vrijdag deadline maandag 12 dec.
Publieksvraag // schrijf een static methode die telt hoe // vaak een symbool voorkomt in een string // voorbeeld-aanroep: int n; n = Demo . Freq(’e’,
Lezen en schrijven van tekst
Gameprogrammeren: Tiles in Tick Tick
Declaratie Declaratie reserveert geheugenruimte
1. Een klasse is… Een groepje opdrachten Een groepje variabelen
Arjan Egges & Paul Bergervoet
Gameprogrammeren: Game Basics
Syntax van opdracht opdracht naam naam ( expressie ) ; . , expressie
Voorbeeld: Simulatie van bewegende deeltjes
Wat gaan we doen? Theorie (14 colleges + 3 deeltentamens)
Voortborduren op eerder gedaan werk
Libraries, Platform Games
Opdrachten herhalen public void tekenScherm (object o, PEA pea)
Arjan Egges Paul Bergervoet Wouter van Toll
Aanroep van een methode voert opdrachten uit in de body daarvan
Gameprogrammeren: Tiles en File I/O in Tick Tick
Gameprogrammeren: Klassen en objecten
Implementatie Zoekboom
Object Communication (Jewel Jam)
Exceptions Exception:
Eerste deeltentamen Nagekeken werk ligt voor in de zaal
Transcript van de presentatie:

Practicum: schets-editor MDI- Container Menu SchetsWin Tools SchetsControl Akties

Member-variabelen class SchetsWin class SchetsControl class Schets : Form : UserControl { { { MenuStrip strip; Schets schets; Bitmap bm; SchetsControl sc; Color kleur; ISchetsTool huidig; } } }

Schoonmaakwerk doen class SchetsWin class SchetsControl class Schets : Form : UserControl { { { MenuStrip strip; Schets schets; Bitmap bm; SchetsControl sc; Color kleur; void Teken (Graphics g) ISchetsTool huidig; void teken(...PEA p) SchetsWin() { gr.DrawImage (bm, 0, 0); { schets.Teken (p.Graphics); { sc = new SchetsControl(); } } this.maakAkties(); } void Schoon( ) void Schoon(...AE a) void maakAkties() { Graphics g = { schets.Schoon(); { Button b Graphics. FromImage(bm); = new Button(); this.Invalidate(); b.Text = "Clear"; } g.FillRectangle (White,0,0,w,h); b.Click += sc.Schoon; } } } } }

Tool gebruiken class SchetsWin interface ISchetsTool : Form SchetsControl sc; { MenuStrip strip; ISchetsTool huidig; { SchetsWin ( ) void MuisVast( { sc = new SchetsControl ( ); SchetsControl s, sc.MousePress += this.muis; } Point p); void muis ( object o, MEA mea) { huidig.MuisVast( sc, mea.Location) } void klikTool ( object obj, AE ae ) { huidig = (ISchetsTool) ( (Button) obj ) . Tag } } }

Tool gebruiken class SchetsWin interface ISchetsTool anonieme methode : Form SchetsControl sc; { MenuStrip strip; ISchetsTool huidig; { SchetsWin ( ) void MuisVast( { sc = new SchetsControl ( ); SchetsControl s, sc.MousePress += ( object o, MEA mea) => Point p); anonieme methode { huidig.MuisVast( sc, mea.Location); } } void klikTool ( object obj, AE ae ) { huidig = (ISchetsTool) ( (Button) obj ) . Tag } } }

Schets-tools (1) interface ISchetsTool { } void muisVast ( SchetsControl s, Point p) ; void muisLos ( SchetsControl s, Point p) ; void muisDrag ( Schetscontrol s, Point p ) ; void Letter ( SchetsControl s, char k) ;

Schets-tools (2) abstract class StartpuntTool : ISchetsTool { } Point startpunt ; Brush kwast ; virtual void MuisVast ( SchetsControl s, Point p) { startpunt = p; } virtual void MuisLos ( SchetsControl s, Point p) { kwast = new SolidBrush( s.Penkleur ); } abstract void MuisDrag ( SchetsControl s, Point p) ; abstract void Letter ( SchetsControl s, Point p) ;

Schets-tools (3) class TekstTool : StartpuntTool { } ISchetsTool Startpunt Tool class TekstTool : StartpuntTool { } override void Letter ( SchetsControl s, char c) { } Graphics g = s . MaakBitmapGraphics(); g . DrawString( c, kwast, ..., startpunt ); startpunt.x += ……c….Width; override void MuisDrag ( SchetsControl s, Point p) { } override void MuisLos ( SchetsControl s, Point p) { }

Schets-tools (4) abstract class TweepuntTool : StartpuntTool { } TekstTool Tweepunt Tool ISchetsTool Startpunt Tool abstract class TweepuntTool : StartpuntTool { } override void MuisDrag ( SchetsControl s, Point p) { } Graphics g = s . CreateGraphics(); this . Bezig (g, startpunt, p); override void MuisLos ( SchetsControl s, Point p) { Graphics g = s . MaakBitmapGraphics(); this . Compleet (g, startpunt, p); } abstract void Bezig (Graphics g, Point p1, Point p2) ; virtual void Compleet (Graphics g, Point p1, Point p2) { this . Bezig (g, p1, p2); }

Schets-tools (5) class RechthoekTool : TweepuntTool { } TekstTool Tool Startpunt Tool Tweepunt Tool Rechthoek Tool class RechthoekTool : TweepuntTool { } override void Bezig ( Graphics g, Point p1, Point p2 ) { g . DrawRectangle(kwast, Punten2Rechthoek(p1,p2) ); } static Rectangle Punten2Rechthoek(Point p1, Point p2) return new Rectangle( { new Point( Math.Min(p1.X,p2.X), Math.Min(p1.Y,p2.Y)) new Size ( Math.Abs(p1.X-p2.X), Math.Abs(p1.Y-p2.Y)) ); }

Schets-tools (6) class VolRechthoekTool : RechthoekTool { } TekstTool Tool Startpunt Tool Tweepunt Tool Rechthoek Tool VolRechth Tool class VolRechthoekTool : RechthoekTool { } override void Compleet ( Graphics g, Point p1, Point p2 ) { } g . FillRectangle(kwast, Punten2Rechthoek(p1,p2) );

Schets-tools (7) class LijnTool : TweepuntTool { } TekstTool LijnTool Tool Startpunt Tool Tweepunt Tool Rechthoek Tool VolRechth Tool class LijnTool : TweepuntTool { } override void Bezig ( Graphics g, Point p1, Point p2 ) { } g . DrawLine( MaakPen(kwast,3), p1, p2 );

Schets-tools (8) class PenTool : LijnTool { } TekstTool LijnTool PenTool Tool Startpunt Tool Tweepunt Tool Rechthoek Tool VolRechth Tool class PenTool : LijnTool { } override void MuisDrag ( SchetsControl s, Point p ) { } this . MuisLos (s, p); this . MuisVast (s, p);

Schets-tools (9) class GumTool : PenTool { } TekstTool LijnTool PenTool GumTool Tool Startpunt Tool Tweepunt Tool Rechthoek Tool VolRechth Tool class GumTool : PenTool { } override void Bezig ( Graphics g, Point p1, Point p2 ) { } g . DrawLine( MaakPen(Brushes.White,7), p1, p2 );

Algoritmen: Console-applicaties Hoofdstuk 11.1 Algoritmen: Console-applicaties

Console applicatie statische methode statische methoden class Hallo { static void Main ( ) { Console . WriteLine("Wat is je naam?"); string naam = Console . ReadLine( ); Console . WriteLine("Hallo " + naam + "!" ); } }

class Console class Console { TextReader In { get; } TextWriter Out { get; } static void WriteLine( string s ) { Console . Out . WriteLine( s ); } static string ReadLine( ) { return Console . In . ReadLine( ); } }

class TextReader abstract class TextReader { string ReadToEnd( ) { StreamReader string resultaat, regel; regel = this.ReadLine( ); StringReader while (regel != null) { resultaat += regel + "\n" ; regel = this.ReadLine( ); } return resultaat; } abstract string ReadLine( ) ; }

class TextReader abstract class TextReader toekennen { string ReadToEnd( ) { en meteen testen string resultaat, regel; regel = this.ReadLine( ); while (regel != null) ( (regel = this.ReadLine()) != null ) { resultaat += regel + "\n" ; regel = this.ReadLine( ); } return resultaat; } abstract string ReadLine( ) ; }

Commandline programma $> date parameters voor het programma parameters voor het programma Fri Oct 29, 11:30 $> ls aap.txt hallo.doc prog.cs $> grep void prog.cs prog.cs, line 6: void Main() prog.cs, line 10: void teken() $> ls > files.txt $> output redirection

Voorbeeld file-processor grep patroon file1 file2 ... Unix-commando laat alle regels van de files zien waarin het gegeven patroon voorkomt (met filenaam en regelnummer)

Grep: main class Grep { static void Main ( string [ ] params ) { if (params.Length==0) Console.WriteLine("Usage: Grep patroon file ..."); else for (int t=1; t<params.Length; t++) Grep.bewerk( params[0], params[t] ); }

Grep: bewerk static void bewerk (String pat, String naam) { TextReader reader; String regel; try { if (naam=="") reader = Console.In; else reader = new StreamReader (naam); while ( for (int n=1; ( regel=reader.ReadLine() ) != null ; n++ ) if ( regel . Contains (pat) ) Console.WriteLine( naam + n + regel ); } catch (Exception e) { Console.WriteLine(naam + e); }

Algoritmen: Zoeken in een netwerk Hoofdstuk 11.3 Algoritmen: Zoeken in een netwerk

Routeplanner Spoorwegkaart: Klik startpunt Klik eindpunt Programma bepaalt route start Klik nieuw startpunt...

Modellering Zoek de “beste” route elk traject heeft “kosten”; route met laagste totaalprijs is de beste Zoek de “beste” route Opbouw van het netwerk staat in een file, met: voor elke stad: naam en coördinaten voor elke weg: 2 steden, en de kosten stad Amersfoort 330 350 stad Amsterdam 250 310 stad Apeldoorn 420 330 weg Amersfoort Apeldoorn 43 weg Amsterdam Hilversum 29 weg Hilversum Amersfoort 16

Specificatie Bij eerste muisklik: aangewezen stad is het beginpunt toon die in blauw Bij tweede muisklik: aangewezen stad is eindpunt bereken de route, en toon die in rood Bij klik buiten een stad: telt niet mee en 3e, 5e, 7e... en 4e, 6e, 8e...

Opdeling in klassen Interactieve interface Belangrijke object-typen met EventHandler voor: teken klik class RouteZoeker : Form Belangrijke object-typen met in elke klasse: een constructor-methode een methode Teken om zichzelf te tekenen ... class Stad class Weg class Pad class Netwerk

Klasse-ontwerp wat is ... wat kan ... en hoe ? member- variabelen methode- headers een object en hoe ? methode- bodies

De klasse RouteZoeker class RouterZoeker : Form { “het” netwerk Netwerk netwerk; de “blauwe” stad Stad stad1; of null Pad pad; het “rode” pad of null Button b; TextBox t; Label lab; we tekenen alles zelf! Event-handlers void klik(..., MouseEventArgs mea) { ...... } void teken(..., PaintEventArgs pea) { ...... }

ICollection<Stad> Steden; De klasse Netwerk class Netwerk { alle steden op de kaart alle steden op de kaart Stad [ ] Steden; ICollection<Stad> Steden; we gaan per stad alle uitgaande wegen bewaren ICollection<Weg> Wegen;

De klasse Stad class Stad { string Naam; Utrecht Point Plek; ICollection<Weg> Wegen;

De klasse Weg class Weg { Stad Doel; int Kosten;

ongeveer een LinkedList, De klasse Pad class Pad { IList<Stad> Steden; Stad Hier; Pad Rest; int Kosten; ongeveer een LinkedList, maar dan zelfgemaakt null

Methoden van Stad Utrecht class Stad { String Naam; Point Plek; ICollection<Weg> wegen; static Font font = new ... Stad ( { } String s, Point p ) Naam = s; Plek = p; Wegen = new LinkedList<Weg> ( ); void Teken (Graphics gr, Brush br) { gr . FillRectangle(br , Plek.X-5, Plek.Y-5, 10, 10 ); Utrecht gr . DrawString (Naam, font, br , Plek + new Size(6,-15) ); }

Methoden van Weg class Weg { Stad Doel; int Kosten; wordt niet getekend Weg ( { } Stad s, int k ) Doel =s; Kosten = k; void Teken (Graphics gr, Pen pen ) { } , Stad bron ) gr . DrawLine ( pen, bron.Plek, Doel.Plek );

Methoden van Pad class Pad { Stad Hier; Pad Rest; int Kosten; totale kosten van het pad Pad ( { } Stad s, Pad r, int k ) Hier = s; Rest = r; Kosten = k; if (Rest != null) Kosten += Rest.Kosten; void Teken (Graphics gr, Brush br, Pen pen) { } Hier . Teken (gr, br); if (Rest != null) { } gr.DrawLine( pen, Hier.Plek, Rest.Hier.Plek ); Rest . Teken (gr, br, pen);

Methoden van Netwerk class Netwerk { ICollection<Stad> Steden; } Steden = new LinkedList<Stad> ( ); void Teken (Graphics gr) { } foreach ( Stad stad in Steden ) { } stad . Teken (gr, Brushes.Black); bron foreach ( Weg w in stad.wegen ) w.Teken (gr, Pens.Black, stad)

Methoden van RouteZoeker class RouteZoeker { Netwerk netwerk; Stad stad1; Pad pad; RouteZoeker ( ) { } netwerk = new Netwerk(); stad1=null; pad=null; void teken (object o, PaintEventArgs pea) { Graphics gr = pea.Graphics; } netwerk . Teken (gr); if (pad != null) pad . Teken(gr, Brushes.Red, Pens.Red); if (stad1 != null) stad1 . Teken(gr, Brushes.Blue);

Opbouw van het Netwerk Lees een file met regels zoals: locatie stad Almelo 520 280 stad Amersfoort 330 350 stad Amsterdam 250 310 stad Apeldoorn 420 330 stad Arnhem 410 380 weg Arnhem Zutphen 29 weg Zutphen Deventer 16 weg Deventer Zwolle 31 weg Amsterdam Weesp 14 weg Weesp Hilversum 15 weg Hilversum Amersfoort 16 locatie commando kosten

Opbouw van het Netwerk void Lees (string filenaam ) { StreamReader sr = new StreamReader(filenaam); while ( (regel=sr.ReadLine()) != null ) { string [] r = regel.Split(" ", StringSplitOptions.RemoveEmpty ); if (r.Length==4) if (r[0] == "stad") { } else this . bouwStad (r[1] new Point( int.Parse(r[2]) , int.Parse(r[3]) ) ); this.bouwWeg( r[1], r[2], int.Parse(r[3]) ); } } }

Opbouw van het Netwerk void bouwStad (string naam, Point p) { } Stad st = new Stad(naam, p); Steden . Add (st); Netwerk’s void bouwWeg (string van, string naar, int kosten) { } Stad st1 = this . vindStad (van); Stad st2 = this . vindStad (naar); st1 . BouwWeg (st2, kosten); st2 . BouwWeg (st1, kosten); class Stad { void BouwWeg(Stad doel, int k) { } Stad’s Wegen . Add ( new Weg(doel, k) );

Opbouw van het Netwerk Stad vindStad (String naam) { } foreach ( Stad st in Steden ) { } if ( st.naam == naam ) return st ; return null ; Stad VindStad (Point p) { foreach ( Stad st in steden ) { } if ( p.X-st.Plek.X < 5 && p.Y-st.Plek.Y <5 ) Math.Abs( ) Math.Abs( ) return st ; return null ;

Interactie in RouteZoeker class RouteZoeker : Form { Netwerk netwerk; Stad stad1; Pad pad; void klik (..., MouseEventArgs mea) { } Stad s = netwerk . VindStad( ); mea.Location if ( s != null ) { } eerste klik of tweede klik? if (stad1==null) else stad1 = s; { stad1 = null; } pad = netwerk . ZoekPad (stad1, s ); this . Invalidate ();

Het zoek-algoritme maak een stapel van nog-niet-complete, maar veelbelovende paden Pad ZoekPad (Stad begin, Stad eind) { Stack<Pad> paden = new Stack<Pad>();

Het zoeken begint... Pad pad; pad = new Pad(begin, null, 0); paden . push (pad); maar wel veelbelovend! hij is niet groot... null

Onderzoek paden uit stapel... while ( paden.Count > 0 ) { Pad pad = paden . pop(); if (pad.Hier==eind) return pad; foreach ( Weg weg in pad . Hier . Wegen ) { beter = new Pad( paden . Push(beter); weg.Doel, pad, weg.Kosten); } } return null;

niet in een kringetje zoeken! Pas op: niet in een kringetje zoeken! één van de wegen kom je net vandaan! foreach ( Weg weg in pad.Hier.Wegen ) { } if ( ! pad . Bevat (weg.Doel) ) { } beter = new Pad( paden . Push(beter); weg.Doel, pad, weg.Kosten);

Niet de eerste oplossing, maar de beste zoeken! beste = null; while ( ... ) { pad = ... if (compleet) return pad; for (...) if ( !kring ) paden.Push(...) } return null; while ( ... ) { pad = ... if (compleet) return pad; for (...) if ( !kring ) paden.Push(...) } return null; beste=pad; if (beter) beste=pad; && !zinloos) return beste;

Uitwerking Wat is “beter” ? Wat is “niet zinloos” ? if ( beste==null || pad.Kosten < beste.Kosten ) beste = pad; if ( beste==null || pad.Kosten + weg.Kosten < beste.Kosten ) paden.Push (new Pad (...) );

Verbetering van het algoritme De meest veelbelovende eerst onderzoeken Dus in volgorde van afstand tot naar pushen ordenen qua afstand tot doel moet een lComparer zijn wegen = new SortedSet<Weg>( pad.Hier.Wegen , naar ); class Stad : IComparer<Weg> { { int Compare( Weg a, Weg b) { return this.afstand(b.doel) – this.afstand(a.doel); }

Routezoeker compleet!