VisualBasic Hilfe zur Programmschreibung

Hetral1988

Newbie
Registriert
März 2009
Beiträge
1
Hi Leute,

bin noch ein Neuling im Programmieren und möchte ein Programm schreiben mit dem Visual
Basic Editor. Excel Version.
Leider sind mir nicht alle Befehle vorläufig die ich für folgendes brauchen werde:

Möchte folgende Gleichung mit 3 Variablen unter Berücksichtigungen einiger Bedingungen lösen:

x*y*z = B

x = alle natürlichen Zahlen von 1-31
Y = alle natürlichen Zahlen von 1-12
Z = alle natürlichen Zahlen von 1-2009
B = alle natürlichen Zahlen

B ist bekannt, und der Computer soll dann die möglichen Daten wiedergeben
Beispiel:
B = 1000
Möglichkeiten:
x = 1
y = 2
z = 500

also das Datum: 01.02.500

oder

x = 2
y = 1
z = 500

Datum wäre dann: 02.01.500

Wie lautet der Befehl, dass der Computer die Variablen ausrechnet und wiedergibt?

natürlich gebe es noch mehr Bedingungen:

If y = 1, 3, 5, 7, 8, 10, 12

then x = 1-31

elseif y = 2, 4, 6, 9, 11

then x = 1-30

else x = 1-28

und er soll aufhören zu rechnen wenn gilt:

z * 12 * 31 > b


weis einer wie die Befehle dafür sind, also mit variablen zu rechnen, von denen der Computer das Ergebnis weis, und er nur noch die möglichen Werte der Variablen unter Bedinungen wiedergibt ?

Hoffe ich hab keine Verwirrung gestiftet ;)

danke ^^
 
also die Bedingungen würde ich mit "case" machen (am besten schaust du in die Hilfe ;) )
deine letzte Bedingung kannst du ja genaus so schreiben
if ((z*12*31)>b) und so weiter ;)

wie du deine Zahl B zerlegen kannst musst du mal schauen wie man es am besten macht. vllt Primfaktorzerlegung, damit du auf deine Werte kommst.
 
Zuletzt bearbeitet:
Bei dieser Berechnung gibt es rund 730.000 Möglichkeiten. Das ist nicht sonderlich viel, daher ließe sich das Projekt z.B. auch mittels "Bruteforce" lösen.

Du gehst also einfach von Tag 01.01.0001 bis zum Tag 31.12.2009 alle Möglichkeiten durch, und probierst ob dabei das Ergebnis rauskommt was du dir vorgestellt hast. Diese Ergebnisse lässt du halt einfach in irgend eine Liste eintragen.

/edit: habs grad mal getestet. Das Proggy hat 3 Sekunden gebraucht, Ergebnis für b=1000:

25.10.0004
25.08.0005
20.10.0005
25.05.0008
25.04.0010
20.05.0010
10.10.0010
25.02.0020
10.05.0020
05.10.0020
20.02.0025
10.04.0025
08.05.0025
05.08.0025
04.10.0025
25.01.0040
05.05.0040
20.01.0050
10.02.0050
05.04.0050
04.05.0050
02.10.0050
10.01.0100
05.02.0100
02.05.0100
01.10.0100
08.01.0125
04.02.0125
02.04.0125
01.08.0125
05.01.0200
01.05.0200
04.01.0250
02.02.0250
01.04.0250
02.01.0500
01.02.0500
01.01.1000
/edit2: der Code dazu in Delphi... vielleicht inspiriert es dich ja:

Code:
procedure TForm1.Button1Click(Sender: TObject);
var
 i: integer;
 a,b,c: word;
 t: TDate;
begin
 Button1.Enabled := false;

 Memo1.Lines.Clear;
[B] t := StrToDate('01.01.0001');

 for I := 1 to DaysBetween(StrToDate('01.01.0001'),StrToDate('31.12.2009')) do
 begin
  DecodeDate(t,a,b,c);
  if (a*b*c) = StrToInt(edit1.Text) then Memo1.Lines.Add(DateToStr(t));
  t := t + 1;
 end;[/B] 

 Button1.Enabled := true;
end;
Dazu habe ich einen Button (Button1), ein Eingabefeld (Edit1) und eine Textbox (Memo1) auf einem Form plaziert.

Im Grunde macht es nichts anderes, als für jedes Datum von 01.01.0001 bis 31.12.2009 die einzelnen Zahlenwerte herauszunehmen (DecodeDate), diese dann miteinander zu multiplizieren und für den Fall, dass es der Eingabe entspricht, in der Textbox auszugeben.

/edit3: das tolle an der Sache ist eigentlich, das Delphi einem abnimmt ein "korrektes" Datum zu nehmen. Also nach dem 31.12. eines Jahres kommt automatisch der 01.01 des folgenden Jahres, obwohl ich nur "+1" rechne (also +1 Tag). Genau das Gleiche mit Schaltjahren und dergleichen.

/edit: ich seh jetzt erst, dass du eigentlich VBA und nicht VB programmierst ("Excel Version"), stimmt das? Dann könnte Bruteforce eventuell doch zu lange dauern, da VBA als Skriptsprache naturgemäß ziemlich langsam ist.
 
Zuletzt bearbeitet:
Zurück
Oben