{ "$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": [] }