660 likes | 946 Views
Grundlæggende Datanet. C# programmering. Per P. Madsen Afd. for Proceskontrol Institut for elektroniske systemer Aalborg Universitet. Del 1: Objekt-orienteret programmering og C#. Intro. til UML og OO* C# programstruktur. Typer, kontrolstrukturer. Data og metoder.
E N D
Grundlæggende Datanet C# programmering Per P. Madsen Afd. for Proceskontrol Institut for elektroniske systemer Aalborg Universitet Per Printz Madsen AAU
Del 1: Objekt-orienteret programmering og C# • Intro. til UML og OO* • C# programstruktur. • Typer, kontrolstrukturer. • Data og metoder. Per Printz Madsen AAU
Software udviklingsmetoder. Overordnet metode: • Fastlæg kravene til systemet. ’’Kravspecifikation’’ • Analyser omverdnen og systemet. ’’Usecase’’ • Beskriv strukturen af systemet. ’’Klassediagram’’ • Design systemet. ’’Algoritmer, sekvenser og tilstande’’ • Programmer. Løbende test af enkelte dele. • Accept test. ’’Opfylder systemet kravspecifikationen?’’ Per Printz Madsen AAU
Water-falls metoden Per Printz Madsen AAU
Spiral-modellen Per Printz Madsen AAU
UML Unified Modeling Language • Standardiseret specifikations sprog til: • understøttelse af objektorienteret software udvikling. • beskrivelse af objektorienteret software. Per Printz Madsen AAU
UML Unified Modeling Language • Functional Model • Viser funktionaliteten af systemet fra brugerens synspunkt. • Beskrivelsesform: Use Case Diagram. • Object Model • Viser strukturer og understrukturer af systemet ved hjælp af klasser, attributter, operationer og associationer. • Beskrivelsesform: Deployment Diagram og Class Diagram. • Dynamic Model • Viser den interne adfærd af systemet. • Beskrivelsesform: Sequence Diagram, Activity Diagram og State Machine Diagram. Per Printz Madsen AAU
Analyse fasen • Kik på brugen af systemet. Anvendelsesområdet. • Kik på den fysiske struktur. Hardwaren der anvendes. • Kik på problemets struktur. Problem området. Per Printz Madsen AAU
Use Case diagram Per Printz Madsen AAU
Aktivitets diagram for sæt parametre Per Printz Madsen AAU
Design layout • Øjet kikker først øverst til venstre. • Ved dialog, husk Cancel/Annuller nederst til højre. • Ved brug af farver, ha’ en veldefineret betydning. • Samme effekt af samme handling. Indlæs fil dialog Vælg fil Default.txt Hjælp Indlæs Annuller Per Printz Madsen AAU
Deployment Diagram - Hvor skal de enkelte software dele placeres? Per Printz Madsen AAU
Klasse diagram - Strukturen af selve problemet. Per Printz Madsen AAU
Design fasen • Sekvenser. Hvem kalder hvem? • Objekt tilstande. Adfærd af objekterne. • Algoritme design. Per Printz Madsen AAU
Sekvensdiagram Per Printz Madsen AAU
Objekt tilstande Per Printz Madsen AAU
Algoritmer • Pseudo kode • Aktivitetsdiagrammer. Fx for RegAlgo run. • Hent ny måleværdi og ny reference. • Beregn fejlen: E • Beregn outputtet: O = P*E + I*EI + D*(E-oldE) • Sæt status: EI= EI+E og oldE= E Per Printz Madsen AAU
Objekt orienteret programmering Nu er både den statiske og dynamiske struktur på plads Så kan programmeringen begynde. Per Printz Madsen AAU
C# (CSharp) Et objektorienteret programmeringssprog. Første version fra MicroSoft i 2001 Nyeste version er C# 2005 Per Printz Madsen AAU
.NET arkitekturen filnavn.vb filnavn.cs filnavn.cpp Forskellige compilere Fx: csc JIT compiler Assemblies .dll eller .exe (CIL) Maskin kode Per Printz Madsen AAU
C# introduktion. using System; Namespace MyFirst { class eks1 { public static void Main() { Console.WriteLine("Hej!"); Console.Write("Skriv dit navn her: "); string navn = Console.ReadLine(); Console.WriteLine("Hej igen - " + navn + ". Jeg er en meget arbejdsom medhjælp."); } } } Per Printz Madsen AAU
C# program struktur. De eksisterende systemer, der bruges. Navnet på dette system Komponet1(class) Data og kode Komponet2(class) Data og kode Komponet3(class) Data og kode Komponet4(class) Data og kode Per Printz Madsen AAU
Using System; ...... Namespace ...... { classe komponentnavn1 { Data. metoder. } classe komponentnavn2 { Data. metoder. } class startkomponent { static void Main() { Data; kode; } } } Per Printz Madsen AAU
using System; Namespace MyFirst { class Eks1 { private static float a; private static int funk1(float ap) { int a; a = (int)ap; return a; } private int funk2(float ap) { return 2*(int)ap; } static void Main(string[] args) { int a = funk1(3.4f); Eks1 p = new Eks1(); a=p.funk2((float)a); } } } Per Printz Madsen AAU
C#- overordnet • Alle programalgoritmer og data skal pakkes ind. – typisk i en klasse, dvs. ingen globale funktioner eller data. • Et eksekverbart program indeholder en metode Main() • applikationens startpunkt. • C# er case-sensitive. • C# har operator- og metodeoverloading. • Ingen multibel arv. • Alle klasser arver fra Object • Garbage-collection Per Printz Madsen AAU
Primitive datatyper Per Printz Madsen AAU
Tilskrivninger int x = 0; float[] ya= new float[10]; double[] za= {1,2,3,4,5,6,7}; int[,,] x3a= new int[3,4,5]; String tal = "3,4E-4"; Boolean flag1 = true; uint stort_tal = 23456789; ya[0]= (float)za[6]; x3a[1,2,3]= (int)stort_tal; ya[1]= (float)System.Convert.ToDouble(tal); tal = "dette er en floatværdi: " + tal; za[3] = Math.PI * Math.Cos(ya[1]) - 3; Per Printz Madsen AAU
using System; Namespace MyFirst { class Eks1 { private static float a; private static int funk1(float ap) { int a; a = (int)ap; return a; } private int funk2(float ap) { return 2*(int)ap; } static void Main(string[] args) { int a = funk1(3.4f); Eks1 p = new Eks1(); a=p.funk2((float)a); } } } Per Printz Madsen AAU
Access Modifiers • Public: Fuld access. • Private: Kun access fra klassen selv. • Protected: Klassen selv og de klasser, der arver fra denne klasse. • Internal: Kun access fra samme assembly (file). Per Printz Madsen AAU
Beregninger • +, -, * , / og % (modulus) • De sædvanlige regler gælder: 2+3*4 = 2+(3*4) = 14 • Math klassen indeholder statiske metoder: Cos, Sin, Tan, Exp, Log osv. • Divideres 2 hele tal (byte,int, long,,) , fås et helt tal ud: 23/4 giver5 • Divideres to tal, hvoraf det ene er et reelt tal, så fungerer alt som normalt • 23%4 giver 3, fordi 4 går op i 23 5 gange med 3 til rest’ Per Printz Madsen AAU
Kontrolstrukturen: if-else Relationer >, <, >=, <=, ==, != Type test is eks: ya is float[] Logiske ||, &&, ! eks:(x<=y) && (y< z) Bit vis logik &, |, ^, ~ if (x < y) { min = x; max = y; } else { min = y; max = x; } Per Printz Madsen AAU
Kontrolstrukturen: switch-case int x= 4; switch (x) { case 1: Console.WriteLine("x=1"); break; case 2: case 3: Console.WriteLine("x= 2 eller 3"); break; default: Console.WriteLine("x er ikke lig 1,2 eller 3"); break; } Per Printz Madsen AAU
Kontrolstrukturer: Loop double[] databuf = new double[5]; int i; for (i = 0; i < 5; i++) { databuf[i] = 0.0; } i=0; while (i<5) { databuf[i] = i = i+1; // i++; i+=1; } foreach (double x in databuf) { Console.WriteLine(x); } Per Printz Madsen AAU
Input/output float b = 29; Console.WriteLine("a= {0,6:F2}",b); Console.WriteLine("a= {0,-6:X}", b); b = .678e2F; string str1 = string.Format("a= {0,7:F2}", b); string str2= "Lidt mere tekst: \t"; string str3 = @" \dir\src\flie.c"; Console.WriteLine(str2 + str1 + str3); • Format: • D Decimaltal. • E Exponent. • F Fixed point. • P Procent. • X Hex. a= 29,00 a= 1D Lidt mere tekst: a= 67,80 \dir\src\flie.c Per Printz Madsen AAU
Skrivning til fil FileStream stream = new FileStream("udfil.txt", FileMode.Create); StreamWriter filoutput = new StreamWriter(stream); filoutput.WriteLine("a= {0,5:f2}", 5); filoutput.Flush(); filoutput.Close(); Filen: udfil.txt a= 5,00 Per Printz Madsen AAU
Binær fil FileStream bstream= new FileStream("udfil.bin", FileMode.Create); BinaryWriter bfil = new BinaryWriter(bstream); BinaryReader bin = new BinaryReader(bstream); bfil.Write((double)b); bfil.Write((double)b + 1); bfil.Write((double)b + 2); bstream.Seek(0, SeekOrigin.Begin); Boolean eof = false; while (!eof) { try { Console.WriteLine("in værdi= {0,7:f2}",bin.ReadDouble()); } catch (EndOfStreamException) { eof = true; } } bfil.Close(); Per Printz Madsen AAU
try-catch-throw static void ProcessString(string s) { if (s == null) { throw new Exception("ProcessString: - Parameter isnull\n"); } } //------------------------------------------------------- try { string s = null; ProcessString(null); } catch (Exception e) { Console.WriteLine("{0} \n-- Exception caught. --", e); } Per Printz Madsen AAU
Udskrift ved fanget exception System.Exception: ProcessString: - Parameter is null at csharpEks.Program.ProcessString(String s) in C:\Documents and Settings\ppm\Dokumenter\Undervisning\Bila\csharpEks\Program.cs:line 62 at csharpEks.Program.Main(String[] args) in C:\Documents and Settings\ppm\Dokumenter\Undervisning\Bila\csharpEks\Program.cs:line 170 -- Exception caught. -- Per Printz Madsen AAU
Metode-overloading void udskriv(float a) { .... } void udskriv(int a) { .... } De kan adskilles hvis: • Forskellige typer af parametre. • Forskellige antal parametre. • Forskellig overføringsmetode (value/ref/out). Per Printz Madsen AAU
Parameter overføring void inc(int x) { x=x+1;} void inc(ref int x) { x=x+1;} void readback(out string tekst){tekst=Console.Read();} ......... int val = 3; inc(val); // val har værdien 3 efter kaldet inc(ref val); // val har værdien 4 efter kaldet String txt; Readback(out txt); Per Printz Madsen AAU
Constructor class Rectangle { int x,y,h,w; public Rectangle(int x, int y, int h, int w) {this.x=x; this.y=y; this.h=h; this.w=w;} public Rectangle(int h, int w) {this.x=0; this.y=0; this.h=h; this.w=w;} public Rectangle() {this.x=0; this.y=0; this.h=50; this.w=100;} ..... } Rectangle rec1= new Rectangle(10,10,30,50); Rectangle rec2= new Rectangle(); Per Printz Madsen AAU
Del 2: Avanceret C# programmering • WindowForm programmering. • Grafik. • Flere-trådet programmering. • Netværksprogrammering. • Database access. Per Printz Madsen AAU
Eksempel: SimpelPlot Per Printz Madsen AAU
Klassediagram Per Printz Madsen AAU
Event styret programmering. Kø Museknapper Musebevægelse Tastatur Timer Netværk Osv. Eventkandler løkke private void timer_Tick(object sender, EventArgs e) { ........ } private void but_Click(object sender, EventArgs e) { ........ } Per Printz Madsen AAU
Grafik. Skaf ’’Graphics’’ objektet for det du vil tegne på. Fx: Graphics g= grafBox.CreateGraphics(); Pen pen = new Pen(Color.Black,3); g.DrawLine(pen, 0, 0, 100, 100); 0,0 Per Printz Madsen AAU
Grafik. Skal gentegnes når: Vindue flyttes, foran liggende vindue fjernes, osv. Løsning: Re-tegn hver gang der komme et Paint-event. private void plot_but_Click( object sender, EventArgs e) { PlotForm pwin = new PlotForm(); pwin.setfilname(filename); pwin.setData(databuf); pwin.Show(); } private void grafBox_Paint(object sender, PaintEventArgs e) { g = e.Graphics; pen= new Pen(gcolor,1); for (int i = 0; i < symboler.Count; i++) ((gsymbol) symboler[i]).plot(g, pen); } Per Printz Madsen AAU
Vis eksempel. Per Printz Madsen AAU
Flere trådet programmering. Ofte består et program af flere parallelle opgaver. • Behandel data fra net. • Logning af status. • Udskrift på skærmen. • Behandling af kommando fra skærmen. • osv. Strukturmæssigt er det nemmest at betragte disse programmer hver for sig. Dvs. flere parallelle programmer på en maskine. Flere trådet programmering. Per Printz Madsen AAU
To tråde: t1 og t2. static Thread t1, t2; static void traad1() { while (true) { Console.WriteLine("hej jeg er traad 1"); t2.Resume();} } static void traad2() { while (true) { Console.WriteLine("hej jeg er traad 2"); t2.Suspend();} } static void Main(string[] args) { t1 = new Thread(new ThreadStart(traad1)); t2 = new Thread(new ThreadStart(traad2)); t1.Start();t2.Start(); } Per Printz Madsen AAU