C# programmering

Preview:

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

Per Printz Madsen AAU 1

Grundlæggende Datanet

C# programmering

Per P. Madsen

Afd. for Proceskontrol

Institut for elektroniske systemer

Aalborg Universitet

Per Printz Madsen AAU 2

Del 1: Objekt-orienteret programmering og C#

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

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

Per Printz Madsen AAU 4

Water-fallsmetoden

Per Printz Madsen AAU 5

Spiral-modellen

Per Printz Madsen AAU 6

UML Unified Modeling Language Standardiseret specifikations sprog til:

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

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.

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.

Per Printz Madsen AAU 9

Use Case diagram

Per Printz Madsen AAU 10

Aktivitets diagram for sæt parametre

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

Per Printz Madsen AAU 12

Deployment Diagram

- Hvor skal de enkelte software dele placeres?

Per Printz Madsen AAU 13

Klasse diagram- Strukturen af selve problemet.

Per Printz Madsen AAU 14

Design fasen

• Sekvenser. Hvem kalder hvem?

• Objekt tilstande. Adfærd af objekterne.

• Algoritme design.

Per Printz Madsen AAU 15

Sekvensdiagram

Per Printz Madsen AAU 16

Objekt tilstande

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

Per Printz Madsen AAU 18

Objekt orienteret programmering

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

Så kan programmeringen begynde.

Per Printz Madsen AAU 19

C# (CSharp)

Et objektorienteret programmeringssprog.

Første version fra MicroSoft i 2001

Nyeste version er C# 2005

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

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

} }

}

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

Per Printz Madsen AAU 23

Using System; ......

Namespace ......{ classe komponentnavn1

{Data.metoder.

}classe komponentnavn2{

Data.metoder.

} class startkomponent

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

}}

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

}}

}

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

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"

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;

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

}}

}

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

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’

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&, |, ^, ~

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;

}

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

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.

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

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

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

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

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

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

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

Per Printz Madsen AAU 42

Del 2: Avanceret C# programmering

• WindowForm programmering.

• Grafik.

• Flere-trådet programmering.

• Netværksprogrammering.

• Database access.

Per Printz Madsen AAU 43

Eksempel: SimpelPlot

Per Printz Madsen AAU 44

Klassediagram

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

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

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

Per Printz Madsen AAU 48

Vis eksempel.

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.

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

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

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.

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;

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

}}

}

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

Per Printz Madsen AAU 56

Deadlock

Tråd 1 Tråd 1

Resurse 1

Resurse 2

Har lock

Ønsker lock

Ønsker lock

Har lock

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

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

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

}}

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

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

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

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

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

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

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

Recommended