feat: implement CPP09 C++20 card

This commit is contained in:
user
2026-07-21 20:11:42 +02:00
commit 54336435e1
36 changed files with 7623 additions and 0 deletions
+372
View File
@@ -0,0 +1,372 @@
{
"$schema": "../../../../tools/card-layouts/schemas/card-source.schema.json",
"schema": "esc-card-source.v1",
"card": {
"id": "mpabi-inf-cpp-y2s1-09-raii",
"series": "cpp",
"series_title": "C++ · Rok 2 · Semestr 1",
"number": "09",
"count": "10",
"slug": "raii",
"title": "CPP09 · RAII: zasób związany z czasem życia obiektu",
"topic": "Pozyskanie w konstruktorze, zwolnienie w destruktorze i wszystkie wyjścia z zakresu",
"project": "C++20 · fundamenty języka i modelu obiektu",
"subject": "Informatyka",
"level": "Rok 2 · Semestr 1",
"revision_date": "2026-07-21T00:00:00+02:00",
"status": "Gotowa do wykonania",
"version": "v00.01",
"uuid": "c7775845-9712-515c-aa36-18ae4db0d588",
"author": "M. Pabiszczak",
"year": "2026"
},
"generated": {
"tex": "doc/generated/main.tex",
"html": "web/index.html",
"html_css": "web/style.css",
"react_app": true,
"html_tree_inspector": false
},
"template": "templates/karta-klasyczna.json",
"title_block": {
"category": "KARTA PRACY · INFORMATYKA · C++20",
"standard": "ISO 7200",
"prepared_by": "M. Pabiszczak",
"prepared_on": "21.07.2026",
"checked_by": "testy automatyczne",
"approved_by": "—",
"url": "http://localhost:8080",
"repository_url": "https://zsl-gitea.mpabi.pl/edu-cpp/lab-cpp-raii",
"revision": "1",
"issued_on": "21.07.2026",
"series": "CPP-Y2S1-09",
"document_type": "karta pracy",
"tool": "card-layouts",
"sheet": "1 / 1",
"show_qr": false,
"show_repository_qr": false,
"height_cm": 3,
"repeat_on_every_page": true,
"replace_front_matter": true
},
"front_page_scope": {
"title": "Cel karty",
"content_tex": "Zapewnić zwolnienie zasobu przez strukturę programu, także przy wczesnym return.",
"scope_title": "Zakres tasków",
"scope_table": {
"headers": [
"Krok",
"Numer tasku",
"Najważniejsza idea",
"Priorytet",
"Status",
"Version"
],
"rows": [
{
"chapter": "1",
"task": "Task01",
"idea_tex": "Uchwyt jako obiekt",
"priority": "obowiązkowe",
"status": "ready",
"version": "v00.01"
},
{
"chapter": "1",
"task": "Task02",
"idea_tex": "Wczesny return",
"priority": "obowiązkowe",
"status": "ready",
"version": "v00.01"
},
{
"chapter": "1",
"task": "Task03",
"idea_tex": "Zagnieżdżone zasoby",
"priority": "obowiązkowe",
"status": "ready",
"version": "v00.01"
}
]
}
},
"learning_effects": {
"CPP09.EN01": {
"text": "Uczeń wyjaśnia reguły C++20 związane z tematem: Pozyskanie w konstruktorze, zwolnienie w destruktorze i wszystkie wyjścia z zakresu.",
"label": "Model języka",
"bloom_level": "Analiza",
"assessment_criteria": [
"CPP09.KW01"
]
},
"CPP09.EK01": {
"text": "Uczeń implementuje, kompiluje i weryfikuje trzy małe eksperymenty C++20.",
"label": "Eksperyment C++",
"bloom_level": "Zastosowanie",
"assessment_criteria": [
"CPP09.KW01"
]
}
},
"assessment_criteria": {
"CPP09.KW01": {
"text": "Trzy taski kompilują się bez ostrzeżeń i zwracają dokładny, testowany wynik.",
"learning_effects": [
"CPP09.EN01",
"CPP09.EK01"
]
}
},
"educational_requirements": {
"CPP09.WE01": {
"text": "Zapewnić zwolnienie zasobu przez strukturę programu, także przy wczesnym return.",
"label": "Pozyskanie w konstruktorze, zwolnienie w destruktorze i wszystkie wyjścia z zakresu",
"learning_effects": [
"CPP09.EN01",
"CPP09.EK01"
],
"learning_tree": {
"schema": "we-learning-tree.v1",
"policy": "Każde twierdzenie o języku ma dowód w kodzie, wyniku programu albo symbolach binarnych.",
"ogolne": [
{
"tree_id": "CPP09.WE01.OG.IP.01",
"effect_ref": "CPP09.EN01",
"display": "EN IP CPP09",
"text": "Uczeń przewiduje zachowanie programu na podstawie reguł języka.",
"kw": [
{
"criterion_ref": "CPP09.KW01",
"display": "KW IP CPP09",
"text": "Uzasadnia przewidywany wynik."
}
]
}
],
"zawodowe": [
{
"tree_id": "CPP09.WE01.TECH.I4.01",
"effect_ref": "CPP09.EK01",
"display": "EK INF04 CPP09",
"text": "Uczeń buduje i testuje program C++20.",
"kw": [
{
"criterion_ref": "CPP09.KW01",
"display": "KW INF04 CPP09",
"text": "Uzyskuje trzy komunikaty PASS."
}
]
}
]
}
}
},
"sections": [
{
"title": "Task01 · Uchwyt jako obiekt",
"content_kind": "prose",
"content_tex": "Zwiąż stan otwarcia uchwytu z konstruktorem i destruktorem. Najpierw przewidź wynik, następnie skompiluj program z ostrzeżeniami traktowanymi jako błędy i porównaj dokładny stdout z kontraktem: acquire; open=1; release; open=0.",
"educational_requirement_refs": [
"CPP09.WE01"
],
"learning_effect_refs": [
"CPP09.EN01",
"CPP09.EK01"
],
"assessment_criterion_refs": [
"CPP09.KW01"
],
"area_tree_refs": [
"CPP09.WE01.OG.IP.01",
"CPP09.WE01.TECH.I4.01"
],
"steps": [
{
"id": "T01-PREDICT",
"title": "Zapisz przewidywany wynik i wskaż regułę języka.",
"tree_refs": [
"CPP09.WE01.OG.IP.01"
]
},
{
"id": "T01-VERIFY",
"title": "Uruchom test i zachowaj mierzalny dowód wykonania.",
"tree_refs": [
"CPP09.WE01.TECH.I4.01"
]
}
]
},
{
"title": "Task02 · Wczesny return",
"content_kind": "prose",
"content_tex": "Potwierdź zwolnienie strażnika przy wyjściu z funkcji przed jej końcem. Najpierw przewidź wynik, następnie skompiluj program z ostrzeżeniami traktowanymi jako błędy i porównaj dokładny stdout z kontraktem: acquire; work=short; release; after.",
"educational_requirement_refs": [
"CPP09.WE01"
],
"learning_effect_refs": [
"CPP09.EN01",
"CPP09.EK01"
],
"assessment_criterion_refs": [
"CPP09.KW01"
],
"area_tree_refs": [
"CPP09.WE01.OG.IP.01",
"CPP09.WE01.TECH.I4.01"
],
"steps": [
{
"id": "T02-PREDICT",
"title": "Zapisz przewidywany wynik i wskaż regułę języka.",
"tree_refs": [
"CPP09.WE01.OG.IP.01"
]
},
{
"id": "T02-VERIFY",
"title": "Uruchom test i zachowaj mierzalny dowód wykonania.",
"tree_refs": [
"CPP09.WE01.TECH.I4.01"
]
}
]
},
{
"title": "Task03 · Zagnieżdżone zasoby",
"content_kind": "prose",
"content_tex": "Sprawdź zwalnianie zagnieżdżonych zasobów w odwrotnej kolejności. Najpierw przewidź wynik, następnie skompiluj program z ostrzeżeniami traktowanymi jako błędy i porównaj dokładny stdout z kontraktem: acquire=A; acquire=B; inside; release=B; release=A.",
"educational_requirement_refs": [
"CPP09.WE01"
],
"learning_effect_refs": [
"CPP09.EN01",
"CPP09.EK01"
],
"assessment_criterion_refs": [
"CPP09.KW01"
],
"area_tree_refs": [
"CPP09.WE01.OG.IP.01",
"CPP09.WE01.TECH.I4.01"
],
"steps": [
{
"id": "T03-PREDICT",
"title": "Zapisz przewidywany wynik i wskaż regułę języka.",
"tree_refs": [
"CPP09.WE01.OG.IP.01"
]
},
{
"id": "T03-VERIFY",
"title": "Uruchom test i zachowaj mierzalny dowód wykonania.",
"tree_refs": [
"CPP09.WE01.TECH.I4.01"
]
}
]
}
],
"tasks": {
"task01": {
"prompt_tex": "Zwiąż stan otwarcia uchwytu z konstruktorem i destruktorem.",
"criterion": "acquire; open=1; release; open=0",
"assessment_criterion_ref": "CPP09.KW01"
},
"task02": {
"prompt_tex": "Potwierdź zwolnienie strażnika przy wyjściu z funkcji przed jej końcem.",
"criterion": "acquire; work=short; release; after",
"assessment_criterion_ref": "CPP09.KW01"
},
"task03": {
"prompt_tex": "Sprawdź zwalnianie zagnieżdżonych zasobów w odwrotnej kolejności.",
"criterion": "acquire=A; acquire=B; inside; release=B; release=A",
"assessment_criterion_ref": "CPP09.KW01"
}
},
"tasks_order": [
"task01",
"task02",
"task03"
],
"mission": "Zapewnić zwolnienie zasobu przez strukturę programu, także przy wczesnym return.",
"objectives": [
"Wyjaśnisz badaną regułę C++20.",
"Skompilujesz program z pełnym zestawem ostrzeżeń.",
"Porównasz dokładny wynik i ślad debuggera."
],
"agenda": [
{
"time": "0--15 min",
"work": "Model i przewidywanie."
},
{
"time": "15--45 min",
"work": "Trzy eksperymenty kodowe."
},
{
"time": "45--60 min",
"work": "Debug, wnioski i raport."
}
],
"tech_stack": {
"software": [
{
"name": "C++20",
"use": "standard języka"
},
{
"name": "GCC/GDB",
"use": "kompilacja i dowód wykonania"
},
{
"name": "stemctl",
"use": "izolowany profil native-amd64"
}
],
"hardware": [
{
"name": "Brak",
"use": "laboratorium kontenerowe"
}
]
},
"container_test": {
"title": "Test w profilu native-amd64",
"commands": [
"stemctl test native-amd64 cpp CPP09 1",
"stemctl test native-amd64 cpp CPP09 2",
"stemctl debug native-amd64 cpp CPP09 3"
],
"pass_condition": "Trzy wyniki zgodne z expected i niepusty debug.log."
},
"safety_rules": [
{
"title": "Brak niezdefiniowanego zachowania",
"body": "Kod testowy nie dereferencjonuje nullptr i nie używa obiektu po zakończeniu czasu życia."
},
{
"title": "Jedna zmienna naraz",
"body": "Każdy task izoluje jedną regułę języka i ma deterministyczny stdout."
}
],
"hardware_procedure": [
{
"step": "1",
"action": "Przewidź wynik.",
"condition": "Reguła języka zapisana przed uruchomieniem."
},
{
"step": "2",
"action": "Uruchom trzy taski.",
"condition": "Trzy komunikaty PASS."
},
{
"step": "3",
"action": "Odczytaj debug.log.",
"condition": "Debugger zatrzymał program w main."
}
],
"references": []
}