| """
Knuth's TPK program in Cobra
From http://en.wikipedia.org/wiki/Trabb_Pardo-Knuth_algorithm
"In their 1977 work "The Early Development of Programming Languages", Trabb Pardo
and Knuth introduced a trivial program which involved arrays, indexing,
mathematical functions, subroutines, I/O, conditionals and iteration. They then
wrote implementations of the algorithm in several early programming languages to
show how such concepts were expressed."
While this is useful for demonstrating a few basic things about a language, it
does not demonstrate well the features surrounding larger issues such as
organizing large code bases, working on a team, documenting your code, etc.
Also, the standard TPK code mixes input, computations and output all together.
It also directly references stdin and hard codes constants rather than taking
parameters for those things.
But some people still like to see this code to compare it to other languages.
So here it is, including a better version that addresses some of the above issues.
"""
class TPK
shared
def f(x as number) as number
return x.abs.sqrt + 5.0 * x.pow(3.0)
def basicTPK1
a = number[](11)
# read in the values for the array, one per line
for i in a.length
a[i] = number.parse(Console.readLine)
# in reverse order, apply "f" to each element of the array and
# print the result, including index
for i in a.length-1 : 0 : -1
y = .f(a[i])
print '[i] ', if(y>400, 'TOO LARGE', y)
def basicTPK2
# some versions in other languages print the input number
# rather than its index
a = number[](11)
for i in a.length
a[i] = number.parse(Console.readLine)
Array.reverse(a)
for x in a
y = .f(x)
print '[x] ', if(y>400, 'TOO LARGE', y)
def betterTPK
"""
Invokec .betterTPK with default arguments: Console.in, 11 and 400.
"""
.betterTPK(Console.in to !, 11, 400)
def betterTPK(tr as TextReader, count as int, limit as number)
require
count > 0
ensure
# Well there's not much to ensure for a method that dumps its
# results as textual output. An even better approach is to
# separate computation from I/O so that computations can be
# more easily tested, contracted and reused.
true
test
# Now that we're using parameters, we can make a proper test.
sw = StringWriter()
print to sw
.betterTPK(StringReader('1\r\n1\r\n'), 2, 400)
r = sw.toString.replace('\r','').replace('\n','; ')
assert r == '1 6.0; 1 6.0; '
body
a = number[](count)
for i in a.length
a[i] = number.parse(tr.readLine)
Array.reverse(a)
for x in a
y = .f(x)
print '[x] ', if(y>limit, 'TOO LARGE', y)
def main
if false
print
print 'Basic TPK - Enter numbers:'
.basicTPK1
if true
print
print 'Better TPK - Enter numbers:'
.betterTPK
|