66
Per Printz Madsen AAU 1 Grundlæggende Datanet C# programmering Per P. Madsen Afd. for Proceskontrol Institut for elektroniske systemer Aalborg Universitet

C# programmering

  • Upload
    maeko

  • View
    129

  • Download
    4

Embed Size (px)

DESCRIPTION

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. - PowerPoint PPT Presentation

Citation preview

Page 1: C# programmering

Per Printz Madsen AAU 1

Grundlæggende Datanet

C# programmering

Per P. Madsen

Afd. for Proceskontrol

Institut for elektroniske systemer

Aalborg Universitet

Page 2: C# programmering

Per Printz Madsen AAU 2

Del 1: Objekt-orienteret programmering og C#

• Intro. til UML og OO*• C# programstruktur.• Typer, kontrolstrukturer.• Data og metoder.

Page 3: C# programmering

Per Printz Madsen AAU 3

Software udviklingsmetoder.

Overordnet metode:

1. Fastlæg kravene til systemet. ’’Kravspecifikation’’

2. Analyser omverdnen og systemet. ’’Usecase’’

3. Beskriv strukturen af systemet. ’’Klassediagram’’

4. Design systemet. ’’Algoritmer, sekvenser og tilstande’’

5. Programmer. Løbende test af enkelte dele.

6. Accept test. ’’Opfylder systemet kravspecifikationen?’’

Page 4: C# programmering

Per Printz Madsen AAU 4

Water-fallsmetoden

Page 5: C# programmering

Per Printz Madsen AAU 5

Spiral-modellen

Page 6: C# programmering

Per Printz Madsen AAU 6

UML Unified Modeling Language Standardiseret specifikations sprog til:

• understøttelse af objektorienteret software udvikling. • beskrivelse af objektorienteret software.

Page 7: C# programmering

Per Printz Madsen AAU 7

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.

Page 8: C# programmering

Per Printz Madsen AAU 8

Analyse fasen

1. Kik på brugen af systemet.Anvendelsesområdet.

2. Kik på den fysiske struktur.Hardwaren der anvendes.

3. Kik på problemets struktur.Problem området.

Page 9: C# programmering

Per Printz Madsen AAU 9

Use Case diagram

Page 10: C# programmering

Per Printz Madsen AAU 10

Aktivitets diagram for sæt parametre

Page 11: C# programmering

Per Printz Madsen AAU 11

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.

Default.txt

Indlæs fil dialog

Vælg fil

AnnullerIndlæs

Hjælp

Page 12: C# programmering

Per Printz Madsen AAU 12

Deployment Diagram

- Hvor skal de enkelte software dele placeres?

Page 13: C# programmering

Per Printz Madsen AAU 13

Klasse diagram- Strukturen af selve problemet.

Page 14: C# programmering

Per Printz Madsen AAU 14

Design fasen

• Sekvenser. Hvem kalder hvem?

• Objekt tilstande. Adfærd af objekterne.

• Algoritme design.

Page 15: C# programmering

Per Printz Madsen AAU 15

Sekvensdiagram

Page 16: C# programmering

Per Printz Madsen AAU 16

Objekt tilstande

Page 17: C# programmering

Per Printz Madsen AAU 17

Algoritmer

• Pseudo kode

• Aktivitetsdiagrammer.

Fx for RegAlgo run.1. Hent ny måleværdi og ny reference.

2. Beregn fejlen: E

3. Beregn outputtet: O = P*E + I*EI + D*(E-oldE)

4. Sæt status: EI= EI+E og oldE= E

Page 18: C# programmering

Per Printz Madsen AAU 18

Objekt orienteret programmering

Nu er både den statiske og dynamiske struktur på plads

Så kan programmeringen begynde.

Page 19: C# programmering

Per Printz Madsen AAU 19

C# (CSharp)

Et objektorienteret programmeringssprog.

Første version fra MicroSoft i 2001

Nyeste version er C# 2005

Page 20: C# programmering

Per Printz Madsen AAU 20

.NET arkitekturen

filnavn.vb filnavn.cs filnavn.cpp

Forskellige compilere

Fx: csc

Assemblies.dll eller .exe (CIL)

Maskin kodeJIT compiler

Page 21: C# programmering

Per Printz Madsen AAU 21

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.");

} }

}

Page 22: C# programmering

Per Printz Madsen AAU 22

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

Page 23: C# programmering

Per Printz Madsen AAU 23

Using System; ......

Namespace ......{ classe komponentnavn1

{Data.metoder.

}classe komponentnavn2{

Data.metoder.

} class startkomponent

{static void Main() { Data; kode;}

}}

Page 24: C# programmering

Per Printz Madsen AAU 24

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);

}}

}

Page 25: C# programmering

Per Printz Madsen AAU 25

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

Page 26: C# programmering

Per Printz Madsen AAU 26

Primitive datatypertype Antel

byteOmråde Special format for literals

bool 1 true false

char 2 'A' '\x0041' '\u0041'

sbyte 1 -128 .. 127

byte 1 0 .. 255

short 2 -32768 .. 32767

ushort 2 0 .. 65535

int 4 -2147483648 .. 2147483647

uint 4 0 .. 4294967295 U suffix

long 8 0 .. 2^64-1 L or l suffix

ulong 8 -2^62 .. 2^63-1 U/u and L/l suffix

float 4 +-1.4E-45 .. +-3.4E38 F or f suffix

double 8 +-5.0E-324 .. +-1.7E308

decimal 16 +-1E28 .. +-7.9E28 M or m suffix

string "hello", @"C:\dir\f.txt"

Page 27: C# programmering

Per Printz Madsen AAU 27

Tilskrivningerint 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;

Page 28: C# programmering

Per Printz Madsen AAU 28

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);

}}

}

Page 29: C# programmering

Per Printz Madsen AAU 29

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).

Page 30: C# programmering

Per Printz Madsen AAU 30

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 giver 5

– 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’

Page 31: C# programmering

Per Printz Madsen AAU 31

Kontrolstrukturen: if-elseif (x < y){

min = x;max = y;

}else{

min = y;max = x;

}

Relationer

>, <, >=, <=, ==, !=

Type test

is eks: ya is float[]

Logiske

||, &&, !eks: (x<=y) && (y< z)

Bit vis logik&, |, ^, ~

Page 32: C# programmering

Per Printz Madsen AAU 32

Kontrolstrukturen: switch-caseint 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;

}

Page 33: C# programmering

Per Printz Madsen AAU 33

Kontrolstrukturer: Loopdouble[] 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);}

Page 34: C# programmering

Per Printz Madsen AAU 34

Input/outputfloat 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);

a= 29,00a= 1DLidt mere tekst: a= 67,80 \dir\src\flie.c

Format:D Decimaltal.E Exponent.F Fixed point.P Procent.X Hex.

Page 35: C# programmering

Per Printz Madsen AAU 35

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();

a= 5,00

Filen: udfil.txt

Page 36: C# programmering

Per Printz Madsen AAU 36

Binær filFileStream 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();

Page 37: C# programmering

Per Printz Madsen AAU 37

try-catch-throw static void ProcessString(string s){

if (s == null){ throw new Exception("ProcessString: - Parameter is null\n");}

}

//-------------------------------------------------------

try{

string s = null;ProcessString(null);

}catch (Exception e){

Console.WriteLine("{0} \n-- Exception caught. --", e);}

Page 38: C# programmering

Per Printz Madsen AAU 38

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. --

Page 39: C# programmering

Per Printz Madsen AAU 39

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).

Page 40: C# programmering

Per Printz Madsen AAU 40

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);

Page 41: C# programmering

Per Printz Madsen AAU 41

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();

Page 42: C# programmering

Per Printz Madsen AAU 42

Del 2: Avanceret C# programmering

• WindowForm programmering.

• Grafik.

• Flere-trådet programmering.

• Netværksprogrammering.

• Database access.

Page 43: C# programmering

Per Printz Madsen AAU 43

Eksempel: SimpelPlot

Page 44: C# programmering

Per Printz Madsen AAU 44

Klassediagram

Page 45: C# programmering

Per Printz Madsen AAU 45

Event styret programmering.MuseknapperMusebevægelseTastaturTimerNetværkOsv.

Eventkandlerløkke

private void timer_Tick(object sender, EventArgs e){ ........} private void but_Click(object sender, EventArgs e){ ........}

Page 46: C# programmering

Per Printz Madsen AAU 46

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

Page 47: C# programmering

Per Printz Madsen AAU 47

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); }

Page 48: C# programmering

Per Printz Madsen AAU 48

Vis eksempel.

Page 49: C# programmering

Per Printz Madsen AAU 49

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.

Page 50: C# programmering

Per Printz Madsen AAU 50

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();}

Page 51: C# programmering

Per Printz Madsen AAU 51

Thread interface.

• Prioritet:t1.Priority = ThreadPriority.BelowNormal;

//Normal(default),BelowNormal,Lowest,AboveNormal,Highest

• Sleep:Thread.Sleep(500);

• Join:t1.Join();

• Abort:t1.Abort();

Page 52: C# programmering

Per Printz Madsen AAU 52

Flere trådet programmering –nemt, men pas på.

• Race condition.Alle tråde kan tilgå samme, ikke lokale data.

Problem: Ikke konsistente data.

Løsning: Udelelig tilgang til fælles data (Mutual exclusion).

• Deadlock.To eller flere tråde venter på hinanden. Ingen kan køre

videre før en kører videre.

Mutual exclusion kan medføre deadlock.

Løsning: Brug mutual exclusion rigtigt.

Page 53: C# programmering

Per Printz Madsen AAU 53

Mutual exclusionTråd 1

Læser x;

Tråd 2

Læser x;x=x + a;Skriv x;

x=x + a;Skriv x;

Page 54: C# programmering

Per Printz Madsen AAU 54

Lock af område.class Databuf{

double a;public double DataVal{

set { lock (this) {

a = value; }

}

get { lock (this) {

return a; }

}}

}

Page 55: C# programmering

Per Printz Madsen AAU 55

Monitor kald.class RingBuffer{ const int size = 10; char[] buf = new char[size]; int inptr = 0, udptr=0, Antdata=0; public void put(char ch) { lock (this) { while (Antdata == size) Monitor.Wait(this); buf[inptr]=ch; inptr= (inptr + 1) % size; Antdata++; Monitor.PulseAll(this); } } public char get() { lock (this) { while (Antdata == 0) Monitor.Wait(this); char ch = buf[udptr]; udptr = (udptr + 1) % size; Antdata--; Monitor.PulseAll(this); return ch; } }}

Page 56: C# programmering

Per Printz Madsen AAU 56

Deadlock

Tråd 1 Tråd 1

Resurse 1

Resurse 2

Har lock

Ønsker lock

Ønsker lock

Har lock

Page 57: C# programmering

Per Printz Madsen AAU 57

Netværks-programmering

• Socket klassen– klassisk API.

• TCPListener og TcpClient– Easy to use lag oven på Socket.

• HttpListener og WebRequest– Kan bruges ved kommunikation gennem

firewalls

Page 58: C# programmering

Per Printz Madsen AAU 58

TCPListenerstatic void Main(string[] args){ TcpListener tcpl = new TcpListener(IPAddress.Any,60080); tcpl.Start(); do { try { Socket sock = tcpl.AcceptSocket(); ServerThread st = new ServerThread(sock); Thread th = new Thread(new ThreadStart(st.Th1)); th.Start(); } catch (Exception e) { Console.WriteLine("Exception message:{0}", e.Message); } } while (true);}

Page 59: C# programmering

Per Printz Madsen AAU 59

TCPListener

class ServerThread{

Byte[] indata = new Byte[256];ASCIIEncoding aencoder = new ASCIIEncoding();Socket sock;

public ServerThread(Socket s) {this.sock=s;}

public void Th1(){

int n= sock.Receive(indata,indata.Length,0); sock.Send(indata, n, 0); Console.WriteLine("Modtagen data: " + aencoder.GetString(indata, 0, n)); sock.Close();

}}

Page 60: C# programmering

Per Printz Madsen AAU 60

TCPClientstatic void Main(string[] args){ Byte[] indata= new Byte[256]; ASCIIEncoding aencoder= new ASCIIEncoding();

if (args.Length != 2) { Console.WriteLine( "TCPClient server tekst fx. TCPClient localhost hej<cr>"); } else { TcpClient cl= new TcpClient(args[0],60080); Stream cls= cl.GetStream(); cls.Write(aencoder.GetBytes(args[1]),0,args[1].Length); int n=cls.Read(indata,0,indata.Length); Console.Write("De modtagene data: " + aencoder.GetString(indata,0,n)); }}

Page 61: C# programmering

Per Printz Madsen AAU 61

HTTPserverpublic static void SimpleHTTPListener(){ HttpListener listener = new HttpListener(); listener.Prefixes.Add(@"http://*:8080/"); listener.Start(); while (true) { HttpListenerContext context = listener.GetContext(); HttpListenerRequest request = context.Request; Console.WriteLine(request.Url.ToString());

HttpListenerResponse response = context.Response; string responseString = "<HTML><BODY> Hello world!</BODY></HTML>"; byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString); response.ContentLength64 = buffer.Length; System.IO.Stream output = response.OutputStream; output.Write(buffer, 0, buffer.Length); output.Close(); Console.WriteLine("svar"); } listener.Stop();}

Page 62: C# programmering

Per Printz Madsen AAU 62

WebRequest

public static void Main(){ WebRequest request = WebRequest.Create("http://localhost:8080/tmp"); HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Stream dataStream = response.GetResponseStream(); StreamReader reader = new StreamReader(dataStream); string responseFromServer = reader.ReadToEnd();

Console.WriteLine(responseFromServer); reader.Close(); dataStream.Close(); response.Close();}

Page 63: C# programmering

Per Printz Madsen AAU 63

DataBase håndtering.

Microsoft Accessdatabase

C# program

Opret Connection.

Opbyg SQL Query KommandoUdfør SQL Query kommando

User IDPasswordFilnavn

SELECT FROM ..INSERT INTO ..UPDATE ..DELETE FROM ..

Page 64: C# programmering

Per Printz Madsen AAU 64

Opret Connection

OleDbConnection conn = new OleDbConnection(@" Provider=Microsoft.Jet.OLEDB.4.0; User Id=;Password=; Data Source= db1.mdb");

conn.Open();

Page 65: C# programmering

Per Printz Madsen AAU 65

Opbyg SQL Query kommandoUdfør SQL Query kommando

OleDbCommand cmd = conn.CreateCommand();cmd.CommandText = "SELECT * FROM Addresses";dbReader = cmd.ExecuteReader();while (dbReader.Read()){ string fornavn = (string)dbReader.GetValue(1); string efternavn = (string)dbReader["Address"]; string telenr = (string)dbReader["HomePhone"]; Console.WriteLine("{0},\t{1},\t{2}", fornavn, efternavn, telenr);}

Page 66: C# programmering

Per Printz Madsen AAU 66

Opbyg SQL Query kommandoUdfør SQL Query kommando

cmd = conn.CreateCommand();cmd.CommandText = @"INSERT INTO Addresses (FirstName, LastName, Address, HomePhone) VALUES(""Viggo"", ""Sørensen"",

""Lokesvej 17"", ""12345678"")";cmd.ExecuteNonQuery();