我的问题定义是: 1.编写一个 Bourn shell 脚本 dTOe,它将 0 到 999 之间的任何数字作为输入,并打印该数字的英文值。我正在努力解决上述问题。你能给我任何提示或帮助吗?
#! /bin/bash
number=$1
if [ $number -lt 0 -o $number -gt 999 ]
then
echo put the right input between 0 and 999
fi
case "$number"
[0-9])
答案1
想想你的思维过程是如何从数字形式翻译成散文形式的。你首先看什么?您如何处理这些信息?您的工作流程是否有可以以程序形式表达的模式?如何将其分解为类似于您可用的命令的小的、离散的步骤?
以上思路就是编程和脚本的精髓。
你心里已经有了流程的框架,把它写成“伪代码”——对你来说有意义的单词,如果对 shell 来说没有意义的话——然后逐步执行该流程,以确保它按照你的想法进行操作。想而不仅仅是你的说。然后将其从您的母语翻译成 shell 命令。
例如,一个好的起点可能是确定必须指示多少位值。有几种方法可以立即浮现在我的脑海中:“我们有多少位数字”,或者“这个数字是否大于 99?大于 9?”或者你甚至可以找出一个不需要你先解决这个问题的系统。
在这种情况下,你首先需要的是能够在shell中进行一些基本的算术,以及对比测试。所以:
假设我们已将数字读入变量 ,number
并且已经对其进行了健全性检查,以确保用户没有输入-53
or3.14
或 oralbatross
或我们不想实际解析的内容。我们可以从以下开始:
output=""
if [[ "$number" -gt 100 ]]; then
# okay, we know $number is greater than 100
hundreds=$((number/100))
case $hundreds in
1) output="one" ;;
2) output="two" ;;
3) output="three" ;;
# et cetera
esac
number=$((number-100*hundreds))
fi
output="$output hundred"
您可以从那里开始构建。
答案2
echo -n "Enter number : "
read num
length=$(echo $num | wc -c)
length=$(( $length - 1 ))
echo "Your number $num in words : "
for (( i=1; i<=$length; i++ ))
do
# get one digit at a time
digit=$(echo $num | cut -c $i)
# use case control structure to find digit equivalent in words
case $digit in
0) echo -n "zero " ;;
1) echo -n "one " ;;
2) echo -n "two " ;;
3) echo -n "three " ;;
4) echo -n "four " ;;
5) echo -n "five " ;;
6) echo -n "six " ;;
7) echo -n "seven " ;;
8) echo -n "eight " ;;
9) echo -n "nine " ;;
esac
done
# just print new line
echo ""