import module namespace tf = "http://www.cems.uwe.ac.uk/xmlwiki/tf" at "../lib/tf.xqm"; declare variable $model := ; declare function local:random-digits($length as xs:integer, $min as xs:integer, $max as xs:integer) as xs:integer* { (: generate a sequence of $length random digits in the range $min to $max inclusive :) let $range := $max + 1 - $min return for $i in (1 to $length) return floor(math:random()* $range) + $min }; declare function local:digits-to-number($digits as xs:integer*,$base as xs:integer) as xs:integer { (: convert a sequence of $digits to an integer - $digits are in reverse order :) if (count($digits)=1) then $digits else $digits[last()] + local:digits-to-number(subsequence($digits,1,count($digits)-1), $base ) * $base }; declare function local:number-to-digits($n as xs:integer,$base as xs:integer ) as xs:integer* { (: generate a sequence of digits from an integer :) if ($n = 0) then () else (local:number-to-digits(floor($n div $base), $base),$n mod $base) }; declare function local:digits-to-row ($digits as xs:integer*, $cols as xs:integer) as element(td)* { (: convert an integer into a row of tds padded with leading spaces :) ( for $pad in ( 1 to $cols -count($digits)) return element td {""}, for $digit in $digits return element td { $digit } ) }; declare option exist:serialize "method=xhtml media-type=text/html omit-xml-declaration=no indent=yes doctype-public=-//W3C//DTD XHTML 1.0 Transitional//EN doctype-system=http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"; (: get the problem spec :) let $spec:= tf:get-parameter-values($model) (: generate the problem :) let $problem := for $i in (1 to xs:integer($spec/rows)) return local:digits-to-number(local:random-digits($spec/columns,$spec/min,$spec/max), $spec/base) let $sum := sum( $problem) (: the sum is the largest number :) let $cols := count(local:number-to-digits($sum,$spec/base)) return Math Problem Generator

Math Problem Generator

{tf:create-span-fields($spec)}

{ for $number in $problem[position() < last()] return } {local:digits-to-row(local:number-to-digits($problem[last()],$spec/*:base),$cols)}
{local:digits-to-row(local:number-to-digits($number,$spec/*:base),$cols)}
+

{local:digits-to-row(local:number-to-digits($sum,$spec/*:base),$cols)}