realnickspiess
realnickspiess

Reputation: 47

Finding Middle Number in PowerShell

I am practicing in PowerShell and am making a user response input where one of the options is to input 3 numbers, and the program will return the middle number. I have done this a million times and it seems I cannot get it to return the middle number consistently.

For example when my numbers are 1, 23452342 and 3, it says that 3 is the middle number.

Here is my code:

if ($response -eq 1) {
    $a = Read-Host "Enter a number "
    $b = Read-Host "Enter a second number "
    $c = Read-Host "Enter a third number "

    if (($a -gt $b -and $a -lt $c) -or ($a -lt $b -and $a -gt $c)) {
        Write-Host "$a is the middle number"
    }
    if (($b -gt $a -and $b -lt $c) -or ($b -gt $c -and $b -lt $a)) {
        Write-Host "$b is the middle number"
    }
    if (($c -gt $a -and $c -lt $b) -or ($c -gt $b -and $c -lt $a)) {
        Write-Host "$c is the middle number"
    }
}

Upvotes: 0

Views: 1525

Answers (2)

yehlo
yehlo

Reputation: 21

As an additional solution that would work on any array where u need the middle item you could just solve it like this:

$arr = 1..50
($arr | Sort-Object)[[int](($arr.count -1) /2)]

If your array comes in a format that does not need the sorting, just leave this part out.

edit: Obviously you would have to insert the data into an array on the first step.

Best regards

Upvotes: 2

Ansgar Wiechers
Ansgar Wiechers

Reputation: 200293

Instead of doing a number of individual comparisons simply sorting the three values and picking the second element will give you the median right away. But I suspect what's actually messing up the results for you is that Read-Host returns strings when you need them to be numeric values. Sort order of strings ("1" < "20" < "3") is different from numeric sort order (1 < 3 < 20), because characters at corresponding positions are compared rather than the whole number.

Casting the entered values to integers (or doubles if you expect floating point numbers) should resolve the issue:

if ($response -eq 1) {
    [int]$a = Read-Host 'Enter a number'
    [int]$b = Read-Host 'Enter a second number'
    [int]$c = Read-Host 'Enter a third number'

    $n = ($a, $b, $c | Sort-Object)[1]

    Write-Host "$n is the median."
}

Upvotes: 5

Related Questions