Geneste lussen

Status
Niet open voor verdere reacties.

Trixt3r

Gebruiker
Lid geworden
2 mei 2007
Berichten
8
Momenteel ben ik bezig met een project waarbij het aantal geneste lussen afhankelijk is van de situatie. Elke lus bezit dezelfde functie. Dus elke lus doet hetzelfde. Daarom hoop ik dat het aantal geneste lussen dat moet worden doorlopen ook kan worden geautomatiseerd. Nu moet ik telkens wanneer de situatie wijzigt handmatig geneste lussen toevoegen of verwijderen. Dus eigenlijk zou je dan tot een functie moeten komen waarbij één van de parameters aangeeft hoeveel ingeneste lussen er moeten doorlopen worden.

voorbeeld:

For a
functie​
For b​
functie​
Next b​
Next a
 
Dag Trixt3r,

Een interessant probleem en als ik het begreep wist ik misschien ook de oplossing.
Welke gegevens heb je en wat moet er mee worden gedaan? Wat zijn de voorwaarden dat sommige gegevens er wel zijn of niet. Of wanneer moeten de gegevens wel of niet worden gefunctioneerd?

Gegroet,

Axel.
 
hoi Trixt3r,


zoiets?

je kunt het nog wel een beetje vervraaien
ik ben benieuwt waarvoor dit is

Code:
Public Max As Integer
Public M
Public totaal                   'tottaal geeft aan hoe vaak ikRoepMezelfAaan is aangeroepen
Sub test()
    M = Array(1, 2, 4, 3)
    Max = 4                     'aantal elementen in M
    totaal = 0
    Call ikRoepMezelfAaan(0)
    MsgBox "ikRoepMezelfAaan is " & totaal & " keer aangeroepen"
End Sub
Function ikRoepMezelfAaan(t)
    totaal = totaal + 1 'geeft aan hoeveel keer de functie is aangeroepen
    If (t < Max) Then
        For a = 1 To M(t)
                                'verzin iets spannends
            Call ikRoepMezelfAaan(t + 1)
        Next a
    End If
End Function

groet Sylvester
 
hoi Trixt3r,


zoiets?

je kunt het nog wel een beetje vervraaien
ik ben benieuwt waarvoor dit is

Code:
Public Max As Integer
Public M
Public totaal                   'tottaal geeft aan hoe vaak ikRoepMezelfAaan is aangeroepen
Sub test()
    M = Array(1, 2, 4, 3)
    Max = 4                     'aantal elementen in M
    totaal = 0
    Call ikRoepMezelfAaan(0)
    MsgBox "ikRoepMezelfAaan is " & totaal & " keer aangeroepen"
End Sub
Function ikRoepMezelfAaan(t)
    totaal = totaal + 1 'geeft aan hoeveel keer de functie is aangeroepen
    If (t < Max) Then
        For a = 1 To M(t)
                                'verzin iets spannends
            Call ikRoepMezelfAaan(t + 1)
        Next a
    End If
End Function

groet Sylvester

Dit lijkt me een goed begin. Toch zijn er op het eerste zicht nog enkele aanpassingen nodig. Volgens mij moet de variabele t binnen de functie verhoogd worden in de vorm van : t = t + 1. Want anders blijft het argument van de functie de hele tijd op dezelfde waarde vanaf de tweede lus. Een ander punt dat mss een fout kan geven is de lusvariabele a. Als je de tweede lus start dan gebruik je weer a en krijg je dus 2 open lussen met dezelfde variabele. Dat zal wellicht een foutmelding geven. Ik zal het eens proberen. Toch al bedankt voor de response.

Greetz Trixt3r
 
hoi trix

jou tekst:
Dit lijkt me een goed begin. Toch zijn er op het eerste zicht nog enkele aanpassingen nodig. Volgens mij moet de variabele t binnen de functie verhoogd worden in de vorm van : t = t + 1. Want anders blijft het argument van de functie de hele tijd op dezelfde waarde vanaf de tweede lus. Een ander punt dat mss een fout kan geven is de lusvariabele a. Als je de tweede lus start dan gebruik je weer a en krijg je dus 2 open lussen met dezelfde variabele. Dat zal wellicht een foutmelding geven. Ik zal het eens proberen. Toch al bedankt voor de response.


antwoord:
de code kun je gewoon proberen hij werkt gewoon

verhoging van t gebeurt door de functie met t+1 aan te roepen

a is lokaal bekent en niet buiten de fuctie
dus iedere keer als je de functie opnieuw aanroept is a alleen daar bekent

als je de functie zichzelf aanroept zijn er meerdere a's met ieder hun eigen waarden

groet sylvester
 
Laatst bewerkt:
hoi trix

jou tekst:
Dit lijkt me een goed begin. Toch zijn er op het eerste zicht nog enkele aanpassingen nodig. Volgens mij moet de variabele t binnen de functie verhoogd worden in de vorm van : t = t + 1. Want anders blijft het argument van de functie de hele tijd op dezelfde waarde vanaf de tweede lus. Een ander punt dat mss een fout kan geven is de lusvariabele a. Als je de tweede lus start dan gebruik je weer a en krijg je dus 2 open lussen met dezelfde variabele. Dat zal wellicht een foutmelding geven. Ik zal het eens proberen. Toch al bedankt voor de response.


antwoord:
de code kun je gewoon proberen hij werkt gewoon

verhoging van t gebeurt door de functie met t+1 aan te roepen

a is lokaal bekent en niet buiten de fuctie
dus iedere keer als je de functie opnieuw aanroept is a alleen daar bekent

als je de functie zichzelf aanroept zijn er meerdere a's met ieder hun eigen waarden

groet sylvester

Thx Sylvester

Ik heb het geprobeerd en het werkt perfect. Sorry dat ik aan je code twijfelde. Nogmaals bedankt voor de snelle response. Ik had niet gedacht dat er iemand zo snel met een antwoord ging komen. Many thx

Greetz Trixt3r
 
vertel eens , wat ging je maken?
Het is voor een bedrijfsproject waarbij ik de voorraad moet poolen en dus bepaalde goederen moet toewijzen aan bepaalde grondstoffen die voor handen zijn. Dit toewijzen gebeurt volgens een matrix die enen en nullen kan bevatten. De kolommen stellen de producten voor en de rijen de grondstoffen. Een één betekent dat het product wordt toegewezen aan die grondstof. Als gevolg kan er in elke kolom maar één 1 staan, maar op een rij meerdere. Ik moet nu bepalen welke toewijzing het voordeligst is.
Ik moet dus binnen een matrix allerlei combinaties testen. Het gaat over een vierkante matrix. Het aantal combinaties is niet gelijk aan macht van 3,maar aan faculteit 3. Dit komt wegens bepaalde constraints.
Elke kolom stelt nu een geneste lus voor. In de eerste lus heb ik drie mogelijkheden. Voor elk van deze 3 mogelijkheden heb ik in kolom 2 twee mogelijkheden en in kolom 3 slechts 1.
Combinatie 1
1
0 1
0 0 1
Combinatie 2
1
0 0
0 1 1
Combinatie 3
0
1 1
0 0 1
Combinatie 4
0
1 0
0 1 1
enz...

Ik hoop dat het wat duidelijker is nu.

greetz trixt3r
 
hoi trix


zijn er dan evenveel producten als grondstoffen?

of bedoelje een rechthoekige matrix? bv Matrix(5,3)

Het is een vierkante matrix, er zijn altijd evenveel kolommen als rijen. Dit komt doordat de producten worden gegroepeerd volgens hun oude toewijzing. Als vroeger de toewijzing gebeurde over bijvoorbeeld 10 grondstoffen dan kan je de producten indelen in 10 groepen. Want elk product moet namelijk aan één van deze grondstoffen worden toegewezen.
Binnen de matrix kan een product uit kolom 2 kan nooit toegewezen worden aan rij1. Een product uit kolom 3 kan nooit worden toegewezen aan rij 2 en rij 1. Dit is vanwege praktische constraints. Daarom krijg je een faculteit voor het aantal combinaties en geen kwadraat. Hierdoor heb ik in je code één iets veranderd, namelijk inplaats dat elke lus begint bij 1 begint die nu bij t (For a = t To). t Wordt namelijk bij elke bijkomende lus verhoogd met 1.

Greetz Trixt3r
 
oh, dus dat gedoe mer die array heb je helemaal niet nodig.

groeten sylvester

Nee, eigenlijk is die array niet nodig. De ondergrens van elke lus is gelijk aan de waarde t. De bovengrens is gelijk aan het aantal rijen (= aantal kolommen). Hierdoor is de ondergrens dynamisch en is de bovengrens statisch.

Greetz Trixt3r
 
hoi trix

eigenlijk kun je deze vraag wel als opgelost instellen

als je nog iets gaafs verzonnen hebt hoor ik het graag

groeten sylvester
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan