1

だから私はLinux端末でプログラムを書いています.私のプログラムには2つの部分があります. 最初の部分は除算で、2 番目の部分はいくつかの数値の MOD を計算しています。最初の部分を終了する方法は、分割する入力のいずれかに 999 を入れることです。

私の問題は、ユーザーが最初の入力として 999 を入力した場合でも、ユーザーが 2 番目の数字を入力する必要があることです。これらは、Linuxで goto :someOtherLocation を実行できるWindowsのようなものかどうか疑問に思っていました。これはコードです:

echo "Enter the number to divide (dividend) (enter 999 to quit):"
read numberOne
[IF NUMBERONE = 999, JUMP TO SECONDPART]
echo "Enter the number to divide (divisor) (enter 999 to quit):"
read numberTwo

while [ "$numberOne" -ne '999' ] && [ "$numberTwo" -ne '999' ]
do
    while [ "$numberTwo" -eq 0 ]
    do
    echo "You cannot divide by 0, please enter another number:"
    read numberTwo
    done

RESULT=$(echo "$numberOne/$numberTwo" | bc -l)
echo $numberOne / $numberTwo = $RESULT
echo $numberOne / $numberTwo = $RESULT >> results.txt
echo "Enter the number to divide (dividend) (enter 999 to quit):"
read numberOne
echo "Enter the number to divide (divisor) (enter 999 to quit):"
read numberTwo
done

SECONDPART

counter=1
totalCount=0
temporal=0

while [ "$counter" -lt '101' ]
do
temporal=$( expr $counter % 5)
echo $counter MOD 5 = $temporal
echo $counter MOD 5 = $temporal >> results.txt
totalCount=$(echo "$totalCount+$temporal" | bc -l)
counter=$(echo "$counter+1" | bc -l)
done

average=$(echo "$totalCount/100" | bc -l)
echo The average of all the MODs is $average >> results.txt

上記のように、入力が999の場合、入力から2番目の部分に直接ジャンプしたいと思います.

4

2 に答える 2

3

Bourne シェルには GOTO ステートメントがshあり、ありbashません。有害と見なされます。

代わりに、if ステートメントのような構造化されたフロー制御を使用します。

echo "Enter the number to divide (dividend) (enter 999 to quit):"
read numberOne
if [ "$numberOne" -ne 999 ]
then
  echo "Enter the number to divide (divisor) (enter 999 to quit):"
  read numberTwo

  while [ "$numberOne" -ne '999' ] && [ "$numberTwo" -ne '999' ]
  do
      while [ "$numberTwo" -eq 0 ]
      do
      echo "You cannot divide by 0, please enter another number:"
      read numberTwo
      done

      RESULT=$(echo "$numberOne/$numberTwo" | bc -l)
      echo $numberOne / $numberTwo = $RESULT
      echo $numberOne / $numberTwo = $RESULT >> results.txt
      echo "Enter the number to divide (dividend) (enter 999 to quit):"
      read numberOne
      if [ "$numberOne" -ne 999 ]
      then
          echo "Enter the number to divide (divisor) (enter 999 to quit):"
          read numberTwo
      fi
  done
fi

counter=1
totalCount=0
temporal=0

while [ "$counter" -lt '101' ]
do
    temporal=$( expr $counter % 5)
    echo $counter MOD 5 = $temporal
    echo $counter MOD 5 = $temporal >> results.txt
    totalCount=$(echo "$totalCount+$temporal" | bc -l)
    counter=$(echo "$counter+1" | bc -l)
done

average=$(echo "$totalCount/100" | bc -l)
echo The average of all the MODs is $average >> results.txt

単純な goto よりも扱いにくいように思えるかもしれませんが、より構造化された制御フローを利用すると、コードが読みやすく、追跡しやすくなります。

readNumber() {
  local number
  read -p "$1" number
  [ "$number" -ne 999 ] && echo "$number"
}

while one=$(readNumber "Enter dividend or 999 to quit: ") && \
      two=$(readNumber "Enter divisor or 999 to quit: ")
do
    echo "$one / $two = $(echo "$one / $two" | bc -l)" | tee results.txt
done

これは、ユーザーがいずれかの数値に 999 を入力するまで、割り算する数値を要求し続けます。

于 2013-11-06T22:24:53.307 に答える
2

次のようなこともできます (bash の例):

#!/bin/bash

secondpart() {
    echo "Hello"
}

read x
if [ $x -eq 999 ]
then
    secondpart
else 
    echo "Bye"
fi

ここで、コードを実行すると、入力が999の場合、プログラムは を返しHello、それ以外の場合は を返しますBye

于 2013-11-06T22:34:20.137 に答える