libertes
Goto Top

Visual Basic

Hey ,bin hier neu auf der Plattform,deshalb sorry wenn ich mich noch nicht so gut auskenne.
Mein Propblem sieht so aus;

For i = 1000 to 9999
If i mod 17 = 0 then
Ergebnis = Ergebnis +1
End If
Next
MsgBox "Ergebnis"

Eigentlich sollte mir die Msgbox alle Zahlen zwischen 1000 und 9999 auflisten die durch 17 teilbar sind.
Leider funktioniert dies nicht,

Kann mir jemand sagen was an der syntax falsch ist ?

Gruß
libertes

Content-ID: 136478

Url: https://administrator.de/contentid/136478

Ausgedruckt am: 16.11.2024 um 03:11 Uhr

StefanKittel
StefanKittel 21.02.2010 um 14:05:45 Uhr
Goto Top
Zitat von @libertes:
MsgBox "Ergebnis"
Hallo,
ohne " -> MsgBox Ergebnis
Stefan
libertes
libertes 21.02.2010 um 14:16:56 Uhr
Goto Top
Dim Ergebnis As String
For i = 1000 To 9999
If mod 17 to 0 then
Ergebnis = Ergebnis + 1
End If

Next
MsgBox(Ergebnis)

Hallo Stefan,
funktioniert noch immer nicht.
Das ist der komplette Text,wobei er Ergebnis automatisch in klammer setzt.

libertes
StefanKittel
StefanKittel 21.02.2010 um 14:23:40 Uhr
Goto Top
Zitat von @libertes:
Dim Ergebnis As String
Ergebnis sollte ja nun auch kein String sein. Ich bin nun nicht der vba fraggle, aber versuch mal long.

Stefan
libertes
libertes 21.02.2010 um 14:31:24 Uhr
Goto Top
Danke Stefan werde es versuchen
Gruß
libertes
hpbruns
hpbruns 21.02.2010 um 14:54:59 Uhr
Goto Top
Hmmm, kurze Frage.
Was wilst Du denn ausgeben? Einen Zähler, der die Anzahl der gefundenen Treffer ausgibt, oder aber die Zahl, die durch 17 teilbar ist?
Und unter welcher Umgebung (VB6, VBA, .Net)?

Das was Du da machst führt eher zu nix.

Gruß

HaPe
libertes
libertes 21.02.2010 um 15:15:58 Uhr
Goto Top
Hey,
Einen Zähler, der die Anzahl der gefundenen Treffer ausgibt

Und zwar in VB.Net
Gruß
libertes
76109
76109 21.02.2010 um 15:22:24 Uhr
Goto Top
Hallo libertes!

Funktioniert besser, wenn Du
1. Einen Zähler als Integer definierst (String = Text, Integer = Zahl)
2. Auch was zum Teilen nimmst (Nothing Mod 17)

Dim Ergebnis As Integer

For i = 1000 To 9999
    If i Mod 17 = 0 Then Ergebnis = Ergebnis + 1
Next

MsgBox Ergebnis

Gruß Dieter
hpbruns
hpbruns 21.02.2010 um 15:22:35 Uhr
Goto Top
Dan n versuche es mal so:

Dim i As Integer
Dim iCounter As Integer

'Anzahl der Treffer (erst mal auf 0 setzten)
iCounter = 0

For i = 1000 To 9999
If i Mod 17 = 0 Then
iCounter = iCounter + 1
End If
Next

'Nach durchlauf der Schleife das Ergebnis ausgeben (Anzahl der Treffer)
MsgBox("Es gibt : " & iCounter & " Treffer")

Gruß

HaPe
HeinrichXII
HeinrichXII 21.02.2010 um 16:17:23 Uhr
Goto Top
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Ergebnis As Integer = 0
For i = 1000 To 9999
If i / 17 = Int(i / 17) Then
Ergebnis = Ergebnis + 1
End If
Next
MsgBox(Ergebnis)
End Sub

MfG
Heinrich
Biber
Biber 21.02.2010 um 23:06:55 Uhr
Goto Top
[OT]
Ja, ich weiß, ob nun Dualcore oder Quadcore, das macht preislich kaum einen Unterschied... und die Rechner sind ja wirklich sauschnell heutzutage....
Und natürlich kann man/frau einen armen wehrlosen Skriptschnipsel zur Prüfung von 8999 Zahlen auf Teilbarkeit durch 17 auch 8999mal durch eine Schleife jagen...

Aber im Ernst - würdet ihr ohne Computer den gleichen Algorithmus anwenden?
Dim Anzahl As Integer
Dim Von as Integer
Dim Bis as Integer
Dim Modwert as Integer
Dim First As Integer
Dim Last As Integer
Von = 1000
Bis = 9999
Modwert =17

First = int(Von / modwert) 
Last = int (Bis /modwert)

If (int(Von / modwert) <> Von / modwert) Then First = First+1
Anzahl= Last -First +1

MsgBox  ("Es gibt : " &Last & "-" &First &" +1 = " & Anzahl & " Treffer.")  

So oder so ähnlich hätte ein Nicht-Quadcore-Besitzer diesen Algorithmus wohl eher formuliert...

Grüße
Biber
[Edit] Etwas leserlicher formuliert. [/Edit]
[/OT]
StefanKittel
StefanKittel 22.02.2010 um 00:03:54 Uhr
Goto Top
Zitat von @Biber:
So oder so ähnlich hätte ein Nicht-Quadcore-Besitzer diesen Algorithmus wohl eher formuliert...

Hallo,
es war schon immer viel schlauer Hirn statt Rechenleistung zu verwenden.
Respekt! Auf diese ganz einfache Idee bin ich ja nun auch nicht gekommen.

Stefan
HeinrichXII
HeinrichXII 22.02.2010 um 19:21:08 Uhr
Goto Top
Dieser "einfache" Programmcode verbraucht schonmal 6 Variablen während der "rechenaufwändige" mit einer auskommt. Nicht nur das man damit bei "Nicht-Quadcore-Rechnern" und größeren Programmen dieser Art den heutzutage wertvolleren Arbeitsspeicher zumüllt, sondern auch die Übersichtlichkeit geht hier flöten. Wer bei solch trivialen For-Schleifen im Jahre 2010 an die Rechenleistung denkt, der ist vor einigen Jahren mal irgendwo stehen geblieben. Selbst ein halbwegs guter Pentium 2 würde diesen Quellcode in unter ner Sekunde durchrattern.
@ Biber: Ich willt nicht deinen Programmcode schlecht machen, im Gegenteil - mehrere Lösungen für ein Ziel sind immer besser als nur eine, aber die Lösung mit der Performanceverschwendung der anderen Codes zu begründen ist für mich Schwachsinn.

MfG Heinrich
Biber
Biber 22.02.2010 um 19:52:49 Uhr
Goto Top
Ach HeinrichXII,

da machen wir gar nicht viel Heckmeck drumrum... da mach ich mal ein liebloses Copy&Paste:

' Quicktest ....Anzahl durch 17 teilbare Zahlen Von:1000 Bis:10Mio-1  
Wscript.echo vblf & " Runde 1 ...10 Mio " & vbcrlf  
wscript.echo "For every number - Loop start " & time  
Ergebnis=0
For i = 1000 To 9999999
If i / 17 = Int(i / 17) Then
Ergebnis = Ergebnis + 1
End If
Next
wscript.echo "Ergebnis: " & Ergebnis  
wscript.echo "For every number - Loop end   "& time  
'------  
wscript.echo "--------------------------------------"  
wscript.echo "mit 6 variablen          start" & time  
Von = 1000
Bis = 9999999
Modwert =17

First = int(Von / modwert) 
Last = int (Bis /modwert)

If (int(Von / modwert) <> Von / modwert) Then First = First+1
Anzahl= Last -First +1


Wscript.echo  (vblf &  "Es gibt : " &Last & "-" &First &" +1 = " & Anzahl & " Treffer." & vblf)  
wscript.echo "mit 6 variablen            end" & time  

Wscript.echo vblf & " Runde 2 ...50 Mio " & vbcrlf  

' Quicktest ....Anzahl durch 17 teilbare Zahlen Von:1000 Bis:50Mio-1  
wscript.echo "For every number - Loop start " & time  
Ergebnis=0
For i = 1000 To 49999999
If i / 17 = Int(i / 17) Then
Ergebnis = Ergebnis + 1
End If
Next
wscript.echo "Ergebnis: " & Ergebnis  
wscript.echo "For every number - Loop end   "& time  
'------  
wscript.echo "--------------------------------------"  
wscript.echo "mit 6 variablen          start" & time  
Von = 1000
Bis = 49999999
Modwert =17

First = int(Von / modwert) 
Last = int (Bis /modwert)

If (int(Von / modwert) <> Von / modwert) Then First = First+1
Anzahl= Last -First +1


Wscript.echo  (vblf &  "Es gibt : " &Last & "-" &First &" +1 = " & Anzahl & " Treffer." & vblf)  
wscript.echo "mit 6 variablen            end" & time  

...und lass das als VBS.Version laufen.... und der Lüfter jault...
>e:\schnipsel\Quicktestmod17.vbs

 Runde 1 ...10 Mio

For every number - Loop start 19:49:08
Ergebnis: 588177
For every number - Loop end   19:49:24
--------------------------------------
mit 6 variablen          start19:49:24

Es gibt : 588235-59 +1 = 588177 Treffer.

mit 6 variablen            end19:49:24

 Runde 2 ...50 Mio

For every number - Loop start 19:49:24
Ergebnis: 2941118
For every number - Loop end   19:50:43
--------------------------------------
mit 6 variablen          start19:50:43

Es gibt : 2941176-59 +1 = 2941118 Treffer.

mit 6 variablen            end19:50:43

(=19:50:44  D:\temp=)

Ich denke, die anderthalb Minuten deines Algorithmus in Runde 2 sind erkennbar.
Und von den 6 Variablen, die ich habe, sind 5 nur wegen der Lesbarkeit drin....

Grüße
Biber

Nachtrag: Ergebnisse der Runde drei (von 1000 bis 100Mio-1:
 Runde 3 ...100 Mio

For every number - Loop start 20:03:18
Ergebnis: 5882294
For every number - Loop end   20:05:49
--------------------------------------
mit 6 variablen          start20:05:49

Es gibt : 5882352-59 +1 = 5882294 Treffer.

mit 6 variablen            end20:05:49


[Edit]
Selbst ein halbwegs guter Pentium 2 würde diesen Quellcode in unter ner Sekunde durchrattern.
Na ja, dann hab' ich mir wohl so'n Billig-Import andrehen lassen ... face-wink
[/Edit]
HeinrichXII
HeinrichXII 22.02.2010 um 20:19:48 Uhr
Goto Top
Hallo,

danke für deinen Post. Ich muss zugeben der war ziemlich aufschlussreich. Es ist ja schön, dass du das alles mal so simulierst und ich traue auch deinen Testergebnissen, nur war die Frage hier nicht nach 10, 50 oder 100 Millionen, sondern nach rund 9000 Zahlen und das schafft dann auch ein Pentium II.

MfG Heinrich
StefanKittel
StefanKittel 22.02.2010 um 20:30:37 Uhr
Goto Top
Zitat von @HeinrichXII:
Wer bei solch trivialen For-Schleifen im Jahre 2010 an die Rechenleistung denkt, der ist vor einigen Jahren mal irgendwo stehen geblieben.
Hallo,
aber wer im kleine schludert....
Oder wie willst Du erklären warum Windows 7 auf einem Core i5 gegenüber Windows 98 auf einem P2 nicht ein bischen schneller ist.
Stefan

PS: zeigt das Bild Dein Büro?
Biber
Biber 22.02.2010 um 20:31:53 Uhr
Goto Top
Moin HeinrichXII,

na ja, ich bin davon ausgegangen, dass libertes' Skizze ja auch nur eine zarte Andeutung sein sollte...für die paar durch 17 teilbaren Zahlen zwischen 1000 und 9999 braucht er ja wohl kaum ein Programm schreiben. Bestenfalls einen Bierdeckel.

Und selbst wenn er dieses Programmschnipselchen nur in diesem daumengroßen Zahlenbereich von bis 10000(-1) verwendet - nach 1000x Starten ist er bei 10Mio.

Also sooooooooo verwegen und realitätsfern finde ich den Quicktest nicht.

Aber ich geb dir natürlich Recht... eine For-Schleife 10000x durcheiern.... das braucht auf den heutigen Rechnern (und gestrigen bis runter auf PentiumII)- natürlich nur einen Lidschlag.

Grüße
Biber
HeinrichXII
HeinrichXII 22.02.2010 um 20:49:27 Uhr
Goto Top
Aloha,

@ Biber: die Worte "verwegen" und "realitärsfern" stammen aus deinem Munde face-smile. Wie gesagt ich fand den Test sehr aufschlussreich (und das mein ich wirklich nicht ironisch)
@ Stefan: Das is aber auch ein hinkender Vergleich - Windows 7 und 98 sind sowohl im Funktionsumfang, Sicherheit, Rechteverwaltung, Grafik und verwendete Treiber nicht Ansatzweise zu vergleichen. Sicher magst du Recht haben das es von der Geschwindigkeit keinen Unterscheid gibt, von der Bedienbarkeit her aber einen riesigen.

MfG Heinrich

Edit: Nein zeigt es nicht, aber was nicht ist kann ja noch werden face-smile .
76109
76109 22.02.2010 um 21:13:29 Uhr
Goto Top
Hallo zusammen!

@Biber
Dein PC ist ganz schön langsamface-wink

Hier mein Test ohne Startverzögerung:
Start = time:  Ergebnis=0

For i = 1000 To 9999999
    If i Mod 17 = 0 Then Ergebnis = Ergebnis + 1
Next

wscript.echo "Start: " & Start & "  Stop: "& time & vbTab & Ergebnis  

Start = time:  Ergebnis=0
For i = 1000 To 49999999
    If i Mod 17 = 0 Then Ergebnis = Ergebnis + 1
Next

wscript.echo "Start: " & Start & "  Stop: "& time & vbTab & Ergebnis  

Start = time:  Ergebnis=0

For i = 1000 To 99999999
    If i Mod 17 = 0 Then Ergebnis = Ergebnis + 1
Next

wscript.echo "Start: " & Start & "  Stop: "& time & vbTab & Ergebnis  

Und meine Zeiten:
 Runde 1 ...10 Mio

For every number - Loop start 20:41:00
Ergebnis: 588177
For every number - Loop stop  20:41:02

--------------------------------------

 Runde 2 ...50 Mio

For every number - Loop start 20:41:30
Ergebnis: 2941118
For every number - Loop stop  20:41:43

--------------------------------------

 Runde 3 ...100 Mio

For every number - Loop start 21:00:07
Ergebnis: 5882294
For every number - Loop stop  21:00:33

Ansonsten hast Du natürlich recht, dass es von keinem guten Programmierstil zeugt, derartige Codes zu schreiben.face-wink

Gruß Dieter
Biber
Biber 22.02.2010 um 21:27:40 Uhr
Goto Top
Moin didi1954,

Dein PC ist ganz schön langsam
jahaa, und dein PC ganz schön schnell.
Du müsstest diesen Proof-of-Concept-Test wahrscheinlich eher im Bereich von 100Mio, 500Mio und 1Mrd machen...face-wink

Ich habe mich ja nur zu diesem Konter hinreißen lassen, weil ich sofort bei HeinrichXIIs Kommentar "aber die Lösung mit der Performanceverschwendung der anderen Codes zu begründen ist für mich Schwachsinn." unter der Decke geklebt habe... da kann ich dann auch stur sein...*g

Na ja, mein heissblütiges norddeutsches Temperament halt.
Aber eine Doktorarbeit sollte es auch nicht werden...

Andererseits sind für mich hier im Forumsbereich schon die Algorithmen und die Lösungsstrategien ein wichtigerer Punkt als diese Das-ist-mein-Laden-Argumentation, dass alles einfach immer mit einem neueren Boliden doppelt so schnell gehen wird.
Und wenn zwei jeweils 5zeilige Schnipsel in der Performance um den Faktor 1000 abweichen, dann ist es für mich schon ein Kriterium.

So, nun aber gut mit diesem kleinen Exkurs.

Grüße
Biber
hpbruns
hpbruns 23.02.2010 um 10:13:17 Uhr
Goto Top
Moin Moin an alle

Sehr interressant das alles. Am Anfang schreibt libertes: "Ich brauch mal Hilfe. Ich bin neu hier und habe ein kleines Problem.... "
Wenn man sich dann den Code ansieht, würd ich mal sagen, dass sich das "neu" nicht nur auf das Forum bezieht.

Mit den ersten Lösungsvorschlägen ist dem Kollegen dann erst mal geholfen. Es funktioniert, wie es sollte.
Ob es da Verbesserungen gibt, war nicht die eigentliche Frage.

Der Rest der Diskussion gleitet dann ab in den Bereich "Algorithmen" und ist HIER eigentlich fehl am Platz.

Wie dem auch sei, Biber hat insofern Recht, das es seit einiger Zeit aus der Mode gekommen ist, effizienten Code zu schreiben.
In Zeiten von QuadCore und gigabyte großem Arbeitspeicher macht man sich keinen Gedanken mehr um "schlanken" und effizienten Code.

Vielleicht sollte man den Thread dann auch in einen anderen Forumsbereich verschieben und da weitermachen face-wink

@libertes: Hat es denn wenigstens geholfen?

Gruß

HaPe

@HeinrichXII: Für eine komplette Büroausstattung fehlt aber noch die Kaffeemaschine face-wink