Generator für das Addieren/Subtrahieren dreier ungleichnamiger Brüche
This commit is contained in:
		
							
								
								
									
										168
									
								
								aufgabengenerator_brueche_addieren_ungleichnamig_v6.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								aufgabengenerator_brueche_addieren_ungleichnamig_v6.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,168 @@ | ||||
| import xml.etree.ElementTree as ET | ||||
| import random | ||||
| from math import gcd | ||||
|  | ||||
| def create_cloze_question(name, questiontext, correct_answers, wrong_answers, feedback, tags): | ||||
|     question = ET.Element('question', attrib={'type': 'cloze'}) | ||||
|  | ||||
|     name_elem = ET.SubElement(question, 'name') | ||||
|     text_elem = ET.SubElement(name_elem, 'text') | ||||
|     text_elem.text = name | ||||
|  | ||||
|     questiontext_elem = ET.SubElement(question, 'questiontext', attrib={'format': 'html'}) | ||||
|     text_elem = ET.SubElement(questiontext_elem, 'text') | ||||
|  | ||||
|     # Erstelle die Tabelle für die Lücken | ||||
|     cloze_text = "<table style='border-collapse: collapse;'>" | ||||
|     cloze_text += "<tr>" | ||||
|     cloze_text += f"<td style='border-bottom: 1px solid black; padding: 5px;'>Zähler: {{1:SHORTANSWER:={correct_answers[0]}~%0%{wrong_answers[0][0]}#{wrong_answers[0][1]}}}</td>" | ||||
|     cloze_text += "</tr>" | ||||
|     cloze_text += "<tr>" | ||||
|     cloze_text += f"<td style='padding: 5px;'>Nenner: {{1:SHORTANSWER:={correct_answers[1]}~%0%{wrong_answers[1][0]}#{wrong_answers[1][1]}}}</td>" | ||||
|     cloze_text += "</tr>" | ||||
|  | ||||
|     # Prüfe, ob der Bruch gekürzt werden kann | ||||
|     if gcd(correct_answers[0], correct_answers[1]) > 1: | ||||
|         common_divisor = gcd(correct_answers[0], correct_answers[1]) | ||||
|         reduced_numerator = correct_answers[0] // common_divisor | ||||
|         reduced_denominator = correct_answers[1] // common_divisor | ||||
|          | ||||
|         cloze_text += "<tr>" | ||||
|         cloze_text += f"<td style='border-bottom: 1px solid black; padding: 5px;'>Gekürzter Zähler: {{1:SHORTANSWER:={reduced_numerator}~%0%{wrong_answers[2][0]}#{wrong_answers[2][1]}}}</td>" | ||||
|         cloze_text += "</tr>" | ||||
|         cloze_text += "<tr>" | ||||
|         cloze_text += f"<td style='padding: 5px;'>Gekürzter Nenner: {{1:SHORTANSWER:={reduced_denominator}~%0%{wrong_answers[3][0]}#{wrong_answers[3][1]}}}</td>" | ||||
|         cloze_text += "</tr>" | ||||
|  | ||||
|     cloze_text += "</table>" | ||||
|  | ||||
|     # Füge die Frage hinzu | ||||
|     text_elem.text = questiontext + " " + cloze_text | ||||
|  | ||||
|     generalfeedback_elem = ET.SubElement(question, 'generalfeedback', attrib={'format': 'html'}) | ||||
|     text_elem = ET.SubElement(generalfeedback_elem, 'text') | ||||
|      | ||||
|     # Musterlösung im LaTeX-Format | ||||
|     if gcd(correct_answers[0], correct_answers[1]) > 1: | ||||
|         solution = f"Die Musterlösung ist: \\( \\Large \\displaystyle \\frac{{{reduced_numerator}}}{{{reduced_denominator}}} \\)." | ||||
|     else: | ||||
|         solution = f"Die Musterlösung ist: \\( \\Large \\displaystyle \\frac{{{correct_answers[0]}}}{{{correct_answers[1]}}} \\)."  | ||||
|  | ||||
|     text_elem.text = solution | ||||
|  | ||||
|     defaultgrade_elem = ET.SubElement(question, 'defaultgrade') | ||||
|     defaultgrade_elem.text = '1.0000000' | ||||
|  | ||||
|     penalty_elem = ET.SubElement(question, 'penalty') | ||||
|     penalty_elem.text = '0.3333333' | ||||
|  | ||||
|     hidden_elem = ET.SubElement(question, 'hidden') | ||||
|     hidden_elem.text = '0' | ||||
|  | ||||
|     # Tags hinzufügen | ||||
|     tags_elem = ET.SubElement(question, 'tags') | ||||
|     for tag in tags: | ||||
|         tag_elem = ET.SubElement(tags_elem, 'tag') | ||||
|         text_elem = ET.SubElement(tag_elem, 'text') | ||||
|         text_elem.text = tag | ||||
|  | ||||
|     return question | ||||
|  | ||||
| def lcm(a, b): | ||||
|     return abs(a * b) // gcd(a, b) | ||||
|  | ||||
| def create_quiz(questions): | ||||
|     quiz = ET.Element('quiz') | ||||
|     for q in questions: | ||||
|         quiz.append(q) | ||||
|     return quiz | ||||
|  | ||||
| def save_to_file(xml_element, filename): | ||||
|     tree = ET.ElementTree(xml_element) | ||||
|     with open(filename, 'wb') as f: | ||||
|         tree.write(f, encoding='utf-8', xml_declaration=True) | ||||
|  | ||||
| questions = [] | ||||
|  | ||||
| # Generiere n Aufgaben zur Addition und Subtraktion von Brüchen mit verschiedenen Nennern | ||||
| n = 20 | ||||
| for i in range(1, (n+1)): | ||||
|     # Zähler und Nenner generieren | ||||
|     numerator1 = random.randint(1, 20)  # Zähler zwischen 1 und 20 | ||||
|     numerator2 = random.randint(1, 20)  # Zähler zwischen 1 und 20 | ||||
|     numerator3 = random.randint(1, 20)  # Zähler zwischen 1 und 20 | ||||
|     denominator1 = random.randint(2, 10)  # Nenner zwischen 2 und 10 | ||||
|     denominator2 = random.randint(2, 10)  # Nenner zwischen 2 und 10 | ||||
|     denominator3 = random.randint(2, 10)  # Nenner zwischen 2 und 10 | ||||
|  | ||||
|     # Berechne den gemeinsamen Nenner, der kleiner als 30 sein muss | ||||
|     common_denominator = lcm(denominator1, lcm(denominator2, denominator3)) | ||||
|     while common_denominator >= 30: | ||||
|         denominator1 = random.randint(2, 10) | ||||
|         denominator2 = random.randint(2, 10) | ||||
|         denominator3 = random.randint(2, 10) | ||||
|         common_denominator = lcm(denominator1, lcm(denominator2, denominator3)) | ||||
|  | ||||
|     # Berechne die äquivalenten Zähler | ||||
|     equivalent_numerator1 = numerator1 * (common_denominator // denominator1) | ||||
|     equivalent_numerator2 = numerator2 * (common_denominator // denominator2) | ||||
|     equivalent_numerator3 = numerator3 * (common_denominator // denominator3) | ||||
|  | ||||
|     operations = random.choice(["+ +", "+ -", "- +", "- -"])  # Zufällige Operationen | ||||
|     if operations == "+ +": | ||||
|         result_numerator = equivalent_numerator1 + (equivalent_numerator2 + equivalent_numerator3) | ||||
|     elif operations == "+ -": | ||||
|         result_numerator = equivalent_numerator1 + (equivalent_numerator2 - equivalent_numerator3) | ||||
|     elif operations == "- +": | ||||
|         result_numerator = equivalent_numerator1 - (equivalent_numerator2 + equivalent_numerator3) | ||||
|     else: | ||||
|         result_numerator = equivalent_numerator1 - (equivalent_numerator2 - equivalent_numerator3) | ||||
|  | ||||
|     # Prüfe, ob der Bruch gekürzt werden kann | ||||
|     needs_reduction = gcd(result_numerator, common_denominator) > 1 | ||||
|  | ||||
|     # Frage im LaTeX-Format | ||||
|     questiontext = (f"<p>Berechne und kürze das Ergebnis, wenn möglich:</p> " | ||||
|                     f"<p> \\( \\Large \\displaystyle \\frac{{{numerator1}}}{{{denominator1}}} {operations[0]} " | ||||
|                     f"\\left(\\frac{{{numerator2}}}{{{denominator2}}} {operations[2]} \\frac{{{numerator3}}}{{{denominator3}}}\\right) = \\) </p>") | ||||
|  | ||||
|     # Antworten | ||||
|     correct_answers = [result_numerator, common_denominator] | ||||
|     if needs_reduction: | ||||
|         common_divisor = gcd(result_numerator, common_denominator) | ||||
|         reduced_numerator = result_numerator // common_divisor | ||||
|         reduced_denominator = common_denominator // common_divisor | ||||
|          | ||||
|         correct_answers.extend([reduced_numerator, reduced_denominator])  # Füge gekürzte Antworten hinzu | ||||
|          | ||||
|         wrong_answers = [ | ||||
|             (result_numerator + random.randint(1, 5), "Dieser Zähler ist zu hoch."),  # Falscher Zähler | ||||
|             (result_numerator - random.randint(1, 5), "Dieser Zähler ist zu niedrig."),  # Falscher Zähler | ||||
|             (reduced_numerator + random.randint(1, 3), "Dieser gekürzte Zähler ist nicht korrekt."),  # Falscher gekürzter Zähler | ||||
|             (reduced_denominator - random.randint(1, 3), "Dieser gekürzte Nenner ist nicht korrekt.")  # Falscher gekürzter Nenner | ||||
|         ] | ||||
|     else: | ||||
|         wrong_answers = [ | ||||
|             (result_numerator + random.randint(1, 5), "Dieser Zähler ist zu hoch."),  # Falscher Zähler | ||||
|             (result_numerator - random.randint(1, 5), "Dieser Zähler ist zu niedrig.")  # Falscher Zähler | ||||
|         ] | ||||
|  | ||||
|     feedback = "Richtig! Die Lösung ist korrekt." | ||||
|  | ||||
|     # Frage erstellen und hinzufügen | ||||
|     questions.append(create_cloze_question( | ||||
|         f"Addition/Subtraktion von 3 ungleichnamigen Brüchen {i}", | ||||
|         questiontext, | ||||
|         correct_answers, | ||||
|         wrong_answers, | ||||
|         feedback, | ||||
|         ["Mathematik", "Brüche", "Addition", "Subtraktion"] | ||||
|     )) | ||||
|  | ||||
| # Erstelle das Quiz | ||||
| quiz = create_quiz(questions) | ||||
|  | ||||
| # Speichere die XML-Datei | ||||
| save_to_file(quiz, 'cloze_fraction_addition_subtraction_quiz.xml') | ||||
|  | ||||
| print("Moodle-XML-Datei 'cloze_fraction_addition_subtraction_quiz.xml' erfolgreich erstellt.") | ||||
		Reference in New Issue
	
	Block a user