• Aktualisierte Forenregeln

    Eine kleine Änderung hat es im Bereich Forenregeln unter Abschnitt 2 gegeben, wo wir nun explizit darauf verweisen, dass Forenkommentare in unserer Heftrubrik Leserbriefe landen können.

    Forenregeln


    Vielen Dank

Logik beim Bruch Kürzen

N-Traxx

Spiele-Enthusiast/in
Mitglied seit
26.01.2004
Beiträge
1.688
Reaktionspunkte
0
Logik beim Bruch Kürzen

Hi

Ich hab ein kleines Logikproblem, folgender Ausgang.

Ich hab solche Bruchlisten

2/16
4/16
2/16
4/16
2/16
2/16

Die Listen ergeben addiert immer 16/16 besser 1/1. Die Nenner sind immer 4,16,64,256 usw.

Jetzt mein Problem, wenn ich die Brüch einfach durch eine Schleife jage.
Sub Bla ()

For i as int32 =0 to Array.length
Response.write(Kürzen(Array(i,0), Array(i,1)))
Next

End sub

Function Kürzen(ByVal z As Int32, ByVal n As Int32) As String
If z = n Then
Kürzen = z / z & "/" & n / n
Exit Function
Else
If z Mod 2 = 0 Then
Kürzen(z / 2, n / 2)
Exit Function
end if
End If
Kürzen = z & "/" & n
End Function

Ich bekomm dann dauernd ein Ergebniss wie.

1/8
1/4
1/8
1/4
1/8
1/8
 
AW: Logik beim Bruch Kürzen

Also am Syntax kann es eigentlich nicht liegen. Hast du die Zähler und Nenner einzeln in das Array eingegeben oder hast du die Brüche vorher schon eingegeben und dann aufgespalten?
Du solltest vielleicht mal das Array ausgeben lassen.
 
AW: Logik beim Bruch Kürzen

DonBarcal am 05.06.2008 13:01 schrieb:
Also am Syntax kann es eigentlich nicht liegen. Hast du die Zähler und Nenner einzeln in das Array eingegeben oder hast du die Brüche vorher schon eingegeben und dann aufgespalten?
Du solltest vielleicht mal das Array ausgeben lassen.

Die ausgabe von dem Array ist die Bruchliste, Im Array, Spalte 0 = Zähler, Spalte 1 = Nenner.

Das Problem liegt am Verhältnis, die Funktion kürzt mir einzelne Brüche zu weit runter.

Das 4/16 = 1/4 sind ist schon richtig aber nicht in diesem Fall da ich bei jedem Bruch den gleichen Nenner brauche.

Bei diesem Beispiel dürfte 4/16 nicht weiter als 2/8 gekürzt werden.
 
AW: Logik beim Bruch Kürzen

N-Traxx am 05.06.2008 12:42 schrieb:
Code:
            If z = n Then
                  Kürzen = z / z & "/" & n / n
Das ist hanebüchen. Wenn z=n, dann ist Kürzen ="1/1" - fertig

Code:
            If z Mod 2 = 0 Then
                  Kürzen(z / 2, n / 2)
                  Exit Function
wenn du das änderst in:
Code:
            If z Mod 2 = 0 [b]and n > 16 [/b]Then
                  Kürzen(z / 2, n / 2)
                  Exit Function
, dann bleibt als Nenner die 16.
Die Syntax mußt du wahrscheinlich anpassen, ich hab keine Ahnung, welche Programmiersprache das ist =)
 
AW: Logik beim Bruch Kürzen

Worrel am 05.06.2008 13:49 schrieb:
N-Traxx am 05.06.2008 12:42 schrieb:
Code:
            If z = n Then
                  Kürzen = z / z & "/" & n / n
Das ist hanebüchen. Wenn z=n, dann ist Kürzen ="1/1" - fertig
Ja hast recht, so gehts auch.;)
Code:
            If z Mod 2 = 0 Then
                  Kürzen(z / 2, n / 2)
                  Exit Function
wenn du das änderst in:
Code:
            If z Mod 2 = 0 [b]and n > 16 [/b]Then
                  Kürzen(z / 2, n / 2)
                  Exit Function
, dann bleibt als Nenner die 16.
Die Syntax mußt du wahrscheinlich anpassen, ich hab keine Ahnung, welche Programmiersprache das ist =)

Das ist ja das Problem, es soll nicht auf 16 bleiben es soll auf den kleins möglichen gemeinsamen Nenner runter. Bei dem Beispiel wäre das 8, wenn die Liste jetzt so aussieht müsste es 16 bleiben.

4/16
1/16
1/16
2/16
6/16


aber bei

2/16
4/16
2/16
4/16
2/16
2/16

ist es möglich das ganze auf 8tel zu kürzen.

Aber es kommen bei der Funktion auch Bruchlisten an die als Nenner z.b. 64,256,1024 haben.

Sämtliche Brüche addiert müssen immer ein ganzes ergeben, aber der Zähler muss immer eine ganze Zahl bleiben, also nciht 0,5/4 oder so.
 
AW: Logik beim Bruch Kürzen

N-Traxx am 05.06.2008 13:58 schrieb:
Das ist ja das Problem, es soll nicht auf 16 bleiben es soll auf den kleins möglichen gemeinsamen Nenner runter.
Ach so.

Dann müßtest du nach dem, was da oben steht, herausfinden welcher Nenner in den Lösungsvariablen am größten ist und dann die 1/8, 2/4 ... wieder auf den Nenner erweitern.

Das dürfte die einfachste Lösung sein, denn wenn du den ersten Bruch kürzt, kann das Programm ja noch gar nicht wissen, ob zB der letzte Bruch nur auf ein 16tel kürzbar ist.
 
AW: Logik beim Bruch Kürzen

Worrel am 05.06.2008 14:08 schrieb:
Dann müßtest du nach dem, was da oben steht, herausfinden welcher Nenner in den Lösungsvariablen am größten ist und dann die 1/8, 2/4 ... wieder auf den Nenner erweitern.

Und genau das ist das Problem, ich bekomm das einfach nciht in meinen Schädel rein wie ich den Mist umsetzten soll. :S
 
AW: Logik beim Bruch Kürzen

Das Hier ist der richtige Code, ein Teil auf jedenfall.

Code:
        Dim Result As New System.Collections.Generic.Dictionary(Of String, Int32)
        
        For Each d As String In Matrix
            If Result.ContainsKey(d) Then
                Result.Item(d) = Result.Item(d) + 1
            ElseIf Not Result.ContainsKey(d) And d.Length = S1.Length Then
                Result.Add(d, 1)
            End If
        Next
        
        For Each i As System.Collections.Generic.KeyValuePair(Of String, Int32) In Result
            
            Dim Z As Int32 = i.Value
            Dim N As Int32 = Matrix(0, 0)
                
            If Z = N Then
                lblErgebnis.Text = "1/1 " & i.Key & "<br>"
                Exit For
            End If
                
            If Not Result.ContainsValue(1) Then
                
[b]Und hier liegt das Problem, wie hau ich da eine Bremse rein ?[/b]
------------------------------------------------------------------------
                For b As Int32 = 0 To i.Value
                    If Z Mod 2 = 0 Then
                        Z = Z / 2
                        N = N / 2
                    Else
                        lblErgebnis.Text = lblErgebnis.Text &  Z & "/" & N & " " & i.Key & "<br>"
                        Exit For
                    End If
                Next
                
------------------------------------------------------------------------ 

           Else
                lblErgebnis.Text = lblErgebnis.Text & Z & "/" & N & " " & i.Key & "<br>"
            End If
        Next
 
AW: Logik beim Bruch Kürzen

N-Traxx am 05.06.2008 14:13 schrieb:
Und genau das ist das Problem, ich bekomm das einfach nciht in meinen Schädel rein wie ich den Mist umsetzten soll. :S

Also:
Du hast jetzt:

1/8
1/4
1/8
1/4
1/8
1/8

mithilfe des von dir geposteten Programms in einem Array gespeichert.

Jetzt schaust du , in welcher Zeile des Arrays der größte Wert steht und speicherst diesen Wert in einer Variablen:

Code:
vergleichswert=0
for i=0 to 6
   if vergleichswert < (brucharray(1,i)) then
       vergleichswert = (brucharray(1,i)) 
next

Als Nächstes mußt du wieder Zeile für Zeile durchgehen und den Bruch wieder erweitern.
Faktor: (brucharray(1,i))/vergleichswert
 
AW: Logik beim Bruch Kürzen

Worrel am 05.06.2008 14:36 schrieb:
Also:
Du hast jetzt:

1/8
1/4
1/8
1/4
1/8
1/8

mithilfe des von dir geposteten Programms in einem Array gespeichert.

Nicht ganz, schau dir den Code an den ich gepostet hab. Die Werte stehen in einem Dictionary. Und die gekürzen Brüche kommen gleich einzeln über die Bildschirmausgabe. Das ganze jetzt nochmal in einem extra Array zu hinterlegen ist nicht gerade das besste.
 
AW: Logik beim Bruch Kürzen

Ich hab es hinbekommen, mit einer Ausnahme. Es darf nie als erstes ein Bruch kommen der weiter gekürzt wird. Aber nach mehrfachen Tests dürfte das auch nciht vorkommen.
Code:
       For b As Int32 = 0 To i.Value
                    If Z Mod 2 = 0 And N > TN Then
                        Z = Z / 2
                        N = N / 2
                    Else
                        If TN < N Then
                            TN = N
                        End If
                        lblErgebnis.Text = lblErgebnis.Text & Z & "/" & N & " " & i.Key & "<br>"
                        Exit For
                    End If
                Next
 
AW: Logik beim Bruch Kürzen

N-Traxx am 05.06.2008 15:07 schrieb:
Ich hab es hinbekommen,...

Na dann Glückwunsch.
... mit einer Ausnahme. Es darf nie als erstes ein Bruch kommen der weiter gekürzt wird. Aber nach mehrfachen Tests dürfte das auch nciht vorkommen.

Hmmm, im Startposting hast du geschrieben:
Ich hab solche Bruchlisten

2/16
4/16
2/16
4/16
2/16
2/16
 
AW: Logik beim Bruch Kürzen

Worrel am 05.06.2008 15:56 schrieb:
2/16
4/16
2/16
4/16
2/16
2/16
[/quote]

Ist ja auch richtig, 2/16 kann man nur auf 1/8 kürzen, so hab ch den Stopper auf 8. Würde jetzt der 4/16 Bruch zu erst kommne hätte ich den Stopper auf 4 weil 4/16 = 1/4 sind. Das wäre dann schlecht für die restliche Ausgabe.
 
AW: Logik beim Bruch Kürzen

N-Traxx am 05.06.2008 16:16 schrieb:
Ist ja auch richtig, 2/16 kann man nur auf 1/8 kürzen, so hab ch den Stopper auf 8. Würde jetzt der 4/16 Bruch zu erst kommne hätte ich den Stopper auf 4 weil 4/16 = 1/4 sind. Das wäre dann schlecht für die restliche Ausgabe.
Ah ok, begriffen.

Aber kannst du das wirklich 100%ig ausschließen, daß soclh ein Bruch am Anfang steht ?
 
AW: Logik beim Bruch Kürzen

Worrel am 05.06.2008 22:13 schrieb:
N-Traxx am 05.06.2008 16:16 schrieb:
Ist ja auch richtig, 2/16 kann man nur auf 1/8 kürzen, so hab ch den Stopper auf 8. Würde jetzt der 4/16 Bruch zu erst kommne hätte ich den Stopper auf 4 weil 4/16 = 1/4 sind. Das wäre dann schlecht für die restliche Ausgabe.
Ah ok, begriffen.

Aber kannst du das wirklich 100%ig ausschließen, daß soclh ein Bruch am Anfang steht ?

zu 99%
 
Zurück