Adding and Subtracting Mixed Numbers Using Visual Models

Adding and Subtracting Mixed Numbers Using Visual Models
Loading the math board and drawing, please wait…
2023-09-06 09:27
This interactive GeoGebra activity demonstrates the process of adding and subtracting mixed numbers using visual fraction bar models. It covers core concepts such as combining whole numbers and fractions, finding common denominators, and simplifying results. The construction uses commands like RandomUniform, Take, Element, If, Remove, Min, Max, Sequence, Polygon, Flatten, Vector, Zip, Join, Numerator, Denominator, Mod, Corner, PointToPixels, and Translate to generate random problems, build visual fraction blocks, and check answers. Suitable for grades 4-5, it helps students understand fraction operations through concrete pictorial representations and supports classroom instruction or independent practice.

GeoGebra Commands & Parameters

  1. RandomUniform(0, 0.99, 200) → allRandomSeeds, {0.8852668807984533, 0.4896175041875582, 0.9004505281500474, 0.8138983790191049, 0.8743290129216643, 0.280047258804096, 0.688947078158236, 0.7314437083587516, 0.33015050254879785, 0.4374839454951024, 0.7865017680308626, 0.948456827350805, 0.9523338719634472, 0.8879031638956442, 0.326564356269377, 0.20191105737721926, 0.544155404387917, 0.37035095429884735, 0.9295919961041543, 0.26126065668314585, 0.2928170492551908, 0.43398286051044127, 0.1632876973859459, 0.6597332013015768, 0.5644923376034315, 0.28100317256816376, 0.7459109743954649, 0.4325136115536207, 0.645241401653553, 0.4807366049418677, 0.31820311969620046, 0.1336686650495682, 0.8055400541858188, 0.725407542104399, 0.7753592964670433, 0.946971717715064, 0.41877564181187255, 0.156980252385173, 0.8573045987205175, 0.5375352873303335, 0.55260672870276, 0.25663145516769814, 0.023295934101422333, 0.2813445819629811, 0.016566821355951007, 0.5440797083462516, 0.06557215775415652, 0.318408332547996, 0.4797115666653138, 0.04308882092974475, 0.8564136883888528, 0.16230382463626608, 0.068466770780014, 0.36199114272649835, 0.5535490430463219, 0.8043905977128843, 0.3571291887091137, 0.7940439125663369, 0.7903596154505329, 0.5549036764889184, 0.671704770058851, 0.8718357932151388, 0.6797846206030655, 0.1755094225087554, 0.18193857223359952, 0.1328024651837247, 0.2542175744783526, 0.01871812622383158, 0.09649849162578111, 0.5391898995578216, 0.4980109628830728, 0.708795307822319, 0.3423191176942597, 0.7855200147859026, 0.22447035925505318, 0.4764994512322494, 0.5710955856014176, 0.8397687354782861, 0.20541959262415144, 0.7460965714385699, 0.6338357465841632, 0.6010568230835057, 0.4985579781256158, 0.8376629087619224, 0.298237912042506, 0.2866849331463792, 0.005905990641803135, 0.5006850191229956, 0.1734552663763915, 0.014809326718981294, 0.715650185302284, 0.7964019406127016, 0.602540738463283, 0.5359604726533497, 0.6496489913083535, 0.5762071851874363, 0.5045364921735608, 0.44694766961485544, 0.5397494965506686, 0.7317390742667167, 0.9257789737833055, 0.16447225847292204, 0.19789211934840947, 0.0390357445808529, 0.573535762873985, 0.04298920538724174, 0.6177426667460697, 0.7143167039021513, 0.17457280858672006, 0.4720106774973076, 0.6292941465566924, 0.14257605628588838, 0.22667054075468812, 0.34213718185589415, 0.23251719427082926, 0.8822328235566445, 0.40246475171009877, 0.3866312155242223, 0.531716194988782, 0.24958212289126844, 0.41228303469988586, 0.08631500354211522, 0.6887605420749305, 0.7457261392997986, 0.14588029289839263, 0.36997847515154614, 0.8608121267773605, 0.46603714002709196, 0.4021460565302815, 0.15032504077535255, 0.9465588985332778, 0.17801544827895094, 0.6209646019823888, 0.8167624137930775, 0.5042900560736514, 0.007652824644084788, 0.5124533235765624, 0.26106222640222193, 0.9754129097592554, 0.14709782213881253, 0.7157870148723641, 0.49006659471257613, 0.21821159787337185, 0.36754255567844835, 0.24273646858496856, 0.10121177014645842, 0.8287873909098654, 0.5008103720380103, 0.5199059749839374, 0.7816678641054383, 0.0891962687906296, 0.8211230250325355, 0.8084507709442981, 0.8103609144423143, 0.5168123375009249, 0.28496022865210713, 0.7107862467754863, 0.05404750528781396, 0.6738984585312358, 0.7817987169337312, 0.5004720399719412, 0.17395421668747843, 0.06225229590014529, 0.3818274332493135, 0.2140607970983637, 0.18827321663783553, 0.3946236126410121, 0.00848434879018251, 0.2622464650942895, 0.7780222596098103, 0.3623614213926476, 0.5838454691174382, 0.742129478210496, 0.18943179469904872, 0.8274513181953294, 0.7835197169990287, 0.4928361218217288, 0.16511325256573864, 0.7767414083800084, 0.2947641368043649, 0.33308663523983156, 0.45879228952697887, 0.08673229443312182, 0.587031660389509, 0.031601837712440725, 0.5843574180885444, 0.4988191711668289, 0.4180993032965854, 0.8294699711022389, 0.009378842466115936, 0.29732635303525745, 0.6712978724235205, 0.6077660113362489, 0.9360936928890489, 0.12606204260583, 0.2801744277520937, 0.033822636762754515, 0.8291337774304036, 0.9434487799910692, 0.7461672527077756}
  2. Take(allRandomSeeds, randIndex, randIndex + numRandoms - 1) → currentRandomSeeds
  3. Element(denBOps, denIndex) → denB
  4. Element(denAOps, denIndex) → denA
  5. If(denA ≟ 4, Element[{1, 3}, 1 + floor((currentRandomSeeds(2) * 2))], 1 + floor((currentRandomSeeds(2) * (denA - 1)))) → numerA
  6. Remove(Element[{{}, {1}, {1, 2}, {1, 3}, {1, 2, 3, 4}, {}, {1, 2, 3, 4, 5, 6}}, denB], If[sameDen, {numerA}, {}]) → possibleNumerB
  7. Element(possibleNumerB, 1 + floor((currentRandomSeeds(3) * Length[possibleNumerB]))) → numerB
  8. Min(numberA, numberB) → numberRight
  9. Max(numberA, numberB) → numberLeft
  10. Element({3, 3, 2.6, 2.2}, totalBlocks - 2) → unitSize
  11. If(numberA > numberB, 1, 2) → indexLeft
  12. Element({numUnitsA, numUnitsB}, indexLeft) → numUnitsLeft
  13. If(indexLeft ≟ 1, 2, 1) → indexRight
  14. Element({numUnitsA, If[testSum ≥ 5 ∧ (¬isSubtract), numUnitsB - 1, numUnitsB]}, indexRight) → numUnitsRight
  15. Element({denA, denB}, indexRight) → denRight
  16. Sequence(AnchorRight + ((K * spacing), 0), K, 0, 2) → anchorsRight
  17. Element({numerA, numerB}, indexLeft) → numPartsLeft
  18. Element({numerA, numerB}, indexRight) → numPartsRight
  19. Element({numerA, numerB}, indexRight) → numerRight
  20. Element({numerB, numerA}, indexRight) → numerLeft
  21. Element({denA, denB}, indexLeft) → denLeft
  22. If(sameDen, denLeft, (denLeft * denRight)) → denCommon
  23. If(isSubtract, numberLeft - numberRight, numberLeft + numberRight) → answerVal
  24. Polygon({(0, 0), (0, unitSize), (unitSize, unitSize), (unitSize, 0)}) → templateUnitBox
  25. Sequence(AnchorLeft + ((K * spacing), 0), K, 0, 2) → anchorsLeft
  26. If(animateControl ≟ animateCount, 1, animateControl - floor(animateControl)) → animateCurrent
  27. Flatten(Sequence[Sequence[AnchorSolnParts + ((i * unitSize / denLeft), (j * unitSize / If[sameDen, 1, denRight])), i, 0, denLeft - 1], j, 0, (2 * denRight)]) → anchorSolnPartsAll
  28. If(sameDen, numerRight, (numerRight * denLeft)) → numCommonRight
  29. Vector(anchorSolnPartsAll(1), anchorSolnUnits(numUnitsSoln)) → vCarry
  30. If(isBorrow, numUnitsLeft - 1, numUnitsLeft) → numUnitsLeft2
  31. If(animateCount < fade2Index + 1, 0, If[animateCount ≟ fade2Index + 1, animateCurrent, 1]) → animateCarry
  32. If(sameDen, 0, If[animateCount ≤ 3, 0, If[animateCount < 5, animateCurrent, 1]]) → animateStage1b
  33. If(sameDen, Polygon[{(0, 0), (unitSize / denRight, 0), (unitSize / denRight, unitSize), (0, unitSize)}], Polygon[{(0, 0), (unitSize, 0), (unitSize, unitSize / denRight), (0, unitSize / denRight)}]) → templatePartRight
  34. Sequence(AnchorPartsRight + If[sameDen, ((A * unitSize / denRight), 0), (0, (A * unitSize / denRight))], A, 0, denRight - 1) → anchorRightParts
  35. Zip(Translate[templatePartRight, A], A, anchorRightParts) → outlinePartsRight
  36. Flatten(Sequence[Sequence[AnchorPartsRight + ((i * unitSize / denLeft), (j * unitSize / denRight)), i, 0, If[sameDen, numerRight - 1, denLeft - 1]], j, 0, If[sameDen, 0, numerRight - 1]]) → anchorRightPartsCD
  37. Flatten(Sequence[Sequence[anchorsLeft(2) + ((i * unitSize / denLeft), (j * unitSize / denRight)), i, 0, denLeft - 1], j, 0, If[sameDen, 0, denRight - 1]]) → anchorLeftPartsBorrow
  38. Join({Flatten[Sequence[Sequence[anchorsLeft(3) + ((i * unitSize / denLeft), (j * unitSize / denRight)), i, 0, numerLeft - 1], j, 0, If[sameDen, 0, denRight - 1]]], If[isBorrow, anchorLeftPartsBorrow, {}]}) → anchorLeftPartsCD
  39. Take(anchorSolnPartsAll, 1, Length[anchorLeftPartsCD] + If[caseNum ≟ caseSUBTRACT, 0, Length[anchorRightPartsCD]]) → anchorSolnPartsCurrent
  40. If(animateCount < fade1Index + numUnitsRight, 0, If[animateCount ≥ fade1Index + numUnitsRight + numCommonRight, numCommonRight + If[animateCount ≥ fade2Index, 1, 0], animateCount - fade1Index - numUnitsRight]) → moveRightPart
  41. Polygon({(0, 0), (unitSize / denLeft, 0), (unitSize / denLeft, unitSize / If[sameDen, 1, denRight]), (0, unitSize / If[sameDen, 1, denRight])}) → templateCommon
  42. Vector(anchorSolnPartsCurrent(If[isSubtract, numCommonLeft - moveRightPart + 1, numCommonLeft + moveRightPart]) - anchorRightPartsCD(moveRightPart)) → vMovePartRight
  43. If(animateCount - sizeStageA ≤ 0, 0, If[animateCount - sizeStageA ≤ numUnitsLeft2, animateCount - sizeStageA, numUnitsLeft2 + 1]) → moveLeftUnit
  44. If(animateCount - sizeStageA ≤ moveLeftUnit, 0, If[moveLeftUnit < animateCount - sizeStageA ≤ moveLeftUnit + numCommonLeft, animateCount - sizeStageA - moveLeftUnit, numCommonLeft]) → moveLeftPart
  45. Element({{}, {anchorsRight(1)}, {anchorsRight(2), anchorsRight(1)}}, numUnitsRight + 1) → anchorUnitsRight
  46. If(animateCount ≤ fade1Index, 0, If[fade1Index < animateCount ≤ fade1Index + numUnitsRight, animateCount - fade1Index, numUnitsRight]) → moveRightUnit
  47. Sequence(anchorsLeft(2 - A), A, 0, numUnitsLeft - 1) → anchorUnitsLeft
  48. If(isBorrow, Element[{{}, {anchorUnitsLeft(2)}}, numUnitsLeft], anchorUnitsLeft) → anchorUnitsLeft2
  49. If(isSubtract, "\minus", "\plus") → caseOperator
  50. Numerator(answerVal) → answerNumer
  51. Denominator(answerVal) → answerDen
  52. If(sameDen, "", (((((((((("\text{ \dfrac{" * fracLeftnumer) * "}{") * answerDen) * "} ") * caseOperator) * " \dfrac{") * fracRightNumer) * "}{") * answerDen) * "} = }")) → commonDenText
  53. Mod(answerNumer, answerDen) → answerRemainder
  54. If(answerNumer < answerDen, "", (((("\text{ \dfrac{" * answerNumer) * "}{") * answerDen) * "} = }")) → improperText
  55. Vector(anchorSolnUnits(moveLeftUnit) - anchorUnitsLeft2(moveLeftUnit)) → vMoveLeftUnit
  56. If(sameDen, 0, 2) → lengthMoveBars
  57. If(sameDen, 0, 1) → denCase
  58. Corner(5) → layoutAppSize
  59. PointToPixels(Corner[onboardingDisplayText, 2], Corner[1], Corner[3], Corner[5]) → layoutOnboarding
  60. If(sameDen, "") → makeCommonDen
  61. Sequence(anchorsLeft(3) + (A, 0), A, 0, unitSize - unitSize / denLeft, unitSize / denLeft) → anchorLeftParts
  62. If(animateControl < 4, 0, animateControl - floor(animateControl)) → animateUnitBox
  63. Vector(anchorSolnUnits(If[isSubtract, numUnitsLeft2 - moveRightUnit + 1, numUnitsLeft2 + moveRightUnit]) - anchorUnitsRight(moveRightUnit)) → vMoveRightUnit
  64. Translate(templateUnitBox, anchorUnitsRight(moveRightUnit) + (animateCurrent * vMoveRightUnit)) → moveUnitRight
  65. Translate(templateUnitBox, anchorUnitsLeft2(moveLeftUnit) + (animateCurrent * vMoveLeftUnit)) → moveUnitLeft
  66. Element({If[sameDen, answerNumer, 2 + answerNumer] + 1, lengthMoveBars + 2 + numUnitsA + numUnitsB}, caseNum) → lengthSlider
  67. Polygon({(0, 0), (unitSize / denLeft, 0), (unitSize / denLeft, unitSize), (0, unitSize)}) → templatePartLeft
  68. Zip(Translate[templatePartLeft, A], A, Take[anchorLeftParts, 1, denLeft]) → outlinePartsLeft
  69. Zip(Translate[templatePartLeft, A], A, Take[anchorLeftParts, 1, numPartsLeft]) → fracPartsLeft
  70. Zip(Translate[templateUnitBox, A], A, anchorUnitsLeft) → unitBoxesLeft
  71. Zip(Translate[templateUnitBox, A], A, anchorUnitsRight) → unitBoxesRight
  72. If(animateCount < fade1Index ∨ (¬isSubtract), 0, If[animateCount > fade1Index, 1, animateCurrent]) → animateFade1
  73. If(animateCount < fade2Index, 0, If[animateCount > fade2Index, 1, animateCurrent]) → animateFade2
  74. Zip(Translate[templateUnitBox, A], A, Take[anchorSolnUnits, 1, numUnitsSoln]) → solnUnitBoxesFinal
  75. If(sameDen, 0, If[animateCount ≤ 1, 0, If[animateCount < 3, animateCurrent, 1]]) → animateStage1a
  76. Zip(Translate[A, (animateStage1b * (anchorsLeft(3) - AnchorPartsRight))], A, outlinePartsRight) → barsRight
  77. Zip(Translate[templatePartRight, A], A, Take[anchorRightParts, 1, numerRight]) → fracPartsRight
  78. Translate(templateCommon, anchorRightPartsCD(moveRightPart) + (animateCurrent * vMovePartRight)) → movePartRight
  79. Translate(templateCommon, anchorLeftPartsCD(moveLeftPart) + (animateCurrent * vMoveLeftPart)) → movePartLeft
  80. If(isSubtract, numCommonLeft, numCommonLeft + 1) → indexStage3B
  81. If(moveRightUnit > 1 ∨ animateCount > numUnitsRight + fade1Index, Sequence[Translate[templateUnitBox, Vector[anchorSolnUnits(numUnitsLeft2 - A + 1)]], A, 1, If[animateCount > fade1Index + numUnitsRight, numUnitsRight, moveRightUnit - 1]], {}) → solnUnitBoxesRightSubtract
  82. If(moveRightUnit > 1 ∨ animateCount > numUnitsRight + fade1Index, Sequence[Translate[templateUnitBox, Vector[anchorSolnUnits(numUnitsLeft2 + A)]], A, 1, If[animateCount > fade1Index + numUnitsRight, numUnitsRight, moveRightUnit - 1]], {}) → solnUnitBoxesRight
  83. Zip(Translate[templateCommon, A], A, Reverse[Take[anchorSolnPartsCurrent, numCommonLeft + 2 - moveRightPart]]) → solnPartBoxesRightSubtract
  84. Zip(Translate[templateCommon, A], A, Take[anchorLeftPartsCD, moveLeftPart + 1]) → remainingLeftParts
  85. Zip(Translate[templateUnitBox, A], A, Take[anchorUnitsLeft2, moveLeftUnit + 1]) → remainingLeftUnits
  86. Zip(Translate[templateUnitBox, A], A, Take[anchorUnitsRight, moveRightUnit + 1]) → remainingRightUnits
  87. Translate(templateUnitBox, anchorSolnPartsAll(1) + (If[IsInteger[answerVal] ∧ answerVal ≠ 4, 0, animateCarry] * vCarry)) → unitCarry
  88. If(sameDen, 0, 5) → startStage1c
  89. If(¬isBorrow, 0, If[animateCount < startStage1c, 0, If[animateCount ≤ startStage1c, animateCurrent, 1]]) → animateStage1c
  90. Zip(Translate[templateUnitBox, A], A, Take[anchorSolnUnits, 1, moveLeftUnit - 1]) → solnUnitsLeft
  91. Zip(Translate[templateCommon, A], A, Take[anchorSolnPartsCurrent, 1, Min[numCommonLeft, animateCount - sizeStageA - numUnitsLeft2 - 2]]) → solnPartBoxesLeft
  92. Zip(Translate[templateCommon, A], A, Take[anchorSolnPartsCurrent, numCommonLeft + 1, numCommonLeft + moveRightPart - 1]) → solnPartBoxesRightAdd
  93. Zip(Translate[templateCommon, A], A, Take[anchorRightPartsCD, moveRightPart + 1]) → remainingRightParts
  94. Zip(Translate[templateUnitBox, A], A, Take[anchorSolnUnits, 1, numUnitsSoln - If[isCarry, 1, 0]]) → solnUnitsFinal
  95. Zip(Translate[templateCommon, A - If[isCarry, (0, (-unitSize) + (animateCarry * unitSize)), (0, 0)]], A, Take[anchorSolnPartsAll, 1, numPartsSoln]) → solnPartsFinal
  96. PointToPixels(AnchorLineA, Corner[1], Corner[3], Corner[5]) → LineStartPX
  97. Zip(Translate[templateUnitBox, A], A, Join[{anchorUnitsLeft, anchorUnitsRight, {anchorsLeft(3), AnchorPartsRight}}]) → outlineUnits
  98. Zip(Translate[A, (animateStage1a * (AnchorPartsRight - anchorsLeft(3)))], A, outlinePartsLeft) → barsLeft

AI Drawing Prompt Reference

Describe a graphic using fraction bar models to demonstrate adding and subtracting mixed numbers. The graphic includes a unit bar and multiple fraction bars representing the integer and fractional parts of mixed numbers. It features an addition example showing how to combine two mixed numbers by aligning fractional parts and adding them, while adding the integer parts. It also includes a subtraction example demonstrating subtraction from a larger mixed number, possibly involving borrowing. The fraction bars are distinguished by color or position to indicate integer and fractional parts. The construction order: first draw the unit bar, then create fraction bars based on randomly generated mixed numbers, separating integer and fractional parts, and finally combining the fraction bars into mixed number graphics, with steps labeled.
The prompt above was compiled from the original drawing commands and is for reference only.