{ "$schema": "../../../../tools/card-layouts/schemas/card-source.schema.json", "schema": "esc-card-source.v1", "card": { "id": "mpabi-inf-cpp-y2s1-08-scope-lifetime", "series": "cpp", "series_title": "C++ · Rok 2 · Semestr 1", "number": "08", "count": "10", "slug": "scope-lifetime", "title": "CPP08 · Zakres i czas życia obiektów", "topic": "Obiekty automatyczne, statyczne i dynamiczne oraz przesłanianie nazw", "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": "0d0c3a10-2744-5245-ad9e-8a910694a5b2", "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-scope-lifetime", "revision": "1", "issued_on": "21.07.2026", "series": "CPP-Y2S1-08", "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": "Powiązać miejsce przechowywania obiektu z początkiem i końcem jego czasu życia.", "scope_title": "Zakres tasków", "scope_table": { "headers": [ "Krok", "Numer tasku", "Najważniejsza idea", "Priorytet", "Status", "Version" ], "rows": [ { "chapter": "1", "task": "Task01", "idea_tex": "Automatyczny i statyczny", "priority": "obowiązkowe", "status": "ready", "version": "v00.01" }, { "chapter": "1", "task": "Task02", "idea_tex": "Obiekt dynamiczny", "priority": "obowiązkowe", "status": "ready", "version": "v00.01" }, { "chapter": "1", "task": "Task03", "idea_tex": "Zakres i przesłanianie", "priority": "obowiązkowe", "status": "ready", "version": "v00.01" } ] } }, "learning_effects": { "CPP08.EN01": { "text": "Uczeń wyjaśnia reguły C++20 związane z tematem: Obiekty automatyczne, statyczne i dynamiczne oraz przesłanianie nazw.", "label": "Model języka", "bloom_level": "Analiza", "assessment_criteria": [ "CPP08.KW01" ] }, "CPP08.EK01": { "text": "Uczeń implementuje, kompiluje i weryfikuje trzy małe eksperymenty C++20.", "label": "Eksperyment C++", "bloom_level": "Zastosowanie", "assessment_criteria": [ "CPP08.KW01" ] } }, "assessment_criteria": { "CPP08.KW01": { "text": "Trzy taski kompilują się bez ostrzeżeń i zwracają dokładny, testowany wynik.", "learning_effects": [ "CPP08.EN01", "CPP08.EK01" ] } }, "educational_requirements": { "CPP08.WE01": { "text": "Powiązać miejsce przechowywania obiektu z początkiem i końcem jego czasu życia.", "label": "Obiekty automatyczne, statyczne i dynamiczne oraz przesłanianie nazw", "learning_effects": [ "CPP08.EN01", "CPP08.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": "CPP08.WE01.OG.IP.01", "effect_ref": "CPP08.EN01", "display": "EN IP CPP08", "text": "Uczeń przewiduje zachowanie programu na podstawie reguł języka.", "kw": [ { "criterion_ref": "CPP08.KW01", "display": "KW IP CPP08", "text": "Uzasadnia przewidywany wynik." } ] } ], "zawodowe": [ { "tree_id": "CPP08.WE01.TECH.I4.01", "effect_ref": "CPP08.EK01", "display": "EK INF04 CPP08", "text": "Uczeń buduje i testuje program C++20.", "kw": [ { "criterion_ref": "CPP08.KW01", "display": "KW INF04 CPP08", "text": "Uzyskuje trzy komunikaty PASS." } ] } ] } } }, "sections": [ { "title": "Task01 · Automatyczny i statyczny", "content_kind": "prose", "content_tex": "Porównaj nowy obiekt automatyczny z zachowującym stan obiektem statycznym. Najpierw przewidź wynik, następnie skompiluj program z ostrzeżeniami traktowanymi jako błędy i porównaj dokładny stdout z kontraktem: auto=7 static\\_calls=1,2.", "educational_requirement_refs": [ "CPP08.WE01" ], "learning_effect_refs": [ "CPP08.EN01", "CPP08.EK01" ], "assessment_criterion_refs": [ "CPP08.KW01" ], "area_tree_refs": [ "CPP08.WE01.OG.IP.01", "CPP08.WE01.TECH.I4.01" ], "steps": [ { "id": "T01-PREDICT", "title": "Zapisz przewidywany wynik i wskaż regułę języka.", "tree_refs": [ "CPP08.WE01.OG.IP.01" ] }, { "id": "T01-VERIFY", "title": "Uruchom test i zachowaj mierzalny dowód wykonania.", "tree_refs": [ "CPP08.WE01.TECH.I4.01" ] } ] }, { "title": "Task02 · Obiekt dynamiczny", "content_kind": "prose", "content_tex": "Jawnie zestaw new z delete i obserwuj moment wykonania destruktora. Najpierw przewidź wynik, następnie skompiluj program z ostrzeżeniami traktowanymi jako błędy i porównaj dokładny stdout z kontraktem: construct; value=11; destroy.", "educational_requirement_refs": [ "CPP08.WE01" ], "learning_effect_refs": [ "CPP08.EN01", "CPP08.EK01" ], "assessment_criterion_refs": [ "CPP08.KW01" ], "area_tree_refs": [ "CPP08.WE01.OG.IP.01", "CPP08.WE01.TECH.I4.01" ], "steps": [ { "id": "T02-PREDICT", "title": "Zapisz przewidywany wynik i wskaż regułę języka.", "tree_refs": [ "CPP08.WE01.OG.IP.01" ] }, { "id": "T02-VERIFY", "title": "Uruchom test i zachowaj mierzalny dowód wykonania.", "tree_refs": [ "CPP08.WE01.TECH.I4.01" ] } ] }, { "title": "Task03 · Zakres i przesłanianie", "content_kind": "prose", "content_tex": "Pokaż, że nazwa wewnętrzna nie zmienia obiektu o tej samej nazwie w zakresie zewnętrznym. Najpierw przewidź wynik, następnie skompiluj program z ostrzeżeniami traktowanymi jako błędy i porównaj dokładny stdout z kontraktem: outer=7; inner=9; outer=7.", "educational_requirement_refs": [ "CPP08.WE01" ], "learning_effect_refs": [ "CPP08.EN01", "CPP08.EK01" ], "assessment_criterion_refs": [ "CPP08.KW01" ], "area_tree_refs": [ "CPP08.WE01.OG.IP.01", "CPP08.WE01.TECH.I4.01" ], "steps": [ { "id": "T03-PREDICT", "title": "Zapisz przewidywany wynik i wskaż regułę języka.", "tree_refs": [ "CPP08.WE01.OG.IP.01" ] }, { "id": "T03-VERIFY", "title": "Uruchom test i zachowaj mierzalny dowód wykonania.", "tree_refs": [ "CPP08.WE01.TECH.I4.01" ] } ] } ], "tasks": { "task01": { "prompt_tex": "Porównaj nowy obiekt automatyczny z zachowującym stan obiektem statycznym.", "criterion": "auto=7 static\\_calls=1,2", "assessment_criterion_ref": "CPP08.KW01" }, "task02": { "prompt_tex": "Jawnie zestaw new z delete i obserwuj moment wykonania destruktora.", "criterion": "construct; value=11; destroy", "assessment_criterion_ref": "CPP08.KW01" }, "task03": { "prompt_tex": "Pokaż, że nazwa wewnętrzna nie zmienia obiektu o tej samej nazwie w zakresie zewnętrznym.", "criterion": "outer=7; inner=9; outer=7", "assessment_criterion_ref": "CPP08.KW01" } }, "tasks_order": [ "task01", "task02", "task03" ], "mission": "Powiązać miejsce przechowywania obiektu z początkiem i końcem jego czasu życia.", "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 CPP08 1", "stemctl test native-amd64 cpp CPP08 2", "stemctl debug native-amd64 cpp CPP08 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": [] }