Aufgabengenerierung für ungleichnamige Brüche und Neuentwurf
This commit is contained in:
parent
087f1d7af1
commit
dd5e8c7286
238
aufgabengenerator_formuals_2brueche_addieren_ungleichnamig_v2.py
Normal file
238
aufgabengenerator_formuals_2brueche_addieren_ungleichnamig_v2.py
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
import random
|
||||||
|
from math import gcd
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
def lcm(a, b):
|
||||||
|
"""Berechnet das kleinste gemeinsame Vielfache."""
|
||||||
|
return abs(a * b) // gcd(a, b)
|
||||||
|
|
||||||
|
def create_formula_question(numerator1, denominator1, numerator2, denominator2, n):
|
||||||
|
"""Erzeugt eine Frage im Format 'Formulas'."""
|
||||||
|
# GCD und das kleinste gemeinsame Vielfache für die Denominator
|
||||||
|
common_denominator = lcm(denominator1, denominator2)
|
||||||
|
new_numerator = (numerator1 * (common_denominator // denominator1)) + (numerator2 * (common_denominator // denominator2))
|
||||||
|
gcd_result = gcd(new_numerator, common_denominator)
|
||||||
|
if gcd_result > 1:
|
||||||
|
print("kürzbar")
|
||||||
|
shortable = True
|
||||||
|
shortened_numerator = new_numerator // gcd_result
|
||||||
|
shortened_denominator = common_denominator // gcd_result
|
||||||
|
else:
|
||||||
|
shortable = False
|
||||||
|
|
||||||
|
question = ET.Element('question', attrib={'type': 'formulas'})
|
||||||
|
|
||||||
|
name_elem = ET.SubElement(question, 'name')
|
||||||
|
text_elem = ET.SubElement(name_elem, 'text')
|
||||||
|
text_elem.text = 'Addition von 2 ungleichnamigen Brüchen {} E'.format(n)
|
||||||
|
|
||||||
|
questiontext_elem = ET.SubElement(question, 'questiontext', attrib={'format': 'html'})
|
||||||
|
text_elem = ET.SubElement(questiontext_elem, 'text')
|
||||||
|
if shortable:
|
||||||
|
text_elem.text = '''<![CDATA[ <p>Addiere die Brüche und kürze das Ergebnis so weit wie möglich.</p>
|
||||||
|
<p>{#A} </p> ]]> '''
|
||||||
|
else:
|
||||||
|
text_elem.text = '''<![CDATA[ <p>Addiere die beiden Brüche.</p>
|
||||||
|
<p>{#A} </p> ]]> '''
|
||||||
|
|
||||||
|
# Allgemeines Feedback
|
||||||
|
generalfeedback_elem = ET.SubElement(question, 'generalfeedback', attrib={'format': 'html'})
|
||||||
|
text_elem = ET.SubElement(generalfeedback_elem, 'text')
|
||||||
|
text_elem.text = ' '
|
||||||
|
|
||||||
|
# Grundlegende Bewertungsinformationen
|
||||||
|
ET.SubElement(question, 'defaultgrade').text = '1.0000000'
|
||||||
|
ET.SubElement(question, 'penalty').text = '0.3333333'
|
||||||
|
ET.SubElement(question, 'hidden').text = '0'
|
||||||
|
ET.SubElement(question, 'idnumber').text = ' '
|
||||||
|
|
||||||
|
# Feedback für korrekte und inkorrekte Antworten
|
||||||
|
correctfeedback_elem = ET.SubElement(question, 'correctfeedback', attrib={'format': 'html'})
|
||||||
|
text_elem = ET.SubElement(correctfeedback_elem, 'text')
|
||||||
|
text_elem.text = '''<![CDATA[ <p>Die Antwort ist richtig.</p> ]]> '''
|
||||||
|
|
||||||
|
partiallycorrectfeedback_elem = ET.SubElement(question, 'partiallycorrectfeedback', attrib={'format': 'html'})
|
||||||
|
text_elem = ET.SubElement(partiallycorrectfeedback_elem, 'text')
|
||||||
|
text_elem.text = '''<![CDATA[ <p>Die Antwort ist teilweise richtig.</p> ]]> '''
|
||||||
|
|
||||||
|
incorrectfeedback_elem = ET.SubElement(question, 'incorrectfeedback', attrib={'format': 'html'})
|
||||||
|
text_elem = ET.SubElement(incorrectfeedback_elem, 'text')
|
||||||
|
text_elem.text = '''<![CDATA[ <p>Die Antwort ist falsch.</p> ]]>'''
|
||||||
|
|
||||||
|
ET.SubElement(question, 'shownumcorrect')
|
||||||
|
|
||||||
|
varsrandom_elem = ET.SubElement(question, 'varsrandom')
|
||||||
|
text_elem = ET.SubElement(varsrandom_elem, 'text')
|
||||||
|
text_elem.text = f' '
|
||||||
|
|
||||||
|
# Globale Variablen definieren
|
||||||
|
varsglobal_elem = ET.SubElement(question, 'varsglobal')
|
||||||
|
text_elem = ET.SubElement(varsglobal_elem, 'text')
|
||||||
|
text_elem.text = f'n = [{numerator1}, {numerator2}];\n d = [{denominator1}, {denominator2}];'
|
||||||
|
|
||||||
|
answernumbering_elem = ET.SubElement(question, 'answernumbering')
|
||||||
|
text_elem = ET.SubElement(answernumbering_elem, 'text')
|
||||||
|
text_elem.text = 'ABCD'
|
||||||
|
|
||||||
|
# Antworten definieren
|
||||||
|
answers_elem = ET.SubElement(question, 'answers')
|
||||||
|
|
||||||
|
# Indizes für die Antworten
|
||||||
|
partindex_elem = ET.SubElement(answers_elem, 'partindex')
|
||||||
|
ET.SubElement(partindex_elem, 'text').text = '0'
|
||||||
|
|
||||||
|
placeholder_elem = ET.SubElement(answers_elem, 'placeholder')
|
||||||
|
ET.SubElement(placeholder_elem, 'text').text = '#A'
|
||||||
|
|
||||||
|
# Punktzahl auf Teilaufgabe
|
||||||
|
answermark_elem = ET.SubElement(answers_elem, 'answermark')
|
||||||
|
if shortable:
|
||||||
|
ET.SubElement(answermark_elem, 'text').text = '2'
|
||||||
|
else:
|
||||||
|
ET.SubElement(answermark_elem, 'text').text = '1'
|
||||||
|
|
||||||
|
answertype_elem = ET.SubElement(answers_elem, 'answertype')
|
||||||
|
ET.SubElement(answertype_elem, 'text').text = '0'
|
||||||
|
|
||||||
|
numbox_elem = ET.SubElement(answers_elem, 'numbox')
|
||||||
|
ET.SubElement(numbox_elem, 'text').text = '2'
|
||||||
|
|
||||||
|
# Berechnungsvariablen
|
||||||
|
vars1_elem = ET.SubElement(answers_elem, 'vars1')
|
||||||
|
if shortable:
|
||||||
|
vars1_elem_text = "<![CDATA[ g = gcd(d[0],d[1]);\n cd = abs(d[0] * d[1]) / g;\n e = [cd / d[0], cd / d[1]];\n nums = [n[0]*e[0], n[1]*e[1]];\n thesumnum = nums[0] + nums[1];\n gcdres = gcd(thesumnum,cd);\n snum = thesumnum / gcdres;\n sdenom = cd / gcdres;]]>"
|
||||||
|
else:
|
||||||
|
vars1_elem_text = "<![CDATA[ g = gcd(d[0],d[1]);\ncd = abs(d[0] * d[1]) / g;\ne = [cd / d[0], cd / d[1]];\nnums = [n[0]*e[0], n[1]*e[1]];\nthesumnum = nums[0] + nums[1];]]>"
|
||||||
|
ET.SubElement(vars1_elem, 'text').text = vars1_elem_text
|
||||||
|
|
||||||
|
# Antwort
|
||||||
|
answer_elem = ET.SubElement(answers_elem, 'answer')
|
||||||
|
if shortable:
|
||||||
|
answer_text = '[thesumnum, cd, snum, sdenom]'
|
||||||
|
else:
|
||||||
|
answer_text = '[thesumnum, cd]'
|
||||||
|
ET.SubElement(answer_elem, 'text').text = answer_text
|
||||||
|
|
||||||
|
answernotunique_elem = ET.SubElement(answers_elem, 'answernotunique')
|
||||||
|
ET.SubElement(answernotunique_elem, 'text').text = '0'
|
||||||
|
|
||||||
|
vars2_elem = ET.SubElement(answers_elem, 'vars2')
|
||||||
|
if shortable:
|
||||||
|
vars2_elem_text = "<![CDATA[ ga = _0 == thesumnum && _1 == cd;\n gb = (_0 / _1) == (thesumnum / cd);\n gsa = _2 == snum && _3 == sdenom;\n gsb = (_2 / _3) == (snum / sdenom); ]]>"
|
||||||
|
else:
|
||||||
|
vars2_elem_text = "<![CDATA[ ga = _0 == thesumnum && _1 == cd; gb = (_0 / _1) == (thesumnum / cd); ]]>"
|
||||||
|
ET.SubElement(vars2_elem, 'text').text = vars2_elem_text
|
||||||
|
|
||||||
|
correctness_elem = ET.SubElement(answers_elem, 'correctness')
|
||||||
|
if shortable:
|
||||||
|
ET.SubElement(correctness_elem, 'text').text = '0.25*ga + 0.25*gb + 0.25*gsa + 0.25*gsb'
|
||||||
|
else:
|
||||||
|
ET.SubElement(correctness_elem, 'text').text = '0.5*ga + 0.5*gb'
|
||||||
|
|
||||||
|
unitpenalty_elem = ET.SubElement(answers_elem, 'unitpenalty')
|
||||||
|
ET.SubElement(unitpenalty_elem, 'text').text = '1'
|
||||||
|
|
||||||
|
postunit_elem = ET.SubElement(answers_elem, 'postunit')
|
||||||
|
ET.SubElement(postunit_elem, 'text').text = ' '
|
||||||
|
|
||||||
|
ruleid_elem = ET.SubElement(answers_elem, 'ruleid')
|
||||||
|
ET.SubElement(ruleid_elem, 'text').text = '1'
|
||||||
|
|
||||||
|
otherrule_elem = ET.SubElement(answers_elem, 'otherrule')
|
||||||
|
ET.SubElement(otherrule_elem, 'text').text = ' '
|
||||||
|
|
||||||
|
# Unterfragen-Text
|
||||||
|
subqtext_elem = ET.SubElement(answers_elem, 'subqtext', attrib={'format': 'html'})
|
||||||
|
if shortable:
|
||||||
|
sub_question_text = '''<![CDATA[ <p>Berechne:</p> <p>\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} + \\frac{{n[1]}}{{d[1]}} =\\) {_0} / {_1} = gekürzt: {_2} / {_3}</p> ]]> '''
|
||||||
|
else:
|
||||||
|
sub_question_text = '''<![CDATA[ <p>Berechne:</p> <p>\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} + \\frac{{n[1]}}{{d[1]}} =\\) {_0} / {_1}</p> ]]> '''
|
||||||
|
ET.SubElement(subqtext_elem, 'text').text = sub_question_text
|
||||||
|
|
||||||
|
# Lösungshinweis
|
||||||
|
feedback_elem = ET.SubElement(answers_elem, 'feedback', attrib={'format': 'html'})
|
||||||
|
if shortable:
|
||||||
|
feedback_text = '''<![CDATA[ <h4>Lösungshinweis</h4>
|
||||||
|
<p>Die korrekte Lösung ist:</p>
|
||||||
|
<p>\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} + \\frac{{n[1]}}{{d[1]}} = \\frac{{nums[0]}}{{cd}} + \\frac{{nums[1]}}{{cd}} = \\frac{{thesumnum}}{{cd}} = \\frac{{snum}}{{sdenom}} \\) </p> ]]>'''
|
||||||
|
else:
|
||||||
|
feedback_text = '''<![CDATA[ <h4>Lösungshinweis</h4>
|
||||||
|
<p>Die korrekte Lösung ist:</p>
|
||||||
|
<p>\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} + \\frac{{n[1]}}{{d[1]}} = \\frac{{nums[0]}}{{cd}} + \\frac{{nums[1]}}{{cd}} = \\frac{{thesumnum}}{{cd}} \\) </p> ]]>'''
|
||||||
|
ET.SubElement(feedback_elem, 'text').text = feedback_text
|
||||||
|
|
||||||
|
# correctfeedback
|
||||||
|
|
||||||
|
correctfeedback_elem = ET.SubElement(answers_elem, 'correctfeedback', attrib={'format': 'html'})
|
||||||
|
correctfeedback_text = '''<![CDATA[ <p>Richtig!</p>]]>'''
|
||||||
|
ET.SubElement(correctfeedback_elem, 'text').text = correctfeedback_text
|
||||||
|
|
||||||
|
# partially correct feedback
|
||||||
|
|
||||||
|
pcorrectfeedback_elem = ET.SubElement(answers_elem, 'partiallycorrectfeedback', attrib={'format': 'html'})
|
||||||
|
pcorrectfeedback_text = '''<![CDATA[ <p>Teilweise richtig.</p>]]>'''
|
||||||
|
ET.SubElement(pcorrectfeedback_elem, 'text').text = pcorrectfeedback_text
|
||||||
|
|
||||||
|
# incorrect feedback
|
||||||
|
incorrectfeedback_elem = ET.SubElement(answers_elem, 'incorrectfeedback', attrib={'format': 'html'})
|
||||||
|
incorrectfeedback_text = '''<![CDATA[ <p>Leider nicht richtig.</p>]]>'''
|
||||||
|
ET.SubElement(incorrectfeedback_elem, 'text').text = incorrectfeedback_text
|
||||||
|
|
||||||
|
return question
|
||||||
|
|
||||||
|
def generate_questions(num_questions):
|
||||||
|
"""Generiert Aufgaben für die Addition ungleichnamiger Brüche."""
|
||||||
|
questions = []
|
||||||
|
|
||||||
|
for i in range(num_questions):
|
||||||
|
numerator1 = random.randint(1, 10)
|
||||||
|
denominator1 = random.randint(2, 10)
|
||||||
|
numerator2 = random.randint(1, 10)
|
||||||
|
denominator2 = random.randint(2, 10)
|
||||||
|
|
||||||
|
# Sicherstellen, dass die Nenner unterschiedlich sind
|
||||||
|
while denominator1 == denominator2:
|
||||||
|
denominator2 = random.randint(2, 10)
|
||||||
|
|
||||||
|
question = create_formula_question(numerator1, denominator1, numerator2, denominator2, i)
|
||||||
|
questions.append(question)
|
||||||
|
|
||||||
|
return questions
|
||||||
|
|
||||||
|
def create_quiz(questions):
|
||||||
|
"""Erzeugt die gesamte Quiz-Struktur."""
|
||||||
|
quiz = ET.Element('quiz')
|
||||||
|
for q in questions:
|
||||||
|
quiz.append(q)
|
||||||
|
return quiz
|
||||||
|
|
||||||
|
def save_to_file(xml_element, filename):
|
||||||
|
"""Speichert das XML-Dokument in einer Datei."""
|
||||||
|
tree = ET.ElementTree(xml_element)
|
||||||
|
ET.indent(tree)
|
||||||
|
with open(filename, 'wb') as f:
|
||||||
|
tree.write(f, encoding='utf-8', xml_declaration=True)
|
||||||
|
|
||||||
|
def ersetze_vars2(xml_file):
|
||||||
|
# XML-Datei lesen
|
||||||
|
with open(xml_file, 'r') as f:
|
||||||
|
text = f.read()
|
||||||
|
|
||||||
|
text = text.replace("&","&")
|
||||||
|
text = text.replace("<","<")
|
||||||
|
text = text.replace(">",">")
|
||||||
|
|
||||||
|
with open(xml_file, 'w') as f:
|
||||||
|
f.write(text)
|
||||||
|
|
||||||
|
|
||||||
|
# Hauptprogramm
|
||||||
|
if __name__ == "__main__":
|
||||||
|
num_questions = 20 # Anzahl der zu generierenden Aufgaben
|
||||||
|
questions = generate_questions(num_questions)
|
||||||
|
quiz = create_quiz(questions)
|
||||||
|
|
||||||
|
save_to_file(quiz, 'formulas_fraction_addition_quiz.xml')
|
||||||
|
ersetze_vars2('formulas_fraction_addition_quiz.xml')
|
||||||
|
|
||||||
|
print("Moodle-XML-Datei 'formulas_fraction_addition_quiz.xml' erfolgreich erstellt.")
|
@ -0,0 +1,238 @@
|
|||||||
|
import random
|
||||||
|
from math import gcd
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
|
def lcm(a, b):
|
||||||
|
"""Berechnet das kleinste gemeinsame Vielfache."""
|
||||||
|
return abs(a * b) // gcd(a, b)
|
||||||
|
|
||||||
|
def create_formula_question(numerator1, denominator1, numerator2, denominator2, n):
|
||||||
|
"""Erzeugt eine Frage im Format 'Formulas'."""
|
||||||
|
# GCD und das kleinste gemeinsame Vielfache für die Denominator
|
||||||
|
common_denominator = lcm(denominator1, denominator2)
|
||||||
|
new_numerator = (numerator1 * (common_denominator // denominator1)) - (numerator2 * (common_denominator // denominator2))
|
||||||
|
gcd_result = gcd(new_numerator, common_denominator)
|
||||||
|
if gcd_result > 1:
|
||||||
|
print("kürzbar")
|
||||||
|
shortable = True
|
||||||
|
shortened_numerator = new_numerator // gcd_result
|
||||||
|
shortened_denominator = common_denominator // gcd_result
|
||||||
|
else:
|
||||||
|
shortable = False
|
||||||
|
|
||||||
|
question = ET.Element('question', attrib={'type': 'formulas'})
|
||||||
|
|
||||||
|
name_elem = ET.SubElement(question, 'name')
|
||||||
|
text_elem = ET.SubElement(name_elem, 'text')
|
||||||
|
text_elem.text = 'Subtraktion von 2 ungleichnamigen Brüchen {} E'.format(n)
|
||||||
|
|
||||||
|
questiontext_elem = ET.SubElement(question, 'questiontext', attrib={'format': 'html'})
|
||||||
|
text_elem = ET.SubElement(questiontext_elem, 'text')
|
||||||
|
if shortable:
|
||||||
|
text_elem.text = '''<![CDATA[ <p>Subtrahiere die Brüche und kürze das Ergebnis so weit wie möglich.</p>
|
||||||
|
<p>{#A} </p> ]]> '''
|
||||||
|
else:
|
||||||
|
text_elem.text = '''<![CDATA[ <p>Subtrahiere die beiden Brüche.</p>
|
||||||
|
<p>{#A} </p> ]]> '''
|
||||||
|
|
||||||
|
# Allgemeines Feedback
|
||||||
|
generalfeedback_elem = ET.SubElement(question, 'generalfeedback', attrib={'format': 'html'})
|
||||||
|
text_elem = ET.SubElement(generalfeedback_elem, 'text')
|
||||||
|
text_elem.text = ' '
|
||||||
|
|
||||||
|
# Grundlegende Bewertungsinformationen
|
||||||
|
ET.SubElement(question, 'defaultgrade').text = '1.0000000'
|
||||||
|
ET.SubElement(question, 'penalty').text = '0.3333333'
|
||||||
|
ET.SubElement(question, 'hidden').text = '0'
|
||||||
|
ET.SubElement(question, 'idnumber').text = ' '
|
||||||
|
|
||||||
|
# Feedback für korrekte und inkorrekte Antworten
|
||||||
|
correctfeedback_elem = ET.SubElement(question, 'correctfeedback', attrib={'format': 'html'})
|
||||||
|
text_elem = ET.SubElement(correctfeedback_elem, 'text')
|
||||||
|
text_elem.text = '''<![CDATA[ <p>Die Antwort ist richtig.</p> ]]> '''
|
||||||
|
|
||||||
|
partiallycorrectfeedback_elem = ET.SubElement(question, 'partiallycorrectfeedback', attrib={'format': 'html'})
|
||||||
|
text_elem = ET.SubElement(partiallycorrectfeedback_elem, 'text')
|
||||||
|
text_elem.text = '''<![CDATA[ <p>Die Antwort ist teilweise richtig.</p> ]]> '''
|
||||||
|
|
||||||
|
incorrectfeedback_elem = ET.SubElement(question, 'incorrectfeedback', attrib={'format': 'html'})
|
||||||
|
text_elem = ET.SubElement(incorrectfeedback_elem, 'text')
|
||||||
|
text_elem.text = '''<![CDATA[ <p>Die Antwort ist falsch.</p> ]]>'''
|
||||||
|
|
||||||
|
ET.SubElement(question, 'shownumcorrect')
|
||||||
|
|
||||||
|
varsrandom_elem = ET.SubElement(question, 'varsrandom')
|
||||||
|
text_elem = ET.SubElement(varsrandom_elem, 'text')
|
||||||
|
text_elem.text = f' '
|
||||||
|
|
||||||
|
# Globale Variablen definieren
|
||||||
|
varsglobal_elem = ET.SubElement(question, 'varsglobal')
|
||||||
|
text_elem = ET.SubElement(varsglobal_elem, 'text')
|
||||||
|
text_elem.text = f'n = [{numerator1}, {numerator2}];\n d = [{denominator1}, {denominator2}];'
|
||||||
|
|
||||||
|
answernumbering_elem = ET.SubElement(question, 'answernumbering')
|
||||||
|
text_elem = ET.SubElement(answernumbering_elem, 'text')
|
||||||
|
text_elem.text = 'ABCD'
|
||||||
|
|
||||||
|
# Antworten definieren
|
||||||
|
answers_elem = ET.SubElement(question, 'answers')
|
||||||
|
|
||||||
|
# Indizes für die Antworten
|
||||||
|
partindex_elem = ET.SubElement(answers_elem, 'partindex')
|
||||||
|
ET.SubElement(partindex_elem, 'text').text = '0'
|
||||||
|
|
||||||
|
placeholder_elem = ET.SubElement(answers_elem, 'placeholder')
|
||||||
|
ET.SubElement(placeholder_elem, 'text').text = '#A'
|
||||||
|
|
||||||
|
# Punktzahl auf Teilaufgabe
|
||||||
|
answermark_elem = ET.SubElement(answers_elem, 'answermark')
|
||||||
|
if shortable:
|
||||||
|
ET.SubElement(answermark_elem, 'text').text = '2'
|
||||||
|
else:
|
||||||
|
ET.SubElement(answermark_elem, 'text').text = '1'
|
||||||
|
|
||||||
|
answertype_elem = ET.SubElement(answers_elem, 'answertype')
|
||||||
|
ET.SubElement(answertype_elem, 'text').text = '0'
|
||||||
|
|
||||||
|
numbox_elem = ET.SubElement(answers_elem, 'numbox')
|
||||||
|
ET.SubElement(numbox_elem, 'text').text = '2'
|
||||||
|
|
||||||
|
# Berechnungsvariablen
|
||||||
|
vars1_elem = ET.SubElement(answers_elem, 'vars1')
|
||||||
|
if shortable:
|
||||||
|
vars1_elem_text = "<![CDATA[ g = gcd(d[0],d[1]);\n cd = abs(d[0] * d[1]) / g;\n e = [cd / d[0], cd / d[1]];\n nums = [n[0]*e[0], n[1]*e[1]];\n thesumnum = nums[0] - nums[1];\n gcdres = gcd(thesumnum,cd);\n snum = thesumnum / gcdres;\n sdenom = cd / gcdres;]]>"
|
||||||
|
else:
|
||||||
|
vars1_elem_text = "<![CDATA[ g = gcd(d[0],d[1]);\ncd = abs(d[0] * d[1]) / g;\ne = [cd / d[0], cd / d[1]];\nnums = [n[0]*e[0], n[1]*e[1]];\nthesumnum = nums[0] - nums[1];]]>"
|
||||||
|
ET.SubElement(vars1_elem, 'text').text = vars1_elem_text
|
||||||
|
|
||||||
|
# Antwort
|
||||||
|
answer_elem = ET.SubElement(answers_elem, 'answer')
|
||||||
|
if shortable:
|
||||||
|
answer_text = '[thesumnum, cd, snum, sdenom]'
|
||||||
|
else:
|
||||||
|
answer_text = '[thesumnum, cd]'
|
||||||
|
ET.SubElement(answer_elem, 'text').text = answer_text
|
||||||
|
|
||||||
|
answernotunique_elem = ET.SubElement(answers_elem, 'answernotunique')
|
||||||
|
ET.SubElement(answernotunique_elem, 'text').text = '0'
|
||||||
|
|
||||||
|
vars2_elem = ET.SubElement(answers_elem, 'vars2')
|
||||||
|
if shortable:
|
||||||
|
vars2_elem_text = "<![CDATA[ ga = _0 == thesumnum && _1 == cd;\n gb = (_0 / _1) == (thesumnum / cd);\n gsa = _2 == snum && _3 == sdenom;\n gsb = (_2 / _3) == (snum / sdenom); ]]>"
|
||||||
|
else:
|
||||||
|
vars2_elem_text = "<![CDATA[ ga = _0 == thesumnum && _1 == cd; gb = (_0 / _1) == (thesumnum / cd); ]]>"
|
||||||
|
ET.SubElement(vars2_elem, 'text').text = vars2_elem_text
|
||||||
|
|
||||||
|
correctness_elem = ET.SubElement(answers_elem, 'correctness')
|
||||||
|
if shortable:
|
||||||
|
ET.SubElement(correctness_elem, 'text').text = '0.25*ga + 0.25*gb + 0.25*gsa + 0.25*gsb'
|
||||||
|
else:
|
||||||
|
ET.SubElement(correctness_elem, 'text').text = '0.5*ga + 0.5*gb'
|
||||||
|
|
||||||
|
unitpenalty_elem = ET.SubElement(answers_elem, 'unitpenalty')
|
||||||
|
ET.SubElement(unitpenalty_elem, 'text').text = '1'
|
||||||
|
|
||||||
|
postunit_elem = ET.SubElement(answers_elem, 'postunit')
|
||||||
|
ET.SubElement(postunit_elem, 'text').text = ' '
|
||||||
|
|
||||||
|
ruleid_elem = ET.SubElement(answers_elem, 'ruleid')
|
||||||
|
ET.SubElement(ruleid_elem, 'text').text = '1'
|
||||||
|
|
||||||
|
otherrule_elem = ET.SubElement(answers_elem, 'otherrule')
|
||||||
|
ET.SubElement(otherrule_elem, 'text').text = ' '
|
||||||
|
|
||||||
|
# Unterfragen-Text
|
||||||
|
subqtext_elem = ET.SubElement(answers_elem, 'subqtext', attrib={'format': 'html'})
|
||||||
|
if shortable:
|
||||||
|
sub_question_text = '''<![CDATA[ <p>Berechne:</p> <p>\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} - \\frac{{n[1]}}{{d[1]}} =\\) {_0} / {_1} = gekürzt: {_2} / {_3}</p> ]]> '''
|
||||||
|
else:
|
||||||
|
sub_question_text = '''<![CDATA[ <p>Berechne:</p> <p>\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} - \\frac{{n[1]}}{{d[1]}} =\\) {_0} / {_1}</p> ]]> '''
|
||||||
|
ET.SubElement(subqtext_elem, 'text').text = sub_question_text
|
||||||
|
|
||||||
|
# Lösungshinweis
|
||||||
|
feedback_elem = ET.SubElement(answers_elem, 'feedback', attrib={'format': 'html'})
|
||||||
|
if shortable:
|
||||||
|
feedback_text = '''<![CDATA[ <h4>Lösungshinweis</h4>
|
||||||
|
<p>Die korrekte Lösung ist:</p>
|
||||||
|
<p>\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} - \\frac{{n[1]}}{{d[1]}} = \\frac{{nums[0]}}{{cd}} - \\frac{{nums[1]}}{{cd}} = \\frac{{thesumnum}}{{cd}} = \\frac{{snum}}{{sdenom}} \\) </p> ]]>'''
|
||||||
|
else:
|
||||||
|
feedback_text = '''<![CDATA[ <h4>Lösungshinweis</h4>
|
||||||
|
<p>Die korrekte Lösung ist:</p>
|
||||||
|
<p>\\(\\Large \\displaystyle \\frac{{n[0]}}{{d[0]}} - \\frac{{n[1]}}{{d[1]}} = \\frac{{nums[0]}}{{cd}} - \\frac{{nums[1]}}{{cd}} = \\frac{{thesumnum}}{{cd}} \\) </p> ]]>'''
|
||||||
|
ET.SubElement(feedback_elem, 'text').text = feedback_text
|
||||||
|
|
||||||
|
# correctfeedback
|
||||||
|
|
||||||
|
correctfeedback_elem = ET.SubElement(answers_elem, 'correctfeedback', attrib={'format': 'html'})
|
||||||
|
correctfeedback_text = '''<![CDATA[ <p>Richtig!</p>]]>'''
|
||||||
|
ET.SubElement(correctfeedback_elem, 'text').text = correctfeedback_text
|
||||||
|
|
||||||
|
# partially correct feedback
|
||||||
|
|
||||||
|
pcorrectfeedback_elem = ET.SubElement(answers_elem, 'partiallycorrectfeedback', attrib={'format': 'html'})
|
||||||
|
pcorrectfeedback_text = '''<![CDATA[ <p>Teilweise richtig.</p>]]>'''
|
||||||
|
ET.SubElement(pcorrectfeedback_elem, 'text').text = pcorrectfeedback_text
|
||||||
|
|
||||||
|
# incorrect feedback
|
||||||
|
incorrectfeedback_elem = ET.SubElement(answers_elem, 'incorrectfeedback', attrib={'format': 'html'})
|
||||||
|
incorrectfeedback_text = '''<![CDATA[ <p>Leider nicht richtig.</p>]]>'''
|
||||||
|
ET.SubElement(incorrectfeedback_elem, 'text').text = incorrectfeedback_text
|
||||||
|
|
||||||
|
return question
|
||||||
|
|
||||||
|
def generate_questions(num_questions):
|
||||||
|
"""Generiert Aufgaben für die Addition ungleichnamiger Brüche."""
|
||||||
|
questions = []
|
||||||
|
|
||||||
|
for i in range(num_questions):
|
||||||
|
numerator1 = random.randint(1, 10)
|
||||||
|
denominator1 = random.randint(2, 10)
|
||||||
|
numerator2 = random.randint(1, 10)
|
||||||
|
denominator2 = random.randint(2, 10)
|
||||||
|
|
||||||
|
# Sicherstellen, dass die Nenner unterschiedlich sind
|
||||||
|
while denominator1 == denominator2:
|
||||||
|
denominator2 = random.randint(2, 10)
|
||||||
|
|
||||||
|
question = create_formula_question(numerator1, denominator1, numerator2, denominator2, i)
|
||||||
|
questions.append(question)
|
||||||
|
|
||||||
|
return questions
|
||||||
|
|
||||||
|
def create_quiz(questions):
|
||||||
|
"""Erzeugt die gesamte Quiz-Struktur."""
|
||||||
|
quiz = ET.Element('quiz')
|
||||||
|
for q in questions:
|
||||||
|
quiz.append(q)
|
||||||
|
return quiz
|
||||||
|
|
||||||
|
def save_to_file(xml_element, filename):
|
||||||
|
"""Speichert das XML-Dokument in einer Datei."""
|
||||||
|
tree = ET.ElementTree(xml_element)
|
||||||
|
ET.indent(tree)
|
||||||
|
with open(filename, 'wb') as f:
|
||||||
|
tree.write(f, encoding='utf-8', xml_declaration=True)
|
||||||
|
|
||||||
|
def ersetze_vars2(xml_file):
|
||||||
|
# XML-Datei lesen
|
||||||
|
with open(xml_file, 'r') as f:
|
||||||
|
text = f.read()
|
||||||
|
|
||||||
|
text = text.replace("&","&")
|
||||||
|
text = text.replace("<","<")
|
||||||
|
text = text.replace(">",">")
|
||||||
|
|
||||||
|
with open(xml_file, 'w') as f:
|
||||||
|
f.write(text)
|
||||||
|
|
||||||
|
|
||||||
|
# Hauptprogramm
|
||||||
|
if __name__ == "__main__":
|
||||||
|
num_questions = 20 # Anzahl der zu generierenden Aufgaben
|
||||||
|
questions = generate_questions(num_questions)
|
||||||
|
quiz = create_quiz(questions)
|
||||||
|
|
||||||
|
save_to_file(quiz, 'formulas_fraction_addition_quiz.xml')
|
||||||
|
ersetze_vars2('formulas_fraction_addition_quiz.xml')
|
||||||
|
|
||||||
|
print("Moodle-XML-Datei 'formulas_fraction_addition_quiz.xml' erfolgreich erstellt.")
|
162
aufgabengenerator_formulas_fraction_new.py
Normal file
162
aufgabengenerator_formulas_fraction_new.py
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
import random
|
||||||
|
from math import gcd, lcm
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
from collections import Counter
|
||||||
|
|
||||||
|
# Konstanten
|
||||||
|
# Anzahl der zu generierenden Fragen.
|
||||||
|
NUM_QUESTIONS = 1
|
||||||
|
# Algebraische Struktur der Aufgaben
|
||||||
|
STRUCTURE = "-(+)"
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
# Platzhalter hinzufügen
|
||||||
|
|
||||||
|
# Anzahl der benötigten Brüche
|
||||||
|
NUM_FRACTIONS = 1 + STRUCTURE.count("+") + STRUCTURE.count("+") + STRUCTURE.count("*") + STRUCTURE.count("/")
|
||||||
|
# Größter Zähler
|
||||||
|
MAX_NUMERATOR = 20
|
||||||
|
# Größter Nenner
|
||||||
|
MAX_DENOMINATOR = 20
|
||||||
|
# Größter erlaubter gemeinsamer Nenner
|
||||||
|
MAX_COMMON_DENOMINATOR = 100
|
||||||
|
# Dateiname für Ausgabe
|
||||||
|
FILENAME = 'formulas_new_quiz.xml'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def create_formula_question(n):
|
||||||
|
numerators = []
|
||||||
|
denominators = []
|
||||||
|
for i in range(NUM_FRACTIONS):
|
||||||
|
n = random.randint(1, MAX_NUMERATOR)
|
||||||
|
d = random.randint(2, MAX_DENOMINATOR)
|
||||||
|
numerators.append(n)
|
||||||
|
denominators.append(d)
|
||||||
|
|
||||||
|
# Sicherstellen, dass die Nenner unterschiedlich sind
|
||||||
|
same_denominators = [k for k,v in Counter(denominators).items() if v>1]
|
||||||
|
while len(same_denominators) > 1:
|
||||||
|
new_denom = random.randint(2, MAX_DENOMINATOR)
|
||||||
|
denominators.replace(same_denominators[0], new_denom)
|
||||||
|
same_denominators = [k for k,v in Counter(denominators).items() if v>1]
|
||||||
|
# [DEBUG]
|
||||||
|
print(numerators)
|
||||||
|
print(denominators)
|
||||||
|
# [DEBUG]
|
||||||
|
*denoms_integers, = denominators
|
||||||
|
common_denominator = lcm(*denoms_integers)
|
||||||
|
|
||||||
|
fractions = []
|
||||||
|
for i in range(NUM_FRACTIONS):
|
||||||
|
fraction = {"n": numerators[i], "d": denominators[i]}
|
||||||
|
fractions.append(fraction)
|
||||||
|
# [DEBUG]
|
||||||
|
print(fractions)
|
||||||
|
# [DEBUG]
|
||||||
|
|
||||||
|
cd = common_denominator
|
||||||
|
expanded_numerators = [frac["n"] * cd // frac["d"] for frac in fractions]
|
||||||
|
|
||||||
|
expanded_fractions = []
|
||||||
|
for i in range(NUM_FRACTIONS):
|
||||||
|
fraction = {"n": expanded_numerators[i], "d": cd}
|
||||||
|
expanded_fractions.append(fraction)
|
||||||
|
# [DEBUG]
|
||||||
|
print(expanded_fractions)
|
||||||
|
# [DEBUG]
|
||||||
|
|
||||||
|
eval_string = f"{expanded_numerators[0]}"
|
||||||
|
cnt_next_fraction = 1
|
||||||
|
for c in STRUCTURE:
|
||||||
|
if c == "(" or c ==")":
|
||||||
|
eval_string += c
|
||||||
|
elif c == "+" or c == "-" or c == "*" or c == "/":
|
||||||
|
eval_string += c
|
||||||
|
eval_string += f"{expanded_numerators[cnt_next_fraction]}"
|
||||||
|
cnt_next_fraction += 1
|
||||||
|
|
||||||
|
# [DEBUG]
|
||||||
|
print(eval_string)
|
||||||
|
# [DEBUG]
|
||||||
|
result_numerator = eval(eval_string)
|
||||||
|
|
||||||
|
question = ET.Element('question', attrib={'type': 'formulas'})
|
||||||
|
|
||||||
|
return question
|
||||||
|
|
||||||
|
|
||||||
|
def generate_questions(num_questions):
|
||||||
|
"""
|
||||||
|
Generiert eine Liste von Aufgaben.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
num_questions (int): Die Anzahl der zu generierenden Fragen.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list: Eine Liste von Frage-Elementen.
|
||||||
|
"""
|
||||||
|
questions = []
|
||||||
|
for i in range(num_questions):
|
||||||
|
# Hier können Sie die Funktionsdefinition für die Erzeugung einer Aufgabe hinzufügen
|
||||||
|
questions.append(create_formula_question(i))
|
||||||
|
|
||||||
|
return questions
|
||||||
|
|
||||||
|
def create_quiz(questions):
|
||||||
|
"""
|
||||||
|
Erstellt das gesamte Quiz-Element.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
questions (list): Eine Liste von Frage-Elementen.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Element: Das gesamte Quiz -Element.
|
||||||
|
"""
|
||||||
|
quiz = ET.Element('quiz')
|
||||||
|
for q in questions:
|
||||||
|
quiz.append(q)
|
||||||
|
return quiz
|
||||||
|
|
||||||
|
def save_to_file(xml_element, filename):
|
||||||
|
"""
|
||||||
|
Speichert das XML-Dokument in eine Datei.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
xml_element (Element): Das XML-Element, zu speichern.
|
||||||
|
filename (str): Der Name der Zieldatei.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
None
|
||||||
|
"""
|
||||||
|
tree = ET.ElementTree(xml_element)
|
||||||
|
with open(filename, 'wb') as f:
|
||||||
|
tree.write(f, encoding='utf_8', xml_declaration=True)
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
|
def replace_vars2(xml_file):
|
||||||
|
# XML-Datei lesen
|
||||||
|
with open(xml_file, 'r') as f:
|
||||||
|
text = f.read()
|
||||||
|
|
||||||
|
text = text.replace("&","&")
|
||||||
|
text = text.replace("<","<")
|
||||||
|
text = text.replace(">",">")
|
||||||
|
|
||||||
|
with open(xml_file, 'w') as f:
|
||||||
|
f.write(text)
|
||||||
|
|
||||||
|
|
||||||
|
# Hauptprogramm
|
||||||
|
if __name__ == "__main__":
|
||||||
|
|
||||||
|
questions = generate_questions(NUM_QUESTIONS)
|
||||||
|
quiz = create_quiz(questions)
|
||||||
|
|
||||||
|
save_to_file(quiz, FILENAME)
|
||||||
|
replace_vars2(FILENAME)
|
||||||
|
|
||||||
|
print("Moodle-XMLDatei erfolgreich erstellt.")
|
64
expression_parsing.py
Normal file
64
expression_parsing.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
import re
|
||||||
|
import random
|
||||||
|
import operator
|
||||||
|
|
||||||
|
# Define operators and their corresponding functions
|
||||||
|
ops = {
|
||||||
|
'+': operator.add,
|
||||||
|
'-': operator.sub,
|
||||||
|
'*': operator.mul,
|
||||||
|
'/': operator.truediv
|
||||||
|
}
|
||||||
|
|
||||||
|
def calculate(expression, num=1):
|
||||||
|
"""Calculate the result of the expression using n[0], n[1], ..."""
|
||||||
|
numbers = [random.randint(1, 10) for _ in range(num)]
|
||||||
|
print(numbers)
|
||||||
|
# Replace placeholders with actual number values
|
||||||
|
for i, num in enumerate(numbers):
|
||||||
|
placeholder = f'n{i}'
|
||||||
|
expression = re.sub(rf'\{placeholder}\s*([+-/*])', rf'{num} \1', expression)
|
||||||
|
expression = re.sub(rf'({placeholder})\s*', rf'{num}', expression)
|
||||||
|
|
||||||
|
print(expression)
|
||||||
|
# Evaluate the result
|
||||||
|
return eval(expression)
|
||||||
|
|
||||||
|
def parse_expression(expression):
|
||||||
|
"""Parse an algebraic expression and determine the required number of numbers"""
|
||||||
|
op_count = 0
|
||||||
|
|
||||||
|
# Count operators in parentheses
|
||||||
|
paren_count = 1
|
||||||
|
max_depth = 0
|
||||||
|
|
||||||
|
for i, char in enumerate(expression):
|
||||||
|
if char == '(':
|
||||||
|
paren_count += 1
|
||||||
|
elif char == ')':
|
||||||
|
paren_count -= 1
|
||||||
|
|
||||||
|
# Update max depth when a closed parenthesis is encountered
|
||||||
|
max_depth = max(max_depth, paren_count)
|
||||||
|
|
||||||
|
if char in ops.keys():
|
||||||
|
op_count += 1
|
||||||
|
|
||||||
|
return max_depth + op_count
|
||||||
|
|
||||||
|
def main():
|
||||||
|
expression = input("Enter an algebraic structure (e.g., -(+)): ")
|
||||||
|
|
||||||
|
# Handle the empty string case by providing a default expression
|
||||||
|
if not expression:
|
||||||
|
expression = 'n0-(n1+n2)'
|
||||||
|
|
||||||
|
num_needed = parse_expression(expression)
|
||||||
|
|
||||||
|
result = calculate(expression, num_needed)
|
||||||
|
|
||||||
|
print(f"Generated calculation: {expression}")
|
||||||
|
print(f"Result: {result}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
46
expression_parsing_2_ollama.py
Normal file
46
expression_parsing_2_ollama.py
Normal file
@ -0,0 +1,46 @@
|
|||||||
|
import re
|
||||||
|
import random
|
||||||
|
|
||||||
|
def calculate(expression, num=1):
|
||||||
|
"""Calculate the result of the expression using n[0], n[1], ..."""
|
||||||
|
|
||||||
|
# Generate random numbers and replace placeholders with them in the expression
|
||||||
|
numbers = [random.randint(1, 10) for _ in range(num)]
|
||||||
|
new_expression = expression
|
||||||
|
|
||||||
|
for i, num in enumerate(numbers):
|
||||||
|
placeholder = f'n[{i}]'
|
||||||
|
new_expression = re.sub(rf'\b{n[i]}(\W|$)', str(num), new_expression)
|
||||||
|
|
||||||
|
# Evaluate the result
|
||||||
|
return eval(new_expression)
|
||||||
|
|
||||||
|
def parse_expression(expression):
|
||||||
|
"""Parse an algebraic expression and determine the required number of numbers"""
|
||||||
|
|
||||||
|
count_n = 0
|
||||||
|
|
||||||
|
i = 0
|
||||||
|
for char in expression:
|
||||||
|
if char == 'n' and (i+1 < len(expression) and expression[i+1] == '['):
|
||||||
|
count_n += 1
|
||||||
|
i += 1
|
||||||
|
|
||||||
|
return count_n
|
||||||
|
|
||||||
|
def main():
|
||||||
|
expression = input("Enter an algebraic structure (e.g., -(+)): ")
|
||||||
|
|
||||||
|
# Handle the empty string case by providing a default expression
|
||||||
|
if not expression:
|
||||||
|
expression = '-(+)'
|
||||||
|
|
||||||
|
num_needed = parse_expression(expression)
|
||||||
|
|
||||||
|
result = calculate(expression, num_needed)
|
||||||
|
|
||||||
|
print(f"Generated calculation: {expression}")
|
||||||
|
print(f"Result: {result}")
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
Loading…
Reference in New Issue
Block a user