2

バイナリ検索を実行する bash スクリプトを作成します。生徒の名前と成績をファイルから配列に読み取ります。ユーザーに学生名の入力を求めます。配列内の名前を見つけて、グレードを表示します。ファイル内のデータは次のとおりです。

Ann:A
Bob:C
Cindy:B
Dean:F
Emily:A
Frank:C
Ginger:D
Hal:B
Ivy:A
Justin:F
Karen:D

私は次のことをしましたが、次に何をすべきか行き詰まっています

#!/bin/bash
 echo "please enter students Name: "
 read student
 echo "$student + $Grade"
 ((i=0))
 while read students[$i] ; do
 ((i++))

 done < students.dat
 first=0
 last=$(students[@])


 ((mid=0))
 Name=`echo ${students[$mid]} | cut -d: -f1`
 Grade=`echo ${students[$mid]} | cut -d: -f2`
 echo $Name
 echo $Grade
4

4 に答える 4

3

二分探索には、探索の最大境界と最小境界が必要です。ゼロから始めるのは素晴らしいことですが、最後の変数は少しずれています。試してみてください: last=$(($#students[@]} - 1)) - 1 は配列を正しいサイズにします (配列はゼロから始まり、そのサイズの 1 つ小さいサイズになります)。

その後、次の疑似コードを試してください。

while (last is <= first) 
  middle = midway point between first and last

  // make sure that your comparing just the names "Ann",
  // not your whole string "Ann:A"
  if (students[middle] == student)
    exit loop
  else if (students[middle] < student)
    first = middle + 1
  else if (students[middle] > student)
    last = middle - 1

私は bash スクリプトが得意ではないので、(修正が必要な場合でも) ほとんどの構文を修正しようとはしません。構文を理解すれば、疑似コードでほとんどの方法を理解できるはずです。

于 2013-07-17T11:00:35.100 に答える