Download - C# programmering
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.
Kø
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();