En medlem (suzanne) undrade hur man skulle göra och nu tror jag att jag skall ge er en uppgift. Se till att koden optimeras i antalet tecken programkod när det gäller att (skala) bort alla från Malmö. Jag försökte skriva så hon skulle förstå det bättre (en uppgift från skolan). Med "tecken programkod" menar du då alltsammans (exkl. kommentar och procedurnamn osv.) eller koden som skalar bort alla från Malmö enbart ? Jag gjorde lite annorlunda med typen, men den kan man egentligen ta bort eller så här (flighttyp osv. är samma): Ok, så kan man också göra, men är inte det onödigt resurskrävande :) Inte så värst... en extra Flight och en extra Person. Hmm, testade din grej: Här kommer mitt förslag: ok då. Optimera denna programkod...
Tänk oss följande. Bokningssystem för tåg, alla till malmö skall bort för det går bara mellan stockholm och göteborg denna dag...
<code>
Option Explicit
Private Const MAX As Integer = 100
Private Type PersonTyp
namn As String
adress As String
alder As Integer
End Type
Private Type FlightTyp
passagerare(1 To MAX) As PersonTyp
antalpassagerare As Integer
End Type
Private Sub Form_Load()
Dim enFlygning As FlightTyp
' registrerar fyra passagerare som skall flyga
enFlygning.antalpassagerare = 4
enFlygning.passagerare(1).namn = "emma"
enFlygning.passagerare(1).alder = 21
enFlygning.passagerare(1).adress = "stockholm"
enFlygning.passagerare(2).namn = "sara"
enFlygning.passagerare(2).alder = 31
enFlygning.passagerare(2).adress = "malmö"
enFlygning.passagerare(3).namn = "pelle"
enFlygning.passagerare(3).alder = 41
enFlygning.passagerare(3).adress = "göteborg"
enFlygning.passagerare(4).namn = "lasse"
enFlygning.passagerare(4).alder = 51
enFlygning.passagerare(4).adress = "malmö"
' Raderar alla som skall åka till malmö för mellanlandningen
' dit blir inställd, vilka skall då åka med i planet?
Dim a, b
With enFlygning
For a = 1 To .antalpassagerare
' tar reda på vilken passagerare som bor i malmö
If .passagerare(a).adress = "malmö" Then
' vi tar det sista objektet i listan och flyttar in det här
' istället.
' försök inte gå förbi sista objektet
If a > .antalpassagerare Then Exit For
' kan vi ta den sista posten eller är det också malmö.
' om det är det, ta näst sista osv..
b = a
Do
If .passagerare(b).adress = "malmö" Then
.antalpassagerare = .antalpassagerare - 1
Exit Do
End If
b = b + 1
' se till att vi inte loopar före första posten
If .antalpassagerare <= 0 Then Exit For
Loop
' ersätt aktuell passagerare med sista godkända i listan
.passagerare(a) = .passagerare(.antalpassagerare)
' Samtidigt minskar vi .antalpassagerare med 1
' för att inte använda det igen..
.antalpassagerare = .antalpassagerare - 1
End If
Next
' skriver nu ut resultatet efter att radera alla från malmö
For a = 1 To .antalpassagerare
Debug.Print .passagerare(a).namn
Next
' det som händer nu är att objektet 2 är raderat och ersatt
' av objektet 4. Om man tittar på hur det egentligen ser ut
' om vi låter den loopa igenom arrayen ser det ut såhär..
Debug.Print "-- array i verklighet --"
For a = 1 To 4
Debug.Print .passagerare(a).namn
Next
End With
End Sub
</code>Sv: Optimera denna programkod...
Sv: Optimera denna programkod...
Option Explicit
Private Type Flight
PassangerarInfo() As String
AntalPassangerare As Long
End Type
Private Sub Command1_Click()
Dim enFlygning As Flight
Const NAMN = 1
Const ORT = 2
Const ALDER = 3
Dim lNr As Long
Dim lCount As Long
With enFlygning
.AntalPassangerare = 3
ReDim .PassangerarInfo(1 To 3, 1 To .AntalPassangerare)
.PassangerarInfo(NAMN, 1) = "Anna"
.PassangerarInfo(ORT, 1) = "Malmö"
.PassangerarInfo(ALDER, 1) = "15"
.PassangerarInfo(NAMN, 2) = "Nisse"
.PassangerarInfo(ORT, 2) = "GBG"
.PassangerarInfo(ALDER, 2) = "30"
.PassangerarInfo(NAMN, 3) = "Kalle"
.PassangerarInfo(ORT, 3) = "Malmö"
.PassangerarInfo(ALDER, 3) = "67"
For lNr = 1 To UBound(.PassangerarInfo, 2)
' försök inte gå förbi sista objektet
If lNr > UBound(.PassangerarInfo, 2) Then Exit For
' Ifall orten är Malmö...
If LCase$(.PassangerarInfo(ORT, lNr)) = "malmö" Then
'...tar sista passageraren öv platsen...
For lCount = 1 To 3
.PassangerarInfo(lCount, lNr) = .PassangerarInfo(lCount, UBound(.PassangerarInfo, 2))
Next
'...och sista platsen raderas
ReDim Preserve .PassangerarInfo(1 To 3, 1 To UBound(.PassangerarInfo, 2) - 1)
'Kör om samma 'Plats' för att se om sisata passageraren ska till malmö
If lNr > 0 Then lNr = lNr - 1
End If
Next
'Om man behöver detta värde....
.AntalPassangerare = UBound(.PassangerarInfo, 2)
For lNr = 1 To .AntalPassangerare
Debug.Print .PassangerarInfo(NAMN, lNr) & vbTab & .PassangerarInfo(ORT, lNr)
Next
End With
End SubSv: Optimera denna programkod...
Private Sub Form_Load()
Dim enFlygning As FlightTyp
Dim UtanMalmö As FlightTyp
Dim Person As PersonTyp
With enFlygning
.antalpassagerare = 4
With .passagerare(1)
.namn = "emma"
.alder = 21
.adress = "stockholm"
End with
With .passagerare(2)
.namn = "sara"
.alder = 31
.adress = "malmö"
End with
With .passagerare(3)
.namn = "pelle"
.alder = 41
.adress = "göteborg"
End with
With .passagerare(4)
.namn = "lasse"
.alder = 51
.adress = "malmö"
End with
For Each Person In enFlygning
If UCase$(Person.adress)="MALMÖ" Then
With UtanMalmö
.AntalPassagerare=.AntalPassagerare+1
.Passagerare(.AntalPassagerare)=Person
End With
End If
Next
'Om du nödvändigtvis måste ha dem i enFlygning
enFlygning=UtanMalmö
End sub
/Niklas JanssonSv: Optimera denna programkod...
Sv: Optimera denna programkod...
Vill man inte slösa så mycket minne kan man ju köra med dynamiska arrayer...
Det ger ingen stor skillnad i koden, men det är svårare att förstå.
/Niklas JanssonSv: Optimera denna programkod...
For Each can only iterate over a collection object or an arraySv: Optimera denna programkod...
Option Explicit
Option Compare Text
Private Const MAX As Integer = 100
Private Type PersonTyp
namn As String
adress As String
alder As Integer
End Type
Private Type FlightTyp
passagerare(1 To MAX) As PersonTyp
antalpassagerare As Integer
End Type
Private Sub Form_Load()
Dim enFlygning As FlightTyp
Dim a As Long, Offset As Long
With enFlygning
' registrerar fyra passagerare som skall flyga
.antalpassagerare = 4
.passagerare(1) = GP("emma", 21, "stockholm")
.passagerare(2) = GP("sara", 31, "malmö")
.passagerare(3) = GP("pelle", 41, "göteborg")
.passagerare(4) = GP("lasse", 51, "malmö")
' Raderar alla som skall åka till malmö för mellanlandningen
' dit blir inställd, vilka skall då åka med i planet?
For a = 1 To .antalpassagerare
If .passagerare(a).adress = "malmö" Then
Offset = Offset + 1
ElseIf Offset Then
.passagerare(a - Offset) = .passagerare(a)
End If
Next
.antalpassagerare = .antalpassagerare - Offset
' skriver nu ut resultatet efter att radera alla från malmö
For a = 1 To .antalpassagerare
Debug.Print .passagerare(a).namn
Next
' det som händer nu är att objektet 2 är raderat och ersatt
' av objektet 4. Om man tittar på hur det egentligen ser ut
' om vi låter den loopa igenom arrayen ser det ut såhär..
Debug.Print "-- array i verklighet --"
For a = 1 To 4
Debug.Print .passagerare(a).namn
Next
End With
End Sub
Private Function GP(namn As String, alder As Integer, adress As String) As PersonTyp
GP.namn = namn
GP.alder = alder
GP.adress = adress
End Function
Nu länar den ju kvar passagerare utanför Antalet passagerare.
Vill man tömma dessa, ändrar man i IF sattsen:
If .passagerare(a).adress = "malmö" Then
Offset = Offset + 1
.passagerare(a) = GP("", 0, "")
ElseIf Offset Then
.passagerare(a - Offset) = .passagerare(a)
.passagerare(a) = GP("", 0, "")
End IfSv: Optimera denna programkod...
For i =1 to MAX
byt ut alla Person mot .Passagerare(i)...
/Niklas Jansson