루프 내에서 음의 정수를 양의 정수로 변환

루프 내에서 음의 정수를 양의 정수로 변환

공백으로 구분된 한 줄의 정수를 추가하고 절대값을 찾으려고 합니다. 5개의 정수가 있는데 그 중 하나는 음수이고 다른 하나는 양수입니다. 모든 숫자의 절대값을 알 수 있도록 현재의 음수값을 양수로 만드는 방법을 찾으려고 합니다. 이것이 내가 지금까지 가지고 있는 것입니다.

read input
# 1, 5, -17, 32, 12
# expected absolute value: 67
absolute_value()
{
    local absolute_value=0

    for nums in $input;
    do
    ((absolute_value += nums))

    done
    echo $absolute_value
}
absolute_value

내 대답은 33이었고 예상 대답은 67이었습니다. 물론 추가되지만 입력 숫자 중 하나가 음수일 수 있으므로 절대값이 아닌 합계를 제공합니다. 혼란스러워서 답을 찾고 있지만 알 수 없습니다. Bash는 나의 가장 강력한 언어가 아니므로 아마도 무시할 것입니다.

답변1

글쎄, 어때?절대값정의?

if [ "$num" -lt 0 ]; then
    num=$((-num))
fi

어쨌든, 이것은:

for nums in $input

분사에 의존하고 약간 추악합니다. 누군가가 숫자가 아닌 문자나 전역 문자를 입력하면 흥미로운 효과도 얻을 수 있습니다. Bash를 사용하고 있으므로 값 read -a[[ var -lt 0 ]].

그러나 단순히 이렇게 하는 것은 좋지 않습니다. Bash의 산술 확장은 위험하기 때문입니다. 명령은 배열 인덱싱 및 명령 대체를 통해 쉽게 주입될 수 있으며 쉘이 이를 실행합니다. 따라서 먼저 수신된 값이 숫자인지 확인해야 합니다.

#!/bin/bash
read -a nums
sum=0
for a in "${nums[@]}"; do
    if [[ $a = *[^-0-9]* ]]; then
        echo "invalid number: $a"
        exit 1
    fi 
    if [[ a -lt 0 ]]; then
        sum=$((sum + -a))
    else
        sum=$((sum +  a))
    fi
done
echo "$sum"

0Bash는 및 로 시작하는 숫자를 각각 8진수와 16진수 로 해석합니다 0x.


또는 실제 프로그래밍 언어를 사용하면 모든 작업을 수동으로 수행할 필요가 없습니다.

$ python3 -c 'print(sum(map(lambda x: abs(int(x)), str.split(input()))))'
1 5 -17 32 12
67

답변2

매개변수 대체를 사용하여 빼기 기호를 제거할 수 있습니다.

입력 읽기
# 1, 5, -17, 32, 12
# 절대값 기대: 67
절대값() {
    지역 절대값=0

    $input의 숫자에 대해서는 다음을 수행하십시오.
      ((절대값+=${nums#-}))
    완벽한
    에코 $절대값
}

절대값

for 루프를 사용하지 않으려면 다음을 시도해 보세요.

printf "%s\n" ${input/-/} | awk '{ sum += $1 } END { print sum }'

나는 while 루프와 배열을 사용하여 사용자가 수행할 수 있는 입력의 양을 제어하고 입력이 잘못된지 계속 묻습니다.

declare -a arr
declare -a arr_abs
echo "Enter four numbers:"

while true; do
  read num
  [[ $num =~  ^[^-0-9]$ ]] && echo "Not a number..." && continue
  # keep the original values for any other use
  arr+=($num)
  # create an array with absolute values
  arr_abs+=(${num#-})
  [[ ${#arr[@]} -eq 4 ]] && break
done

absolute_value() {
   sum=$(printf "%s\n" ${arr_abs[@]} | awk '{ sum += $1 } END { print sum }')
   echo "The absolute sum is $sum"
}

absolute_value

관련 정보