373 lines
11 KiB
JSON
373 lines
11 KiB
JSON
{
|
|
"$schema": "../../../../tools/card-layouts/schemas/card-source.schema.json",
|
|
"schema": "esc-card-source.v1",
|
|
"card": {
|
|
"id": "mpabi-inf-cpp-y2s1-10-copy-move",
|
|
"series": "cpp",
|
|
"series_title": "C++ · Rok 2 · Semestr 1",
|
|
"number": "10",
|
|
"count": "10",
|
|
"slug": "copy-move",
|
|
"title": "CPP10 · Kopiowanie, przenoszenie i Rule of Zero/Five",
|
|
"topic": "Głębokie kopiowanie, transfer własności i typy składowe zarządzające zasobem",
|
|
"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": "7894d2da-5772-5846-8f1e-c98ed215ea2c",
|
|
"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-copy-move",
|
|
"revision": "1",
|
|
"issued_on": "21.07.2026",
|
|
"series": "CPP-Y2S1-10",
|
|
"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": "Rozróżnić kopię od przeniesienia i wybrać Rule of Zero dla bezpiecznego typu zasobowego.",
|
|
"scope_title": "Zakres tasków",
|
|
"scope_table": {
|
|
"headers": [
|
|
"Krok",
|
|
"Numer tasku",
|
|
"Najważniejsza idea",
|
|
"Priorytet",
|
|
"Status",
|
|
"Version"
|
|
],
|
|
"rows": [
|
|
{
|
|
"chapter": "1",
|
|
"task": "Task01",
|
|
"idea_tex": "Głęboka kopia",
|
|
"priority": "obowiązkowe",
|
|
"status": "ready",
|
|
"version": "v00.01"
|
|
},
|
|
{
|
|
"chapter": "1",
|
|
"task": "Task02",
|
|
"idea_tex": "Przeniesienie własności",
|
|
"priority": "obowiązkowe",
|
|
"status": "ready",
|
|
"version": "v00.01"
|
|
},
|
|
{
|
|
"chapter": "1",
|
|
"task": "Task03",
|
|
"idea_tex": "Rule of Zero",
|
|
"priority": "obowiązkowe",
|
|
"status": "ready",
|
|
"version": "v00.01"
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"learning_effects": {
|
|
"CPP10.EN01": {
|
|
"text": "Uczeń wyjaśnia reguły C++20 związane z tematem: Głębokie kopiowanie, transfer własności i typy składowe zarządzające zasobem.",
|
|
"label": "Model języka",
|
|
"bloom_level": "Analiza",
|
|
"assessment_criteria": [
|
|
"CPP10.KW01"
|
|
]
|
|
},
|
|
"CPP10.EK01": {
|
|
"text": "Uczeń implementuje, kompiluje i weryfikuje trzy małe eksperymenty C++20.",
|
|
"label": "Eksperyment C++",
|
|
"bloom_level": "Zastosowanie",
|
|
"assessment_criteria": [
|
|
"CPP10.KW01"
|
|
]
|
|
}
|
|
},
|
|
"assessment_criteria": {
|
|
"CPP10.KW01": {
|
|
"text": "Trzy taski kompilują się bez ostrzeżeń i zwracają dokładny, testowany wynik.",
|
|
"learning_effects": [
|
|
"CPP10.EN01",
|
|
"CPP10.EK01"
|
|
]
|
|
}
|
|
},
|
|
"educational_requirements": {
|
|
"CPP10.WE01": {
|
|
"text": "Rozróżnić kopię od przeniesienia i wybrać Rule of Zero dla bezpiecznego typu zasobowego.",
|
|
"label": "Głębokie kopiowanie, transfer własności i typy składowe zarządzające zasobem",
|
|
"learning_effects": [
|
|
"CPP10.EN01",
|
|
"CPP10.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": "CPP10.WE01.OG.IP.01",
|
|
"effect_ref": "CPP10.EN01",
|
|
"display": "EN IP CPP10",
|
|
"text": "Uczeń przewiduje zachowanie programu na podstawie reguł języka.",
|
|
"kw": [
|
|
{
|
|
"criterion_ref": "CPP10.KW01",
|
|
"display": "KW IP CPP10",
|
|
"text": "Uzasadnia przewidywany wynik."
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"zawodowe": [
|
|
{
|
|
"tree_id": "CPP10.WE01.TECH.I4.01",
|
|
"effect_ref": "CPP10.EK01",
|
|
"display": "EK INF04 CPP10",
|
|
"text": "Uczeń buduje i testuje program C++20.",
|
|
"kw": [
|
|
{
|
|
"criterion_ref": "CPP10.KW01",
|
|
"display": "KW INF04 CPP10",
|
|
"text": "Uzyskuje trzy komunikaty PASS."
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|
|
}
|
|
},
|
|
"sections": [
|
|
{
|
|
"title": "Task01 · Głęboka kopia",
|
|
"content_kind": "prose",
|
|
"content_tex": "Zaimplementuj kopię bufora tak, aby dwa obiekty nie współdzieliły jednej komórki. Najpierw przewidź wynik, następnie skompiluj program z ostrzeżeniami traktowanymi jako błędy i porównaj dokładny stdout z kontraktem: original=7 copy=9 distinct=1.",
|
|
"educational_requirement_refs": [
|
|
"CPP10.WE01"
|
|
],
|
|
"learning_effect_refs": [
|
|
"CPP10.EN01",
|
|
"CPP10.EK01"
|
|
],
|
|
"assessment_criterion_refs": [
|
|
"CPP10.KW01"
|
|
],
|
|
"area_tree_refs": [
|
|
"CPP10.WE01.OG.IP.01",
|
|
"CPP10.WE01.TECH.I4.01"
|
|
],
|
|
"steps": [
|
|
{
|
|
"id": "T01-PREDICT",
|
|
"title": "Zapisz przewidywany wynik i wskaż regułę języka.",
|
|
"tree_refs": [
|
|
"CPP10.WE01.OG.IP.01"
|
|
]
|
|
},
|
|
{
|
|
"id": "T01-VERIFY",
|
|
"title": "Uruchom test i zachowaj mierzalny dowód wykonania.",
|
|
"tree_refs": [
|
|
"CPP10.WE01.TECH.I4.01"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"title": "Task02 · Przeniesienie własności",
|
|
"content_kind": "prose",
|
|
"content_tex": "Przenieś bufor move-only i pozostaw obiekt źródłowy w poprawnym stanie pustym. Najpierw przewidź wynik, następnie skompiluj program z ostrzeżeniami traktowanymi jako błędy i porównaj dokładny stdout z kontraktem: src\\_empty=1 value=42.",
|
|
"educational_requirement_refs": [
|
|
"CPP10.WE01"
|
|
],
|
|
"learning_effect_refs": [
|
|
"CPP10.EN01",
|
|
"CPP10.EK01"
|
|
],
|
|
"assessment_criterion_refs": [
|
|
"CPP10.KW01"
|
|
],
|
|
"area_tree_refs": [
|
|
"CPP10.WE01.OG.IP.01",
|
|
"CPP10.WE01.TECH.I4.01"
|
|
],
|
|
"steps": [
|
|
{
|
|
"id": "T02-PREDICT",
|
|
"title": "Zapisz przewidywany wynik i wskaż regułę języka.",
|
|
"tree_refs": [
|
|
"CPP10.WE01.OG.IP.01"
|
|
]
|
|
},
|
|
{
|
|
"id": "T02-VERIFY",
|
|
"title": "Uruchom test i zachowaj mierzalny dowód wykonania.",
|
|
"tree_refs": [
|
|
"CPP10.WE01.TECH.I4.01"
|
|
]
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"title": "Task03 · Rule of Zero",
|
|
"content_kind": "prose",
|
|
"content_tex": "Zbuduj typ z bezpiecznych składowych standardowych bez własnego destruktora i operacji copy/move. Najpierw przewidź wynik, następnie skompiluj program z ostrzeżeniami traktowanymi jako błędy i porównaj dokładny stdout z kontraktem: copy=alpha original=beta moved=alpha.",
|
|
"educational_requirement_refs": [
|
|
"CPP10.WE01"
|
|
],
|
|
"learning_effect_refs": [
|
|
"CPP10.EN01",
|
|
"CPP10.EK01"
|
|
],
|
|
"assessment_criterion_refs": [
|
|
"CPP10.KW01"
|
|
],
|
|
"area_tree_refs": [
|
|
"CPP10.WE01.OG.IP.01",
|
|
"CPP10.WE01.TECH.I4.01"
|
|
],
|
|
"steps": [
|
|
{
|
|
"id": "T03-PREDICT",
|
|
"title": "Zapisz przewidywany wynik i wskaż regułę języka.",
|
|
"tree_refs": [
|
|
"CPP10.WE01.OG.IP.01"
|
|
]
|
|
},
|
|
{
|
|
"id": "T03-VERIFY",
|
|
"title": "Uruchom test i zachowaj mierzalny dowód wykonania.",
|
|
"tree_refs": [
|
|
"CPP10.WE01.TECH.I4.01"
|
|
]
|
|
}
|
|
]
|
|
}
|
|
],
|
|
"tasks": {
|
|
"task01": {
|
|
"prompt_tex": "Zaimplementuj kopię bufora tak, aby dwa obiekty nie współdzieliły jednej komórki.",
|
|
"criterion": "original=7 copy=9 distinct=1",
|
|
"assessment_criterion_ref": "CPP10.KW01"
|
|
},
|
|
"task02": {
|
|
"prompt_tex": "Przenieś bufor move-only i pozostaw obiekt źródłowy w poprawnym stanie pustym.",
|
|
"criterion": "src\\_empty=1 value=42",
|
|
"assessment_criterion_ref": "CPP10.KW01"
|
|
},
|
|
"task03": {
|
|
"prompt_tex": "Zbuduj typ z bezpiecznych składowych standardowych bez własnego destruktora i operacji copy/move.",
|
|
"criterion": "copy=alpha original=beta moved=alpha",
|
|
"assessment_criterion_ref": "CPP10.KW01"
|
|
}
|
|
},
|
|
"tasks_order": [
|
|
"task01",
|
|
"task02",
|
|
"task03"
|
|
],
|
|
"mission": "Rozróżnić kopię od przeniesienia i wybrać Rule of Zero dla bezpiecznego typu zasobowego.",
|
|
"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 CPP10 1",
|
|
"stemctl test native-amd64 cpp CPP10 2",
|
|
"stemctl debug native-amd64 cpp CPP10 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": []
|
|
}
|