Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen

Programmzeilen

Betrifft: Programmzeilen von: Alifa
Geschrieben am: 14.03.2013 10:04:40

Hallo,
wenn die Rechenoperationen "+4","*7","-6","/8", nicht unbedingt in dieser Reihenfolge, auf eine Zahl(18 bis 100) je einmal angewendet werden sollen, wie kann man das in wenigen Programmzeilen erfassen? Beispiel: E=(((59+4)/8)-6)*7. Das Ergebnis (E) soll positiv, ganzzahlig sein und sich zwischen 10 und 100 befinden. Alle möglichen Permutationen der Rechenoperationen(24) sollen berücksichtigt werden. Danke im Voraus!
Gruß Alifa

  

Betrifft: AW: Programmzeilen von: Klaus M.vdT.
Geschrieben am: 14.03.2013 10:52:59

Hallo Alifa,

Punkt vor Strich, richtig? Deshalb die Klammern.

Leider habe ich keine Musterdatei von dir, darum auch keine Ahung wie die Ausgabe aussehen soll.
Ich habe mir jetzt mal die Permutationen der Rechenoperationen in einer Hilfstabelle hingeschrieben und für alle Möglichkeiten die Ergebnisse in eine Matrix geschrieben:
https://www.herber.de/bbs/user/84353.xlsm
(drücke "clear" zum leeren, "Formeln" um die Mathe-Formeln zu sehen oder "Ergebniss" um das Ergebniss zu sehen)

Das Ergebnis (E) soll positiv, ganzzahlig sein und sich zwischen 10 und 100 befinden.
Ehm ... Nö? eine gültige Permutation deiner Befehle ist -6 /8 +4 *7, durch ausklammerung von der Punkt-vor-Strich Regel befreit ergibt das für den Input 97 (das ist eine Zahl zwischen 18 und 100):
((((97-6)/8)+4)*7)=107,625
Das ist nunmal so. Du kannst nicht verlangen, dass die Ergebnisse ganzzahlig und zw. 10 und 100 sind, wenn Adam Riese damals etwas anderes herausbekommen hätte!

wie kann man das in wenigen Programmzeilen erfassen?
Mangels Kentniss deiner Ausgabewünsche der Ergebnisse habe ich das ignoriert und relativ viele Programmzeilen und Hilfstabellen verwendet.
Um das zu reduzieren, dürfen die Permutationen FEST im Code stehen oder verändern die sich noch?

Grüße,
Klaus M.vdT.


  

Betrifft: AW: Programmzeilen von: Alifa
Geschrieben am: 14.03.2013 11:51:26

Hallo Klaus,
nein, nicht Punkt vor Strich, sondern nacheinander. Beispiel:52+4=56; 56/8=7; 7*7=49 und 49-6=43.
Natürlich erfüllen nicht alle 24 Permutationen von ("+4","-6","*7","/8")die gestellten Bedingungen. Das erwartet auch Adam Riese nicht! Ich möchte alle plausiblen Ergebnisse.
Gruß Alifa


  

Betrifft: Meine Datei? von: Klaus M.vdT.
Geschrieben am: 14.03.2013 12:03:42

Hallo Alifa,

in meine Datei hast du aber geschaut?
Ich schreibe 5 Absätze mit Musterdatei, du liest nur den ersten Satz und drückst dann "Beitrag absenden"??
Egal jetzt. Erichs Lösung ist eh besser als meine.

Grüße,
Klaus M.vdT.


  

Betrifft: noch ein Vorschlag von: Erich G.
Geschrieben am: 14.03.2013 11:41:23

Hi Erhard,
dieser Code

Option Explicit
   Dim arE

Sub RechenopPerm()
   Dim strT As String, ww0 As Long, zz As Long, ww As Double
   Dim cc As Long, ze As Long, strE As String

   strT = "1234"
   ReDim arE(1 To Application.Fact(Len(strT))) As String
   Permu strT, "", 0
   
   ze = 1
   For ww0 = 18 To 100
      For zz = 1 To UBound(arE)
         ww = ww0: strE = "((((" & ww0
         For cc = 1 To 4
            Select Case --Mid(arE(zz), cc, 1)
               Case 1: ww = ww - 6: strE = strE & "-6)"
               Case 2: ww = ww / 8: strE = strE & "/8)"
               Case 3: ww = ww + 4: strE = strE & "+4)"
               Case 4: ww = ww * 7: strE = strE & "*7)"
            End Select
         Next cc
          If Int(ww) = ww Then
            If ww > 9 And ww < 101 Then
               ze = ze + 1
               Cells(ze, 1) = ww0
               Cells(ze, 2) = arE(zz)
               Cells(ze, 3) = strE
               Cells(ze, 4) = ww
            End If
         End If
      Next zz
   Next ww0
End Sub

Sub Permu(aa$, bb$, ze&)
   Dim ii%, jj%:     jj = Len(aa)
   If jj > 1 Then
      For ii = 1 To jj
         Permu Left(aa, ii - 1) + Right(aa, jj - ii), bb + Mid(aa, ii, 1), ze
      Next ii
   Else
      ze = ze + 1
      arE(ze) = bb & aa
   End If
End Sub
produziert das hier:

 ABCD
1ZahlPermFormelErgebnis
2181324((((18-6)+4)/8)*7)14
3181342((((18-6)+4)*7)/8)14
4181432((((18-6)*7)+4)/8)11
5183124((((18+4)-6)/8)*7)14
6183142((((18+4)-6)*7)/8)14
7184123((((18*7)-6)/8)+4)19
8203241((((20+4)/8)*7)-6)15
233983142((((98+4)-6)*7)/8)84
234984123((((98*7)-6)/8)+4)89
2351003214((((100+4)/8)-6)*7)49
2361003241((((100+4)/8)*7)-6)85
2371003421((((100+4)*7)/8)-6)85
2381004321((((100*7)+4)/8)-6)82

Es werden also 237 Lösungen gefunden.

Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich


  

Betrifft: wunderschön! von: Klaus M.vdT.
Geschrieben am: 14.03.2013 12:06:47

Hallo Erich,

dein Code ist wunderschön! Ich muss noch sowas von aufholen mit VBA ...

Grüße,
Klaus M.vdT.


  

Betrifft: Wenn es bei diesem Thema vordergründig ... von: Luc:-?
Geschrieben am: 14.03.2013 12:44:24

…um eine einheitliche Darstellung unterschiedlicher Notationsweisen (also trotzdem gleiche Ergebnisse liefernd) einer Berechnungsfml ginge, wäre es auch für mich interessant gewesen, Erich… ;-)
Aber das ist ein anderes Thema, dessen positive Behandlung ich dir allerdings auch zutraue… ;-)
(Es ginge dabei um automatisierte Feststellung der Gleichartigkeit von Berechnungskennziffern.)
Gruß Luc :-?


  

Betrifft: AW: noch ein Vorschlag von: Alifa
Geschrieben am: 14.03.2013 14:28:34

Hallo Erich,
danke für deinen Beitrag!!! Ich habe es so versucht:

Sub EinfachSo()
Dim a, b, p, f1, t!, z As Byte
Dim d1%, d2%, d3%, d4%, e
Cells.ClearContents
t = Timer
p = Array("-6", "+4", "/8", "*7")
For a = 18 To 100
For d1 = 0 To 3
For d2 = 0 To 3
For d3 = 0 To 3
For d4 = 0 To 3
If p(d1) <> p(d2) And p(d1) <> p(d3) And p(d1) <> p(d4) And p(d2) <> p(d3) _
And p(d2) <> p(d4) And p(d3) <> p(d4) Then
f1 = "(" & "(" & "(" & a & p(d1) & ")" & p(d2) & ")" & p(d3) & ")" & p(d4)
e = Evaluate(f1)
If e > 10 And e < 100 And e = Fix(e) Then
z = z + 1
Cells(z + 2, 1) = e
Cells(z + 2, 2) = f1
Columns.AutoFit
End If: End If: Next: Next: Next: Next: Next
MsgBox Round(Timer - t, 1)
End Sub
Gruß Erhard