Diskuze: list ve VB
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Neaktivní uživatel:7.7.2016 15:38
Musím říct, že jsi ignorant - už snad 10x ti ostatní říkali, jak se má vkládat dlouhý kód, aby byl pěnkně formátovaný, a aby se dal číst. Nevím, jestli má někdo náladu ty tvoje kilometrové zdrojáky číst, když ty ani nemáš zájem na tom, aby se daly dobře číst.
Prostě ho ignorujte, kdo chce kam, pomozme mu tam
VitekST:8.7.2016 11:37
- Dlouhý kód se vkládá pomocí patřičného tlačítka.
- Nikdo tady nemá energii ani náladu číst takto dlouhý zdrojový kód, zvlášť když to není jeho práce.
- Špatně položený dotaz, co takhle přijít s konkrétním problémem? Nefunguje mi tento cyklus, nechce se mi přiřadit proměnná, cokoliv konkrétního. Neprojevil si žádnou snahu co se ladění týče, zkus si pro příště definovat zarážku a program si odkrokovat, jestli dělá, to co má.
Jestli tomu programu (co dělá, jak vevnitř funguje) rozumíš jak koza petrželi, prosím, ve vlastním zájmu toto přenech někomu jinému.
Jaroslav Trojan:8.7.2016 11:52
Vůbec nejde o ten dlouhý kód, ten se tam vloudil omylem a je to funkční
program, který normálně běží a dává správné výsledky- Navrhuje
ocelové nosníky z válcovaných a svařovaných profilů, a sám jsem ho
sestavil, tak mu asi rozumím dobře.
Ale o to mi nešlo!
Na konci je připojen kód, který se týká použití Property
A t e n správně nefunguje! Pro věk 15 let píše plnoletý a to mi vadí
Michal Štěpánek:8.7.2016 13:12
A jak z toho máme poznat, ke kterému konci je co připojeno, když se to v tomto stavu nedá luštit??? Kód, ať už krátký nebo delší se vkládá pomocí tlačítka pro vložení kódu (druhé zleva). Pak je kód pěkně zformátovaný, odsazený, barevně rozlišený a hned se na tom dá leccos poznat. Takhle jeto jen kus textu, který nechce nikdo ani číst, natož pak louskat, co k čemu patří...
VitekST:8.7.2016 13:56
1251 řádků vážně není dlouhý kód...
Ach ták, máš na mysli jen poslední část toho kódu. Co tam tedy dělá ten
(IMHO) komplexní program pro výpočet čehosi s ocelí?
Jednak prvá věc, je to zakomentované.
Dobře, dal jsem si tu práci a vše převedl do čitelné podoby (pro příště, byl bych rád kdybys použil TLAČÍTKO SE SYMBOLEM KÓDU V EDITORU a dával sis pozor, co vkládáš, předmětem diskuze není program pro výpočet čehosi z ocele, předmětem diskuze je třída Student a procedura Main). Kdyžtak máš prvních 5 minut po vložení příspěvku přístupno tlačítko se symbolem tužky (Upravit).
Výpočet vlastnosti Plnolety je IMHO pofidérní, nemyslím si že je třeba mít u této vlastnosti setter odkazující na lokální proměnnou, proč to nevypočítávat přímo jakmile se na hodnotu této vlastnosti zeptáš?
Tzn:
Public Property Plnolety() As Boolean
Get
Return vek < 18
End Get
End Property
U vlastnosti Plnolety smaž settera, stejně tak jako korespondující
lokální proměnnou (zbytečná) a patřičně si uprav settera u vlastnosti
Vek.
Tudíž:
Public Property Vek() As Integer
Get
Return Vek
End Get
Set(value As Integer)
vek = value
End Set
End Property
Vlastnosti.vbproj
Jaroslav Trojan:8.7.2016 15:10
Opravil jsem ,ale nešlo to.
Upravil jsem kód ,aby nehlásil chyby, ale přestal pracovat
Module Module1
Sub Main()
Dim s As New Student(" student Pavel Hora ", True, 20)
Dim vek As Integer
' s.Vek = 15
's.muz = True
'Console.Write("plnolety=")
Console.WriteLine(s)
' Console.WriteLine(objekt, Jmeno) 'číst
' objekt.Jmeno = "Jan Malý" 'zapisovat
Console.ReadKey()
End Sub
End Module
Class Student
' Public jmeno As String
' Public muz As Boolean
' Public vek As Integer
' Public plnolety As Boolean
Public Sub New(jmeno As String, pohlavi As Boolean, vek As Integer)
Me.Jmeno = jmeno
Me.Muz = Muz
Me.Vek = vek
Plnolety = True
If vek < 18 Then
Plnolety = False
End If
End Sub
Public Overrides Function ToString() As String
Dim jsemPlnolety As String = "jsem"
If Plnolety = False Then
jsemPlnolety = "nejsem"
End If
Dim pohlavi As String = "muž"
If False Then
pohlavi = "žena"
End If
Return [String].Format(" Jsem {0}, {1}.Je mi {2} let a {3} plnoletý.", Jmeno, pohlavi, Vek, jsemPlnolety)
End Function
Public Function VratJmeno() As String
Return Jmeno
End Function
Public Function VratPlnoletost() As String
Return Plnolety
End Function
Public Function VratVek() As Integer
Return Vek
End Function
Public Function Muz1() As String
Return Muz
End Function
Public Sub NastavVek(hodnota As Integer)
Vek = hodnota
' přehodnocení plnoletosti
Dim jsemPlnolety As String
Plnolety = True
If Vek < 18 Then
Plnolety = False
End If
If False Then
jsemPlnolety = "nejsem"
End If
End Sub
' Property funguje, třeba dělat gettery a settery
Public Property Jmeno() As String
Get
Return Jmeno
End Get
Private Set(value As String)
Jmeno = value
End Set
End Property
' Private jmeno As String
Public Property Muz() As Boolean
Get
Return Muz
End Get
Private Set(value As Boolean)
Muz = value
End Set
End Property
Public Property Plnolety() As Boolean
Get
Return Vek < 18
End Get
Private Set(value As Boolean)
Plnolety = value
End Set
End Property
Public Property Vek() As Integer
Get
Return Vek
End Get
Set(value As Integer)
Vek = value
End Set
End Property
End Class
VitekST:8.7.2016 15:27
Jsem rád, že si konečně použil tlačítko pro kód.
Moje verze, testováno v SharpDevelopu:
Module Module1
Sub Main()
Dim s As New Student(" student Pavel Hora ", True, 15)
Console.WriteLine(s)
Console.ReadKey()
End Sub
End Module
Class Student
Private _jmeno As String
Private _muz As Boolean
Private _vek As Integer
Public Sub New(jmeno As String, pohlavi As Boolean, vek As Integer)
_jmeno = jmeno
_muz = Muz
_vek = vek
End Sub
Public Overrides Function ToString() As String
Dim jsemPlnolety As String = "jsem"
If Not Plnolety Then
jsemPlnolety = "nejsem"
End If
Dim pohlavi As String = "muž"
If Not _muz Then
pohlavi = "žena"
End If
Return [String].Format(" Jsem {0}, {1}.Je mi {2} let a {3} plnoletý.", _jmeno, pohlavi, _vek, jsemPlnolety)
End Function
Public Property Jmeno() As String
Get
Return _jmeno
End Get
Private Set(value As String)
_jmeno = value
End Set
End Property
Public Property Muz() As Boolean
Get
Return _muz
End Get
Private Set(value As Boolean)
_muz = value
End Set
End Property
Public ReadOnly Property Plnolety() As Boolean
Get
Return Vek > 18
End Get
End Property
Public Property Vek() As Integer
Get
Return _vek
End Get
Set(value As Integer)
_vek = value
End Set
End Property
End Class
- Lokální proměnné reprezentující data třídy kolidovaly s vlastnostmi třídy (pokud vlastnost má deklarované vlastní gettery a settery, už to není vlastní proměnná, ale dvě metody upravující lokální proměnné) => lokální proměnné se deklarují s odlišným názvem než vlastnosti (použil jsem podtržítko)¨
- Lokální proměnné reprezentující data třídy NESMÍ BÝT VEŘEJNÉ!
- Lokální proměnné se používají uvnitř třídy, vlastnosti slouží jen pro vnější interakci. (představ si třídu jako černou skříňku s páru čudlíky)
- Proč si zakomentoval všechny lokální proměnné? Pod výrazem "patřičnou" jsem myslel jen proměnnou patřící k vlastnosti "Plnolety".
- Nevím, co tam čachruješ s metodami "Vrat**" a "Nastav***". Tyto metody jsou právě gettery a settery a patří do deklarace vlastnosti.
- Proč máš logiku pro plnoletost na třech různých místech? Stačí ji uvést do getteru vlastnosti a konec.
- Pokud deklaruješ vlastnost pouze s jedním prvkem (buďto setter, nebo getter), použij klíčového slova WriteOnly nebo ReadOnly.
Pročti si prosím nějaké výukové materiály pro navrhování tříd.
+20 Zkušeností
+2,50 Kč
Jaroslav Trojan:9.7.2016 9:30
Opravil jsem program dle tvého , spustil se , ale stále mi píše : jsem
žena!
neumím si to vysvětlit , nastaven je muž
Class Student
Private _jmeno As String
Private _muz As Boolean
Private _vek As Integer
Public Sub New(jmeno As String, pohlavi As Boolean, vek As Integer)
_jmeno = jmeno
_muz = Muz
_vek = vek
End Sub
Public Overrides Function ToString() As String
Dim jsemPlnolety As String = "jsem"
If Not Plnolety Then
jsemPlnolety = "nejsem"
End If
Dim pohlavi As String = "muž"
If Not _muz Then
pohlavi = "žena"
End If
Return [String].Format(" Jsem {0}, {1}.Je mi {2} let a {3} plnoletý.", Jmeno, pohlavi, Vek, jsemPlnolety)
End Function
' Public Function VratJmeno() As String
' Return jmeno
' End Function
' Public Function VratPlnoletost() As String
' Return plnolety
' End Function
' Public Function VratVek() As Integer
' Return vek
' End Function
' Public Function Muz() As String
' Return Muz
' End Function
' Property funguje, třeba dělat gettery a settery
Public Property Jmeno() As String
Get
Return _jmeno
End Get
Private Set(value As String)
_jmeno = value
End Set
End Property
Public Property Muz() As Boolean
Get
Return _muz
End Get
Private Set(value As Boolean)
_muz = value
End Set
End Property
Public ReadOnly Property Plnolety() As Boolean
Get
Return _vek > 18
End Get
End Property
Public Property Vek() As Integer
Get
Return _vek
End Get
Set(value As Integer)
_vek = value
End Set
End Property
End Class
Module Module1
Sub Main()
Dim s As New Student(" student Pavel Hora ", True, 20)
Dim vek As Integer
s.Vek = 15
Console.WriteLine(s)
' Console.WriteLine(objekt, Jmeno) 'číst
' objekt.Jmeno = "Jan Malý" 'zapisovat
Console.ReadKey()
End Sub
End Module
správně má být
Public Overrides Function ToString() As String
Dim jsemPlnolety As String = "jsem"
If Not Plnolety Then
jsemPlnolety = "nejsem"
End If
Dim pohlavi As String = "muž"
If Not pohlavi = "muž" Then
pohlavi = "žena"
End If
Return [String].Format(" Jsem {0}, {1}.Je mi {2} let a {3} plnoletý.",
Jmeno, pohlavi, Vek, jsemPlnolety)
End Function
VitekST:9.7.2016 10:25
Není, pohlaví bude stále muž, protože podmínka závisí na lokální proměnné v metodě, kterou nastavíš na jednu a samou hodnotu, výsledek vždy bude muž.
Jaroslav Trojan:9.7.2016 11:04
Ale nebyl. Je to správně , podle tvého kódu byl výsledek žena.
Vždyť vidíš, že jsem musel tvůj kód opravit.
VitekST:9.7.2016 18:59
Omlouvám se, udělal jsem chybu v konstruktoru.
Já totiž přiřazuju na lokální proměnnou _muz hodnotu z veřejné
vlastnosti "Muz", a protože dosud není přiřazená, vrací to implicitní
hodnotu.
Zmátlo mě to, protože ze sémantického hlediska parametr "pohlavi" by měl obsahovat hodnotu toho pohlaví (výčtový typ, nebo string ["zena", "muz"]), ne booleovskou hodnotu (to by se potom měl jmenovat "jeMuz", nebo "jeZena").
Problém si ale neopravil, schválně, zkus si zadat ať je žena (dřív než zkopíruješ a vložíš opravený kód dostupný níže). Vypíše ti to muž.
Proč?
Definuješ v metodě lokální proměnnou "pohlavi", která má reprezentovat
text toho pohlaví a její výchozí hodnota je "muž".
Co ale vůbec nechápu, že ji uvádíš v podmínce, a to tak, že pokud se
hodnota tý proměnné nebude rovnat hodnotě "muž", tak ji přiřadíš
hodnotu "žena".
Což je blbost, protože to je lokální proměnná v metodě, která má přiřazenou výchozí hodnotu "muž", a ona se nikdy nezmění, neprobíhá tedy tudíž žádná interakce s daty ve třídě!
Trochu logického uvažování do toho, prosím, promysli si co ten kód dělá dřív než stiskneš tlačítko se symbolem "Play".
Opravený konstruktor:
Public Sub New(jmeno As String, pohlavi As Boolean, vek As Integer)
_jmeno = jmeno
_muz = pohlavi
_vek = vek
End Sub
Opravená funkce ToString:
Public Overrides Function ToString() As String
Dim jsemPlnolety As String = "jsem"
If Not Plnolety Then
jsemPlnolety = "nejsem"
End If
Dim pohlavi As String = "muž"
If Not _muz Then
pohlavi = "žena"
End If
Return [String].Format(" Jsem {0}, {1}.Je mi {2} let a {3} plnoletý.", _jmeno, pohlavi, _vek, jsemPlnolety)
End Function
Ještě jednou: Prosím, pro vkládání kódu používej TLAČÍTKO SE SYMBOLEM KÓDU, kód to formátuje a zbarvuje, nemám náladu na to, abych se brouzdal v bordelu. Děkuji mnohokrát.
Zobrazeno 18 zpráv z 18.