2015-06-30 10 views
8

Kodum sizin tahmin numara bir rasgele oluşturulmuş sayısından daha yüksek veya daha düşük olup olmadığını söyler, ama bu onlardan biri aşağıda 10.PowerShell'deki tam sayılar neden rakamlarla karşılaştırılır?

Örneğin
[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) 

olduğunda sadece Numaranın ilk rakamlarını karşılaştırmak gibi görünüyor, $GeneratedNum = 56 ve $Input = 7, "Too High"

+3

okunan değer 'Oku-Host' bir dize değil bir tam sayıdır . Değişken işaretçiniz görünmeyecek bir döküm değil. Ödevin sağ tarafında bir yayın kullanın ve düzgün çalışıyor gibi görünüyor. –

+0

Teşekkürler! Mükemmel çalıştı – iasanator

cevap

13

döndüğünde, bir dizeyi bir tamsayı ile karşılaştırmanızdır. Sipariş önemlidir. Alternatif

"56" -lt "7" 

:

56 -lt "7" 

size doğru sonucu verecek

"56" -lt 7 

aslında aynı mı. PowerShell, sağ taraftaki argümanı sol tarafın türüne zorlamaya çalışır.

Sen açık döküm deneyebilirsiniz:

[int]$Input -lt $GeneratedNum 
4

$Input bir ArrayListEnumeratorSimple deneyin senin oyuncularla böylece Read-Host bir dize döndürür olmasından gelir sorun:

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

Ayrıca kullanmalıdır try{}catch{} giriş yakalamak için giriş bir int değil.

anlamak gerekir şey PowerShell karşılaştırma operatörlerini kullandığınızda rigth kısım sol türü içine dökme bu yüzden, sol kısmının tipi, seçili kullanılan olmasıdır.

[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

otomatik değişken olarak aynı isimde bir değişken asla kullanmayın: Eğer ben sadece karşılaştırmalar solunda bir tamsayı olduğu $GeneratedNum nereye koyduğunuzu, yazacağımdan olabilir bilerek $input otomatik olduğu değişken. Ben boru makineden okunur değeri (ve $input değişken kullanmayın) nerede

, bu kodu bakınız:

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

benim kodu doğru yanlış girişler (non sayısal karakterler davranır fark etmek) w veya benzeri dizgiler (qwerty) gibi diğer tekliflerin başarısız olmasını sağlar.

Sana kullanılması her zaman tamsayılar 0'dan büyük

0

oluşturmak gerçeği faydalanmak bir 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)