[Tutor] Projects (fwd)

Ricardo Aráoz ricaraoz at gmail.com
Thu Jan 24 02:21:53 CET 2008


Danny Yoo wrote:
> Hi Jason,
> 
> 
> Looking back at that Java code:
> 
> ////////////////////////////////////////////////
>     static String convertDigitToEnglish(int d)  {
>         switch ( d )
>         {
>            case 1: return "one";
>            case 2: return "two";
>            case 3: return "three";
>            case 4: return "four";
>            case 5: return "five";
>            case 6: return "six";
>            case 7: return "seven";
>            case 8: return "eight";
>            case 9: return "nine";
>            default: return "\nFatal Error!\n"; // should I abort pgm?
>         } // end of switch
>    } // end of convertDigitToEnglis
> ////////////////////////////////////////////////
> 
> 
> Frankly, this seems silly to me.  First, it ignores zero, which is a cardinal 
> sin.  I'm being somewhat serious about this: functions should do what they say, 
> and that function isn't.
> 
> 
> But the code could also be written much more tightly as:
> 
> ////////////////////////////////////////////////
>       static String digitToString(int n) {
>  	 String[] words = {"zero", "one", "two", "three", "four",
>  	 		  "five", "six", "seven", "eight", "nine"};
>  	 if (0 <= n && n < 10) {
>  	     return words[n];
>  	 }
>  	 throw new IllegalArgumentException("input not a single digit");
>      }
> ////////////////////////////////////////////////
> 
> I don't mean to make this post so Java-centric; it just seems a little unfair 
> to compare a bad Java routine to a good Python routine.  :) Writing an 
> equivalent in Python is also pretty straightforward:
> 
> #################################
> ## Pseudocode: just a sketch
> def digitToString(n):
>       words = ["zero", "one", ...]
>       if 0 <= n < 10:
>           return words[n]
>      ...
> #################################
> 
> Like dictionaries, the list data structure works pretty well for key/value 
> lookup if the input key is a small number.
> 
> 
> Good luck!
> 

up to a thousand (not tested)

words = {0:'zero', 1:'one', 2:'two', 3:'three', ... , 10:'ten',
	 11:'eleven', 12:'twelve', ..., 19:'nineteen',
         20:'twenty', ...., 90:'ninety', 100:'one hundred' }
def digitToString(n) :
    try :
        retStr = words[n]
    except KeyError :
        if n > 100 :
            retStr = (digitToString(n // 100)
                     + ' hundred and '
                     + digitToString(n % 100))
        else :
            retStr = (digitToString(n - (n % 10))
                     + ' '
                     + digitToString(n % 10))

    return retStr

HTH


More information about the Tutor mailing list