2013-01-17 2 views
0

계산기를 만들려고합니다. 사용자는 1 번을 입력하고 선택 및 조작하고 2 번을 입력 한 다음 다른 작업을 선택하거나 답변을 표시합니다.루프 할 수있는 계산기 만들기 - Bash

예 : 1 + 1 = 또는 1 + 1 + 2 + 1 =

두 가지 모두 가능해야합니다.

read -p "what's the first number? " n1 
PS3="what's the operation? " 
select ans in add subtract multiply divide equals; do 
case $ans in 
    add) op='+' ; break ;; 
    subtract) op='-' ; break ;; 
    multiply) op='*' ; break ;; 
    divide) op='/' ; break ;; 
    *) echo "invalid response" ;; 
esac 
done 
read -p "what's the second number? " n2 
ans=$(echo "$n1 $op $n2" | bc -l) 
printf "%s %s %s = %s\n\n" "$n1" "$op" "$n2" "$ans" 

exit 0 

이것은 내가 지금까지 쓴 것입니다,하지만 난 그것이 가능 사용자가 선택할 수 있도록 할 수 있도록하는 방법을 작동하지 않을 수있는 다른 작업을 입력 다시 라운드 루프 또는 '동일'. 내가 여기서 내 코드에 할 수있는 아이디어는 무엇입니까? 나는 하루 종일 붙어 있었다.

  • 사용자가 방정식을 직접 입력하지 않고도 목록에서 선택하기를 원합니다.
+0

이 스크립트는 전혀 작동하지 않습니다. 올바른 버전을 복사/붙여 넣었습니까? – Avio

+0

읽기 -p "첫 번째 숫자는 무엇입니까?"n1 PS3 = "작동은 무엇입니까?" ans 선택 추가 빼기 곱하기 나누기 같음; do case $ ans in add) op = '+'; 휴식 ;; 빼기) op = '-'; 휴식 ;; 곱하기) op = '*'; 휴식 ;; 나누기) op = '/'; 휴식 ;; \t \t 같음) op = *) "잘못된 응답";; 의 printf "%의 %의 %의 = % s의 \ 없음 | ESAC \t 가?"무슨 일이 두 번째 숫자이다 "N2 ANS = $ (기원전 -l 에코"$ N1 $ 연산 $의 N2 ") -p 읽어 수행 \ n ""$ n1 ""$ ns ""$ ns ""$ ans " exit 0 –

+0

그래, @svnpenn은 똑같은 복제 ... –

답변

1

은 기본적으로 해당 코드 주위에 루프를 넣어 가지고 반복적으로 작업을 선택합니다. 수식을 구축하십시오. 사용자가 "같음"을 선택하면 바깥 쪽 루프에서 벗어나 수식을 평가합니다. 의사 코드에서 :

formula="" 
while true; do 
    get a number 
    formula+="$number" 
    select an operation 
    case $op in 
    ... 
    equals) break 2 ;; # need to break out of 2 levels, the select and the while 
    esac 
    done 
    formula+="$op" 
done 
ans=$(bc -l <<< "$formula") 
printf "%s = %s\n" "$formula" "$ans" 
0

나는 사용자가 하나의 읽기에 전체 방정식을 입력하게 할 것이다.

read -p "enter equation" equate 
ans=$(bc -l <<< "${equate%%=*})" 
echo ${equate%%=*} = $ans 

< < < 예를 들어

는 문자열의 내용을 표준 입력으로 cmd를에 공급된다하는 여기에 문자열입니다. 그 다음 숫자를 읽도록

%% = *에 넣어 한 수 = 후 어떤 일의 변수 스트립을 동일시한다.

+0

나는 그 방법을 사용할 것이지만 나는 그들이 할 수있는 것을 제한하고 싶다. 사례를 사용하여 입력하십시오. –

0
#!/bin/bash 

read -p "what's the first number? " n1 
PS3="what's the operation? " 
select ans in add subtract multiply divide equals; do 
case $ans in 
    add) op='+' ; break ;; 
    subtract) op='-' ; break ;; 
    multiply) op='*' ; break ;; 
    divide) op='/' ; break ;; 
    *) echo "invalid response" ;; 
esac 
done 
read -p "what's the second number? " n2 
ans=$(echo "$n1 $op $n2" | bc -l) 
printf "%s %s %s = %s\n\n" "$n1" "$op" "$n2" "$ans" 

exit 0