@lernapps/app-templates 0.0.1 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/LICENSE +22 -0
  2. package/README.md +195 -2
  3. package/dist/appname-Bh23cUuz.mjs +12 -0
  4. package/dist/assessment-Dy359O1O.mjs +1696 -0
  5. package/dist/block-BK_ohsH1.mjs +82 -0
  6. package/dist/blocks-CxtCPAa5.mjs +149 -0
  7. package/dist/blocks.mjs +4 -0
  8. package/dist/check-CteIFN96.mjs +254 -0
  9. package/dist/content-DO6oEJxj.mjs +140 -0
  10. package/dist/contract-PONpxJtd.mjs +52 -0
  11. package/dist/e2e-CU0n_unV.mjs +89 -0
  12. package/dist/engine-CArxqizW.mjs +136 -0
  13. package/dist/explainer-e2e.mjs +1311 -0
  14. package/dist/explainer-islands.mjs +197 -0
  15. package/dist/explainer-plugin.mjs +2132 -0
  16. package/dist/explainer.mjs +1246 -0
  17. package/dist/html-mffkHGHh.mjs +89 -0
  18. package/dist/image-CspJVfyQ.mjs +21 -0
  19. package/dist/interactive-e2e.mjs +140 -0
  20. package/dist/interactive-plugin.mjs +242 -0
  21. package/dist/interactive.mjs +75 -0
  22. package/dist/load-RosvaPZf.mjs +16976 -0
  23. package/dist/needs-BzEahJ6X.mjs +97 -0
  24. package/dist/pages-9RaaomoO.mjs +81 -0
  25. package/dist/questions-e2e.mjs +1 -0
  26. package/dist/questions-engine.mjs +3 -0
  27. package/dist/questions.mjs +6 -0
  28. package/dist/quiz-DnW-xtCh.mjs +70 -0
  29. package/dist/quiz-e2e.mjs +174 -0
  30. package/dist/quiz-plugin.mjs +266 -0
  31. package/dist/quiz.mjs +246 -0
  32. package/dist/render-D5kwkNt1.mjs +507 -0
  33. package/dist/render-DqHOJyHK.mjs +146 -0
  34. package/dist/render-GS1Htlu8.mjs +545 -0
  35. package/dist/result-D_mmCVwN.mjs +180 -0
  36. package/dist/tasks-DADUYy52.mjs +74 -0
  37. package/dist/validate-BDwL7Su3.mjs +1076 -0
  38. package/dist/validate-Bxy9NfB8.mjs +146 -0
  39. package/dist/vue-DO1m6q1R.mjs +40 -0
  40. package/dist/vue-code-BkJjW_I_.mjs +320 -0
  41. package/docs/arc42/01-introduction-and-goals.arc42.md +82 -0
  42. package/docs/arc42/02-constraints.arc42.md +228 -0
  43. package/docs/arc42/03-system-context.arc42.md +118 -0
  44. package/docs/arc42/04-solution-strategy.arc42.md +47 -0
  45. package/docs/arc42/05-building-blocks.arc42.md +307 -0
  46. package/docs/arc42/06-runtime-view.arc42.md +98 -0
  47. package/docs/arc42/07-deployment-view.arc42.md +160 -0
  48. package/docs/arc42/08-concepts.arc42.md +123 -0
  49. package/docs/arc42/09-decisions.arc42.md +246 -0
  50. package/docs/arc42/10-quality-requirements.arc42.md +155 -0
  51. package/docs/arc42/11-risks.arc42.md +113 -0
  52. package/docs/arc42/12-glossary.arc42.md +162 -0
  53. package/docs/arc42/architecture-evidence.md +395 -0
  54. package/explainer/.arc42ignore +3 -0
  55. package/explainer/README.md +54 -0
  56. package/explainer/_gitignore +5 -0
  57. package/explainer/docs/arc42/03-explainer-system-context.arc42.md +35 -0
  58. package/explainer/docs/arc42/05-explainer-building-blocks.arc42.md +659 -0
  59. package/explainer/docs/arc42/06-explainer-runtime-view.arc42.md +105 -0
  60. package/explainer/docs/arc42/07-explainer-deployment-view.arc42.md +34 -0
  61. package/explainer/docs/arc42/08-explainer-concepts.arc42.md +17 -0
  62. package/explainer/docs/arc42/09-explainer-decisions.arc42.md +443 -0
  63. package/explainer/docs/arc42/10-explainer-quality-requirements.arc42.md +54 -0
  64. package/explainer/docs/arc42/11-explainer-risks.arc42.md +17 -0
  65. package/explainer/docs/arc42/12-explainer-glossary.arc42.md +185 -0
  66. package/explainer/e2e/explainer.e2e.ts +3 -0
  67. package/explainer/index.html +11 -0
  68. package/explainer/package.json +18 -0
  69. package/explainer/playwright.config.ts +1 -0
  70. package/explainer/src/app.yaml +20 -0
  71. package/explainer/src/components/ProzentFeld.test.ts +30 -0
  72. package/explainer/src/components/ProzentFeld.ts +121 -0
  73. package/explainer/src/components/ProzentFeld.vue +84 -0
  74. package/explainer/src/images/hunderterfeld-klammern.svg +105 -0
  75. package/explainer/src/main.ts +4 -0
  76. package/explainer/src/prozent/chapter.yaml +18 -0
  77. package/explainer/src/prozent/grundwert.yaml +115 -0
  78. package/explainer/src/prozent/prozentsatz.yaml +99 -0
  79. package/explainer/src/prozent/prozentwert.yaml +119 -0
  80. package/explainer/tsconfig.json +1 -0
  81. package/explainer/vite.config.ts +4 -0
  82. package/interactive/.arc42ignore +5 -0
  83. package/interactive/README.md +28 -0
  84. package/interactive/_gitignore +4 -0
  85. package/interactive/docs/arc42/05-interactive-building-blocks.arc42.md +518 -0
  86. package/interactive/docs/arc42/06-interactive-runtime-view.arc42.md +58 -0
  87. package/interactive/docs/arc42/07-interactive-deployment-view.arc42.md +35 -0
  88. package/interactive/docs/arc42/08-interactive-concepts.arc42.md +52 -0
  89. package/interactive/docs/arc42/09-interactive-decisions.arc42.md +130 -0
  90. package/interactive/docs/arc42/10-interactive-quality-requirements.arc42.md +45 -0
  91. package/interactive/docs/arc42/11-interactive-risks.arc42.md +20 -0
  92. package/interactive/docs/arc42/12-interactive-glossary.arc42.md +80 -0
  93. package/interactive/e2e/interactive.e2e.ts +3 -0
  94. package/interactive/index.html +11 -0
  95. package/interactive/package.json +18 -0
  96. package/interactive/playwright.config.ts +1 -0
  97. package/interactive/src/app.yaml +28 -0
  98. package/interactive/src/core/index.ts +101 -0
  99. package/interactive/src/data/lessons.json +4 -0
  100. package/interactive/src/env.d.ts +6 -0
  101. package/interactive/src/main.ts +6 -0
  102. package/interactive/src/messages/de.json +12 -0
  103. package/interactive/src/playthroughs/grundreihe.yaml +33 -0
  104. package/interactive/src/playthroughs/obere-reihe.yaml +14 -0
  105. package/interactive/src/ui/App.vue +85 -0
  106. package/interactive/tsconfig.json +1 -0
  107. package/interactive/vite.config.ts +4 -0
  108. package/package.json +143 -4
  109. package/quiz/README.md +31 -0
  110. package/quiz/_gitignore +5 -0
  111. package/quiz/docs/arc42/05-quiz-building-blocks.arc42.md +283 -0
  112. package/quiz/docs/arc42/06-quiz-runtime-view.arc42.md +21 -0
  113. package/quiz/docs/arc42/07-quiz-deployment-view.arc42.md +33 -0
  114. package/quiz/docs/arc42/09-quiz-decisions.arc42.md +36 -0
  115. package/quiz/docs/arc42/10-quiz-quality-requirements.arc42.md +53 -0
  116. package/quiz/docs/arc42/11-quiz-risks.arc42.md +19 -0
  117. package/quiz/docs/arc42/12-quiz-glossary.arc42.md +27 -0
  118. package/quiz/e2e/quiz.e2e.ts +3 -0
  119. package/quiz/index.html +11 -0
  120. package/quiz/package.json +18 -0
  121. package/quiz/playwright.config.ts +1 -0
  122. package/quiz/src/images/berge-ordnen.jpg +0 -0
  123. package/quiz/src/images/everest-hoehe.jpg +0 -0
  124. package/quiz/src/images/galapagos.jpg +0 -0
  125. package/quiz/src/images/grand-canyon.jpg +0 -0
  126. package/quiz/src/images/totes-meer.jpg +0 -0
  127. package/quiz/src/images/uluru.jpg +0 -0
  128. package/quiz/src/images/wasserfaelle-laender.jpg +0 -0
  129. package/quiz/src/main.ts +4 -0
  130. package/quiz/src/quiz.json +312 -0
  131. package/quiz/tsconfig.json +1 -0
  132. package/quiz/vite.config.ts +4 -0
  133. package/runtime/explainer/assessment-client.ts +478 -0
  134. package/runtime/explainer/assessment-page.ts +448 -0
  135. package/runtime/explainer/assessment.ts +393 -0
  136. package/runtime/explainer/check-page.ts +520 -0
  137. package/runtime/explainer/components/exercise.ts +409 -0
  138. package/runtime/explainer/components/props.ts +230 -0
  139. package/runtime/explainer/components/read.ts +428 -0
  140. package/runtime/explainer/content.ts +277 -0
  141. package/runtime/explainer/e2e.ts +1488 -0
  142. package/runtime/explainer/exercises.ts +326 -0
  143. package/runtime/explainer/explainer.css +1283 -0
  144. package/runtime/explainer/explainer.ts +838 -0
  145. package/runtime/explainer/explainer.v1.schema.json +1165 -0
  146. package/runtime/explainer/expression.ts +407 -0
  147. package/runtime/explainer/fraction.ts +107 -0
  148. package/runtime/explainer/generated/comparator.ts +31 -0
  149. package/runtime/explainer/generated/question.ts +165 -0
  150. package/runtime/explainer/generated/soundness.ts +280 -0
  151. package/runtime/explainer/generated/texts.ts +257 -0
  152. package/runtime/explainer/generated/types.ts +103 -0
  153. package/runtime/explainer/generated/values.ts +136 -0
  154. package/runtime/explainer/islands.ts +281 -0
  155. package/runtime/explainer/load.ts +457 -0
  156. package/runtime/explainer/messages/de.json +200 -0
  157. package/runtime/explainer/messages/en.json +200 -0
  158. package/runtime/explainer/messages.ts +13 -0
  159. package/runtime/explainer/needs.ts +122 -0
  160. package/runtime/explainer/open-task.ts +235 -0
  161. package/runtime/explainer/outline.ts +306 -0
  162. package/runtime/explainer/plugin.ts +488 -0
  163. package/runtime/explainer/position.ts +62 -0
  164. package/runtime/explainer/prompt.ts +75 -0
  165. package/runtime/explainer/render.ts +686 -0
  166. package/runtime/explainer/result.ts +238 -0
  167. package/runtime/explainer/routes.ts +119 -0
  168. package/runtime/explainer/schema.ts +140 -0
  169. package/runtime/explainer/scope.ts +87 -0
  170. package/runtime/explainer/stuck.ts +57 -0
  171. package/runtime/explainer/tasks.ts +109 -0
  172. package/runtime/explainer/tutor.ts +469 -0
  173. package/runtime/explainer/tutorpage.ts +669 -0
  174. package/runtime/explainer/video.ts +123 -0
  175. package/runtime/interactive/contract.ts +121 -0
  176. package/runtime/interactive/e2e.ts +190 -0
  177. package/runtime/interactive/interactive.css +82 -0
  178. package/runtime/interactive/interactive.ts +115 -0
  179. package/runtime/interactive/interactive.v1.schema.json +146 -0
  180. package/runtime/interactive/load.ts +188 -0
  181. package/runtime/interactive/messages/de.json +14 -0
  182. package/runtime/interactive/messages/en.json +14 -0
  183. package/runtime/interactive/messages.ts +11 -0
  184. package/runtime/interactive/playthrough.v1.schema.json +143 -0
  185. package/runtime/interactive/plugin.ts +266 -0
  186. package/runtime/interactive/render.ts +126 -0
  187. package/runtime/quiz/e2e.ts +233 -0
  188. package/runtime/quiz/engine.ts +242 -0
  189. package/runtime/quiz/messages/de.json +23 -0
  190. package/runtime/quiz/messages/en.json +23 -0
  191. package/runtime/quiz/plugin.ts +150 -0
  192. package/runtime/quiz/quiz.css +154 -0
  193. package/runtime/quiz/quiz.ts +56 -0
  194. package/runtime/quiz/quiz.v1.schema.json +72 -0
  195. package/runtime/quiz/render.ts +173 -0
  196. package/runtime/quiz/validate.ts +108 -0
  197. package/runtime/shared/appname.ts +16 -0
  198. package/runtime/shared/blocks/block.ts +162 -0
  199. package/runtime/shared/blocks/blocks.css +190 -0
  200. package/runtime/shared/blocks/blocks.v1.schema.json +432 -0
  201. package/runtime/shared/blocks/code.ts +26 -0
  202. package/runtime/shared/blocks/figures.ts +49 -0
  203. package/runtime/shared/blocks/image.ts +25 -0
  204. package/runtime/shared/blocks/index.ts +13 -0
  205. package/runtime/shared/blocks/messages/de.json +4 -0
  206. package/runtime/shared/blocks/messages/en.json +4 -0
  207. package/runtime/shared/blocks/render.ts +134 -0
  208. package/runtime/shared/blocks/validate.ts +165 -0
  209. package/runtime/shared/content.ts +197 -0
  210. package/runtime/shared/examples.ts +20 -0
  211. package/runtime/shared/html.ts +10 -0
  212. package/runtime/shared/languages.ts +94 -0
  213. package/runtime/shared/page.css +101 -0
  214. package/runtime/shared/pages.ts +114 -0
  215. package/runtime/shared/questions/e2e.ts +115 -0
  216. package/runtime/shared/questions/engine.ts +209 -0
  217. package/runtime/shared/questions/index.ts +39 -0
  218. package/runtime/shared/questions/messages/de.json +26 -0
  219. package/runtime/shared/questions/messages/en.json +26 -0
  220. package/runtime/shared/questions/question.ts +433 -0
  221. package/runtime/shared/questions/question.v1.schema.json +346 -0
  222. package/runtime/shared/questions/questions.css +192 -0
  223. package/runtime/shared/questions/render.ts +255 -0
  224. package/runtime/shared/questions/validate.ts +518 -0
  225. package/runtime/shared/schema.ts +44 -0
  226. package/runtime/shared/text/check.ts +68 -0
  227. package/runtime/shared/text/formula.ts +69 -0
  228. package/runtime/shared/text/markdown.ts +185 -0
  229. package/runtime/shared/text/speech.ts +39 -0
  230. package/runtime/shared/text/text.v1.schema.json +34 -0
  231. package/runtime/shared/vue-code.ts +395 -0
  232. package/runtime/shared/vue.ts +38 -0
@@ -0,0 +1,115 @@
1
+ # yaml-language-server: $schema=../../node_modules/@lernapps/app-templates/runtime/explainer/explainer.v1.schema.json
2
+ title: Grundwert
3
+ description: "Den Grundwert berechnen: G = W · 100 : p, mit einem Beispiel und dem Hunderterfeld."
4
+ scope: |
5
+ Gesucht ist das Ganze, wenn nur ein Teil und sein Prozentsatz bekannt sind, etwa der alte Preis, wenn 30 € gespart
6
+ sind und das 12 % waren. Man rechnet $G = \frac{W \cdot 100}{p}$: $W$ geteilt durch $p$ ist 1 %, mal 100 das Ganze.
7
+ Bei einem Prozentsatz unter 100 % ist der Grundwert immer größer als der Prozentwert; kommt etwas Kleineres heraus,
8
+ wurde die Formel für den Prozentwert benutzt.
9
+ blocks:
10
+ - type: section
11
+ id: warum
12
+ title: Warum
13
+ blocks:
14
+ - type: text
15
+ text: |
16
+ „Du sparst 30 €, das sind 12 % Rabatt“: Wie teuer war die Sache vorher? Hier ist das Ganze unbekannt, und
17
+ genau das verwirrt viele. Wer den Grundwert sicher zurückrechnen kann, löst auch die kniffligen Aufgaben, bei
18
+ denen nur der Teil bekannt ist.
19
+ - type: section
20
+ id: regel
21
+ title: Regel
22
+ blocks:
23
+ - type: formula
24
+ formula: 'G = \frac{W \cdot 100}{p}'
25
+ - type: definition
26
+ term: Grundwert
27
+ explanation: Der Grundwert $G$ ist das Ganze, also 100 %.
28
+ - type: text
29
+ text: |
30
+ Du kennst den **Prozentwert** $W$ (den Teil) und den **Prozentsatz** $p\,\%$. Über 1 % kommst du zum
31
+ Ganzen: $W$ geteilt durch $p$ ist 1 %, mal 100 ist das Ganze.
32
+ - type: labelled-figure
33
+ image: images/hunderterfeld-klammern.svg
34
+ alt: Ein Hunderterfeld mit 10 mal 10 Kästchen, die linken drei Spalten sind gefärbt. A die Klammer unter dem ganzen Feld, B die Klammer über den gefärbten Spalten.
35
+ caption: Die Klammer um das ganze Feld und die Klammer um den gefärbten Teil.
36
+ source: eigene Zeichnung
37
+ licence: CC0-1.0
38
+ labels:
39
+ - { marker: A, x: 50, y: 94, text: "Grundwert: das Ganze, 100 %" }
40
+ - { marker: B, x: 21, y: 5, text: "Prozentwert: der gefärbte Teil" }
41
+ - type: note
42
+ title: Achtung
43
+ blocks:
44
+ - type: text
45
+ text: |
46
+ Der Grundwert ist bei $p$ unter 100 % immer größer als der Prozentwert. Kommt etwas Kleineres heraus,
47
+ hast du die Formel für den Prozentwert benutzt.
48
+ - type: section
49
+ id: beispiel
50
+ title: Beispiel
51
+ blocks:
52
+ - type: example
53
+ title: Der Preis eines Rollers
54
+ blocks:
55
+ - type: text
56
+ text: Beim Kauf eines Rollers sparst du 30 €. Das sind 12 % Rabatt. Wie viel hat der Roller vorher gekostet?
57
+ - type: table
58
+ caption: Der Grundwert beim Roller
59
+ rowHeaders: true
60
+ rows:
61
+ - [Prozentwert $W$, "30 € (der Teil, der bekannt ist)"]
62
+ - [Prozentsatz $p$, 12 %]
63
+ - [Rechnung, '$G = 30 \cdot 100 : 12 = 250$']
64
+ - [Grundwert $G$, "**250 €** war der alte Preis"]
65
+ - type: figure
66
+ draw: { kind: hundred-grid, filled: 12 }
67
+ alt: Ein Hunderterfeld mit 100 Kästchen, 12 davon sind gefärbt.
68
+ caption: Die 12 gefärbten Kästchen sind der bekannte Teil, 30 €. Alle 100 Kästchen stehen für den Grundwert, 250 €.
69
+ - type: text
70
+ text: "Über 1 %: 30 € : 12 = 2,50 € sind 1 %. Dann 2,50 € · 100 = 250 €."
71
+ - type: section
72
+ id: uebung
73
+ title: Übung
74
+ blocks:
75
+ - type: matching
76
+ id: klammern
77
+ text: Beschrifte A und B. Welcher Begriff gehört zu welcher Klammer?
78
+ material:
79
+ - type: labelled-figure
80
+ image: images/hunderterfeld-klammern.svg
81
+ alt: Ein Hunderterfeld mit 10 mal 10 Kästchen, die linken drei Spalten sind gefärbt. A die Klammer unter dem ganzen Feld, B die Klammer über den gefärbten Spalten.
82
+ source: eigene Zeichnung
83
+ licence: CC0-1.0
84
+ legend: false
85
+ labels:
86
+ - { marker: A, x: 50, y: 94, text: Grundwert }
87
+ - { marker: B, x: 21, y: 5, text: Prozentwert }
88
+ pairsFrom: material
89
+ distractors: [Prozentsatz]
90
+ explanation: Die Klammer um das ganze Feld zeigt das Ganze, den Grundwert. Die Klammer um die gefärbten Spalten zeigt den Teil, den Prozentwert.
91
+ examples:
92
+ accepted: [[[A, Grundwert], [B, Prozentwert]]]
93
+ rejected: [[[0, 1], [1, 0]], [[A, Prozentsatz], [B, Prozentwert]]]
94
+ links:
95
+ - title: Prozentrechnung (Wikipedia)
96
+ url: https://de.wikipedia.org/wiki/Prozentrechnung
97
+ - type: generated
98
+ id: grundwert-ueben
99
+ given:
100
+ W: { int: [5, 150] }
101
+ p: { oneOf: [5, 10, 12, 15, 20, 25, 30, 40, 50] }
102
+ where: ["decimals(W * 100 / p) == 0", "W * 100 / p >= 50", "W * 100 / p <= 500"]
103
+ task:
104
+ text: "Beim Kauf eines Rollers sparst du {{W}} €. Das sind {{p}} % Rabatt. Wie viel hat der Roller vorher gekostet?"
105
+ answer: { value: "W * 100 / p", compare: { number: { format: money } } }
106
+ mistakes:
107
+ - {
108
+ value: "W * p / 100",
109
+ message: "Du hast {{p}} % von {{W}} € berechnet. Gesucht ist aber das Ganze, von dem die {{W}} € ein Teil sind.",
110
+ }
111
+ - { value: "W / p", message: "Das ist erst 1 %. Nimm es noch mal 100, dann hast du das Ganze." }
112
+ hint: "Gesucht ist das Ganze, 100 %. Rechne erst aus, was 1 % ist: {{W}} € geteilt durch {{p}}. Dann mal 100."
113
+ steps:
114
+ - '$G = \frac{W \cdot 100}{p}$'
115
+ - '$G = \frac{{{W}} \cdot 100}{{{p}}} = {{answer}}$, also {{answer}} €.'
@@ -0,0 +1,99 @@
1
+ # yaml-language-server: $schema=../../node_modules/@lernapps/app-templates/runtime/explainer/explainer.v1.schema.json
2
+ title: Prozentsatz
3
+ description: "Den Prozentsatz berechnen: p = W : G · 100, mit einem Beispiel und dem Prozentstreifen."
4
+ scope: |
5
+ Gesucht ist, welcher Anteil der Teil vom Ganzen ist, etwa „18 von 24 Schülern“. Man rechnet
6
+ $p = \frac{W}{G} \cdot 100$: Teil durch Ganzes gibt den Anteil, mal 100 die Prozent. Erst der Prozentsatz macht
7
+ Anteile vergleichbar, auch wenn das Ganze verschieden groß ist. Wer unsicher ist, welche Formel passt, fragt sich,
8
+ welche zwei der drei Größen in der Aufgabe stehen.
9
+ blocks:
10
+ - type: section
11
+ id: warum
12
+ title: Warum
13
+ blocks:
14
+ - type: text
15
+ text: |
16
+ „18 von 24 Schülern haben ein Haustier“: Ist das viel? Erst der Prozentsatz macht solche Angaben
17
+ vergleichbar. 75 % sagen sofort, wie groß der Anteil ist, egal ob die Klasse 24 oder 30 Schüler hat.
18
+ - type: section
19
+ id: regel
20
+ title: Regel
21
+ blocks:
22
+ - type: formula
23
+ formula: 'p = \frac{W}{G} \cdot 100'
24
+ - type: definition
25
+ term: Prozentsatz
26
+ explanation: |
27
+ Der Prozentsatz $p\,\%$ ist der Anteil des Prozentwerts $W$ (der Teil) am Grundwert $G$ (das Ganze), in
28
+ Hundertsteln geschrieben.
29
+ - type: note
30
+ title: Merkhilfe
31
+ blocks:
32
+ - type: text
33
+ text: Teil durch Ganzes, also immer durch das Ganze teilen, nie umgekehrt. Dann mal 100.
34
+ - type: section
35
+ id: beispiel
36
+ title: Beispiel
37
+ blocks:
38
+ - type: example
39
+ title: Haustiere in der Klasse
40
+ blocks:
41
+ - type: text
42
+ text: In einer Klasse sind 24 Schüler. 18 davon haben ein Haustier. Wie viel Prozent der Klasse sind das?
43
+ - type: table
44
+ caption: Der Prozentsatz der Klasse
45
+ rowHeaders: true
46
+ rows:
47
+ - [Grundwert $G$, 24 Schüler (die ganze Klasse)]
48
+ - [Prozentwert $W$, 18 Schüler (der Teil)]
49
+ - [Rechnung, '$p = 18 : 24 \cdot 100 = 0{,}75 \cdot 100 = 75$']
50
+ - [Prozentsatz, "**75 %**"]
51
+ - type: figure
52
+ draw: { kind: bar, part: 18, whole: 24 }
53
+ alt: Ein Streifen für 24 Schüler, drei Viertel davon sind gefärbt, 75 %.
54
+ caption: Der ganze Streifen ist der Grundwert, 24 Schüler sind 100 %. Der gefärbte Teil ist der Prozentwert, 18 Schüler sind 75 %.
55
+ - type: text
56
+ text: "Probe: 75 % von 24 sind 24 · 0,75 = 18. Passt."
57
+ - type: section
58
+ id: uebung
59
+ title: Übung
60
+ blocks:
61
+ - type: single-choice
62
+ id: welche-rechnung
63
+ text: In einer Klasse mit 25 Schülern haben 10 ein Haustier. Mit welcher Rechnung bekommst du den Prozentsatz?
64
+ explanation: "Der Prozentsatz ist Teil durch Ganzes, mal 100. Der Teil sind die 10 Schüler mit Haustier, das Ganze die 25 Schüler der Klasse, also 10 : 25 · 100 = 40 %."
65
+ links:
66
+ - title: Prozentrechnung mittels Formeln (Serlo)
67
+ url: https://de.serlo.org/mathe/2193/prozentrechnung-mittels-formeln
68
+ options:
69
+ - text: "10 : 25 · 100"
70
+ correct: true
71
+ info: Teil durch Ganzes, dann mal 100. So kommt der Anteil in Hundertsteln heraus.
72
+ - text: "25 : 10 · 100"
73
+ correct: false
74
+ info: Hier wird das Ganze durch den Teil geteilt. Das ergibt 250 %, mehr als die ganze Klasse.
75
+ - text: "10 · 25 : 100"
76
+ correct: false
77
+ info: So rechnest du einen Prozentwert aus, nicht einen Prozentsatz. Es kommen 2,5 heraus.
78
+ - type: generated
79
+ id: prozentsatz-ueben
80
+ given:
81
+ G: { int: [16, 32] }
82
+ W: { int: [1, 31] }
83
+ where: ["W < G", "decimals(W * 100 / G) == 0"]
84
+ task:
85
+ text: "In einer Klasse sind {{G}} Schüler. {{W}} davon haben ein Haustier. Wie viel Prozent der Klasse sind das?"
86
+ answer: { value: "W * 100 / G", compare: { number: { format: percent, decimals: 0 } } }
87
+ mistakes:
88
+ - {
89
+ value: "W / G",
90
+ message: "Das ist der Anteil als Dezimalzahl. Nimm ihn noch mal 100, dann hast du den Prozentsatz.",
91
+ }
92
+ - {
93
+ value: "G * 100 / W",
94
+ message: "Du hast das Ganze durch den Teil geteilt. Richtig ist: Teil durch Ganzes, also W durch G.",
95
+ }
96
+ hint: "Teile den Teil ({{W}} Schüler) durch das Ganze ({{G}} Schüler) und nimm das Ergebnis mal 100."
97
+ steps:
98
+ - '$p = \frac{W}{G} \cdot 100$'
99
+ - '$p = \frac{{{W}}}{{{G}}} \cdot 100 = {{answer}}$, also {{answer}} %.'
@@ -0,0 +1,119 @@
1
+ # yaml-language-server: $schema=../../node_modules/@lernapps/app-templates/runtime/explainer/explainer.v1.schema.json
2
+ title: Prozentwert
3
+ description: "Den Prozentwert berechnen: W = G · p : 100, mit einem Beispiel und dem Hunderterfeld."
4
+ scope: |
5
+ Gesucht ist der Teil des Ganzen, etwa wie viel Euro man bei 20 % Rabatt auf 80 € spart. Man rechnet
6
+ $W = \frac{G \cdot p}{100}$: erst 1 % des Grundwerts ($G$ geteilt durch 100), dann mal $p$. Der Prozentwert hat die
7
+ Einheit des Grundwerts (€, Schüler, mAh). Ein Hunderterfeld zeigt, dass $p\,\%$ von 100 Kästchen $p$ Kästchen sind,
8
+ bei einem Feld mit anderer Größe aber nicht. Weil man beim Malnehmen die Zahlen tauschen darf, ist zum Beispiel 20 %
9
+ von 50 € dasselbe wie 50 % von 20 €, nämlich 10 €. Ein häufiger Fehler ist, das Teilen durch 100 zu vergessen; ein
10
+ anderer, den neuen Preis statt des Rabatts auszurechnen.
11
+ blocks:
12
+ - type: section
13
+ id: warum
14
+ title: Warum
15
+ blocks:
16
+ - type: text
17
+ text: |
18
+ „20 % Rabatt auf 80 €“: Wie viel sparst du wirklich? Der Prozentwert ist der Teil des Ganzen, den die
19
+ Prozente beschreiben. Wer ihn schnell ausrechnen kann, weiß beim Einkaufen, beim Handy-Akku und in jeder
20
+ Statistik sofort, worum es geht.
21
+ - type: section
22
+ id: regel
23
+ title: Regel
24
+ blocks:
25
+ - type: formula
26
+ formula: 'W = \frac{G \cdot p}{100}'
27
+ - type: definition
28
+ term: Prozentwert
29
+ explanation: |
30
+ Der Prozentwert $W$ ist der Anteil am Ganzen, in der Einheit des Grundwerts (€, Schüler, mAh …).
31
+ - type: text
32
+ text: |
33
+ Der **Grundwert** $G$ ist das Ganze, also 100 %. Der **Prozentsatz** $p\,\%$ sagt, welcher Anteil gemeint
34
+ ist. mAh (Milliamperestunden) gibt an, wie viel Ladung ein Akku speichert.
35
+ - type: note
36
+ title: Merkhilfe
37
+ blocks:
38
+ - type: text
39
+ text: Erst 1 % ausrechnen ($G$ geteilt durch 100), dann mal $p$ nehmen.
40
+ - type: section
41
+ id: beispiel
42
+ title: Beispiel
43
+ blocks:
44
+ - type: example
45
+ title: Rabatt auf ein Skateboard
46
+ blocks:
47
+ - type: text
48
+ text: Ein Skateboard kostet 250 €. Es gibt 12 % Rabatt. Wie viel Euro sparst du?
49
+ - type: table
50
+ caption: Der Prozentwert beim Skateboard
51
+ rowHeaders: true
52
+ rows:
53
+ - [Grundwert $G$, 250 € (der volle Preis)]
54
+ - [Prozentsatz $p$, 12 %]
55
+ - [Rechnung, '$W = 250 \cdot 12 : 100 = 30$']
56
+ - [Prozentwert $W$, "**30 €** Rabatt"]
57
+ - type: figure
58
+ draw: { kind: hundred-grid, filled: 12 }
59
+ alt: Ein Hunderterfeld mit 100 Kästchen, 12 davon sind gefärbt.
60
+ caption: Das Hunderterfeld ist der Grundwert, 100 Kästchen sind 100 %. Die 12 gefärbten Kästchen sind der Prozentwert.
61
+ - type: text
62
+ text: "Über 1 %: 250 € : 100 = 2,50 € sind 1 %. Dann 2,50 € · 12 = 30 €."
63
+ - type: section
64
+ id: uebung
65
+ title: Übung
66
+ blocks:
67
+ - type: generated
68
+ id: prozentwert-ueben
69
+ given:
70
+ G: { int: [150, 1500], step: 5 }
71
+ p: { oneOf: [5, 10, 12, 15, 20, 25, 30, 40] }
72
+ where: ["decimals(G * p / 100) <= 2"]
73
+ task:
74
+ text: "Ein Fahrrad kostet {{G}} €. Im Angebot gibt es {{p}} % Rabatt. Wie viel Euro sparst du?"
75
+ answer: { value: "G * p / 100", compare: { number: { format: money } } }
76
+ mistakes:
77
+ - { value: "G * p", message: "Du hast vergessen, durch 100 zu teilen: {{p}} % sind {{p}} Hundertstel." }
78
+ - {
79
+ value: "G - G * p / 100",
80
+ message: "Das ist der neue Preis, nicht der Rabatt. Gefragt ist, wie viel du sparst.",
81
+ }
82
+ hint: "Rechne erst 1 % aus: {{G}} € geteilt durch 100. Dann nimm das mal {{p}}."
83
+ steps:
84
+ - '$W = \frac{G \cdot p}{100}$'
85
+ - '$W = \frac{{{G}} \cdot {{p}}}{100} = {{answer}}$, also {{answer}} € Rabatt.'
86
+ - type: vue-component
87
+ id: prozentfeld
88
+ component: ProzentFeld
89
+ props:
90
+ task: "Das Feld hat {G} Kästchen, zusammen sind sie 100 %. Färbe {p} % davon."
91
+ counter: "{n} von {G} Kästchen gefärbt"
92
+ cell: "Kästchen {n}"
93
+ mistakes:
94
+ - "Du hast {p} Kästchen gefärbt. Das wären {p} %, wenn das Feld 100 Kästchen hätte. Hier sind {G} Kästchen 100 %."
95
+ - "Du hast den Rest gefärbt. Die gefärbten Kästchen sollen die {p} % sein, nicht das, was übrig bleibt."
96
+ examples:
97
+ accepted:
98
+ - { answer: 2, seed: 1 }
99
+ rejected:
100
+ - { answer: 5, seed: 1 }
101
+ - { answer: 38, seed: 1 }
102
+ - { answer: 0 }
103
+ - type: open-task
104
+ id: tauschen-erklaeren
105
+ task: Erkläre in zwei bis vier Sätzen, warum 20 % von 50 € genauso viel sind wie 50 % von 20 €.
106
+ points:
107
+ - text: Der Prozentwert ist Grundwert mal Prozentsatz, geteilt durch 100.
108
+ source: /prozent/prozentwert/#regel
109
+ - text: "Beide Male kommt 20 · 50 : 100 = 10 heraus, also 10 €."
110
+ source: /prozent/prozentwert/#regel
111
+ - text: Beim Malnehmen darf man die Zahlen tauschen, darum ist das Ergebnis gleich.
112
+ source: /prozent/prozentwert/#regel
113
+ - text: Ganze Sätze mit einer Begründung (weil …, darum …).
114
+ kind: form
115
+ solution: |
116
+ Den Prozentwert rechnet man mit $W = \frac{G \cdot p}{100}$. Für 20 % von 50 € ist das
117
+ $\frac{50 \cdot 20}{100} = 10$, für 50 % von 20 € ist es $\frac{20 \cdot 50}{100} = 10$. Weil man beim
118
+ Malnehmen die Zahlen tauschen darf, kommt beide Male 10 € heraus.
119
+ hint: Setz beide Male in die Formel ein und vergleich, was im Zähler steht.
@@ -0,0 +1 @@
1
+ { "extends": "@lernapps/tooling/tsconfig.json", "include": ["src"] }
@@ -0,0 +1,4 @@
1
+ import { lernapps } from "@lernapps/tooling/preset";
2
+ import { explainer } from "@lernapps/app-templates/explainer/plugin";
3
+
4
+ export default lernapps({ plugins: [explainer()] });
@@ -0,0 +1,5 @@
1
+ # Paths the architecture does not claim (arc42 H021), relative to this template folder.
2
+ # The entry, which hands the app's core and root component to the shell (if-start), and type declarations for Vite
3
+ # and Vue single-file components: configuration rather than architecture.
4
+ src/main.ts
5
+ src/env.d.ts
@@ -0,0 +1,28 @@
1
+ # Archetype interactive
2
+
3
+ One app page where the learner's doing is the content: a game, a trainer, a simulation. A static start page says what
4
+ it is and works without JavaScript.
5
+
6
+ ## What it can do
7
+
8
+ - Any interaction in one page: keys, buttons, touch.
9
+ - Timers and moving parts: the runtime's clock ticks the app's core.
10
+ - Its own look and colours, images, and libraries with an open licence, bundled.
11
+ - Routes for modes or levels, which a link can open.
12
+ - The learning state on the learner's device, at most 100 kB.
13
+ - German, plus English: texts in message files.
14
+ - Playthroughs prove its behaviour: the build plays them against the core, the browser on desktop and at 360 px.
15
+
16
+ ## What it cannot do yet
17
+
18
+ - No full-screen app page: the runtime always shows its frame; an overlay inside it works.
19
+ - No storage beyond 100 kB.
20
+ - No property tests of the core over fixed seeds.
21
+ - A time limit or a required keyboard deviates from accessibility or from 360 px: the catalog entry says so.
22
+
23
+ ## What the app supplies
24
+
25
+ - `src/app.yaml` ([schema](../runtime/interactive/interactive.v1.schema.json)), the core
26
+ `src/core/index.ts`, its Vue components in `src/ui/`, data in `src/data/`, texts in `src/messages/`, playthroughs in
27
+ `src/playthroughs/` ([schema](../runtime/interactive/playthrough.v1.schema.json)), and its part of the
28
+ architecture in `docs/arc42/`.
@@ -0,0 +1,4 @@
1
+ node_modules/
2
+ dist/
3
+ test-results/
4
+ playwright-report/