Linux の算術計算

LinuxBeginner

はじめに

Linux のコマンドラインは、算術計算を行うための強力なツールを提供しています。Linux で利用可能な最も汎用性の高い計算機の 1 つが bc (Basic Calculator) で、ユーザーはターミナルから直接、単純な数学演算から複雑な数学演算まで実行することができます。

この実験では、Linux で bc コマンドを使用してさまざまな算術計算を行う方法を学びます。基本的な演算から始めて、徐々により複雑な式に挑戦します。学んだスキルは、Linux 環境でのスクリプト作成、データ処理、および計算問題の効率的な解決に役立ちます。

この実験の終了時には、以下のことができるようになります。

  • bc を使用して基本的な算術演算を実行する
  • 複数の演算を含む複雑な数学式を扱う
  • 変数を使用し、計算の精度を制御する
  • 数学的な計算を自動化するスクリプトを作成する

では、Linux の bc 計算機の機能を探索し始めましょう。

bc を使った基本的な算術演算

このステップでは、Linux で bc コマンドを使用して基本的な算術演算を行う方法を学びます。bc コマンドは強力な計算機ツールで、ターミナルから直接計算を実行することができます。

bc のインストール

まず、システムに bc 計算機がインストールされていることを確認しましょう。

sudo apt-get update
sudo apt-get install -y bc

インストールプロセスを示す出力が表示されるはずです。インストールが完了したら、次のコマンドを入力して動作を確認できます。

bc --version

bc 計算機のバージョン情報が表示されるはずです。

単純な足し算スクリプトの作成

では、bc を使用して足し算を行う単純なスクリプトを作成しましょう。

  1. プロジェクトディレクトリに移動します。
cd ~/project
  1. simple_calc.sh という名前の新しいスクリプトファイルを作成します。
touch simple_calc.sh
  1. nano エディタでファイルを開きます。
nano simple_calc.sh
  1. ファイルに以下の内容を追加します。
#!/bin/zsh

## Simple addition using bc
echo "20 + 5" | bc
  1. Ctrl+O を押してファイルを保存し、Enter を押し、Ctrl+X で nano を終了します。

  2. スクリプトを実行可能にします。

chmod +x simple_calc.sh
  1. スクリプトを実行します。
./simple_calc.sh

以下の出力が表示されるはずです。

25

これは、bc が "20 + 5" という式を入力として受け取り、結果 25 を出力することを示しています。

bc の動作原理の理解

bc コマンドはパイプライン指向の計算機です。パイプ記号 (|) を使用して式を bc に送り、評価させます。基本的な構文は次の通りです。

echo "expression" | bc

他の基本的な演算も試すことができます。

echo "10 - 3" | bc ## Subtraction
echo "4 * 6" | bc  ## Multiplication
echo "15 / 3" | bc ## Division

これらのコマンドをターミナルで実行して結果を確認してみましょう。

echo "10 - 3" | bc
echo "4 * 6" | bc
echo "15 / 3" | bc

出力は次のようになるはずです。

7
24
5

bc を使った浮動小数点数の計算

このステップでは、bc 計算機を使用して浮動小数点数の計算を行う方法を学びます。デフォルトでは、bc は整数演算を行いますが、scale パラメータを使用して小数点以下の精度を制御することができます。

scale パラメータの理解

bcscale パラメータは、計算で使用する小数点以下の桁数を決定します。その動作を見てみましょう。

  1. scale を設定せずに除算を行うコマンドを試してみます。
echo "5 / 2" | bc

出力は次のようになります。

2

結果が整数に切り捨てられ、四捨五入されていないことに注意してください。

  1. 次に、より正確な結果を得るために scale を設定してみましょう。
echo "scale=2; 5 / 2" | bc

出力は次のようになります。

2.50

scale=2 は、bc に小数点以下 2 桁で結果を計算するよう指示します。

複雑な計算用のスクリプトの作成

scale を使用して、より複雑な計算を行うスクリプトを作成しましょう。

  1. まだプロジェクトディレクトリにいない場合は、移動します。
cd ~/project
  1. complex_calc.sh という名前の新しいスクリプトファイルを作成します。
touch complex_calc.sh
  1. nano エディタでファイルを開きます。
nano complex_calc.sh
  1. ファイルに以下の内容を追加します。
#!/bin/zsh

## Complex calculation using bc with scale
result=$(echo "scale=2; (10.5 * 4.2) - (5.5 / 2) + 3^2" | bc)
echo "Result: $result"

このスクリプトは以下のことを行います。

  • 小数点以下 2 桁の精度を設定します。
  • 乗算を行います:10.5 * 4.2
  • 除算を行います:5.5 / 2
  • 累乗を計算します:3^2 (3 の 2 乗)
  • これらの演算を加算と減算で組み合わせます。
  • 結果を result という名前の変数に格納します。
  • 説明ラベル付きで結果を出力します。
  1. Ctrl+O を押してファイルを保存し、Enter を押し、Ctrl+X で nano を終了します。

  2. スクリプトを実行可能にします。

chmod +x complex_calc.sh
  1. スクリプトを実行します。
./complex_calc.sh

以下のような出力が表示されるはずです。

Result: 46.35

計算を分解してみましょう。

  • 10.5 * 4.2 = 44.1
  • 5.5 / 2 = 2.75
  • 3^2 = 9
  • 44.1 - 2.75 + 9 = 50.35

待ってください。期待される結果は 50.35 ですが、46.35 が出力されました。これは、スクリプト内の計算が正しくないためです。修正しましょう。

nano complex_calc.sh

計算を更新します。

#!/bin/zsh

## Complex calculation using bc with scale
result=$(echo "scale=2; (10.5 * 4.2) - (5.5 / 2) + 3^2" | bc)
echo "Result: $result"

## Breaking down the calculation
part1=$(echo "scale=2; 10.5 * 4.2" | bc)
part2=$(echo "scale=2; 5.5 / 2" | bc)
part3=$(echo "3^2" | bc)

echo "Part 1 (10.5 * 4.2): $part1"
echo "Part 2 (5.5 / 2): $part2"
echo "Part 3 (3^2): $part3"
echo "Final: $part1 - $part2 + $part3 = $(echo "scale=2; $part1 - $part2 + $part3" | bc)"

変更を保存し、スクリプトを再度実行します。

./complex_calc.sh

この更新されたスクリプトは、計算の各部分を分解して表示するため、最終結果がどのように得られたかを理解しやすくなります。

bc での変数の使用

このステップでは、bc 内で変数を使用して、計算をより柔軟かつ強力にする方法を学びます。bc 計算機では、変数を定義し、複数の計算で再利用することができます。

bc の対話モードでの変数の使用

まず、bc の対話モードで直接変数を使用する方法を探ってみましょう。

  1. 対話モードで bc 計算機を起動します。
bc
  1. 変数を定義し、それを使って計算を行います。
x = 10
x + 5
x * 2

以下のように表示されるはずです。

15
20
  1. 複数の変数を定義し、一緒に使用することができます。
y = 7
x + y
x * y

出力は次のようになります。

17
70
  1. Ctrl+D を押すか、quit と入力して対話モードを終了します。

bc の変数を使用したスクリプトの作成

では、bc の計算で変数を使用するスクリプトを作成しましょう。

  1. まだプロジェクトディレクトリにいない場合は、移動します。
cd ~/project
  1. variable_calc.sh という名前の新しいスクリプトファイルを作成します。
touch variable_calc.sh
  1. nano エディタでファイルを開きます。
nano variable_calc.sh
  1. ファイルに以下の内容を追加します。
#!/bin/zsh

## Script to demonstrate using variables in bc

## Define input values
radius=5
height=10

## Calculate cylinder volume (π * r² * h)
volume=$(echo "scale=2; 3.14159 * $radius * $radius * $height" | bc)

## Calculate cylinder surface area (2π * r² + 2π * r * h)
surface_area=$(echo "scale=2; 2 * 3.14159 * $radius * $radius + 2 * 3.14159 * $radius * $height" | bc)

## Display results
echo "Cylinder properties with radius $radius and height $height:"
echo "Volume: $volume cubic units"
echo "Surface Area: $surface_area square units"

このスクリプトは以下のことを行います。

  • 円柱の半径と高さの変数を定義します。
  • 公式 π h を使用して体積を計算します。
  • 公式 2π r² + 2π r * h を使用して表面積を計算します。
  • 適切な単位付きで結果を表示します。
  1. Ctrl+O を押してファイルを保存し、Enter を押し、Ctrl+X で nano を終了します。

  2. スクリプトを実行可能にします。

chmod +x variable_calc.sh
  1. スクリプトを実行します。
./variable_calc.sh

以下のような出力が表示されるはずです。

Cylinder properties with radius 5 and height 10:
Volume: 785.39 cubic units
Surface Area: 471.23 square units

bc 内部での変数の使用

複数行を使って、bc 内部で完全に変数を定義して使用することもできます。これを示す別のスクリプトを作成しましょう。

  1. 新しいファイルを作成します。
nano bc_variables.sh
  1. 以下の内容を追加します。
#!/bin/zsh

## Script to demonstrate using variables within bc

bc << EOF
scale=2
radius = 5
height = 10
pi = 3.14159

## Calculate cylinder volume
volume = pi * radius^2 * height
print "Volume: ", volume, " cubic units\n"

## Calculate cylinder surface area
surface_area = 2 * pi * radius^2 + 2 * pi * radius * height
print "Surface Area: ", surface_area, " square units\n"
EOF

このスクリプトは以下のことを行います。

  • "ヒアドキュメント" (EOF) を使用して複数行を bc に送ります。
  • bc 自身の中ですべての変数を定義します。
  • これらの変数を使用して計算を行います。
  • bcprint コマンドを使用して結果を表示します。
  1. ファイルを保存し、実行可能にしてから実行します。
chmod +x bc_variables.sh
./bc_variables.sh

出力は前のスクリプトと似ているはずですが、bc で変数を使用する別のアプローチを示しています。

実用的な bc 計算機スクリプトの作成

この最後のステップでは、これまで学んだすべての概念をまとめた、より実用的な計算機スクリプトを作成します。このスクリプトでは、ユーザーがメニューからオプションを選択して様々な計算を行うことができます。

対話型計算機の構築

対話型計算機として機能するスクリプトを作成しましょう。

  1. まだプロジェクトディレクトリにいない場合は、移動します。
cd ~/project
  1. calculator.sh という名前の新しいスクリプトファイルを作成します。
touch calculator.sh
  1. nano エディタでファイルを開きます。
nano calculator.sh
  1. ファイルに以下の内容を追加します。
#!/bin/zsh

## Interactive calculator script using bc

## Function to calculate area of a circle
calculate_circle_area() {
  echo -n "Enter the radius of the circle: "
  read radius
  area=$(echo "scale=2; 3.14159 * $radius * $radius" | bc)
  echo "The area of the circle with radius $radius is: $area square units"
}

## Function to calculate area of a rectangle
calculate_rectangle_area() {
  echo -n "Enter the length of the rectangle: "
  read length
  echo -n "Enter the width of the rectangle: "
  read width
  area=$(echo "scale=2; $length * $width" | bc)
  echo "The area of the rectangle with length $length and width $width is: $area square units"
}

## Function to solve quadratic equation ax² + bx + c = 0
solve_quadratic() {
  echo -n "Enter coefficient a: "
  read a
  echo -n "Enter coefficient b: "
  read b
  echo -n "Enter coefficient c: "
  read c

  ## Calculate discriminant
  discriminant=$(echo "scale=4; ($b * $b) - (4 * $a * $c)" | bc)

  ## Check the discriminant
  if (($(echo "$discriminant < 0" | bc -l))); then
    echo "The equation has no real solutions (discriminant < 0)"
  elif (($(echo "$discriminant == 0" | bc -l))); then
    ## One solution
    x=$(echo "scale=4; -$b / (2 * $a)" | bc)
    echo "The equation has one solution: x = $x"
  else
    ## Two solutions
    x1=$(echo "scale=4; (-$b + sqrt($discriminant)) / (2 * $a)" | bc -l)
    x2=$(echo "scale=4; (-$b - sqrt($discriminant)) / (2 * $a)" | bc -l)
    echo "The equation has two solutions:"
    echo "x1 = $x1"
    echo "x2 = $x2"
  fi
}

## Main program loop
while true; do
  echo ""
  echo "===== BC Calculator Menu ====="
  echo "1. Calculate area of a circle"
  echo "2. Calculate area of a rectangle"
  echo "3. Solve quadratic equation (ax² + bx + c = 0)"
  echo "4. Exit"
  echo ""

  echo -n "Enter your choice (1-4): "
  read choice

  case $choice in
    1) calculate_circle_area ;;
    2) calculate_rectangle_area ;;
    3) solve_quadratic ;;
    4)
      echo "Exiting calculator. Goodbye!"
      exit 0
      ;;
    *) echo "Invalid option. Please try again." ;;
  esac
done

このスクリプトは以下のことを行います。

  • 異なるタイプの計算用の関数を定義します。
  • ユーザーが希望する計算を選択できるメニューインターフェースを提供します。
  • すべての数学的演算に bc を使用します。
  • 二次方程式のようなより複雑な数式を扱います。
  1. Ctrl+O を押してファイルを保存し、Enter を押し、Ctrl+X で nano を終了します。

  2. スクリプトを実行可能にします。

chmod +x calculator.sh
  1. 計算機スクリプトを実行します。
./calculator.sh
  1. メニューの各オプションを試してみましょう。
    • オプション 1 を選択し、半径を入力して円の面積を計算します。
    • オプション 2 を選択し、長さと幅を入力して長方形の面積を計算します。
    • オプション 3 を選択し、係数を入力して二次方程式を解きます(例えば、a=1, b=5, c=6 を試してみましょう)。
    • オプション 4 を選択して計算機を終了します。

例えば、オプション 3 を選択し、a=1, b=5, c=6 を入力すると、以下のような出力が表示されるはずです。

The equation has two solutions:
x1 = -2.0000
x2 = -3.0000

この対話型スクリプトは、bc をより複雑なプログラムに組み込んで、様々な数学的問題を解く方法を示しています。

まとめ

この実験では、Linux のコマンドライン計算機 bc を使用して様々な算術演算を行う方法を学びました。

以下は、あなたが達成したことのまとめです。

  1. 基本的な算術演算

    • bc 計算機をインストールし、動作を確認しました。
    • 足し算を行う簡単なスクリプトを作成しました。
    • パイプ演算子を使用して式を bc に送る方法を学びました。
    • 足し算、引き算、掛け算、割り算などの基本的な演算を練習しました。
  2. 浮動小数点数の計算

    • scale パラメータを使用して小数点以下の精度を制御しました。
    • 複数の演算を含むより複雑な計算用のスクリプトを作成しました。
    • 演算子の優先順位を理解し、括弧を使用して計算の流れを制御する方法を学びました。
  3. 変数の使用

    • bc の計算でシェル変数を使用しました。
    • 変数を定義して使用するための bc の対話モードを探索しました。
    • より柔軟な計算のために変数を利用するスクリプトを作成しました。
    • 複数行の bc 演算に "ヒアドキュメント" を使用する方法を学びました。
  4. 実用的なアプリケーション

    • メニューインターフェース付きの対話型計算機スクリプトを構築しました。
    • 一般的な幾何学的計算を実装しました。
    • 二次方程式のようなより複雑な方程式を解きました。
    • 学んだすべての概念を役立つアプリケーションにまとめました。

これらのスキルにより、Linux コマンドラインで効率的に数学的演算を行い、スクリプト内で計算を自動化することができます。bc 計算機は、単純な算術から複雑な数式まですべてを扱うことができる強力なツールであり、Linux 環境で作業するシステム管理者、開発者、データアナリストにとって不可欠なユーティリティです。

Linux での作業を続けるうちに、bc のようなコマンドラインツールとシェルスクリプトを組み合わせることで、幅広い問題をより効率的に解決できることがわかるでしょう。