diff --git a/scripts/extract-android-content.py b/scripts/extract-android-content.py index 2b48d65..b8147aa 100644 --- a/scripts/extract-android-content.py +++ b/scripts/extract-android-content.py @@ -1085,7 +1085,7 @@ def main() -> int: }) hw_lessons = [] - for i in range(1, 4): + for i in range(1, 5): hw_lessons.append({ "id": i, "titleKey": f"hw_unit{i}", diff --git a/src/hw.c b/src/hw.c index 974fbb5..9695a01 100644 --- a/src/hw.c +++ b/src/hw.c @@ -6,6 +6,7 @@ NetLesson hw_lessons[HW_LESSONS] = { { .n_slides = HW_SLIDES, .unit_page = "hwunit1", .ex_page = "hwex1" }, { .n_slides = HW2_SLIDES, .unit_page = "hwunit2", .ex_page = "hwex2" }, { .n_slides = HW3_SLIDES, .unit_page = "hwunit3", .ex_page = "hwex3" }, + { .n_slides = HW4_SLIDES, .unit_page = "hwunit4", .ex_page = "hwex4" }, }; void hw_rail_theme_reset(void); @@ -252,7 +253,7 @@ void hw_add_node(GtkFixed *fixed, int index) { GtkWidget *name; char *text; static const char *unit_keys[HW_LESSONS] = { - "hw_unit1", "hw_unit2", "hw_unit3" + "hw_unit1", "hw_unit2", "hw_unit3", "hw_unit4" }; card = gtk_button_new(); @@ -853,7 +854,7 @@ GtkWidget *build_hw_unit2_exercise_page(void) { GtkWidget *build_hw_unit3_page(void) { static const NetSlide slides[HW3_SLIDES] = { { - "1 / 4 • Bit", "Bit – nejmenší jednotka informace", + "1 / 2 • Bit", "Bit – nejmenší jednotka informace", "Bit = binary digit (dvojková číslice)", { "Bit je dvojková číslice – nabývá hodnoty 0 nebo 1.", @@ -863,7 +864,7 @@ GtkWidget *build_hw_unit3_page(void) { }, }, { - "2 / 4 • Byte", "Byte – adresovatelná jednotka paměti", + "2 / 2 • Byte", "Byte – adresovatelná jednotka paměti", "Tip: 1 B = 8 b", { "Byte je nejmenší adresovatelná jednotka paměti.", @@ -873,37 +874,6 @@ GtkWidget *build_hw_unit3_page(void) { NULL, }, }, - { - "3 / 4 • Integer", "Proměnná typu integer (celá čísla)", - "Tip: n bitů → 2ⁿ různých hodnot (např. 0 až 2ⁿ − 1)", - { - "Celá čísla se ukládají binárně v pevné řádové čárce.", - "Mají pevný počet bitů – standardně 16 nebo 32 " - "(tedy 2 nebo 4 byty).", - "Při 16bitovém formátu je 2¹⁶ = 65 536 různých hodnot; " - "u nezáporných čísel interval 0 až 2¹⁶ − 1, tedy 0–65 535.", - "Obecně u n bitů je M = 2ⁿ různých hodnot " - "(u 16 bitů je nejvyšší nezáporné číslo 65 535).", - "Ostatní čísla se do tohoto intervalu převádějí transformací " - "(mapováním na přirozená čísla z daného rozsahu).", - NULL, - }, - }, - { - "4 / 4 • Real", "Proměnná typu real (desetinná čísla)", - "Tip: tvar = mantisa × základ^exponent", - { - "Desetinná čísla se ukládají v pohyblivé řádové čárce " - "ve tvaru mantisa a exponent.", - "Mantisa je normalizovaná tak, že první platná číslice " - "je hned za desetinnou čárkou.", - "Posun řádové čárky vyrovná odpovídající změna exponentu.", - "Standardně zabírá 4 nebo 8 bytů v paměti.", - "Více bytů se používá jen tehdy, když potřebujeme vyšší " - "přesnost výpočtů.", - NULL, - }, - }, }; return build_hw_unit_page(&hw_lessons[2], "hw_unit3", "hw_unit3_sub", @@ -925,6 +895,58 @@ GtkWidget *build_hw_unit3_exercise_page(void) { 4, 0}, {"Kolik bitů má obvykle jeden byte?", {"2", "4", "8", "16"}, 4, 2}, + }; + static const char *hints[] = { + "Bit = dvojková číslice, nejmenší jednotka informace", + "Bit nabývá hodnoty 0 nebo 1", + "Byte = nejmenší adresovatelná jednotka paměti", + "1 B = 8 b", + }; + return build_hw_mcq_page(2, "hwunit3", "hw_ex3_title", "hw_quiz3_head", + qs, hints, 4); +} + +GtkWidget *build_hw_unit4_page(void) { + static const NetSlide slides[HW4_SLIDES] = { + { + "1 / 2 • Integer", "Proměnná typu integer (celá čísla)", + "Tip: n bitů → 2ⁿ různých hodnot (např. 0 až 2ⁿ − 1)", + { + "Celá čísla se ukládají binárně v pevné řádové čárce.", + "Mají pevný počet bitů – standardně 16 nebo 32 " + "(tedy 2 nebo 4 byty).", + "Při 16bitovém formátu je 2¹⁶ = 65 536 různých hodnot; " + "u nezáporných čísel interval 0 až 2¹⁶ − 1, tedy 0–65 535.", + "Obecně u n bitů je M = 2ⁿ různých hodnot " + "(u 16 bitů je nejvyšší nezáporné číslo 65 535).", + "Ostatní čísla se do tohoto intervalu převádějí transformací " + "(mapováním na přirozená čísla z daného rozsahu).", + NULL, + }, + }, + { + "2 / 2 • Real", "Proměnná typu real (desetinná čísla)", + "Tip: tvar = mantisa × základ^exponent", + { + "Desetinná čísla se ukládají v pohyblivé řádové čárce " + "ve tvaru mantisa a exponent.", + "Mantisa je normalizovaná tak, že první platná číslice " + "je hned za desetinnou čárkou.", + "Posun řádové čárky vyrovná odpovídající změna exponentu.", + "Standardně zabírá 4 nebo 8 bytů v paměti.", + "Více bytů se používá jen tehdy, když potřebujeme vyšší " + "přesnost výpočtů.", + NULL, + }, + }, + }; + + return build_hw_unit_page(&hw_lessons[3], "hw_unit4", "hw_unit4_sub", + slides, HW4_SLIDES); +} + +GtkWidget *build_hw_unit4_exercise_page(void) { + static const ChoiceQ qs[] = { {"Jak se ukládají celá čísla (integer)?", {"Jen jako text", "Binárně v pevné řádové čárce s pevným počtem bitů", @@ -949,15 +971,11 @@ GtkWidget *build_hw_unit3_exercise_page(void) { 4, 1}, }; static const char *hints[] = { - "Bit = dvojková číslice, nejmenší jednotka informace", - "Bit nabývá hodnoty 0 nebo 1", - "Byte = nejmenší adresovatelná jednotka paměti", - "1 B = 8 b", "Integer = pevná řádová čárka, pevný počet bitů (16/32…)", "16 bitů → 2¹⁶ = 65 536 hodnot (0–65 535 u nezáporných)", "Real = pohyblivá řádová čárka = mantisa + exponent", "Normalizace: 1. platná číslice hned za desetinnou čárkou", }; - return build_hw_mcq_page(2, "hwunit3", "hw_ex3_title", "hw_quiz3_head", - qs, hints, 8); + return build_hw_mcq_page(3, "hwunit4", "hw_ex4_title", "hw_quiz4_head", + qs, hints, 4); } diff --git a/src/i18n.c b/src/i18n.c index 40b328d..7c12555 100644 --- a/src/i18n.c +++ b/src/i18n.c @@ -536,12 +536,19 @@ const TrEntry tr_ui[] = { {"hw_quiz2_head", "Kvíz k historii počítačů", "Quiz on the history of computers"}, {"hw_unit3", "Zobrazování dat v počítači", "Data representation"}, - {"hw_unit3_sub", "4 snímky: bit, byte, integer a real – a pak kvíz.", - "4 slides: bit, byte, integer and real – then a quiz."}, + {"hw_unit3_sub", "2 snímky o bitu a bytu a pak kvíz.", + "2 slides about bits and bytes, then a quiz."}, {"hw_ex3_title", "Kvíz: zobrazování dat", "Quiz: data representation"}, {"hw_quiz3_head", "Kvíz k zobrazování dat v počítači", "Quiz on data representation in computers"}, + {"hw_unit4", "Celá a desetinná čísla", "Integers and reals"}, + {"hw_unit4_sub", "2 snímky o integer a real a pak kvíz.", + "2 slides about integer and real, then a quiz."}, + {"hw_ex4_title", "Kvíz: integer a real", + "Quiz: integer and real"}, + {"hw_quiz4_head", "Kvíz k celým a desetinným číslům", + "Quiz on integers and floating-point numbers"}, {"czech_sub", "Vyberte oblast a začněte procvičovat.", "Pick an area and start practicing."}, {"Literatura", "Literatura", "Literature"}, diff --git a/src/main.c b/src/main.c index 037d531..d74f4bc 100644 --- a/src/main.c +++ b/src/main.c @@ -390,6 +390,7 @@ static gboolean run_smoke_test(gpointer data) { "cetba1984", "cetba1984quiz", "cetba1984dej", "cetbaFuks", "cetbaFuksQuiz", "cetbaFuksDej", "hwunit1", "hwex1", "hwunit2", "hwex2", "hwunit3", "hwex3", + "hwunit4", "hwex4", "unit1", "unit2", "unit3", "u1e1", "u1e13", "u2e1", "u2e19", "u3e1", "u3e15", "u1vocab", "u2vocab", "u3vocab", @@ -530,6 +531,8 @@ void activate(GtkApplication *app, gpointer user_data) { gtk_stack_add_named(main_stack, build_hw_unit2_exercise_page(), "hwex2"); gtk_stack_add_named(main_stack, build_hw_unit3_page(), "hwunit3"); gtk_stack_add_named(main_stack, build_hw_unit3_exercise_page(), "hwex3"); + gtk_stack_add_named(main_stack, build_hw_unit4_page(), "hwunit4"); + gtk_stack_add_named(main_stack, build_hw_unit4_exercise_page(), "hwex4"); { typedef GtkWidget *(*NetBuilder)(void); static const struct { diff --git a/src/maturita.h b/src/maturita.h index ad011fe..93c73f3 100644 --- a/src/maturita.h +++ b/src/maturita.h @@ -113,10 +113,11 @@ extern char *app_progress_cetba; #define NET27_SLIDES 8 #define NET_LESSONS 27 #define HW_UNITS 10 -#define HW_LESSONS 3 +#define HW_LESSONS 4 #define HW_SLIDES 3 #define HW2_SLIDES 6 -#define HW3_SLIDES 4 +#define HW3_SLIDES 2 +#define HW4_SLIDES 2 typedef enum { THEME_CATPPUCCIN = 0, @@ -866,6 +867,8 @@ GtkWidget *build_hw_unit2_page(void); GtkWidget *build_hw_unit2_exercise_page(void); GtkWidget *build_hw_unit3_page(void); GtkWidget *build_hw_unit3_exercise_page(void); +GtkWidget *build_hw_unit4_page(void); +GtkWidget *build_hw_unit4_exercise_page(void); void draw_chip_icon(GtkDrawingArea *area, cairo_t *cr, int width, int height, gpointer data); void draw_czech_flag(GtkDrawingArea *area, cairo_t *cr,