2015-06-30 19 views
8

Mã của tôi cho bạn biết số đoán của bạn là cao hơn hoặc thấp hơn so với một số được tạo ngẫu nhiên, nhưng nó dường như chỉ so sánh các chữ số đầu tiên của số khi một trong số họ là dưới 10.Tại sao các số nguyên trong PowerShell so sánh bằng các chữ số?

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

Ví dụ, khi số $GeneratedNum = 56$Input = 7, trả về "Too High"

+3

Giá trị đọc từ 'Read-Host' là một chuỗi không phải là một số nguyên . Điểm đánh dấu biến của bạn không phải là một diễn viên. Sử dụng một diễn viên ở phía bên phải của nhiệm vụ và nó có vẻ hoạt động chính xác. –

+0

Cảm ơn bạn! Điều đó làm việc hoàn hảo – iasanator

Trả lời

13

Điều này là do bạn đang so sánh chuỗi với số nguyên. Thứ tự quan trọng.

"56" -lt 7 

Thực sự là giống như:

"56" -lt "7" 

Hoặc:

56 -lt "7" 

sẽ cung cấp cho bạn kết quả chính xác. PowerShell cố gắng ép buộc đối số bên phải thành loại bên trái.

Bạn có thể thử kiểu tường minh:

[int]$Input -lt $GeneratedNum 
4

Vấn đề xuất phát từ thực tế là Read-Host trả về một chuỗi như vậy với dàn diễn viên của bạn $Input là một ArrayListEnumeratorSimple thử:

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

Bạn cũng nên sử dụng try{}catch{} để bắt trường hợp đầu vào không phải là int.

Điều bạn phải hiểu là khi bạn sử dụng toán tử so sánh PowerShell, loại phần bên trái được sử dụng được chọn, do đó phần rigth được đúc thành loại bên trái. Biết rằng bạn có thể có viết như sau, nơi tôi chỉ cần đặt các $GeneratedNum đó là một số nguyên trên trái của so sánh:

[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

bao giờ sử dụng một biến có cùng tên như là một biến tự động: $input là một tự động biến.

Xem mã này, nơi tôi ống giá trị đọc từ máy chủ (và không sử dụng các biến $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) 

quan trọng cần lưu ý rằng mã của tôi đối xử một cách chính xác sai đầu vào (không ký tự số) như w hoặc giống như các chuỗi (qwerty), khiến các đề xuất khác thất bại.

Tôi tận dụng thực tế là bạn tạo ra các số nguyên luôn lớn hơn 0.

0

Sử dụng một 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) 
Các vấn đề liên quan