C# programmering

Download Report

Transcript C# programmering

Grundlæggende Datanet
C# programmering
Per P. Madsen
Afd. for Proceskontrol
Institut for elektroniske systemer
Aalborg Universitet
Per Printz Madsen AAU
1
Del 1: Objekt-orienteret
programmering og C#
• Intro. til UML og OO*
• C# programstruktur.
• Typer, kontrolstrukturer.
• Data og metoder.
Per Printz Madsen AAU
2
Software udviklingsmetoder.
Overordnet metode:
1.
2.
3.
4.
5.
6.
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
3
Water-falls metoden
Per Printz Madsen AAU
4
Spiral-modellen
Per Printz Madsen AAU
5
UML Unified Modeling Language
Standardiseret specifikations sprog til:
• understøttelse af objektorienteret software udvikling.
• beskrivelse af objektorienteret software.
Per Printz Madsen AAU
6
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
7
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
8
Use Case diagram
Per Printz Madsen AAU
9
Aktivitets diagram for sæt parametre
Per Printz Madsen AAU
10
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
Per Printz Madsen AAU
Annuller
11
Deployment Diagram
- Hvor skal de enkelte software dele placeres?
Per Printz Madsen AAU
12
Klasse diagram
- Strukturen af selve problemet.
Per Printz Madsen AAU
13
Design fasen
• Sekvenser. Hvem kalder hvem?
• Objekt tilstande. Adfærd af objekterne.
• Algoritme design.
Per Printz Madsen AAU
14
Sekvensdiagram
Per Printz Madsen AAU
15
Objekt tilstande
Per Printz Madsen AAU
16
Algoritmer
•
•
Pseudo kode
Aktivitetsdiagrammer.
Fx for RegAlgo run.
1.
2.
3.
4.
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
17
Objekt orienteret programmering
Nu er både den statiske og dynamiske
struktur på plads
Så kan programmeringen begynde.
Per Printz Madsen AAU
18
C# (CSharp)
Et objektorienteret programmeringssprog.
Første version fra MicroSoft i 2001
Nyeste version er C# 2005
Per Printz Madsen AAU
19
.NET arkitekturen
filnavn.vb
filnavn.cs
filnavn.cpp
Forskellige compilere
Fx: csc
Assemblies
.dll eller .exe (CIL)
JIT compiler
Per Printz Madsen AAU
Maskin kode
20
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
21
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
22
Using System; ......
Namespace ......
{
classe komponentnavn1
{
Data.
metoder.
}
classe komponentnavn2
{
Data.
metoder.
}
class startkomponent
{
static void Main()
{ Data;
kode;
}
}
}
Per Printz Madsen AAU
23
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
24
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
25
Primitive datatyper
type
Antel
byte
Område
Special format for literals
bool
1
true false
char
2
'A'
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
string
'\x0041' '\u0041'
M or m suffix
"hello", @"C:\dir\f.txt"
Per Printz Madsen AAU
26
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
27
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
28
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
29
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
30
Kontrolstrukturen: if-else
if (x < y)
{
min
max
}
else
{
min
max
}
Relationer
= x;
= y;
= y;
= x;
>, <, >=, <=, ==, !=
Type test
is
eks:
ya is float[]
Logiske
||, &&, !
eks: (x<=y) && (y< z)
Bit vis logik
&, |, ^, ~
Per Printz Madsen AAU
31
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
32
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
33
Input/output
float b = 29;
Console.WriteLine("a= {0,6:F2}", b);
Console.WriteLine("a= {0,-6:X}", b);
b = .678e2F;
Format:
string str1 = string.Format("a= {0,7:F2}", b);
D Decimaltal.
string str2= "Lidt mere tekst: \t";
E Exponent.
string str3 = @" \dir\src\flie.c";
F Fixed point.
Console.WriteLine(str2 + str1 + str3);
P Procent.
X Hex.
a= 29,00
a= 1D
Lidt mere tekst:
a=
67,80 \dir\src\flie.c
Per Printz Madsen AAU
34
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
35
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;
}
}
Per Printz Madsen AAU
36
bfil.Close();
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
37
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
38
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
39
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
40
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
41
Del 2: Avanceret C#
programmering
•
•
•
•
•
WindowForm programmering.
Grafik.
Flere-trådet programmering.
Netværksprogrammering.
Database access.
Per Printz Madsen AAU
42
Eksempel: SimpelPlot
Per Printz Madsen AAU
43
Klassediagram
Per Printz Madsen AAU
44
Event styret programmering.
Museknapper
Musebevægelse
Tastatur
Timer
Netværk
Osv.
Kø
Eventkandler
løkke
private void timer_Tick(object sender, EventArgs e)
{
........
}
private void but_Click(object sender, EventArgs e)
{
........
}
Per Printz Madsen AAU
45
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
46
Skal gentegnes når:
Grafik.
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
47
Vis eksempel.
Per Printz Madsen AAU
48
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
49
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
50
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
51
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
52
Mutual exclusion
Tråd 1
Tråd 2
Læser x;
Læser x;
x=x + a;
Skriv x;
x=x + a;
Skriv x;
Per Printz Madsen AAU
53
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
54
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
55
Deadlock
Ønsker lock
Resurse 1
Tråd 1
Har lock
Har lock
Tråd 1
Resurse 2
Per Printz Madsen AAU
Ønsker lock
56
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
57
TCPListener
static 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
58
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
59
TCPClient
static 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
60
HTTPserver
public 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
61
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
62
DataBase håndtering.
User ID
Password
Filnavn
C# program
Opret Connection.
Microsoft Access
database
Opbyg SQL Query Kommando
Udfør SQL Query kommando
SELECT FROM ..
INSERT INTO ..
UPDATE ..
DELETE FROM ..
Per Printz Madsen AAU
63
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
64
Opbyg SQL Query kommando
Udfø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
65
Opbyg SQL Query kommando
Udfø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();
Per Printz Madsen AAU
66