2015-06-30 20 views
8

Mein Code sagt Ihnen, ob Ihre vermutete Zahl höher oder niedriger als eine zufällig generierte Zahl, aber es scheint nur auf den ersten Ziffern der Nummer zu vergleichen, wenn einer von ihnen ist unten 10.Warum werden Ganzzahlen in PowerShell nach Zahlen verglichen?

[int]$GeneratedNum = Get-Random -min 1 -max 101 
Write-Debug $GeneratedNum 

$isQuitting = $false 
Do{ 
    [int]$Input = Read-Host "Take a guess!" 

    If($Input -lt $GeneratedNum){Write-Output "Too Low"} 
    If($Input -gt $GeneratedNum){Write-Output "Too High"} 
    If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true} 

} Until($isQuitting -eq $true) 

Zum Beispiel, Wenn die $GeneratedNum = 56 und $Input = 7, gibt es zurück "Too High"

+3

Der gelesene Wert von 'Read-Host' ist eine Zeichenfolge, nicht eine ganze Zahl . Dein variabler Marker ist kein Cast, wie es scheint. Verwenden Sie eine Besetzung auf der rechten Seite der Aufgabe und es scheint richtig zu funktionieren. –

+0

Vielen Dank! Das hat perfekt funktioniert – iasanator

Antwort

13

Dies ist, weil Sie eine Zeichenfolge mit einer Ganzzahl vergleichen. Die Reihenfolge ist wichtig.

"56" -lt 7 

Ist eigentlich das gleiche wie:

"56" -lt "7" 

Alternativ:

56 -lt "7" 

würden Sie das richtige Ergebnis. PowerShell versucht, das Argument der rechten Seite zum Typ der linken Seite zu zwingen.

Sie könnten eine explizite Umwandlung versuchen:

[int]$Input -lt $GeneratedNum 
4

Das Problem aus der Tatsache, dass Read-Host einen String zurückgeben, so mit Ihrem Guss $Input ist ein ArrayListEnumeratorSimple Versuch:

[int]$GeneratedNum = Get-Random -min 1 -max 101 
Write-host $GeneratedNum 

$isQuitting = $false 
Do{ 
    $Input = (Read-Host "Take a guess!") -as [int] 

    If($Input -lt $GeneratedNum){Write-Output "Too Low"} 
    If($Input -gt $GeneratedNum){Write-Output "Too High"} 
    If($Input -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true} 

} Until($isQuitting -eq $true) 

Sie sollten auch verwenden try{}catch{} um den Fall abzufangen, ist die Eingabe kein int.

Die Sache, die Sie verstehen müssen, ist, dass wenn Sie PowerShell-Vergleichsoperatoren verwenden, der Typ des linken Teils ausgewählt wird, sodass der rechte Teil in den linken Typ gegossen wird. Zu wissen, dass Sie die folgende schreiben könnte, wo ich die $GeneratedNum setzen nur die auf der linken Seite der Vergleiche eine ganze Zahl ist:

[int]$GeneratedNum = Get-Random -min 1 -max 101 
Write-host $GeneratedNum 

$isQuitting = $false 
Do{ 
    $Input = (Read-Host "Take a guess!") 

    If($GeneratedNum -gt $Input){Write-Output "Too Low"} 
    If($GeneratedNum -lt $Input){Write-Output "Too High"} 
    If($GeneratedNum -eq $Input){Write-Output "Good Job!"; $isQuitting = $true} 

} Until($isQuitting -eq $true) 
0

nie eine Variable mit dem gleichen Namen wie eine automatische Variable verwenden: $input ist eine automatische Variable.

diesen Code sehen, wo ich der Wert Rohr vom Host gelesen (und die $input Variable nicht verwenden):

[int]$GeneratedNum = Get-Random -min 1 -max 101 
Write-Debug $GeneratedNum 
$isQuitting = $false 
Do{ 
    Read-Host "Take a new guess!" | %{ 

     if($_ -as [int] -gt 0){ 
      If($_ -lt $GeneratedNum){Write-Output "Too Low"} 
      If($_ -gt $GeneratedNum){Write-Output "Too High"} 
      If($_ -eq $GeneratedNum){Write-Output "Good Job!"; $isQuitting = $true} 
     } 
    } 

} Until($isQuitting -eq $true) 

wichtig zu bemerken, dass mein Code korrekt falsch Eingänge (nicht numerische Zeichen behandelt) wie w oder ähnliche Strings (qwerty), die die anderen Vorschläge zum Scheitern bringen.

ich die Tatsache zunutze machen, dass Sie ganze Zahlen erzeugen immer größer als 0

0

Mit einem switch:

[int]$GeneratedNum = Get-Random -min 1 -max 101 
Write-Debug $GeneratedNum 

:lop Do{ 
    switch ((Read-Host 'Take a new guess!') -as [int]) 
    { 
     {$_ -eq $null}{continue} 
     {$_ -lt $GeneratedNum}{'Too Low';continue} 
     {$_ -gt $GeneratedNum}{'Too High';continue} 
     {$true}{'Good Job!';break lop} 
    } 

} while($true) 
Verwandte Themen