2014-10-24 2 views
0

Моя задача состояла в том, чтобы напечатать, соответствуют ли эти цифры знакам ISOSCELES, EQUILATERAL или SCALENE. Мой код печатает только ISOSCELES: Где ошибка?bash- условный треугольник error

#!/bin/bash 
read a b c 
if [ "$a" == "$b" ] && { [ "$b" = "$c" ] && [ "$c" = "$a" ]; } 
then 
    echo "EQUILATERAL" 
exit 1 
elif [ "$a" == "$b" ] && { [ "$b" = "$c" ] || [ "$c" = "$a" ]; } 
then 
    echo "ISOSCELES" 
elif ([[ "$a" != "$b" ]] && [[ "$b" != "$c" ]] && [[ "$c" != "$a" ]]) 
then 
    echo "SCALENE" 
fi 
+1

Что вы указываете в качестве входных данных? – merlin2011

+0

Я даю ввод: '6 6 6' – Drave

+0

Используйте -eq для сравнения целых чисел – merlin2011

ответ

2

В вашем скрипте есть странная смесь [, [[, = и ==. Если вы используете bash, я бы предложил вместо этого использовать (()) для всех ваших численных сравнений. Это создает арифметический контекст, так что это также означает, что вам не нужно использовать $ для обозначения вашего переменные:

if ((a == b)) && ((b == c)) && ((c == a)); then echo "equilateral" 
elif ((a != b)) && ((b != c)) && ((c != a)); then echo "scalene" 
else echo "isoceles" 
fi 

Отдельного испытания для равнобедренных ненужно.

+0

для '2, 3, 4' он дал неправильный вывод @TomFenech – Drave

+0

Отделяете переменные запятыми в вашем вводе? Он работает для меня, когда я вручную назначаю 'a = 2; б = 3; c = 4' –

+0

переменные вводятся в новых строках. – Drave

1
  1. смешать == и = в ваших тестах
  2. изменения порядка, первый тест для равносторонний, то для разносторонних, то вам не нужно, чтобы проверить на равнобедренный (quartum не дано; -)
+0

Хороший вопрос об изменении порядка вокруг, но вы не указали который из '=' и '==' вы должны использовать. Ответ, по крайней мере, в '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' –

+0

@TomFenech У меня нет, потому что я был уверен, что другие ответы побили бы проблему «Пакьяо-стиль» и, что более важно, намного лучше, чем я мог. Я надеюсь, что вы оценили «quartum non datur», не так ли? – gboffi

+0

Нет никакого вреда в добавлении к вашему ответу, чтобы сделать его более полным. Что касается вашего латинского, очень впечатляющего, хотя лично мне пришлось его искать! –

0

Try (использование == или -eq для чисел):

#!/bin/bash 

    read a b c 
    if [ "$a" == "$b" ] && { [ "$b" == "$c" ] && [ "$c" == "$a" ]; } 
    then 
     echo "EQUILATERAL" 
    elif ([[ "$a" != "$b" ]] && [[ "$b" != "$c" ]] && [[ "$c" != "$a" ]]) 
    then 
     echo "SCALENE" 
    else 
    echo "ISOSCELES" 
    fi 
0

Это немного упрощена:

#!/bin/bash 
read a b c 
if [ "$a" -eq "$b" ] && [ "$b" -eq "$c" ] && [ "$c" -eq "$a" ]; 
then 
    echo "EQUILATERAL" 
    exit 1 
elif [ "$a" -ne "$b" ] && [ "$b" -ne "$c" ] && [ "$c" -ne "$a" ]; 
then 
    echo "SCALENE" 
else 
    echo "ISOSCELES" 
fi 

Я думаю будет замыслил вывод:

$ echo "6 6 6" | ./script 
EQUILATERAL 
$ echo "6 6 5" | ./script 
ISOSCELES 
$ echo "4 5 6" | ./script 
SCALENE 
2

Вы можете просто посчитать количество различных чисел, чтобы получить ответ.

#!/bin/bash 
read a b c 
different=$(printf '%s\n' $a $b $c | 
      sort -n    | 
      uniq -c    | 
      wc -l 
     ) 

case $different in 
    (1) echo EQUILITERAL ;; 
    (2) echo ISOSCELES ;; 
    (3) echo SCALENE  ;; 
esac 

Вы должны также проверить неравенство треугольника в начале:

#!/bin/bash 
read a b c 
sorted=$(printf '%s\n' $a $b $c | sort -n) 
ineq=${sorted/$'\n'/+} 
ineq=${ineq/$'\n'/>} 
(($ineq)) || exit 1 

different=$(uniq -c <<< "$sorted" | wc -l) 

case $different in 
    (1) echo EQUILITERAL ;; 
    (2) echo ISOSCELES ;; 
    (3) echo SCALENE  ;; 
esac 
+0

спасибо :) @choroba – Drave

+0

+1 для упоминания и обработки неравенства треугольника. –

0

Возьмите стороны traingles в качестве входных данных с помощью чтения команды.

read a 
read b 
read c 
if ((a == b)) && ((b == c)) && ((c == a)); 
then 
    echo "EQUILATERAL" 
elif ((a != b)) && ((b != c)) && ((c != a)); 
then 
    echo "SCALENE" 
else 
    echo "ISOSCELES" 
fi 
Смежные вопросы