编写一个 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
这里的每个人都希望你学习这些东西而不是为你做作业,所以我故意有点迟钝。
请记住,这里提出的任何解决方案都是一个程序员的做法,不一定是唯一正确的方法。
您需要先将您的成绩纳入您的类(class) - 从这开始。
文件中的每一行都是一个学生姓名,与成绩之间用“:”分隔。
您想将它们读入两个并行数组(正如 Jonathan 指出的那样)。
如果您在 google 上搜索“bash split string”,您会发现很多关于如何执行此操作的有用建议。
我这样做是为了得到两个数组,一个保存学生姓名,另一个保存成绩。
((i=0))
while IFS=":" read -a fields ;
do
students[$i]=${fields[0]}
grades[$i]=${fields[1]}
((i++))
done < students.dat
echo ${students[@]}
echo ${grades[@]}
太棒了!现在您需要稍微研究一下二分查找算法。请记住,您可以使用 ${#ArrayName[@]}
获取数组的长度
由于列表显然已经排序,您不必自己进行排序,因此您可以将所需的姓名与数组中点的学生姓名进行比较。如果你要找的学生姓名大于中点的学生姓名,那么你就知道你要找的在数组的后半部分,反之亦然。最终中点的学生姓名将正是您要查找的那个。