Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Dezimalzahlen über Batch verarbeiten

Frage Entwicklung Batch & Shell

Mitglied: Motorcross

Motorcross (Level 1) - Jetzt verbinden

09.04.2010 um 17:50 Uhr, 4816 Aufrufe, 16 Kommentare

Hallo Administratoren,

ich programmiere gerade einen Geldwechseler, der 2 Euromünzen, 1 Euromüzen und 0,10 Euromünzen wechselt.
Nur habe ich ein problem mit den Dezimalzahlen.
Hier erstmal mein Script für GANZE Euro
01.
@Echo off 
02.
:aa 
03.
set /p alt=Geld: 
04.
:bb 
05.
if %alt% GEQ 50 echo Error zu viel Geld!!&pause&goto aa 
06.
:cc 
07.
if %alt% GEQ 2 set /a eurodeux=%eurodeux%+1&set /a alt=%alt%-2 
08.
if %alt% GEQ 1 set /a euroun=%euroun%+1&set /a alt=%alt%-1 
09.
if %alt%==0 goto gg 
10.
goto cc 
11.
echo %eurodeux% 
12.
echo %euroun% 
13.
 
14.
:gg 
15.
if %eurodeux%==0 goto ff 
16.
call 2.00-1.vbs 
17.
set /a eurodeux=%eurodeux%-1 
18.
goto gg 
19.
 
20.
:ff 
21.
if %euroun%==0 exit 
22.
call 1.00.vbs 
23.
set /a euroun=%euroun%-1 
24.
goto ff
Beschreibung
1. Benötigte Geld wird eingegeben
2. Es wird gezählt wie viele Münzen den Betrag ergeben der in der Variable %alt% gespeichert ist.
3. Das Geld wird ausgezahlt:
"call 2.00-1.vbs" bedeutet das jetzt eine 2 Euromünze ausgezahlt wird.
"call 1.00.vbs" bedeutet das jetzt eine 1 Euromünze ausgezahlt wird.

Wichtig:
Ich würde gerne in diesem Script auch dezimalzahlen verarbeiten.
z. B. das man 15.10 eingibt und dann das z.B. 14 2 Euromünzen und 1 1Euromünze und 1 0,10 Euromünze ausgezahlt wird.
Die 0,10.vbs würde dann immer eine 0,10 Euomünze auszahlen.
Kann man das irgendwie programmieren und wenn ja wie?
Ich würde mich über Hilfe und Beispiele freuen!
Gruß Motorcross
Mitglied: bastla
09.04.2010 um 18:24 Uhr
Hallo motorcross!

Etwa so:
01.
@echo off & setlocal 
02.
:aa 
03.
set /p alt=Geld: 
04.
:bb 
05.
for /f "tokens=1-2 delims=." %%a in ("%alt%") do if [%%b]==[] (set /a alt=%%a*100) else (set /a alt=%%a*100+1%%b-100) 
06.
if %alt% GEQ 5000 echo Error zu viel Geld!! & pause & goto aa 
07.
:cc 
08.
if %alt% GEQ 200 ( 
09.
    set /a eurodeux+=1 
10.
    set /a alt-=200 
11.
    goto :cc 
12.
13.
:dd 
14.
if %alt% GEQ 100 ( 
15.
    set /a euroun+=1 
16.
    set /a alt-=100 
17.
    goto :dd 
18.
19.
set /a centdix=alt/10 
20.
echo %eurodeux% 
21.
echo %euroun% 
22.
echo %centdix% 
23.
 
24.
:gg 
25.
if %eurodeux%==0 goto ff 
26.
call 2.00-1.vbs 
27.
set /a eurodeux-=1 
28.
goto gg 
29.
 
30.
:ff 
31.
if %euroun%==0 goto hh 
32.
call 1.00.vbs 
33.
set /a euroun-=1 
34.
goto ff 
35.
 
36.
:hh 
37.
if %centdix%==0 goto :eof 
38.
call "0,10.vbs" 
39.
set /a centdix-=1 
40.
goto hh
Es wird vorausgesetzt, dass keine oder genau 2 Nachkommastellen eingegeben wurden, und falls die Eingabe nicht auf 10 Cent genau ist, fallen die überzähligen Cent einfach weg (also würde zB eine Eingabe von 15.18 als Ergebnis 7 / 1 / 1 liefern) ...
Da Batch ja nun wirklich nicht mit Dezimalzahlen umgehen kann, müssen aus den Euro eben Cent (und damit wieder ganzzahlige Werte) werden - deshalb die Multiplikation mit 100 ...

Noch ein Hinweis zur etwas gewöhnungsbedürftig aussehenden Formel
set /a alt=%%a*100+1%%b-100
Da in Batch eine mit der Ziffer 0 beginnende Zahl als Oktalzahl interpretiert wird, würde die einfachere Variante
set /a alt=%%a*100+%%b
bei der Eingabe von 08 oder 09 Cent zu einem Fehler führen - durch das Voranstellen von 1 wird daraus aber zunächst zB 108 und durch die folgende Subtraktion von 100 der verarbeitbare Wert 8.

Hinsichtlich der Schreibweise von zB "set /a alt-=200" gibt die Onlinehilfe zu "set" nicht ganz so viel her, deshalb auch dazu eine kurze Erklärung: Es wird damit der Interpreter einfach angewiesen, vom derzeitigen Wert der Variablen %alt% 200 zu subtrahieren und das Ergebnis wieder in %alt% zu speichern.

Grüße
bastla

P.S.: Natürlich ließe sich die Ermittlung der Münzanzahl auch sehr einfach ohne Schleifen realisieren (auf vielfachen Wunsch in der kommentierten Version ) und damit als Ersatz der Zeilen 7 bis 18 etwa so formulieren:
01.
:: Betrag in Cent durch 200 ganzzahlig (kann Batch ohnehin nicht anders) dividieren, 
02.
:: um die Anzahl der 2-Euro-Münzen zu ermitteln und in der Variablen %eurodeux% zu speichern 
03.
set /a eurodeux=alt/200 
04.
:: Restbetrag in Cent ermitteln, indem für jede 2-Euro-Münze 200 Cent abgezogen werden - 
05.
:: vereinfacht durch Multiplikation anstelle einer Schleife, und in der für "set /a"-Anweisungen 
06.
:: zulässigen verkürzten Variablenschreibweise (ohne Prozentzeichen) 
07.
set /a alt-=eurodeux*200 
08.
:: analog zur Vorgangsweise für die 2-Euro-Münzen die Ermittlung der Anzahl von 1-Euro-Münzen ... 
09.
set /a euroun=alt/100 
10.
:: ... und wiederum Berechnung des verbleibenden Betrages 
11.
set /a alt-=euroun*100
Bitte warten ..
Mitglied: Biber
09.04.2010 um 18:38 Uhr
[OT]
Moin Motorcross, moin bastla,

um diesen beiden hartnäckigen Gerüchten entgegenzuwirken:

  • nein, es ist schon dem Bergfest von Helmut Kohls Amtszeit nicht mehr so, dass Batchschnipsel immer ein bisschen ruckeln, wenn sie Kommentarzeilen überspringen müssen. Die Prozessoren sind echt spürbar flotter geworden.

  • nein, es ist auch nicht so, dass durch das Setzen von Codetags automatisch alle Kommentarzeilen die Schriftfarbe weiß bekommen.

So alle 5 cm könnte doch ruhig mal eine mit "REM " oder "::" beginnende und von einem Halbsatz gefolgte Erklärung folgen, oder...? *wimpernklapp*

Falls es sich um die weit verbreiteten Oneliner handelt will ich nichts sagen....

Grüße
Biber

[Edit] @bastla Na gut, wenn du jetzt schon was nachgetragen hast, dann will ich mal nicht auch noch nachtragend sein *gg [/Edit]
[/OT]
Bitte warten ..
Mitglied: bastla
09.04.2010 um 18:41 Uhr
@Biber
Ruhig Brauner *SCNR* - ist ja schon (zumindest ein wenig) was in der Richtung nachgereicht ...

Grüße
bastla
Bitte warten ..
Mitglied: Biber
09.04.2010 um 22:35 Uhr
Okay, okay, bastla,

ich nehme alles zurück.
Höchstes und ernst gemeintes Lob für die Bereitstellung, Erläuterung und Erklärung deiner Lösung.

Dann muss ich eben allein Motorcross anzählen, der hatte ja gebeten:
Ich würde mich über Hilfe und Beispiele freuen!
Bitte auch als versuchte Hilfe annehmen:
Wenn schon vollständiger Verzicht auf jegliche Kommentare in einen Script-Schnipsel,
dann bestenfalls bei (wirklich) selbst erklärenden Variablen- und Unterprogramm/Funktionsnamen.

Wenn aber aufgerufene Unterroutinen kommentarlos als :aa, :bb, :cc...., :gg aufgerufen werden, dann mindert das auf jeden Fall die Pfleg-, Wart- und Nachvollziehbarkeit des Sourcecodes.

Und irgendwann wirst auch du vor der Situation stehen, dass du einen Schnipsel anpassen musst, den du vor 8 oder 18 Monaten eben mal flüssig runtergetippselt hast und den du nun aber nicht mehr auf Anhieb nachvollziehen kannst.

...aber wozu red' ich.... ich hatte mal eine Praktikantin, die.... jedenfalls ist sorgfältige Codedokumentation nicht das einzige Kriterium, das zählt.

Grüße
Biber
Bitte warten ..
Mitglied: 76109
10.04.2010 um 13:19 Uhr
Hallo zusammen!

Wenn doch sowieso ein VB-Script aufgerufen wird, warum dann das Ganze so umständlich?

Das läßt sich doch mit einem simplen VB-Script wesentlich einfacher gestalten und ist dabei auch noch ohne Aufwand beliebig erweiterbar

Batch:
01.
@Echo off 
02.
set /p Wert="Geldwert eingeben: " 
03.
cscript //nologo Geldwechsel.vbs %Wert%
VB-Script:
01.
Dim Anzahl, Betrag, Wechselgeld, a, w 
02.
     
03.
If WScript.Arguments.Count <> 1 Then WScript.Quit 
04.
 
05.
Wechselgeld = Array(200, 100, 50, 20, 10, 5, 2, 1) 
06.
     
07.
Betrag = CDbl(WScript.Arguments(0)) * 100 
08.
     
09.
For w = 0 To UBound(Wechselgeld) 
10.
    Anzahl = Betrag \ Wechselgeld(w) 
11.
         
12.
    For a = 1 To Anzahl 
13.
        Select Case Wechselgeld(w) 
14.
            Case 200 
15.
               WScript.Echo "2 Euro" 
16.
            Case 100 
17.
               WScript.Echo "1 Euro" 
18.
            Case 50 
19.
               WScript.Echo "50 Cent" 
20.
            Case 20 
21.
               WScript.Echo "20 Cent" 
22.
            Case 10 
23.
               WScript.Echo "10 Cent" 
24.
            Case 5 
25.
               WScript.Echo "5 Cent" 
26.
            Case 2 
27.
               WScript.Echo "2 Cent" 
28.
            Case 1 
29.
               WScript.Echo "1 Cent" 
30.
        End Select 
31.
    Next 
32.
         
33.
    Betrag = Betrag Mod Wechselgeld(w) 
34.
Next
Der Code sollte - so hoffe ich zumindest, soweit selbsterklärend sein

Gruß Dieter
Bitte warten ..
Mitglied: bastla
10.04.2010 um 13:35 Uhr
Hallo Dieter!

Dann aber doch gleich:
01.
Dim Anzahl, Betrag, Wechselgeld, a, w 
02.
     
03.
If WScript.Arguments.Count <> 1 Then WScript.Quit 
04.
 
05.
Wechselgeld = Array(200, 100, 50, 20, 10, 5, 2, 1) 
06.
WechselgeldText = Array("2 Euro","1 Euro","50 Cent","20 Cent","10 Cent","5 Cent","2 Cent","1 Cent") 
07.
     
08.
Betrag = CDbl(WScript.Arguments(0)) * 100 
09.
     
10.
For w = 0 To UBound(Wechselgeld) 
11.
    Anzahl = Betrag \ Wechselgeld(w) 'ganzzahlige Division 
12.
    If Anzahl > 0 Then WScript.Echo Anzahl & " * " & WechselgeldText(w)         
13.
    Betrag = Betrag Mod Wechselgeld(w) 
14.
Next
oder meinetwegen mit
01.
    For a = 1 To Anzahl 
02.
        WScript.Echo WechselgeldText(w) 
03.
    Next
anstelle der Zeile 12 ...

Grüße
bastla
Bitte warten ..
Mitglied: 76109
10.04.2010 um 13:45 Uhr
Hallo bastla!

Sofern es nur bei einer Textausgabe bleiben soll, dann natürlich optimal

Falls aber irgendwelche Routinen aufgerufen werden sollen, dann muss die Textausgabe nur durch einen entsprechenden Aufruf ersetzt werden. So habe ich zumindest gedenktdenkt

Gruß Dieter

PS
Anzahl = Betrag \ Wechselgeld(w) 'ganzzahlige Division
Sehr schön. An diesen Hinweis habe ich mit meinem Alzheimerhirn auch nicht gedacht
Bitte warten ..
Mitglied: bastla
10.04.2010 um 13:51 Uhr
Hallo Dieter!
Falls aber irgendwelche Routinen aufgerufen werden sollen, dann muss die Textausgabe nur durch einen entsprechenden Aufruf ersetzt werden.
Ist natürlich richtig ...

... aber auch in diesem Fall sollte ein einziger Aufruf mit den Parametern Anzahl und Münzenart genügen ...

[Edit] Zur ganzzahligen Division: Hinsichtlich der "For-Next"-Schleife wäre diese eigentlich gar nicht erforderlich ... [/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: 76109
10.04.2010 um 14:02 Uhr
Hallo bastla!

Zitat von bastla:
... aber auch in diesem Fall sollte ein einziger Aufruf mit den Parametern Anzahl und Münzenart genügen ...
Die Anzahl bzw. die Einzelausgabe habe ich nur aufgrund der Einzelaufrufe in der Vorgabe-Batch genommen, weil ich ja nicht weiß, was tatsächlich noch hintendran hängt. D.h. ob am Ende eventuell eine Art Einzelimpuls erforderlich ist?

Gruß Dieter
Bitte warten ..
Mitglied: Biber
10.04.2010 um 14:25 Uhr
Schade, didi1954 und bastla,

da habe ich wieder zu sehr getrödelt.. ich wollte auch mitspielen und hatte einen ähnlichen Ansatz wie bastla.

Also der Vollständigkeit halber meine Variante:
01.
' BiberWexler.vbs -- Anpassung von didi1954s Ansatz 
02.
Dim Anzahl, Betrag, Wechselgeld, a, w  
03.
 
04.
If WScript.Arguments.Count <> 1 Then WScript.Quit  
05.
 
06.
' Münzen haben einen Wert in Cent, ein Label und eine Anzahl Münzen 
07.
'Ich habe darauf verzichtet, EIN Array der Länge 8 x 3 Elemente zu machen 
08.
Wechselgeld   = Array(200, 100, 50, 20, 10, 5, 2, 1)  
09.
WechselLabel  = Array(" 2 Euro", " 1 Euro","50 Cent","20 Cent","10 Cent"," 5 Cent"," 2 Cent", " 1 Cent") 
10.
WechselAnzahl = Array(  0,   0,  0,  0,  0, 0, 0, 0)      
11.
 
12.
Betrag = CDbl(WScript.Arguments(0)) * 100  
13.
 
14.
For w = 0 To UBound(Wechselgeld)  
15.
    Anzahl = Betrag \ Wechselgeld(w)  
16.
'    WScript.Echo "Anzahl " & Anzahl  
17.
    For a = 1 To Anzahl  
18.
        If Wechselgeld(w) Then WechselAnzahl(w) = WechselAnzahl(w) + 1 
19.
         
20.
    Next  
21.
     
22.
    Betrag = Betrag Mod Wechselgeld(w)  
23.
Next 
24.
For w = 0 To UBound(WechselAnzahl)  
25.
   If WechselAnzahl(w) then 
26.
    WScript.Echo Right("   "& WechselAnzahl(w),3) & " x " & WechselLabel(w) 
27.
   End if   
28.
Next     
29.
 
Output:
>cscript BiberWeXler.vbs 57,33 
 28 x  2 Euro 
  1 x  1 Euro 
  1 x 20 Cent 
  1 x 10 Cent 
  1 x  2 Cent 
  1 x  1 Cent
Grüße
Biber
Bitte warten ..
Mitglied: 76109
10.04.2010 um 14:54 Uhr
Hallo Biber!

Spätzünder

Wobei die Codezeile 18:
01.
If Wechselgeld(w) Then WechselAnzahl(w) = WechselAnzahl(w) + 1 
für mich keinen Sinn ergibt, zumal der Wert immer True ist, weil das Wechsgeld-Array nur True-Werte enthält und somit unnötig ist. Auch desdewegen, weil die Schleife Anzahl ja nur durchlaufen wird, wenn Anzahl > 0 ist.

Gruß Dieter
Bitte warten ..
Mitglied: bastla
10.04.2010 um 15:06 Uhr
Hallo Biber!
da habe ich wieder zu sehr getrödelt..
Dafür hast Du aber die schönste Ausgabe produziert ...
ich wollte auch mitspielen
"Spielen" ist ja sowieso das Stichwort für den ganzen Thread ...
Wie Dieter sind auch mir die Zeilen 17 bis 20 aufgefallen - die würde ich etwas unspektakulärer gestalten und durch
WechselAnzahl(w) = Anzahl
ersetzen.

Grüße
bastla
Bitte warten ..
Mitglied: bastla
10.04.2010 um 15:10 Uhr
Hallo Dieter!
... weil ich ja nicht weiß, was tatsächlich noch hintendran hängt. D.h. ob am Ende eventuell eine Art Einzelimpuls erforderlich ist?
Auch einen solchen würde ich im aufgerufenen Unterprogramm (genügend oft , aber für die einzelnen Münzarten auf die gleiche Weise) auslösen - nur, wenn es tatsächlich irgendwelche "Sonderbehandlungen" geben müsste, würde ich zu "Select Case" greifen ...

Grüße
bastla
Bitte warten ..
Mitglied: 76109
10.04.2010 um 15:36 Uhr
Hallo bastla!

Zitat von bastla:
Hallo Biber!
> da habe ich wieder zu sehr getrödelt..
Dafür hast Du aber die schönste Ausgabe produziert ...
Stimmt, ist mir garnicht aufgefallen. Die Codezeile 18 hat mich wohl zu sehr verwirrt

Gruß Dieter
Bitte warten ..
Mitglied: Biber
10.04.2010 um 16:11 Uhr
Moin bastla und didi1954,

klar, ihr habt natürlich Recht mit den etwas sehr verspielten Zeilen 17ff.
Zum Wechseln von ein paar Euronen reicht jedenfalls dieses hier vollkommen.
01.
' BiberWexler.vbs -- V.002 Anpassung von didi1954s Ansatz 
02.
Dim Betrag, w, Wechselgeld, WechselAnzahl, WechselLabel  
03.
 
04.
If WScript.Arguments.Count <> 1 Then WScript.Quit  
05.
 
06.
' Münzen haben einen Wert in Cent, ein Label und eine Anzahl Münzen 
07.
'Ich habe darauf verzichtet, EIN Array der Länge 8 x 3 Elemente zu machen 
08.
Wechselgeld   = Array(200, 100, 50, 20, 10, 5, 2, 1)  
09.
WechselAnzahl = Array(  0,   0,  0,  0,  0, 0, 0, 0)      
10.
WechselLabel  = Array(" 2 Euro", " 1 Euro","50 Cent","20 Cent","10 Cent"," 5 Cent"," 2 Cent", " 1 Cent") 
11.
 
12.
Betrag = (WScript.Arguments(0)) * 100  
13.
 
14.
For w = 0 To UBound(Wechselgeld)  
15.
    WechselAnzahl(w) = Betrag \ Wechselgeld(w)  
16.
    Betrag = Betrag Mod Wechselgeld(w)  
17.
Next 
18.
 
19.
For w = 0 To UBound(WechselAnzahl)  
20.
   If WechselAnzahl(w) then 
21.
    WScript.Echo Right("   "& WechselAnzahl(w),3) & " x " & WechselLabel(w) 
22.
   End if   
23.
Next
...ich spiele ja immer gerne mit euch mit...

Grüße
Biber
Bitte warten ..
Mitglied: 76109
10.04.2010 um 17:18 Uhr
Hallo Biber!

Sehr schön. Genau nach meinem Geschmack

...ich spiele ja immer gerne mit euch mit...
ich auch

Gruß Dieter
Bitte warten ..
Neuester Wissensbeitrag
Ähnliche Inhalte
Batch & Shell
Batch-Variable nach Stichworten aus TXT Datei durchsuchen (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (11)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Userverwaltung
Ausgeschiedene Mitarbeiter im Unternehmen - was tun mit den AD Konten? (27)

Frage von patz223 zum Thema Windows Userverwaltung ...

Viren und Trojaner
Aufgepasst: Neue Ransomware Goldeneye verbreitet sich rasant (20)

Link von Penny.Cilin zum Thema Viren und Trojaner ...

LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (20)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (18)

Frage von Fiasko zum Thema Windows Netzwerk ...