2015-06-30 13 views
8

Il mio codice indica se il proprio numero indovinato sia superiore o inferiore a un numero generato in modo casuale, ma sembra di confrontare solo le prime cifre del numero, quando uno di loro è al di sotto di 10.Perché i numeri interi in PowerShell vengono confrontati in base alle cifre?

[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) 

Ad esempio, quando $GeneratedNum = 56 e $Input = 7 restituisce "Too High"

+3

Il valore letto da 'lettura Host' è un non stringa di un intero . Il tuo indicatore variabile non è un cast che sembrerebbe. Utilizza un cast sul lato destro del compito e sembra funzionare correttamente. –

+0

Grazie! Ha funzionato perfettamente – iasanator

risposta

13

Questo perché si confronta una stringa con un numero intero. L'ordine conta.

"56" -lt 7 

è in realtà lo stesso di:

"56" -lt "7" 

alternativa:

56 -lt "7" 

darebbe il risultato corretto. PowerShell tenta di forzare l'argomento del lato destro al tipo del lato sinistro.

Si potrebbe provare un cast esplicito:

[int]$Input -lt $GeneratedNum 
4

Il guaio venire dal fatto che Read-Host restituire una stringa in modo con il cast $Input è un ArrayListEnumeratorSimple prova:

[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) 

È inoltre necessario utilizzare try{}catch{} per catturare il caso l'input non è un int.

La cosa che devi capire è che quando si usano gli operatori di confronto di PowerShell, viene selezionato il tipo della parte sinistra, quindi la parte finale viene inserita nel tipo di sinistra. Sapendo che si potrebbe avere scrivere quanto segue, dove ho appena messo la $GeneratedNum, che è un numero intero a sinistra dei confronti:

[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

Mai usare una variabile con lo stesso nome di una variabile automatica: $input è un sistema automatico variabile.

Vedere questo codice, dove il tubo il valore letto da host (e non uso la variabile $input):

[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) 

importante notare che il mio codice tratta correttamente sbagliate ingressi (caratteri non numerici) come w o stringhe simili (qwerty), che rendono le altre proposte non riuscite.

Faccio uso del fatto che si genera numeri interi sempre maggiore di 0.

0

Utilizzando un 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) 
Problemi correlati