Zgled – člani športnega kluba

Preview:

DESCRIPTION

Zgled – člani športnega kluba. Denimo, da bi radi napisali program, ki vodi evidenco o članih športnega kluba. Podatki o članu obsegajo ime, priimek, letnico vpisa v klub in vpisno številke (seveda je to poenostavljen primer). Torej objekt, ki predstavlja člana kluba, vsebuje štiri podatke: - PowerPoint PPT Presentation

Citation preview

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Zgled – člani športnega kluba• Denimo, da bi radi napisali program, ki vodi evidenco o članih

športnega kluba. Podatki o članu obsegajo ime, priimek, letnico vpisa v klub in vpisno številke (seveda je to poenostavljen primer). Torej objekt, ki predstavlja člana kluba, vsebuje štiri podatke:

public class Clan { public string ime; public string priimek; public int letoVpisa; public string vpisnaStevilka; }

1

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Klub - uporabausing MojaKnjiznica;public class TestKlub {

public static void Main(string[] args) { 

Clan a = new Clan();a.ime = "Janez";a.priimek = "Starina";a.letoVpisa = 2000;a.vpisnaStevilka = "2304";

 Clan b = new Clan();b.ime = "Mojca";b.priimek = "Mavko";b.letoVpisa = 2001;b.vpisnaStevilka = "4377";

 Clan c = b;c.ime = "Andreja";

 Console.WriteLine("Clan a:\n" + a.ime + " " + a.priimek + " " + a.letoVpisa + " (" + a.vpisnaStevilka + ")\n");

 Console.WriteLine("Clan b:\n" + b.ime + " " + b.priimek + " " + b.letoVpisa + " (" + b.vpisnaStevilka + ")\n");

  Console.WriteLine("Clan c:\n" + c.ime + " " + c.priimek +

" " + c.letoVpisa + " (" + c.vpisnaStevilka + ")\n");Console.ReadLine();

}}

2

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Zakajpublic class TestKlub {

public static void Main(string[] args) { 

Clan a;a = new Clan();

a.ime = "Janez";a.priimek = "Starina";a.letoVpisa = 2000;a.vpisnaStevilka = "2304";

 Clan b = new Clan();b.ime = "Mojca";b.priimek = "Mavko";b.letoVpisa = 2001;b.vpisnaStevilka = "4377";

 Clan c;

c = b;c.ime = "Andreja";

 Console.WriteLine("Clan a:\n" + a.ime + " " + a.priimek + " " + a.letoVpisa + " (" + a.vpisnaStevilka + ")\n");

 Console.WriteLine("Clan b:\n" + b.ime + " " + b.priimek + " " + b.letoVpisa + " (" + b.vpisnaStevilka + ")\n");

  Console.WriteLine("Clan c:\n" + c.ime + " " + c.priimek +

" " + c.letoVpisa + " (" + c.vpisnaStevilka + ")\n");Console.ReadLine();

}}

3

a

ime: Janezpriimek: Starina

b

ime: Mojcapriimek: Mavko

c

ANDREJA

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Zgled – športni klub, nadaljevanje• Spremenimo sedaj naš razred Clan tako, da bomo uporabili

konstruktorpublic class Clan { public string ime; public string priimek; public int letoVpisa; public string vpisnaStevilka;  public Clan(string i, string p, int l, string v) {

this.ime = i;this.priimek = p;this.letoVpisa = l;this.vpisnaStevilka = v;

}}

4

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Šprtni klub - test• Bo naš testni program OK?• Poženimo• Napake!– Kako, rekli smo, da spreminjanje razreda ne vpliva

na uporabniške programe– Spremenili smo način uporabe– V testnem programu: Clan()

Tega sedaj ni– C# ga naredi sam le, če nismo napisali nobenega konstruktorja

5

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Popravljeni zgledpublic class Clan { public string ime; public string priimek; public int letoVpisa; public string vpisnaStevilka;  public Clan() {

this.ime = "Ne vem";this.priimek = "Ne vem";this.letoVpisa = 0;this.vpisnaStevilka = "Ne vem";

}  public Clan(string i, string p, int l, string v) {

this.ime = i;this.priimek = p;this.letoVpisa = l;this.vpisnaStevilka = v;

}}

6

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Poskus testa• Ni težav!• Zakaj ves ta napor, če pa je na koncu le isto ...• Preglednost!– In priprava za naprej

7

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Primerjava: brez / s konstruktiorjempublic class TestKlub {

public static void Main(string[] args) {

  Clan a = new Clan();a.ime = "Janez";a.priimek = "Starina";a.letoVpisa = 2000;a.vpisnaStevilka = "2304";

 Clan b = new Clan();b.ime = "Mojca";b.priimek = "Mavko";b.letoVpisa = 2001;b.vpisnaStevilka = "4377";

 Clan c = b;c.ime = "Andreja";

... 

public class TestClan{ public static void Main(string[] args) { Clan a = new Clan("Janez", "Starina", 2000, "2304");

Clan b = new Clan("Mojca", "Mavko", 2001, "4377"); Clan c = b;

c.ime = "Andreja"; ...

8

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Objektne metode• V definicijo razreda običajno spadajo tudi metode• Klic objektnih metod:

– imeObjekta.imeMetode(parametri)– System.Console.WriteLine("To naj se izpiše");– besedilo.Equals(primerjava)

• Metoda v razredu Clan public string Inicialke() {

return this.ime[0] + "." + this.priimek[0] + ".";

}

9

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Uporaba metodeusing MojiRazredi; // knjižnica z razredom Clanpublic class TestClan{ public static void Main(string[] args) { Clan a = new Clan("Janez", "Starina", 2000, "2304"); String inicialkeClanaA = a.Inicialke(); Console.Write("Clan a:\n" + a.ime + " " + a.priimek + " " + a.letoVpisa + " (" + a.vpisnaStevilka + ") "); Console.WriteLine("ima inicialke: " + inicialkeClanaA); }}

10

Klic metode

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Sprememba metodepublic class Clan { public string ime; public string priimek; public int letoVpisa; public string vpisnaStevilka;  public Clan() {

ime = "Ne vem"; priimek = "Ne vem"; letoVpisa = 0; vpisnaStevilka = "Ne vem";

}  public Clan(string i, string p, int l, string v) : this() { ime = i;

priimek = p; letoVpisa = l; vpisnaStevilka = v;

} public string Inicialke() {

return this.ime[0] + " " + this.priimek[0]; }}

11

Spremembe v TestClan niso potrebne!

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Metoda, ki vrača objekt iz Razreda• Vemo, da z – a = b;

• kjer sta a in b obe spremenljivki tipa Clan, v a ne shranimo kopije objekta b, ampak sedaj a in b označujeta isti objekt.

• Metoda, ki naredi kopijo objekta. a = b.Kopija();

– V a je nov objekt, ki pa ima iste podatke kot b.

12

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Kopijapublic Clan Kopija() { Clan nov = new Clan(); nov.ime = this.ime; nov.priimek = this.priimek; nov.letoVpisa = this.letoVpisa; nov.vpisnaStevilka = this.vpisnaStevilka; return nov; }

13

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Še metoda za izpispublic void Izpis() { Console.WriteLine("Clan:\n" + this.ime + " " + this.priimek + " " + this.letoVpisa + " (" + this.vpisnaStevilka + ")\n");}

ali pa še

public string Opis() { return this.ime + " " + this.priimek + " " + this.letoVpisa + " (" + this.vpisnaStevilka + ");}

14

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Uporabapublic class TestKlub {

public static void Main(string[] args) { 

Clan a = new Clan("Janez", "Starina", 2000, "2304");  Clan b = new Clan("Mojca", "Mavko", 2001, "4377");  Clan c = b;

c.ime = "Andreja"; Clan d = b.Kopija(); d.ime = "Tadeja"; 

Console.WriteLine("Clan a"); a.Izpis();  Console.WriteLine("Clan b:\n" + b.Opis());

Console.WriteLine("Clan c:\n" + c); Console.WriteLine("Clan d"); d.Izpis();

Console.ReadLine();}

}

15

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Razred Datum• Denimo, da v naših programih pogosto delamo z datumi.• Zato bomo sestavili ustrezni razred• Načrt razreda:

– Podatki dan (število) mesec (izbira: število ali pa niz) Leto (število)

– Metode Konstruktorji Izpiši Povečaj za 1 dan Je datum smiselen Je leto prestopno Nov datum za toliko in toliko dni pred/za danim datumom Dan v tednu ...

16

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Datum – podatki in konstruktorpublic class Datum { public int dan; public string mesec; public int leto;

public Datum() { dan = 1; mesec = "januar" leto = 2000; } // privzeti datum je torej 1.1.2000

17

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Dodatni konstruktorjipublic Datum(int leto) : this() { this.leto = leto; // this je nujen} // datum je torej 1.1.leto

public Datum(int d, string m, int l) : this(l){ // leto smo že nastavili this.mesec = m; // this ni nujen this.dan = d; } // datum je torej d.m.l (na primer 12.3.2006 ali // 12. marec 2006)

18

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Prestopno• Zanima nas, ali je leto prestopno

public bool JePrestopno() { int leto = this.leto; if (leto % 4 != 0) return false; if (leto % 400 == 0) return true; if (leto % 100 == 0) return false; return true;}

19

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Dodaj en danpublic void PovecajZaEnDan() { dan = dan + 1; if (dan < 29) return; if (dan == 29 && mesec != "februar") return; if (dan == 29 && mesec == "februar" && this.JePrestopno()) return;

// lahko nehamo, mesec in leto sta ok string[] meseciPo30 = {"april","junij","september", "november"}; if (dan == 31) { if (meseciPo30.IndexOf(mesec) > 0){ mesec = mesec + 1; if (mesec == 13) { mesec = 1; leto++; } return; } // če je 32 dni, je zagotovo

20

Smiselno je, da je tudi mesec int!

Ponovno za "risalno desko" – razred spremnimo tako, da je mesec int.

Dokončaj za vajo!

Sintaktično prav, a semantično narobe – mesec je niz!

Narobe, mesec je string

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Uporaba razreda• Ugotovi, če je letošnje leto prestopno!using MojiRazredi;

public class JeLetosPrestopnoLeto { Datum danes = new Datum(5, 3, 2009); if (danes.jePrestopno()) { Console.WriteLine("Je prestopno leto"); } else { Console.WriteLine("Ni prestopno leto"); }}

21

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Sprememba razreda• Imamo

if (enClan.letoVpisa > drugClan.letoVpisa) { …

• Spremenimo razred Clan, tako, da vodimo datum vpisa

public class Clan { public string ime; public string priimek; public Datum datumVpisa; public string vpisnaStevilka;  public Clan() {

ime = "Ne vem";priimek = "Ne vem";datumVpisa = new Datum();vpisnaStevilka = "Ne vem";

}

22

Clan y = new Clan();

y Ime: "Ne vem"Priimek: "Ne vem"datumVpisavpisnaStevilka: "Ne vem"

dan: 1mesec: 1leto: 2000

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Sprememba razreda  public Clan(string i, string p, Datum d, string v) : this() {

ime = i;priimek = p;datumVpisa = d;vpisnaStevilka = v;

}

  public string Inicialke() { return this.ime[0] + "." + this.priimek[0] + ".";

}

  public Clan Kopija() { Clan nov = new Clan(); nov.ime = this.ime; nov.priimek = this.priimek; nov.datumVpisa = this.datumVpisa.Kopija(); nov.vpisnaStevilka = this.vpisnaStevilka; return nov;

}  public void Izpis() {

Console.WriteLine("Clan:\n" + this.ime + " " + this.priimek + " " + this.datumVpisa.OpisDat() + " (" + this.vpisnaStevilka + ")\n");

}

23

Metoda Kopija iz razreda Datum!!!!Nima zveze z metodo Kopija iz razreda Clan

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Sprememba razreda  public string Opis() {

return this.ime + " " + this.priimek + " " + this.datumVpisa.OpisDat() + " (" + this.vpisnaStevilka + ");

}

  public string ToString() {

return this.Opis(); }

public bool SpremeniLetoVpisa(int l) { if ((2000 <= leto) && (leto <= 2020)) { this.datumVpisa.leto = l; return true; //leto je smiselno, popravimo stanje objekta in vrnemo true } return false; // leto ni smsielno, ne spremnimo inč in vrnemo false }}

24

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Sprememba razreda public Clan(string i, string p, Datum d, string v) : this() {

ime = i;priimek = p;datumVpisa = d;vpisnaStevilka = v;

}  public string Inicialke() {

return this.ime[0] + "." + this.priimek[0] + "."; }  public Clan Kopija() { Clan nov = new Clan(); nov.ime = this.ime; nov.priimek = this.priimek; nov.datumVpisa = this.datumVpisa.Kopija(); nov.vpisnaStevilkaevilka = this.vpisnaStevilka; return nov;

25

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Sprememba razredapublic void Izpis() { Console.WriteLine("Clan:\n" + this.ime + " " +

this.priimek + " " + this.datumVpisa.OpisDat() + " (" + this.vpisnaStevilka + ")\n");

}public string Opis() { return this.ime + " " + this.priimek + " " +

this.datumVpisa.OpisDat() + " (" + this.vpisnaStevilka + "); }public bool SpremeniLetoVpisa(int l) { if ((2000 <= leto) && (leto <= 2020)) { this.datumVpisa.leto = l; return true; //leto je smiselno, popravimo stanje objekta in vrnemo true } return false; // leto ni smiselno, ne spremenimo nič in vrnemo false }}

26

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Način programiranja• Seveda zaradi spremembe if (enClan.letoVpisa > drugClan.letoVpisa) { …

• ne deluje več!• Kako popraviti?

27

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Že v prvotnem razredupublic class Clan { public string ime; public string priimek; public int letoVpisa; public string vpisnaStevilka;  public bool SpremeniLetoVpisa(int leto) { if ((2000 <= leto) && (leto <= 2020)) { this.letoVpisa = leto; return true; } return false; // leto ni smiselno, ne spremnimo nič in vrnemo false } public int VrniLetoVpisa() { return this.letoVpisa; }}

28

if (enClan.VrniLetoVpisa() > drugClan.VrniLetoVpisa()) { …

Izvedbo projekta je omogočilo sofinanciranje Evropskega socialnega sklada Evropske unije in

Ministrstva za šolstvo in šport.

Fakulteta za matematiko in fiziko

http://up.fmf.uni-lj.si

Ob spremembi razreda Clan• Le metodo public int VrniLetoVpisa() { return this.letoVpisa; }

• zamenjamo z

public int VrniLetoVpisa() { return this.datumVpisa.leto; }

29

Enak podpis, enak tip rezultata – spremembe v uporabniških programih niso potrebne

Recommended