#include "library.h" // version 1. This function is a bit boring, but... void speak(int n) { // if ever speak(n) is called with n between 0 and 20 // it can not fail, under all circumstances if (n==0) print("zero"); else if (n==1) print("one"); else if (n==2) print("two"); else if (n==3) print("three"); else if (n==4) print("four"); else if (n==5) print("five"); else if (n==6) print("six"); else if (n==7) print("seven"); else if (n==8) print("eight"); else if (n==9) print("nine"); else if (n==10) print("ten"); else if (n==11) print("eleven"); else if (n==12) print("twelve"); else if (n==13) print("thirteen"); else if (n==14) print("fourteen"); else if (n==15) print("fifteen"); else if (n==16) print("sixteen"); else if (n==17) print("seventeen"); else if (n==18) print("eighteen"); else if (n==19) print("nineteen"); else if (n==20) print("twenty"); else { print("I don't know how to say "); print(n); } } void main() { speak(7); } // we can even make it test itself, so there can be no question. void test_from_to(int from, int to) { if (from=21 && n<=29) { // we already know that speak(20) is guaranteed to work speak(20); print(" "); // n is between 21 and 29 therefore n-20 is between 1 and 9 // therefore speak(n-20) is guarateed to do the right thing. speak(n-20); } else { print("I don't know how to say "); print(n); } } // version 4. Using exactly the same pattern to go a bit further. #include "library.h" void speak(int n) { // if ever speak(n) is called with n between 0 and 59 // it can not fail, under all circumstances if (n==0) print("zero"); else if (n==1) print("one"); else if (n==2) print("two"); else if (n==3) print("three"); else if (n==4) print("four"); else if (n==5) print("five"); else if (n==6) print("six"); else if (n==7) print("seven"); else if (n==8) print("eight"); else if (n==9) print("nine"); else if (n==10) print("ten"); else if (n==11) print("eleven"); else if (n==12) print("twelve"); else if (n==13) print("thirteen"); else if (n==14 || n==16 || n==17 || n==19) { speak(n-10); print("teen"); } else if (n==15) print("fifteen"); else if (n==18) print("eighteen"); else if (n==20) print("twenty"); else if (n>=21 && n<=29) { speak(20); print(" "); speak(n-20); } else if (n==30) print("thirty"); else if (n>=31 && n<=39) { speak(30); print(" "); speak(n-30); } else if (n==40) print("forty"); else if (n>=41 && n<=49) { speak(40); print(" "); speak(n-40); } else if (n==50) print("fifty"); else if (n>=51 && n<=59) { speak(50); print(" "); speak(n-50); } else { print("I don't know how to say "); print(n); } } // we notice that the cases for 21 to 29, 31 to 39, 41 to 49 // and 51 to 59 are identical but for the appearances of the // numbers 20, 30, 40 and 50. // with a bit of thinking, we discovered that the formula // n - n%10 just removes the last digit from a number, so // it is exactly what we want to make a generalisation // we also added 60, 70, 80, 90 to the functions speaking // repertoire. #include "library.h" void speak(int n) { // if ever speak(n) is called with n between 0 and 99 // it can not fail, under all circumstances if (n==0) print("zero"); else if (n==1) print("one"); else if (n==2) print("two"); else if (n==3) print("three"); else if (n==4) print("four"); else if (n==5) print("five"); else if (n==6) print("six"); else if (n==7) print("seven"); else if (n==8) print("eight"); else if (n==9) print("nine"); else if (n==10) print("ten"); else if (n==11) print("eleven"); else if (n==12) print("twelve"); else if (n==13) print("thirteen"); else if (n==14 || n==16 || n==17 || n==19) { speak(n-10); print("teen"); } else if (n==15) print("fifteen"); else if (n==18) print("eighteen"); else if (n==20) print("twenty"); else if (n==30) print("thirty"); else if (n==40) print("forty"); else if (n==50) print("fifty"); else if (n==80) print("eighty"); else if (n==60 || n==70 || n==90) { speak(n/10); print("ty"); } else if (n>=21 && n<=99) { const int ty = n - n%10; // this just removes last digit, e.g. 37 -> 30 speak(ty); print(" "); speak(n-ty); } else { print("I don't know how to say "); print(n); } } // this is where we were when time ran out. #include "library.h" void speak(int n) { // if ever speak(n) is called with n between 0 and 99 // it can not fail, under all circumstances if (n==0) print("zero"); else if (n==1) print("one"); else if (n==2) print("two"); else if (n==3) print("three"); else if (n==4) print("four"); else if (n==5) print("five"); else if (n==6) print("six"); else if (n==7) print("seven"); else if (n==8) print("eight"); else if (n==9) print("nine"); else if (n==10) print("ten"); else if (n==11) print("eleven"); else if (n==12) print("twelve"); else if (n==13) print("thirteen"); else if (n==14 || n==16 || n==17 || n==19) { speak(n-10); print("teen"); } else if (n==15) print("fifteen"); else if (n==18) print("eighteen"); else if (n==20) print("twenty"); else if (n==30) print("thirty"); else if (n==40) print("forty"); else if (n==50) print("fifty"); else if (n==80) print("eighty"); else if (n==60 || n==70 || n==90) { speak(n/10); print("ty"); } else if (n>=21 && n<=99) { const int ty = n - n%10; // this just removes last digit, e.g. 37 -> 30 speak(ty); print(" "); speak(n-ty); } else if (n>=100 && n<=999) { speak(n/100); print(" hundred and "); speak(n%100); } else { print("I don't know how to say "); print(n); } } void test_from_to(int from, int to) { if (from