javax_slr: (Default)
[personal profile] javax_slr
Скрипт груви генерирующий LaTeX с упражнениями по умножению дробей (и еще один с ответами)

//////////////////////////////////////////////////// 
int N = 10
def f1 = new File("d:\\temp\\ex.tex")
def f2 = new File("d:\\temp\\sol.tex")
///////////////////////////////////////////////////// 

def r = new Random(System.currentTimeMillis())

f1.delete();
f2.delete();

def header = """ 
\\documentclass[a4paper,12pt,onecolumn]{article}
\\begin{document} \n"""

f1 << header
f2 << header

N.times {



    // boolean - will it eliminate?
    boolean eliminate = r.nextBoolean()

    //choose 2 numbers in denominator
    int den1 = (r.nextInt(7) + 2)
    int den2 = (r.nextInt(7) + 2)

    boolean isFirstInteger = r.nextBoolean()

    def mult = r.nextInt(3) + 2
    int integer = mult * den1
    if (eliminate) {
        integer *= den2
    } else {
        integer *= (r.nextInt(7) + 2)
    }

    int firstFractionIntegerPart = r.nextInt(3) + 1
    int secondFractionIntegerPart = r.nextInt(3) + 1
    int firstFractionNumeratorPart = r.nextInt(den1-1) + 1
    int secondFractionNumeratorPart = r.nextInt(den2-1) + 1

    println "$eliminate mult = $mult  den1=$den1 den2=$den2 integer=$integer"


    def s = new StringBuffer("")

    if (isFirstInteger) {
        s << "\$\$ $integer "
        s << "  \\times "
        s << "$firstFractionIntegerPart\\frac{$firstFractionNumeratorPart}{$den1}"
    }
    else {
        s << "\$\$ $firstFractionIntegerPart\\frac{$firstFractionNumeratorPart}{$den1}"
        s << "  \\times "
        s << "$integer "
    }
    s << "  \\times "
    s << "$secondFractionIntegerPart\\frac{$secondFractionNumeratorPart}{$den2}  =  "

    f1 <<s
    f2 <<s

    f1 << "\$\$\n \\bigskip \n"




    // compute the answer

    int numerator = integer*(firstFractionIntegerPart*den1+firstFractionNumeratorPart)*(secondFractionIntegerPart*den2+secondFractionNumeratorPart)
    int denumerator = den1*den2

    int commondenum =  gcdR(numerator,denumerator)

    int reducedNumerator = numerator/commondenum
    int reducedDenumerator = denumerator/commondenum

    int integerNumerator = 0
    if (reducedNumerator > reducedDenumerator) {
        integerNumerator = reducedNumerator/reducedDenumerator
        f2 << integerNumerator
        reducedNumerator = reducedNumerator% reducedDenumerator
    }
    if (reducedNumerator!=0) {
    f2 << "\\frac{$reducedNumerator}{$reducedDenumerator}"
    }
    f2 << "\$\$\n \\bigskip\n"


    double res1 = integer * ((double) firstFractionIntegerPart + ((double)firstFractionNumeratorPart/den1)) * ((double) secondFractionIntegerPart + ((double)secondFractionNumeratorPart/den2 ))
    double res2 = integerNumerator + ((double)reducedNumerator/reducedDenumerator)

    assert Math.abs(res1-res2) < 0.001

}


def footer = """ 
\\end{document} \n"""

f1 << footer
f2 << footer


private def gcdR(int m, int n) {  m = m.abs(); n = n.abs(); n == 0 ? m : m%n == 0 ? n : gcdR(n, m%n) }

January 2026

S M T W T F S
    123
45 678910
11121314151617
18192021222324
25262728293031

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 14th, 2026 11:09 am
Powered by Dreamwidth Studios