mirror of
https://github.com/pepaskopec-blip/Graduately.git
synced 2026-10-27 07:04:35 +00:00
Open software as four years from Windows and Office to policy.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
ec7aa63159
commit
264f4a73d8
84 changed files with 3327 additions and 4 deletions
|
|
@ -76,6 +76,8 @@ Intel Mac, jiná architektura nebo úpravy kódu → [sestavení ze zdroje](#ses
|
||||||
- **Prezentační grafika** — 4 ročníky, v každém 8 lekcí: Photoshop od pixelu
|
- **Prezentační grafika** — 4 ročníky, v každém 8 lekcí: Photoshop od pixelu
|
||||||
po plakát, Premiere Pro a ve čtvrtém ročníku Illustrator, After Effects
|
po plakát, Premiere Pro a ve čtvrtém ročníku Illustrator, After Effects
|
||||||
a InDesign
|
a InDesign
|
||||||
|
- **Programové vybavení** — 4 ročníky, v každém 8 lekcí: Windows a licence,
|
||||||
|
Word a Excel, Access a MySQL, pak WordPress, Power BI, dávkové soubory a zásady
|
||||||
- **Programování** — 4 ročníky C# po vzoru W3Schools. U každé lekce se kód
|
- **Programování** — 4 ročníky C# po vzoru W3Schools. U každé lekce se kód
|
||||||
píše a spouští vedle výkladu, od výpisu po třídy, LINQ a async
|
píše a spouští vedle výkladu, od výpisu po třídy, LINQ a async
|
||||||
- **Český jazyk a literatura** — literatura (4 ročníky, 32 lekcí podle osnov
|
- **Český jazyk a literatura** — literatura (4 ročníky, 32 lekcí podle osnov
|
||||||
|
|
@ -97,7 +99,7 @@ Intel Mac, jiná architektura nebo úpravy kódu → [sestavení ze zdroje](#ses
|
||||||
|
|
||||||
### Použití
|
### Použití
|
||||||
|
|
||||||
1. **Úvod** ukáže postup a mřížku předmětů. Otevřený předmět spustí cestu. Zamčená dlaždice zatím nic neotevře: programové vybavení.
|
1. **Úvod** ukáže postup a mřížku předmětů. Každý předmět spustí svou cestu.
|
||||||
2. U němčiny je učebnice (Neue Freunde, Aus aller Welt, Bei uns zu Hause) a čtyři ročníky. Ostatní otevřené předměty mají ročníky, lekce nebo knihy.
|
2. U němčiny je učebnice (Neue Freunde, Aus aller Welt, Bei uns zu Hause) a čtyři ročníky. Ostatní otevřené předměty mají ročníky, lekce nebo knihy.
|
||||||
3. Z cesty se otevře výklad, poslech, čtení, psaní nebo kvíz.
|
3. Z cesty se otevře výklad, poslech, čtení, psaní nebo kvíz.
|
||||||
4. **Statistiky**, **Nastavení** a **Hledat** jsou v postranním panelu na Macu. Na telefonu a v desktopové aplikaci jsou na záložkách, hledání navíc ikonou lupy. Zkratka je `Cmd/Ctrl+K`.
|
4. **Statistiky**, **Nastavení** a **Hledat** jsou v postranním panelu na Macu. Na telefonu a v desktopové aplikaci jsou na záložkách, hledání navíc ikonou lupy. Zkratka je `Cmd/Ctrl+K`.
|
||||||
|
|
|
||||||
|
|
@ -34,6 +34,8 @@ import org.maturita.maturita.ui.LessonListScreen
|
||||||
import org.maturita.maturita.ui.FyzQuizScreen
|
import org.maturita.maturita.ui.FyzQuizScreen
|
||||||
import org.maturita.maturita.ui.PgQuizScreen
|
import org.maturita.maturita.ui.PgQuizScreen
|
||||||
import org.maturita.maturita.ui.PgYearsScreen
|
import org.maturita.maturita.ui.PgYearsScreen
|
||||||
|
import org.maturita.maturita.ui.SwQuizScreen
|
||||||
|
import org.maturita.maturita.ui.SwYearsScreen
|
||||||
import org.maturita.maturita.ui.TgQuizScreen
|
import org.maturita.maturita.ui.TgQuizScreen
|
||||||
import org.maturita.maturita.ui.TgYearsScreen
|
import org.maturita.maturita.ui.TgYearsScreen
|
||||||
import org.maturita.maturita.ui.MathPracticeScreen
|
import org.maturita.maturita.ui.MathPracticeScreen
|
||||||
|
|
@ -645,6 +647,63 @@ private fun MaturitaAppBody(vm: AppViewModel) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
is Route.Pg4Ex -> PgQuizScreen(vm, 4, r.id)
|
is Route.Pg4Ex -> PgQuizScreen(vm, 4, r.id)
|
||||||
|
Route.SwYears -> SwYearsScreen(vm)
|
||||||
|
Route.SwMap -> LessonListScreen(
|
||||||
|
vm, vm.tr("sw_year1"), vm.tr("sw_sub"),
|
||||||
|
vm.content.sw.map { l ->
|
||||||
|
val id = l.int("id")
|
||||||
|
LessonRow(vm.tr(l.str("titleKey")), vm.progress.swDone(id), Route.SwLesson(id))
|
||||||
|
},
|
||||||
|
)
|
||||||
|
is Route.SwLesson -> {
|
||||||
|
val l = vm.content.swLesson(r.id)
|
||||||
|
if (l != null) SlidesScreen(vm, vm.tr(l.str("titleKey")), vm.tr(l.str("subKey")), l.arr("slides")) {
|
||||||
|
vm.replace(Route.SwEx(r.id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is Route.SwEx -> SwQuizScreen(vm, 1, r.id)
|
||||||
|
Route.Sw2Map -> LessonListScreen(
|
||||||
|
vm, vm.tr("sw_year2"), vm.tr("sw2_sub"),
|
||||||
|
vm.content.sw2.map { l ->
|
||||||
|
val id = l.int("id")
|
||||||
|
LessonRow(vm.tr(l.str("titleKey")), vm.progress.sw2Done(id), Route.Sw2Lesson(id))
|
||||||
|
},
|
||||||
|
)
|
||||||
|
is Route.Sw2Lesson -> {
|
||||||
|
val l = vm.content.sw2Lesson(r.id)
|
||||||
|
if (l != null) SlidesScreen(vm, vm.tr(l.str("titleKey")), vm.tr(l.str("subKey")), l.arr("slides")) {
|
||||||
|
vm.replace(Route.Sw2Ex(r.id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is Route.Sw2Ex -> SwQuizScreen(vm, 2, r.id)
|
||||||
|
Route.Sw3Map -> LessonListScreen(
|
||||||
|
vm, vm.tr("sw_year3"), vm.tr("sw3_sub"),
|
||||||
|
vm.content.sw3.map { l ->
|
||||||
|
val id = l.int("id")
|
||||||
|
LessonRow(vm.tr(l.str("titleKey")), vm.progress.sw3Done(id), Route.Sw3Lesson(id))
|
||||||
|
},
|
||||||
|
)
|
||||||
|
is Route.Sw3Lesson -> {
|
||||||
|
val l = vm.content.sw3Lesson(r.id)
|
||||||
|
if (l != null) SlidesScreen(vm, vm.tr(l.str("titleKey")), vm.tr(l.str("subKey")), l.arr("slides")) {
|
||||||
|
vm.replace(Route.Sw3Ex(r.id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is Route.Sw3Ex -> SwQuizScreen(vm, 3, r.id)
|
||||||
|
Route.Sw4Map -> LessonListScreen(
|
||||||
|
vm, vm.tr("sw_year4"), vm.tr("sw4_sub"),
|
||||||
|
vm.content.sw4.map { l ->
|
||||||
|
val id = l.int("id")
|
||||||
|
LessonRow(vm.tr(l.str("titleKey")), vm.progress.sw4Done(id), Route.Sw4Lesson(id))
|
||||||
|
},
|
||||||
|
)
|
||||||
|
is Route.Sw4Lesson -> {
|
||||||
|
val l = vm.content.sw4Lesson(r.id)
|
||||||
|
if (l != null) SlidesScreen(vm, vm.tr(l.str("titleKey")), vm.tr(l.str("subKey")), l.arr("slides")) {
|
||||||
|
vm.replace(Route.Sw4Ex(r.id))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
is Route.Sw4Ex -> SwQuizScreen(vm, 4, r.id)
|
||||||
Route.CsYears -> CsYearsScreen(vm)
|
Route.CsYears -> CsYearsScreen(vm)
|
||||||
Route.CsMap -> LessonListScreen(
|
Route.CsMap -> LessonListScreen(
|
||||||
vm, vm.tr("cs_year1"), vm.tr("cs_sub"),
|
vm, vm.tr("cs_year1"), vm.tr("cs_sub"),
|
||||||
|
|
|
||||||
|
|
@ -282,6 +282,26 @@ class AppViewModel(val content: Content, val platform: Platform) {
|
||||||
refresh()
|
refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun markSw(id: Int) {
|
||||||
|
progress.markSw(id)
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun markSw2(id: Int) {
|
||||||
|
progress.markSw2(id)
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun markSw3(id: Int) {
|
||||||
|
progress.markSw3(id)
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun markSw4(id: Int) {
|
||||||
|
progress.markSw4(id)
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
|
||||||
fun markCs(id: Int) {
|
fun markCs(id: Int) {
|
||||||
progress.markCs(id)
|
progress.markCs(id)
|
||||||
refresh()
|
refresh()
|
||||||
|
|
|
||||||
|
|
@ -131,6 +131,19 @@ sealed class Route(val page: String) {
|
||||||
data object Pg4Map : Route("pg4map")
|
data object Pg4Map : Route("pg4map")
|
||||||
data class Pg4Lesson(val id: Int) : Route("pg4unit$id")
|
data class Pg4Lesson(val id: Int) : Route("pg4unit$id")
|
||||||
data class Pg4Ex(val id: Int) : Route("pg4ex$id")
|
data class Pg4Ex(val id: Int) : Route("pg4ex$id")
|
||||||
|
data object SwYears : Route("swyears")
|
||||||
|
data object SwMap : Route("swmap")
|
||||||
|
data class SwLesson(val id: Int) : Route("swunit$id")
|
||||||
|
data class SwEx(val id: Int) : Route("swex$id")
|
||||||
|
data object Sw2Map : Route("sw2map")
|
||||||
|
data class Sw2Lesson(val id: Int) : Route("sw2unit$id")
|
||||||
|
data class Sw2Ex(val id: Int) : Route("sw2ex$id")
|
||||||
|
data object Sw3Map : Route("sw3map")
|
||||||
|
data class Sw3Lesson(val id: Int) : Route("sw3unit$id")
|
||||||
|
data class Sw3Ex(val id: Int) : Route("sw3ex$id")
|
||||||
|
data object Sw4Map : Route("sw4map")
|
||||||
|
data class Sw4Lesson(val id: Int) : Route("sw4unit$id")
|
||||||
|
data class Sw4Ex(val id: Int) : Route("sw4ex$id")
|
||||||
data object CsYears : Route("csyears")
|
data object CsYears : Route("csyears")
|
||||||
data object CsMap : Route("csmap")
|
data object CsMap : Route("csmap")
|
||||||
data class CsLesson(val id: Int) : Route("csunit$id")
|
data class CsLesson(val id: Int) : Route("csunit$id")
|
||||||
|
|
@ -298,6 +311,19 @@ sealed class Route(val page: String) {
|
||||||
Pg4Map -> listOf(Subjects, PgYears, Pg4Map)
|
Pg4Map -> listOf(Subjects, PgYears, Pg4Map)
|
||||||
is Pg4Lesson -> listOf(Subjects, PgYears, Pg4Map, this)
|
is Pg4Lesson -> listOf(Subjects, PgYears, Pg4Map, this)
|
||||||
is Pg4Ex -> listOf(Subjects, PgYears, Pg4Map, Pg4Lesson(id), this)
|
is Pg4Ex -> listOf(Subjects, PgYears, Pg4Map, Pg4Lesson(id), this)
|
||||||
|
SwYears -> listOf(Subjects, SwYears)
|
||||||
|
SwMap -> listOf(Subjects, SwYears, SwMap)
|
||||||
|
is SwLesson -> listOf(Subjects, SwYears, SwMap, this)
|
||||||
|
is SwEx -> listOf(Subjects, SwYears, SwMap, SwLesson(id), this)
|
||||||
|
Sw2Map -> listOf(Subjects, SwYears, Sw2Map)
|
||||||
|
is Sw2Lesson -> listOf(Subjects, SwYears, Sw2Map, this)
|
||||||
|
is Sw2Ex -> listOf(Subjects, SwYears, Sw2Map, Sw2Lesson(id), this)
|
||||||
|
Sw3Map -> listOf(Subjects, SwYears, Sw3Map)
|
||||||
|
is Sw3Lesson -> listOf(Subjects, SwYears, Sw3Map, this)
|
||||||
|
is Sw3Ex -> listOf(Subjects, SwYears, Sw3Map, Sw3Lesson(id), this)
|
||||||
|
Sw4Map -> listOf(Subjects, SwYears, Sw4Map)
|
||||||
|
is Sw4Lesson -> listOf(Subjects, SwYears, Sw4Map, this)
|
||||||
|
is Sw4Ex -> listOf(Subjects, SwYears, Sw4Map, Sw4Lesson(id), this)
|
||||||
CsYears -> listOf(Subjects, CsYears)
|
CsYears -> listOf(Subjects, CsYears)
|
||||||
CsMap -> listOf(Subjects, CsYears, CsMap)
|
CsMap -> listOf(Subjects, CsYears, CsMap)
|
||||||
is CsLesson -> listOf(Subjects, CsYears, CsMap, this)
|
is CsLesson -> listOf(Subjects, CsYears, CsMap, this)
|
||||||
|
|
@ -369,6 +395,11 @@ fun routeFromPage(page: String): Route? = when (page) {
|
||||||
"pg2map" -> Route.Pg2Map
|
"pg2map" -> Route.Pg2Map
|
||||||
"pg3map" -> Route.Pg3Map
|
"pg3map" -> Route.Pg3Map
|
||||||
"pg4map" -> Route.Pg4Map
|
"pg4map" -> Route.Pg4Map
|
||||||
|
"swyears" -> Route.SwYears
|
||||||
|
"swmap" -> Route.SwMap
|
||||||
|
"sw2map" -> Route.Sw2Map
|
||||||
|
"sw3map" -> Route.Sw3Map
|
||||||
|
"sw4map" -> Route.Sw4Map
|
||||||
"csyears" -> Route.CsYears
|
"csyears" -> Route.CsYears
|
||||||
"csmap" -> Route.CsMap
|
"csmap" -> Route.CsMap
|
||||||
"cs2map" -> Route.Cs2Map
|
"cs2map" -> Route.Cs2Map
|
||||||
|
|
@ -519,6 +550,30 @@ fun routeFromPage(page: String): Route? = when (page) {
|
||||||
Regex("""pgex(\d+)""").matchEntire(page)?.let {
|
Regex("""pgex(\d+)""").matchEntire(page)?.let {
|
||||||
return Route.PgEx(it.groupValues[1].toInt())
|
return Route.PgEx(it.groupValues[1].toInt())
|
||||||
}
|
}
|
||||||
|
Regex("""sw4unit(\d+)""").matchEntire(page)?.let {
|
||||||
|
return Route.Sw4Lesson(it.groupValues[1].toInt())
|
||||||
|
}
|
||||||
|
Regex("""sw4ex(\d+)""").matchEntire(page)?.let {
|
||||||
|
return Route.Sw4Ex(it.groupValues[1].toInt())
|
||||||
|
}
|
||||||
|
Regex("""sw3unit(\d+)""").matchEntire(page)?.let {
|
||||||
|
return Route.Sw3Lesson(it.groupValues[1].toInt())
|
||||||
|
}
|
||||||
|
Regex("""sw3ex(\d+)""").matchEntire(page)?.let {
|
||||||
|
return Route.Sw3Ex(it.groupValues[1].toInt())
|
||||||
|
}
|
||||||
|
Regex("""sw2unit(\d+)""").matchEntire(page)?.let {
|
||||||
|
return Route.Sw2Lesson(it.groupValues[1].toInt())
|
||||||
|
}
|
||||||
|
Regex("""sw2ex(\d+)""").matchEntire(page)?.let {
|
||||||
|
return Route.Sw2Ex(it.groupValues[1].toInt())
|
||||||
|
}
|
||||||
|
Regex("""swunit(\d+)""").matchEntire(page)?.let {
|
||||||
|
return Route.SwLesson(it.groupValues[1].toInt())
|
||||||
|
}
|
||||||
|
Regex("""swex(\d+)""").matchEntire(page)?.let {
|
||||||
|
return Route.SwEx(it.groupValues[1].toInt())
|
||||||
|
}
|
||||||
Regex("""cs4unit(\d+)""").matchEntire(page)?.let {
|
Regex("""cs4unit(\d+)""").matchEntire(page)?.let {
|
||||||
return Route.Cs4Lesson(it.groupValues[1].toInt())
|
return Route.Cs4Lesson(it.groupValues[1].toInt())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,10 @@ class Content(root: JSONObject) {
|
||||||
val pg2 = raw.arr("pg2")
|
val pg2 = raw.arr("pg2")
|
||||||
val pg3 = raw.arr("pg3")
|
val pg3 = raw.arr("pg3")
|
||||||
val pg4 = raw.arr("pg4")
|
val pg4 = raw.arr("pg4")
|
||||||
|
val sw = raw.arr("sw")
|
||||||
|
val sw2 = raw.arr("sw2")
|
||||||
|
val sw3 = raw.arr("sw3")
|
||||||
|
val sw4 = raw.arr("sw4")
|
||||||
val cs = raw.arr("cs")
|
val cs = raw.arr("cs")
|
||||||
val cs2 = raw.arr("cs2")
|
val cs2 = raw.arr("cs2")
|
||||||
val cs3 = raw.arr("cs3")
|
val cs3 = raw.arr("cs3")
|
||||||
|
|
@ -128,6 +132,10 @@ class Content(root: JSONObject) {
|
||||||
fun pg2Lesson(id: Int) = pg2.firstOrNull { it.int("id") == id }
|
fun pg2Lesson(id: Int) = pg2.firstOrNull { it.int("id") == id }
|
||||||
fun pg3Lesson(id: Int) = pg3.firstOrNull { it.int("id") == id }
|
fun pg3Lesson(id: Int) = pg3.firstOrNull { it.int("id") == id }
|
||||||
fun pg4Lesson(id: Int) = pg4.firstOrNull { it.int("id") == id }
|
fun pg4Lesson(id: Int) = pg4.firstOrNull { it.int("id") == id }
|
||||||
|
fun swLesson(id: Int) = sw.firstOrNull { it.int("id") == id }
|
||||||
|
fun sw2Lesson(id: Int) = sw2.firstOrNull { it.int("id") == id }
|
||||||
|
fun sw3Lesson(id: Int) = sw3.firstOrNull { it.int("id") == id }
|
||||||
|
fun sw4Lesson(id: Int) = sw4.firstOrNull { it.int("id") == id }
|
||||||
fun csLesson(id: Int) = cs.firstOrNull { it.int("id") == id }
|
fun csLesson(id: Int) = cs.firstOrNull { it.int("id") == id }
|
||||||
fun cs2Lesson(id: Int) = cs2.firstOrNull { it.int("id") == id }
|
fun cs2Lesson(id: Int) = cs2.firstOrNull { it.int("id") == id }
|
||||||
fun cs3Lesson(id: Int) = cs3.firstOrNull { it.int("id") == id }
|
fun cs3Lesson(id: Int) = cs3.firstOrNull { it.int("id") == id }
|
||||||
|
|
|
||||||
|
|
@ -107,6 +107,14 @@ class ProgressStore(private val prefs: Prefs, content: Content) {
|
||||||
fun markPg3(id: Int) { mark("pg3.$id") }
|
fun markPg3(id: Int) { mark("pg3.$id") }
|
||||||
fun pg4Done(id: Int) = done("pg4.$id")
|
fun pg4Done(id: Int) = done("pg4.$id")
|
||||||
fun markPg4(id: Int) { mark("pg4.$id") }
|
fun markPg4(id: Int) { mark("pg4.$id") }
|
||||||
|
fun swDone(id: Int) = done("sw.$id")
|
||||||
|
fun markSw(id: Int) { mark("sw.$id") }
|
||||||
|
fun sw2Done(id: Int) = done("sw2.$id")
|
||||||
|
fun markSw2(id: Int) { mark("sw2.$id") }
|
||||||
|
fun sw3Done(id: Int) = done("sw3.$id")
|
||||||
|
fun markSw3(id: Int) { mark("sw3.$id") }
|
||||||
|
fun sw4Done(id: Int) = done("sw4.$id")
|
||||||
|
fun markSw4(id: Int) { mark("sw4.$id") }
|
||||||
fun csDone(id: Int) = done("cs.$id")
|
fun csDone(id: Int) = done("cs.$id")
|
||||||
fun markCs(id: Int) { mark("cs.$id") }
|
fun markCs(id: Int) { mark("cs.$id") }
|
||||||
fun cs2Done(id: Int) = done("cs2.$id")
|
fun cs2Done(id: Int) = done("cs2.$id")
|
||||||
|
|
@ -368,6 +376,38 @@ fun summarize(content: Content, p: ProgressStore): ProgressSum {
|
||||||
sum.doneUnits += 1
|
sum.doneUnits += 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
content.sw.forEach { l ->
|
||||||
|
sum.totalEx += 1
|
||||||
|
sum.openUnits += 1
|
||||||
|
if (p.swDone(l.int("id"))) {
|
||||||
|
sum.doneEx += 1
|
||||||
|
sum.doneUnits += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
content.sw2.forEach { l ->
|
||||||
|
sum.totalEx += 1
|
||||||
|
sum.openUnits += 1
|
||||||
|
if (p.sw2Done(l.int("id"))) {
|
||||||
|
sum.doneEx += 1
|
||||||
|
sum.doneUnits += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
content.sw3.forEach { l ->
|
||||||
|
sum.totalEx += 1
|
||||||
|
sum.openUnits += 1
|
||||||
|
if (p.sw3Done(l.int("id"))) {
|
||||||
|
sum.doneEx += 1
|
||||||
|
sum.doneUnits += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
content.sw4.forEach { l ->
|
||||||
|
sum.totalEx += 1
|
||||||
|
sum.openUnits += 1
|
||||||
|
if (p.sw4Done(l.int("id"))) {
|
||||||
|
sum.doneEx += 1
|
||||||
|
sum.doneUnits += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
content.cs.forEach { l ->
|
content.cs.forEach { l ->
|
||||||
sum.totalEx += 1
|
sum.totalEx += 1
|
||||||
sum.openUnits += 1
|
sum.openUnits += 1
|
||||||
|
|
|
||||||
|
|
@ -1130,6 +1130,30 @@ fun PgQuizScreen(vm: AppViewModel, year: Int, id: Int) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SwQuizScreen(vm: AppViewModel, year: Int, id: Int) {
|
||||||
|
val lesson = when (year) {
|
||||||
|
2 -> vm.content.sw2Lesson(id)
|
||||||
|
3 -> vm.content.sw3Lesson(id)
|
||||||
|
4 -> vm.content.sw4Lesson(id)
|
||||||
|
else -> vm.content.swLesson(id)
|
||||||
|
} ?: return
|
||||||
|
val spec = J(org.json.JSONObject().apply {
|
||||||
|
put("type", "choice")
|
||||||
|
put("title", vm.tr(lesson.str("exTitleKey")))
|
||||||
|
put("sub", lesson.str("quizHeadKey"))
|
||||||
|
put("questions", lesson.o.optJSONArray("quiz"))
|
||||||
|
})
|
||||||
|
DispatchExercise(vm, spec, vm.tr(lesson.str("exTitleKey"))) {
|
||||||
|
when (year) {
|
||||||
|
2 -> vm.markSw2(id)
|
||||||
|
3 -> vm.markSw3(id)
|
||||||
|
4 -> vm.markSw4(id)
|
||||||
|
else -> vm.markSw(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun FyzQuizScreen(vm: AppViewModel, year: Int, id: Int) {
|
fun FyzQuizScreen(vm: AppViewModel, year: Int, id: Int) {
|
||||||
val lesson = when (year) {
|
val lesson = when (year) {
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import androidx.compose.foundation.verticalScroll
|
||||||
import androidx.compose.material.icons.Icons
|
import androidx.compose.material.icons.Icons
|
||||||
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
import androidx.compose.material.icons.automirrored.filled.ArrowBack
|
||||||
import androidx.compose.material.icons.automirrored.filled.MenuBook
|
import androidx.compose.material.icons.automirrored.filled.MenuBook
|
||||||
|
import androidx.compose.material.icons.filled.Apps
|
||||||
import androidx.compose.material.icons.filled.Architecture
|
import androidx.compose.material.icons.filled.Architecture
|
||||||
import androidx.compose.material.icons.filled.AutoAwesome
|
import androidx.compose.material.icons.filled.AutoAwesome
|
||||||
import androidx.compose.material.icons.filled.AutoStories
|
import androidx.compose.material.icons.filled.AutoStories
|
||||||
|
|
@ -248,6 +249,7 @@ private fun SubjectIcon(icon: String, open: Boolean) {
|
||||||
"ruler" -> Icon(Icons.Filled.Architecture, null, tint = tint, modifier = Modifier.size(26.dp))
|
"ruler" -> Icon(Icons.Filled.Architecture, null, tint = tint, modifier = Modifier.size(26.dp))
|
||||||
"code" -> Icon(Icons.Filled.Terminal, null, tint = tint, modifier = Modifier.size(26.dp))
|
"code" -> Icon(Icons.Filled.Terminal, null, tint = tint, modifier = Modifier.size(26.dp))
|
||||||
"brush" -> Icon(Icons.Filled.Brush, null, tint = tint, modifier = Modifier.size(26.dp))
|
"brush" -> Icon(Icons.Filled.Brush, null, tint = tint, modifier = Modifier.size(26.dp))
|
||||||
|
"apps" -> Icon(Icons.Filled.Apps, null, tint = tint, modifier = Modifier.size(26.dp))
|
||||||
else -> Icon(Icons.Filled.Lock, null, tint = tint)
|
else -> Icon(Icons.Filled.Lock, null, tint = tint)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -369,6 +371,10 @@ fun routeProgress(vm: AppViewModel, r: Route): Pair<Int, Int>? {
|
||||||
Route.Pg2Map -> tally(c.pg2, p::pg2Done)
|
Route.Pg2Map -> tally(c.pg2, p::pg2Done)
|
||||||
Route.Pg3Map -> tally(c.pg3, p::pg3Done)
|
Route.Pg3Map -> tally(c.pg3, p::pg3Done)
|
||||||
Route.Pg4Map -> tally(c.pg4, p::pg4Done)
|
Route.Pg4Map -> tally(c.pg4, p::pg4Done)
|
||||||
|
Route.SwMap -> tally(c.sw, p::swDone)
|
||||||
|
Route.Sw2Map -> tally(c.sw2, p::sw2Done)
|
||||||
|
Route.Sw3Map -> tally(c.sw3, p::sw3Done)
|
||||||
|
Route.Sw4Map -> tally(c.sw4, p::sw4Done)
|
||||||
Route.CsMap -> tally(c.cs, p::csDone)
|
Route.CsMap -> tally(c.cs, p::csDone)
|
||||||
Route.Cs2Map -> tally(c.cs2, p::cs2Done)
|
Route.Cs2Map -> tally(c.cs2, p::cs2Done)
|
||||||
Route.Cs3Map -> tally(c.cs3, p::cs3Done)
|
Route.Cs3Map -> tally(c.cs3, p::cs3Done)
|
||||||
|
|
@ -457,6 +463,13 @@ private fun subjectSum(vm: AppViewModel, s: J): ProgressSum {
|
||||||
vm.content.pg3.count { vm.progress.pg3Done(it.int("id")) } +
|
vm.content.pg3.count { vm.progress.pg3Done(it.int("id")) } +
|
||||||
vm.content.pg4.count { vm.progress.pg4Done(it.int("id")) }
|
vm.content.pg4.count { vm.progress.pg4Done(it.int("id")) }
|
||||||
}
|
}
|
||||||
|
"swyears", "swmap", "sw2map", "sw3map", "sw4map" -> {
|
||||||
|
sum.totalEx = vm.content.sw.size + vm.content.sw2.size + vm.content.sw3.size + vm.content.sw4.size
|
||||||
|
sum.doneEx = vm.content.sw.count { vm.progress.swDone(it.int("id")) } +
|
||||||
|
vm.content.sw2.count { vm.progress.sw2Done(it.int("id")) } +
|
||||||
|
vm.content.sw3.count { vm.progress.sw3Done(it.int("id")) } +
|
||||||
|
vm.content.sw4.count { vm.progress.sw4Done(it.int("id")) }
|
||||||
|
}
|
||||||
"czechmap" -> {
|
"czechmap" -> {
|
||||||
val litDone = vm.content.lit.count { vm.progress.litDone(it.int("id")) } +
|
val litDone = vm.content.lit.count { vm.progress.litDone(it.int("id")) } +
|
||||||
vm.content.lit2.count { vm.progress.lit2Done(it.int("id")) } +
|
vm.content.lit2.count { vm.progress.lit2Done(it.int("id")) } +
|
||||||
|
|
@ -758,6 +771,27 @@ private fun buildSearch(vm: AppViewModel): List<Hit> {
|
||||||
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "fyz4unit${l.int("id")}", extra = "fyzika")
|
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "fyz4unit${l.int("id")}", extra = "fyzika")
|
||||||
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "fyz4ex${l.int("id")}")
|
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "fyz4ex${l.int("id")}")
|
||||||
}
|
}
|
||||||
|
add(vm.tr("Programové vybavení"), vm.tr("search_lesson"), "swyears", extra = "office windows excel mysql")
|
||||||
|
add(vm.tr("sw_year1"), vm.tr("search_lesson"), "swmap", extra = "rocnik")
|
||||||
|
add(vm.tr("sw_year2"), vm.tr("search_lesson"), "sw2map", extra = "rocnik")
|
||||||
|
add(vm.tr("sw_year3"), vm.tr("search_lesson"), "sw3map", extra = "rocnik")
|
||||||
|
add(vm.tr("sw_year4"), vm.tr("search_lesson"), "sw4map", extra = "rocnik")
|
||||||
|
vm.content.sw.forEach { l ->
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "swunit${l.int("id")}", extra = "windows")
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "swex${l.int("id")}")
|
||||||
|
}
|
||||||
|
vm.content.sw2.forEach { l ->
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw2unit${l.int("id")}", extra = "word excel")
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw2ex${l.int("id")}")
|
||||||
|
}
|
||||||
|
vm.content.sw3.forEach { l ->
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw3unit${l.int("id")}", extra = "access mysql")
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw3ex${l.int("id")}")
|
||||||
|
}
|
||||||
|
vm.content.sw4.forEach { l ->
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw4unit${l.int("id")}", extra = "wordpress")
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw4ex${l.int("id")}")
|
||||||
|
}
|
||||||
add(vm.tr("Prezentační grafika"), vm.tr("search_lesson"), "pgyears", extra = "photoshop premiere illustrator")
|
add(vm.tr("Prezentační grafika"), vm.tr("search_lesson"), "pgyears", extra = "photoshop premiere illustrator")
|
||||||
add(vm.tr("pg_year1"), vm.tr("search_lesson"), "pgmap", extra = "rocnik")
|
add(vm.tr("pg_year1"), vm.tr("search_lesson"), "pgmap", extra = "rocnik")
|
||||||
add(vm.tr("pg_year2"), vm.tr("search_lesson"), "pg2map", extra = "rocnik")
|
add(vm.tr("pg_year2"), vm.tr("search_lesson"), "pg2map", extra = "rocnik")
|
||||||
|
|
@ -1032,6 +1066,20 @@ fun CsYearsScreen(vm: AppViewModel) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun SwYearsScreen(vm: AppViewModel) {
|
||||||
|
DetailScaffold(vm, vm.tr("Programové vybavení"), vm.tr("sw_years_sub")) { inner ->
|
||||||
|
LazyColumn(contentPadding = PaddingValues(top = inner.calculateTopPadding(), bottom = inner.calculateBottomPadding() + 16.dp)) {
|
||||||
|
item {
|
||||||
|
NavRow(title = vm.tr("sw_year1"), subtitle = vm.tr("sw_sub"), leading = { LeadingBadge("1") }, progress = routeProgress(vm, Route.SwMap)) { vm.go(Route.SwMap) }
|
||||||
|
NavRow(title = vm.tr("sw_year2"), subtitle = vm.tr("sw2_sub"), leading = { LeadingBadge("2") }, progress = routeProgress(vm, Route.Sw2Map)) { vm.go(Route.Sw2Map) }
|
||||||
|
NavRow(title = vm.tr("sw_year3"), subtitle = vm.tr("sw3_sub"), leading = { LeadingBadge("3") }, progress = routeProgress(vm, Route.Sw3Map)) { vm.go(Route.Sw3Map) }
|
||||||
|
NavRow(title = vm.tr("sw_year4"), subtitle = vm.tr("sw4_sub"), leading = { LeadingBadge("4") }, progress = routeProgress(vm, Route.Sw4Map)) { vm.go(Route.Sw4Map) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun PgYearsScreen(vm: AppViewModel) {
|
fun PgYearsScreen(vm: AppViewModel) {
|
||||||
DetailScaffold(vm, vm.tr("Prezentační grafika"), vm.tr("pg_years_sub")) { inner ->
|
DetailScaffold(vm, vm.tr("Prezentační grafika"), vm.tr("pg_years_sub")) { inner ->
|
||||||
|
|
|
||||||
|
|
@ -18,7 +18,7 @@ Skript vypíše počet lekcí, nebo chyby s cestou a číslem řádku
|
||||||
|
|
||||||
| Složka | Obsah |
|
| Složka | Obsah |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `pocitacove-site/`, `technicke-vybaveni/`, `technicka-grafika/`, `prezentacni-grafika/`, `programovani/`, `obcanska-nauka/`, `fyzika/` | `N-rocnik/`, v nich lekce |
|
| `pocitacove-site/`, `technicke-vybaveni/`, `technicka-grafika/`, `prezentacni-grafika/`, `programove-vybaveni/`, `programovani/`, `obcanska-nauka/`, `fyzika/` | `N-rocnik/`, v nich lekce |
|
||||||
| `prirodni-vedy/chemie`, `prirodni-vedy/biologie` | lekce |
|
| `prirodni-vedy/chemie`, `prirodni-vedy/biologie` | lekce |
|
||||||
| `cestina/literatura/N-rocnik` | lekce literatury |
|
| `cestina/literatura/N-rocnik` | lekce literatury |
|
||||||
| `cestina/mluvnice` | cvičení z mluvnice |
|
| `cestina/mluvnice` | cvičení z mluvnice |
|
||||||
|
|
@ -97,7 +97,7 @@ a smažte `puvodni`.
|
||||||
|
|
||||||
## Běžná lekce
|
## Běžná lekce
|
||||||
|
|
||||||
Sítě, hardware, technická grafika, prezentační grafika, občanka, literatura, chemie, biologie, fyzika.
|
Sítě, hardware, technická grafika, prezentační grafika, programové vybavení, občanka, literatura, chemie, biologie, fyzika.
|
||||||
|
|
||||||
```md
|
```md
|
||||||
---
|
---
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,12 @@
|
||||||
# cs: bullet
|
# cs: bullet
|
||||||
# en: bullet
|
# en: bullet
|
||||||
|
|
||||||
|
--- 2026-10-11
|
||||||
|
cs: Programové vybavení: Windows, Word, Excel, Access, MySQL a správa účtů
|
||||||
|
cs: Čtyři ročníky, od licence a složek po WordPress, Power BI a zásady
|
||||||
|
en: Software: Windows, Word, Excel, Access, MySQL and account administration
|
||||||
|
en: Four years, from licences and folders to WordPress, Power BI and policy
|
||||||
|
|
||||||
--- 2026-10-11
|
--- 2026-10-11
|
||||||
cs: Prezentační grafika: Photoshop, Premiere Pro a další programy Adobe
|
cs: Prezentační grafika: Photoshop, Premiere Pro a další programy Adobe
|
||||||
cs: Čtyři ročníky, v každé lekci postup, zadání a kvíz
|
cs: Čtyři ročníky, v každé lekci postup, zadání a kvíz
|
||||||
|
|
|
||||||
|
|
@ -14,4 +14,4 @@
|
||||||
| Technická grafika | Technická grafika | Technical Graphics | ruler | tgyears | ano |
|
| Technická grafika | Technická grafika | Technical Graphics | ruler | tgyears | ano |
|
||||||
| Prezentační grafika | Prezentační grafika | Presentation Graphics | brush | pgyears | ano |
|
| Prezentační grafika | Prezentační grafika | Presentation Graphics | brush | pgyears | ano |
|
||||||
| Programování | Programování | Programming | code | csyears | ano |
|
| Programování | Programování | Programming | code | csyears | ano |
|
||||||
| Programové vybavení | Programové vybavení | Software | lock | | ne |
|
| Programové vybavení | Programové vybavení | Software | apps | swyears | ano |
|
||||||
|
|
|
||||||
|
|
@ -258,6 +258,20 @@
|
||||||
| pg3_sub | Premiere Pro: střih, zvuk, titulky a video. | Premiere Pro: the cut, sound, titles and the video. |
|
| pg3_sub | Premiere Pro: střih, zvuk, titulky a video. | Premiere Pro: the cut, sound, titles and the video. |
|
||||||
| pg4_sub | Illustrator, After Effects, InDesign a maturitní kampaň. | Illustrator, After Effects, InDesign and the exam campaign. |
|
| pg4_sub | Illustrator, After Effects, InDesign a maturitní kampaň. | Illustrator, After Effects, InDesign and the exam campaign. |
|
||||||
|
|
||||||
|
# Programové vybavení
|
||||||
|
|
||||||
|
| Klíč | Česky | Anglicky |
|
||||||
|
|---|---|---|
|
||||||
|
| sw_years_sub | Operační systém, Office, databáze a správa Windows. | The operating system, Office, databases and Windows administration. |
|
||||||
|
| sw_year1 | 1. ročník | Year 1 |
|
||||||
|
| sw_year2 | 2. ročník | Year 2 |
|
||||||
|
| sw_year3 | 3. ročník | Year 3 |
|
||||||
|
| sw_year4 | 4. ročník | Year 4 |
|
||||||
|
| sw_sub | Software, licence a práce ve Windows. | Software, licences and working in Windows. |
|
||||||
|
| sw2_sub | Word a Excel: dokument, vzorce a graf. | Word and Excel: a document, formulas and a chart. |
|
||||||
|
| sw3_sub | Access a MySQL: tabulky, dotazy a vztahy. | Access and MySQL: tables, queries and relationships. |
|
||||||
|
| sw4_sub | WordPress, Power BI, dávkové soubory a zásady. | WordPress, Power BI, batch files and policy. |
|
||||||
|
|
||||||
# Programování
|
# Programování
|
||||||
|
|
||||||
| Klíč | Česky | Anglicky |
|
| Klíč | Česky | Anglicky |
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Software and licences
|
||||||
|
popis: System and application programs, and the terms for using them.
|
||||||
|
nazev_cviceni: Quiz: software and licences
|
||||||
|
nadpis_kvizu: Name the kind of program and the kind of licence
|
||||||
|
---
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-1-software-a-licence
|
||||||
|
nazev: Software a licence
|
||||||
|
popis: Systémové a aplikační programy a to, za jakých podmínek se smí používat.
|
||||||
|
nazev_cviceni: Kvíz: software a licence
|
||||||
|
nadpis_kvizu: Poznejte druh programu a druh licence
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Dva druhy programů
|
||||||
|
*Software*
|
||||||
|
|
||||||
|
- Software je program. Hardware je zařízení. Samotný počítač bez programu nic neudělá.
|
||||||
|
- Operační systém řídí počítač: Windows, Linux, macOS. Ve škole pracujeme ve Windows.
|
||||||
|
- Aplikační software řeší jednu práci: Word dokument, Excel tabulku, prohlížeč web.
|
||||||
|
- Ovladač je malý program k zařízení. Tiskárna bez ovladače netiskne, i když je zapnutá.
|
||||||
|
|
||||||
|
> Tip: Když program spadne a systém běží dál, spadla aplikace. Když nesvítí plocha, spadl systém.
|
||||||
|
|
||||||
|
## Licence
|
||||||
|
*Podmínky*
|
||||||
|
|
||||||
|
- Licence říká, kdo program smí nainstalovat a na kolik počítačů.
|
||||||
|
- Komerční program se kupuje, nebo se platí předplatné. Microsoft 365 je předplatné.
|
||||||
|
- OEM licence je přivázaná k jednomu počítači. Na nový stroj se nepřetahuje.
|
||||||
|
- Stažený program bez licence není zdarma. Je to kopie, kterou škola nesmí používat.
|
||||||
|
|
||||||
|
> Tip: Školní účet Microsoft 365 nepatří na domácí počítače navždy. Platí, dokud škola předplatné má.
|
||||||
|
|
||||||
|
## Zdarma není jeden pojem
|
||||||
|
*Freeware a open source*
|
||||||
|
|
||||||
|
- Freeware je zdarma, ale zdrojový kód nedostanete. Smíte ho používat za podmínek autora.
|
||||||
|
- Open source má otevřený kód. GPL navíc chce, aby odvozené programy zůstaly otevřené.
|
||||||
|
- Zkušební verze (shareware) po čase skončí, nebo omezí funkce. Není to trvalá licence.
|
||||||
|
- Na školní počítač patří jen programy, které škola schválila. Vlastní instalace se hlásí učiteli.
|
||||||
|
|
||||||
|
> Tip: Cena nula neznamená, že smíte program rozdávat dál. I freeware má licenci.
|
||||||
|
|
||||||
|
## Zadání: šest programů
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Do tabulky zapište šest programů ze školního počítače: systém, prohlížeč, Word, Excel a dva další.
|
||||||
|
- U každého napište, jestli je systémový, nebo aplikační.
|
||||||
|
- U Wordu a Excelu napište, jaká licence ve škole je: předplatné Microsoft 365, ne domácí krabice.
|
||||||
|
- Soubor pojmenujte licence.txt a uložte ho do Dokumenty. Zatím nic neinstalujte.
|
||||||
|
|
||||||
|
> Tip: Název systému zjistíte příkazem winver. Okno ukáže edici Windows a verzi.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Kam patří Microsoft Word?
|
||||||
|
- Mezi operační systémy
|
||||||
|
- [x] Mezi aplikační software
|
||||||
|
- Mezi ovladače tiskárny
|
||||||
|
- Mezi hardware
|
||||||
|
> Word řeší jednu práci, dokument. Systém pod ním je Windows.
|
||||||
|
|
||||||
|
## Co znamená OEM licence Windows?
|
||||||
|
- Smí se přenést na každý další počítač
|
||||||
|
- [x] Je vázaná na jeden počítač
|
||||||
|
- Je to totéž co GPL
|
||||||
|
- Platí jen 14 dní
|
||||||
|
> OEM se prodává s počítačem a na jiný stroj se nepřesouvá.
|
||||||
|
|
||||||
|
## Čím se freeware liší od open source?
|
||||||
|
- Freeware má otevřený zdrojový kód
|
||||||
|
- [x] Freeware je zdarma, ale kód obvykle nedostanete
|
||||||
|
- Open source se nesmí používat ve škole
|
||||||
|
- Je to totéž
|
||||||
|
> Zdarma a otevřený kód jsou dvě různé věci. GPL je otevřená licence, ne jen nulová cena.
|
||||||
|
|
||||||
|
## Který program je operační systém?
|
||||||
|
- Excel
|
||||||
|
- [x] Windows
|
||||||
|
- WordPress
|
||||||
|
- Power BI
|
||||||
|
> Windows řídí počítač. Ostatní jsou aplikace, které na systému běží.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: The operating system
|
||||||
|
popis: What the system does between the user and the hardware.
|
||||||
|
nazev_cviceni: Quiz: the operating system
|
||||||
|
nadpis_kvizu: Name the role of the system
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/1-rocnik/02-operacni-system.md
Normal file
79
content/programove-vybaveni/1-rocnik/02-operacni-system.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-1-operacni-system
|
||||||
|
nazev: Operační systém
|
||||||
|
popis: Co systém dělá mezi uživatelem a hardwarem.
|
||||||
|
nazev_cviceni: Kvíz: operační systém
|
||||||
|
nadpis_kvizu: Poznejte roli systému
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Mezi člověkem a strojem
|
||||||
|
*Role*
|
||||||
|
|
||||||
|
- Systém spouští programy, hlídá paměť a přiděluje čas procesoru.
|
||||||
|
- Souborový systém ukládá data na disk. Ve Windows je to NTFS.
|
||||||
|
- Ovladač si systém načte, aby mluvil s tiskárnou, diskem a sítí.
|
||||||
|
- Uživatel vidí plochu a okna. Jádro pod tím nevidí a do něj nesahá.
|
||||||
|
|
||||||
|
> Tip: Když dva programy chtějí tiskárnu najednou, rozhodne systém. Samy se nedomluví.
|
||||||
|
|
||||||
|
## Tři systémy
|
||||||
|
*Windows, Linux, macOS*
|
||||||
|
|
||||||
|
- Školní učebna je Windows. Příkazy a obrazovky v tomto předmětu jsou z Windows.
|
||||||
|
- Linux je častý na serverech. Stejný dokument v Excelu tam sám od sebe není.
|
||||||
|
- macOS běží na počítačích Apple. Zkratka Ctrl je tam často Cmd.
|
||||||
|
- Soubor .docx je dokument Wordu. Není to program a není to systém.
|
||||||
|
|
||||||
|
> Tip: Přípona souboru říká, čím ho otevřít. Systém podle ní vybere aplikaci.
|
||||||
|
|
||||||
|
## Start počítače
|
||||||
|
*Až po přihlášení*
|
||||||
|
|
||||||
|
- Po zapnutí naběhne firmware, pak systém, pak přihlašovací obrazovka.
|
||||||
|
- Dokud se nepřihlásíte, pracujete s účtem nikoho. Soubory uživatele jsou zamčené.
|
||||||
|
- Každý účet má vlastní plochu a složku C:\Users\jméno.
|
||||||
|
- Vypnutí přes nabídku Start uloží práci systému. Dlouhý stisk tlačítka je až poslední možnost.
|
||||||
|
|
||||||
|
> Tip: Restart po aktualizaci není trest. Systém si domlouvá soubory, které za běhu nevymění.
|
||||||
|
|
||||||
|
## Zadání: jaký systém to je
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Spusťte winver a opište edici a verzi, třeba Windows 11 Pro, verzi z okna.
|
||||||
|
- Otevřete C:\Users a napište, které složky uživatelů tam jsou. Do cizích nesaháte.
|
||||||
|
- Najděte jeden ovladač v názvu: ve Správci zařízení rozbalte Monitory nebo Tiskárny.
|
||||||
|
- Zápis uložte jako system.txt do Dokumenty. Hesla ani sériová čísla nepište.
|
||||||
|
|
||||||
|
> Tip: Správce zařízení je ve Windows devmgmt.msc. Žlutý vykřičník znamená chybějící nebo vadný ovladač.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Co dělá operační systém s pamětí?
|
||||||
|
- Nic, paměť si berou programy samy
|
||||||
|
- [x] Přiděluje ji programům
|
||||||
|
- Maže ji při každém uložení dokumentu
|
||||||
|
- Patří do Excelu
|
||||||
|
> Program požádá, systém přidělí. Dva programy nesmí psát do stejného místa.
|
||||||
|
|
||||||
|
## Jaký souborový systém používá školní Windows na disku?
|
||||||
|
- [x] NTFS
|
||||||
|
- Jen názvy souborů bez systému
|
||||||
|
- SVG
|
||||||
|
- MySQL
|
||||||
|
> NTFS drží soubory, oprávnění i větší disky. Názvy složek jsou až uvnitř něj.
|
||||||
|
|
||||||
|
## Kdy smíte sáhnout do složky jiného uživatele v C:\Users?
|
||||||
|
- Kdykoli, je to jeden počítač
|
||||||
|
- [x] Nesmíte, je to jeho účet
|
||||||
|
- Jen když je složka na ploše
|
||||||
|
- Když má dokument příponu docx
|
||||||
|
> Každý účet má vlastní soubory. Cizí složka není společný šuplík.
|
||||||
|
|
||||||
|
## Čím zjistíte edici Windows?
|
||||||
|
- [x] Příkazem winver
|
||||||
|
- Otevřením Excelu
|
||||||
|
- Smazáním koše
|
||||||
|
- Souborem .bat
|
||||||
|
> winver otevře okno O systému Windows s edicí a verzí.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Files and folders
|
||||||
|
popis: A path, an extension and order in Documents.
|
||||||
|
nazev_cviceni: Quiz: files
|
||||||
|
nadpis_kvizu: Build the path and the name
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/1-rocnik/03-soubory-a-slozky.md
Normal file
79
content/programove-vybaveni/1-rocnik/03-soubory-a-slozky.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-1-soubory
|
||||||
|
nazev: Soubory a složky
|
||||||
|
popis: Cesta, přípona a pořádek v Dokumentech.
|
||||||
|
nazev_cviceni: Kvíz: soubory
|
||||||
|
nadpis_kvizu: Sestavte cestu a název
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Cesta
|
||||||
|
*Kde soubor leží*
|
||||||
|
|
||||||
|
- Cesta začíná diskem. C:\Users\novak\Documents\Skola\1-rocnik je složka, ne soubor.
|
||||||
|
- Zpětné lomítko odděluje složky. Dopředné lomítko je na webu, ne ve Windows.
|
||||||
|
- Dokumenty jsou %USERPROFILE%\Documents. Na každém účtu to vede jinam, příkaz je stejný.
|
||||||
|
- Plocha je taky složka. Soubor jen na ploše se ve školním pořádku ztratí.
|
||||||
|
|
||||||
|
> Tip: Do řádku adresy v Průzkumníku vložte cestu a Enter. Nemusíte proklikávat pět složek.
|
||||||
|
|
||||||
|
## Přípona
|
||||||
|
*Čím se soubor otevře*
|
||||||
|
|
||||||
|
- prihlaska.docx je Word. znamky.xlsx je Excel. poznamka.txt je prostý text.
|
||||||
|
- Windows přípony schovává. Zapněte Zobrazit, Zobrazit, Přípony názvů souborů.
|
||||||
|
- Přejmenovat foto.jpg na foto.docx z něj dokument neudělá. Změní se jen štítek.
|
||||||
|
- Dvojitá přípona faktura.pdf.exe je program, který se tváří jako dokument. Neotevírejte ho.
|
||||||
|
|
||||||
|
> Tip: Když přípony vidíte, podvodný soubor poznáte dřív, než na něj kliknete.
|
||||||
|
|
||||||
|
## Názvy
|
||||||
|
*Co je zakázané*
|
||||||
|
|
||||||
|
- V názvu nesmí být znaky \ / : * ? " < > |.
|
||||||
|
- Mezera smí být, ale v dávkových souborech pak název patří do uvozovek.
|
||||||
|
- Školní název je věcný: 2026-06-12-zadost.docx. Final-final2.docx není název.
|
||||||
|
- Datum pište rok-měsíc-den. Složka se seřadí od nejstaršího sama.
|
||||||
|
|
||||||
|
> Tip: Kopírování je Ctrl+C, vložení Ctrl+V, přesun začíná Ctrl+X. Přesun z flashky na disk soubor na flashce smaže.
|
||||||
|
|
||||||
|
## Zadání: strom školy
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- V Dokumentech založte Skola, v ní 1-rocnik a v ní slozky word, excel a system.
|
||||||
|
- Do word uložte prázdný soubor poznamka.txt. Příponu ať je vidět.
|
||||||
|
- Cesta ať končí na \Skola\1-rocnik\word\poznamka.txt.
|
||||||
|
- Na ploše nic nenechávejte. Koš nevysypávejte, dokud nevíte, co v něm je.
|
||||||
|
|
||||||
|
> Tip: Nová složka je Ctrl+Shift+N. Když se jmenuje Nová složka, hned ji přejmenujte.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Která cesta vede k souboru v Dokumentech?
|
||||||
|
- [x] C:\Users\novak\Documents\Skola\1-rocnik\poznamka.txt
|
||||||
|
- https://skola/poznamka.txt
|
||||||
|
- poznamka.txt bez složky, to stačí vždy
|
||||||
|
- C:/Users/novak s obyčejnými lomítky jako jediná správná forma
|
||||||
|
> Ve Windows se složky oddělují zpětným lomítkem a cesta začíná diskem.
|
||||||
|
|
||||||
|
## Co se stane, když foto.jpg přejmenujete na foto.docx?
|
||||||
|
- Stane se z něj upravitelný dokument Word
|
||||||
|
- [x] Změní se přípona, obsah zůstane obrázek
|
||||||
|
- Soubor se uloží do koše
|
||||||
|
- Vznikne tabulka Excel
|
||||||
|
> Přípona je nápověda pro systém. Bajty obrázku se samy nepřepíšou na dokument.
|
||||||
|
|
||||||
|
## Který název je na školní odevzdání nejlepší?
|
||||||
|
- final2.docx
|
||||||
|
- [x] 2026-06-12-zadost.docx
|
||||||
|
- Nový dokument.docx
|
||||||
|
- ???.docx
|
||||||
|
> Datum rok-měsíc-den se seřadí a je z něj poznat verze. Otazník v názvu Windows ani nepustí.
|
||||||
|
|
||||||
|
## Proč zapnout zobrazení přípon?
|
||||||
|
- Aby šly soubory mazat
|
||||||
|
- [x] Aby byl vidět skutečný typ, třeba pdf.exe
|
||||||
|
- Protože bez přípony soubor nejde uložit
|
||||||
|
- Excel to vyžaduje u každé buňky
|
||||||
|
> Skrytá přípona schová, že faktura.pdf.exe je program.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Installation and updates
|
||||||
|
popis: Where a program comes from and why the system is updated.
|
||||||
|
nazev_cviceni: Quiz: installation
|
||||||
|
nadpis_kvizu: Pick a safe source
|
||||||
|
---
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-1-instalace
|
||||||
|
nazev: Instalace a aktualizace
|
||||||
|
popis: Odkud se program bere a proč se systém aktualizuje.
|
||||||
|
nazev_cviceni: Kvíz: instalace
|
||||||
|
nadpis_kvizu: Vyberte bezpečný zdroj
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Odkud instalovat
|
||||||
|
*Zdroj*
|
||||||
|
|
||||||
|
- Školní programy berte z Microsoft Store, z balíčku školy, nebo z webu výrobce.
|
||||||
|
- Odkaz v mailu, tlačítko Stáhnout zdarma na cizím webu a crack nejsou zdroj.
|
||||||
|
- Instalace chce souhlas správce. Okno Řízení uživatelských účtů se neodklepává poslepu.
|
||||||
|
- Na plochu nepatří deset instalačních souborů. Po instalaci je smažte, program už je v systému.
|
||||||
|
|
||||||
|
> Tip: Název souboru setup.exe nic neříká. Říká to vydavatel v okně účtů a adresa, odkud soubor přišel.
|
||||||
|
|
||||||
|
## Aktualizace
|
||||||
|
*Windows Update*
|
||||||
|
|
||||||
|
- Aktualizace zašívá chyby, přes které se do počítače leze. Odkládat ji týdny je riziko.
|
||||||
|
- Windows Update je v Nastavení, Windows Update. Školní počítač nechte doběhnout.
|
||||||
|
- Restart po aktualizaci udělejte, když o něj systém požádá. Ne uprostřed testu, ale ten den.
|
||||||
|
- Word a Excel se v Microsoft 365 aktualizují se sadou Office, ne jen s Windows.
|
||||||
|
|
||||||
|
> Tip: Verze systému z winver se po velké aktualizaci změní. Když se měsíc nemění, aktualizace stojí.
|
||||||
|
|
||||||
|
## Odinstalace
|
||||||
|
*Aplikace*
|
||||||
|
|
||||||
|
- Program se odebírá v Nastavení, Aplikace, Nainstalované aplikace. Ne smazáním zástupce.
|
||||||
|
- Zástupce na ploše je jen odkaz. Smazáním ikony program v počítači zůstane.
|
||||||
|
- Neznámý program, který jste neinstalovali, nejdřív nahlaste. Nemusí to být hra spolužáka.
|
||||||
|
- Odinstalace nesmaže vaše dokumenty. Smaže program. Dokumenty si před velkým úklidem zkopírujte.
|
||||||
|
|
||||||
|
> Tip: Když v seznamu aplikací Word není a zástupce ano, zástupce vede do prázdna, nebo na jiný disk.
|
||||||
|
|
||||||
|
## Zadání: stav počítače
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Z winver opište verzi. V Windows Update napište, jestli je systém aktuální, nebo něco čeká.
|
||||||
|
- V nainstalovaných aplikacích najděte Word nebo Microsoft 365 a opište název, jak ho seznam uvádí.
|
||||||
|
- Najděte jeden program, který nepoznáváte, a zapište ho. Neodinstalovávejte ho bez učitele.
|
||||||
|
- Uložte stav.txt do Skola\1-rocnik\system. Nic z internetu nestahujte.
|
||||||
|
|
||||||
|
> Tip: Čas poslední aktualizace je ve Windows Update dole v historii. Stačí datum, ne seznam všech záplat.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Odkud se má školní program instalovat?
|
||||||
|
- Z odkazu v neznámém mailu
|
||||||
|
- [x] Z webu výrobce, z Store, nebo z balíčku školy
|
||||||
|
- Z stránky s nápisem crack
|
||||||
|
- Z přílohy faktura.pdf.exe
|
||||||
|
> Výrobce, obchod a škola jsou zdroje. Crack a náhodný mail nejsou.
|
||||||
|
|
||||||
|
## Co udělá smazání zástupce na ploše?
|
||||||
|
- Odinstaluje program
|
||||||
|
- [x] Smaže jen odkaz, program zůstane
|
||||||
|
- Smaže Dokumenty
|
||||||
|
- Vypne aktualizace
|
||||||
|
> Zástupce je zkratka. Program se odebírá v Nainstalovaných aplikacích.
|
||||||
|
|
||||||
|
## Proč se Windows Update nenechává měsíc stát?
|
||||||
|
- Protože jinak nejde otevřít Word
|
||||||
|
- [x] Záplaty zavírají známé díry
|
||||||
|
- Protože se jinak smaže plocha
|
||||||
|
- Aktualizace jen mění tapetu
|
||||||
|
> Neaktualizovaný systém má chyby, které už jsou veřejně popsané.
|
||||||
|
|
||||||
|
## Kdy odklepnete okno Řízení uživatelských účtů?
|
||||||
|
- Vždycky, ať instalace pokračuje
|
||||||
|
- [x] Jen když víte, jaký program a odkud ho spouštíte
|
||||||
|
- Nikdy, ani u školního balíčku
|
||||||
|
- Jen v Excelu
|
||||||
|
> Okno říká, že program chce právo správce. Neznámý vydavatel se neodklepává.
|
||||||
6
content/programove-vybaveni/1-rocnik/05-ucty.en.md
Normal file
6
content/programove-vybaveni/1-rocnik/05-ucty.en.md
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: User accounts
|
||||||
|
popis: A standard user, an administrator and a password that is not the account name.
|
||||||
|
nazev_cviceni: Quiz: accounts
|
||||||
|
nadpis_kvizu: Pick the account type and the password
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/1-rocnik/05-ucty.md
Normal file
79
content/programove-vybaveni/1-rocnik/05-ucty.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-1-ucty
|
||||||
|
nazev: Uživatelské účty
|
||||||
|
popis: Běžný uživatel, správce a heslo, které není jméno účtu.
|
||||||
|
nazev_cviceni: Kvíz: účty
|
||||||
|
nadpis_kvizu: Vyberte typ účtu a heslo
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Dva typy
|
||||||
|
*Správce a uživatel*
|
||||||
|
|
||||||
|
- Správce smí instalovat programy a měnit systém. Ve škole je to účet učitele nebo správce učebny.
|
||||||
|
- Běžný uživatel smí pracovat se svými soubory. Systémové složky mu systém zamkne.
|
||||||
|
- Denní práce nepatří na účet správce. Virus by dostal stejná práva jako vy.
|
||||||
|
- Nový školní účet pro cvičení se jmenuje zaci a je běžný uživatel, ne správce.
|
||||||
|
|
||||||
|
> Tip: Když systém požádá o heslo správce, běžný účet na to nestačí. To je záměr, ne porucha.
|
||||||
|
|
||||||
|
## Heslo
|
||||||
|
*Osm znaků*
|
||||||
|
|
||||||
|
- Heslo má aspoň 8 znaků a není to jméno účtu, ani slovo heslo, ani 12345678.
|
||||||
|
- Do příkazu se heslo nepíše. Příkaz net user zaci * /add se na heslo zeptá a na obrazovce ho neukáže.
|
||||||
|
- Heslo na papírek na monitor nepatří. Patří do hlavy, nebo do školního sejfu hesel, když ho učitel určí.
|
||||||
|
- Cizí heslo se nezkouší. Ani když je účet spolužáka odhlášený a počítač je společný.
|
||||||
|
|
||||||
|
> Tip: Hvězdička v net user znamená dotaz na heslo. Heslo napsané za příkazem zůstane v historii příkazů.
|
||||||
|
|
||||||
|
## Vlastní soubory
|
||||||
|
*Profil*
|
||||||
|
|
||||||
|
- Profil je složka C:\Users\zaci. Jsou v ní Dokumenty, Plocha a Stažené soubory.
|
||||||
|
- Soubor uložený do Dokumentů tohoto účtu jiný běžný uživatel neotevře.
|
||||||
|
- Společná složka C:\Users\Public je pro věci, které mají vidět všichni. Úkoly tam nedávejte.
|
||||||
|
- Odhlášení účet zavře. Vypnutí počítače taky. Přepnutí uživatele nechá první účet otevřený v paměti.
|
||||||
|
|
||||||
|
> Tip: Na sdíleném počítači se odhlašujte. Přepnutí uživatele nechá otevřené dokumenty v paměti.
|
||||||
|
|
||||||
|
## Zadání: účet na papíře
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Napište, jak by se založil běžný účet zaci: příkaz net user zaci * /add spuštěný jako správce.
|
||||||
|
- Napište heslo, které pravidlům nevyhovuje, a druhé, které má aspoň 8 znaků a není jméno účtu. Skutečné školní heslo nepište.
|
||||||
|
- Účet nesmí být ve skupině Administrators. Patří mezi běžné Users.
|
||||||
|
- Uložte ucet.txt do Skola\1-rocnik\system. Účet v systému zakládejte jen když to učitel výslovně řekne.
|
||||||
|
|
||||||
|
> Tip: Kdo jsem, zjistí příkaz whoami. Když vypíše správce, na denní práci jste na špatném účtu.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jaký má být cvičný účet zaci?
|
||||||
|
- Správce, ať jde všechno
|
||||||
|
- [x] Běžný uživatel
|
||||||
|
- Účet bez hesla
|
||||||
|
- Účet hosta sdílený celou třídou bez hesla
|
||||||
|
> Denní práce běží jako běžný uživatel. Správce je na instalaci a správu, ne na Word.
|
||||||
|
|
||||||
|
## Jak se heslo předá příkazu net user?
|
||||||
|
- Napíše se za příkaz, ať je v sešitě vidět
|
||||||
|
- [x] Hvězdičkou, příkaz se zeptá a heslo neukáže
|
||||||
|
- Do názvu účtu
|
||||||
|
- Do souboru na plochu
|
||||||
|
> net user zaci * /add se zeptá. Heslo v příkazu zůstane v historii.
|
||||||
|
|
||||||
|
## Proč se denně nepracuje jako správce?
|
||||||
|
- Word jinak nejde otevřít
|
||||||
|
- [x] Program, který spustíte, dostane právo měnit systém
|
||||||
|
- Správce nemá Dokumenty
|
||||||
|
- Excel jinak nepočítá
|
||||||
|
> Škodlivý program dědí vaše práva. U správce smí instalovat a měnit systém.
|
||||||
|
|
||||||
|
## Kam patří osobní úkol?
|
||||||
|
- Do C:\Users\Public
|
||||||
|
- [x] Do Dokumentů vlastního účtu
|
||||||
|
- Do složky Windows
|
||||||
|
- Na účet spolužáka
|
||||||
|
> Public vidí každý účet na počítači. Úkol patří do vlastního profilu.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Task Manager
|
||||||
|
popis: A process, memory and startup programs. The system is not ended.
|
||||||
|
nazev_cviceni: Quiz: Task Manager
|
||||||
|
nadpis_kvizu: Pick what you may end
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/1-rocnik/06-spravce-uloh.md
Normal file
79
content/programove-vybaveni/1-rocnik/06-spravce-uloh.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-1-spravce-uloh
|
||||||
|
nazev: Správce úloh
|
||||||
|
popis: Proces, paměť a programy po spuštění. Systém se neukončuje.
|
||||||
|
nazev_cviceni: Kvíz: Správce úloh
|
||||||
|
nadpis_kvizu: Vyberte, co smíte ukončit
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Okno
|
||||||
|
*Ctrl+Shift+Esc*
|
||||||
|
|
||||||
|
- Správce úloh se otevře Ctrl+Shift+Esc. Nehledá se přes náhodné ikony na ploše.
|
||||||
|
- Karta Procesy ukáže aplikace a to, co běží na pozadí.
|
||||||
|
- Sloupec Procesor je v procentech. Sloupec Paměť je v megabajtech.
|
||||||
|
- Vysoká paměť u prohlížeče s dvaceti kartami je běžná. Vysoká paměť neznámého procesu se hlásí.
|
||||||
|
|
||||||
|
> Tip: Když plocha nereaguje, Ctrl+Shift+Esc často projde i tehdy, když nabídka Start ne.
|
||||||
|
|
||||||
|
## Ukončit se smí aplikace
|
||||||
|
*Ne systém*
|
||||||
|
|
||||||
|
- Ukončit úlohu smíte u svého Wordu, který nereaguje. Rozpracovaný dokument si předtím uložte, jinak o něj přijdete.
|
||||||
|
- Proces Systém, Registr a aplikace systému Windows se neukončují. Počítač pak nemusí doběhnout do restartu.
|
||||||
|
- Neznámý proces nejdřív vyhledejte podle přesného názvu. Ukončení není první krok.
|
||||||
|
- Restart počítače je čistší než ukončit deset systémových procesů za sebou.
|
||||||
|
|
||||||
|
> Tip: Word, který nereaguje, ukončete a otevřete znovu. Autorecover často dokument vrátí, ale nespoléhejte na něj.
|
||||||
|
|
||||||
|
## Po spuštění
|
||||||
|
*Co startuje samo*
|
||||||
|
|
||||||
|
- Karta Aplikace po spuštění ukáže programy, které naběhnou s Windows.
|
||||||
|
- Každý takový program bere čas startu a paměť. Ve škole jich má být málo.
|
||||||
|
- Vypnutí Teams nebo prohlížeče po spuštění, když ho učitel nechce, je v pořádku. Vypnutí zabezpečení Windows není.
|
||||||
|
- Změna se projeví po příštím přihlášení, ne vždy hned.
|
||||||
|
|
||||||
|
> Tip: Povolené a zakázané je v posledním sloupci. Zakázaný program v počítači zůstane, jen se sám nespustí.
|
||||||
|
|
||||||
|
## Zadání: jeden pohled
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Otevřete Správce úloh a zapište tři aplikace, které berou nejvíc paměti. Čísla opište.
|
||||||
|
- Najděte, jestli s Windows startuje něco, co nepoznáváte. Neznámé nevypínejte, jen ho zapište.
|
||||||
|
- Systémové procesy neukončujte. Když Word nereaguje, ukončete jen Word.
|
||||||
|
- Uložte procesy.txt do Skola\1-rocnik\system.
|
||||||
|
|
||||||
|
> Tip: Řazení podle paměti je kliknutí na záhlaví sloupce Paměť. První řádek je pak ten nejtěžší.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jakou zkratkou se otevře Správce úloh?
|
||||||
|
- [x] Ctrl+Shift+Esc
|
||||||
|
- Ctrl+S
|
||||||
|
- Win+E je Správce úloh
|
||||||
|
- Alt+F4 na ploše
|
||||||
|
> Ctrl+Shift+Esc otevře Správce přímo. Win+E je Průzkumník.
|
||||||
|
|
||||||
|
## Co smíte ukončit, když nereaguje vaše práce?
|
||||||
|
- Proces Systém
|
||||||
|
- [x] Svůj Word, který nereaguje
|
||||||
|
- Registr
|
||||||
|
- Zabezpečení Windows
|
||||||
|
> Ukončuje se zaseknutá aplikace. Systémové procesy drží počítač.
|
||||||
|
|
||||||
|
## Co dělá vypnutí programu na kartě Po spuštění?
|
||||||
|
- Odinstaluje ho
|
||||||
|
- [x] Příště se sám nespustí s Windows
|
||||||
|
- Smaže Dokumenty
|
||||||
|
- Zakáže aktualizace
|
||||||
|
> Program v počítači zůstane. Nenaběhne jen sám při přihlášení.
|
||||||
|
|
||||||
|
## Vysoká paměť u prohlížeče s mnoha kartami znamená co?
|
||||||
|
- Že se má hned ukončit Systém
|
||||||
|
- [x] Že prohlížeč prostě drží otevřené karty
|
||||||
|
- Že je disk NTFS rozbitý
|
||||||
|
- Že vypršela licence
|
||||||
|
> Každá karta bere paměť. Neznámý proces je jiný případ než prohlížeč, který jste sami otevřeli.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Securing the computer
|
||||||
|
popis: Antivirus, updates and a file that pretends to be a document.
|
||||||
|
nazev_cviceni: Quiz: security
|
||||||
|
nadpis_kvizu: Pick what stays on and what stays closed
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/1-rocnik/07-zabezpeceni.md
Normal file
79
content/programove-vybaveni/1-rocnik/07-zabezpeceni.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-1-zabezpeceni
|
||||||
|
nazev: Zabezpečení počítače
|
||||||
|
popis: Antivir, aktualizace a soubor, který se tváří jako dokument.
|
||||||
|
nazev_cviceni: Kvíz: zabezpečení
|
||||||
|
nadpis_kvizu: Vyberte, co se nezapíná a co se neotvírá
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Zabezpečení Windows
|
||||||
|
*Defender*
|
||||||
|
|
||||||
|
- Školní Windows mají Zabezpečení Windows. Antivir se nevypíná kvůli instalaci hry.
|
||||||
|
- Ochrana v reálném čase má být zapnutá. Vypnutá ochrana je nález, ne úleva.
|
||||||
|
- Brána firewall má být zapnutá na školní síti. Vypnutí kvůli jedné hře se nedělá.
|
||||||
|
- Druhý antivir vedle Defenderu se bez učitele neinstaluje. Dva se perou a oba pak hlídají hůř.
|
||||||
|
|
||||||
|
> Tip: Zabezpečení Windows otevřete z nabídky Start. Zelené fajfky u položek jsou stav, který opisujete do úkolu.
|
||||||
|
|
||||||
|
## Soubory a maily
|
||||||
|
*Co neotvírat*
|
||||||
|
|
||||||
|
- Příloha faktura.pdf.exe se neotevírá, ani když text mailu zní věcně.
|
||||||
|
- Odkaz na přihlášení, který nečekáte, se neotvírá. Škola po hesle v mailu nepátrá.
|
||||||
|
- Flash disk neznámého původu se do školního počítače nestrká. Nejdřív učitel.
|
||||||
|
- Makro ve Wordu se povoluje, jen když dokument přišel ze školy a učitel řekl proč.
|
||||||
|
|
||||||
|
> Tip: Heslo se neposílá mailem ani do chatu. Kdo ho po vás chce zprávou, nemá ho dostat.
|
||||||
|
|
||||||
|
## Oprávnění k souboru
|
||||||
|
*NTFS*
|
||||||
|
|
||||||
|
- Pravý klik na složku, Vlastnosti, Zabezpečení ukáže, kdo smí číst a kdo zapisovat.
|
||||||
|
- Běžný uživatel zapíše do svých Dokumentů. Do C:\Windows nezapíše.
|
||||||
|
- Odebrat si vlastní právo číst vlastní Dokumenty je chyba. Složka pak nejde otevřít.
|
||||||
|
- Společná složka Public nemá být místo, kam dáváte test s jménem.
|
||||||
|
|
||||||
|
> Tip: Když soubor nejde uložit, často nemáte právo zápisu. Uložte ho do Dokumentů, ne do Program Files.
|
||||||
|
|
||||||
|
## Zadání: pět kontrol
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Opište, jestli je ochrana v reálném čase zapnutá a jestli firewall hlásí zapnuto.
|
||||||
|
- Z Windows Update opište, jestli něco čeká na restart.
|
||||||
|
- Najděte ve stažených souborech, jestli tam není soubor s dvojitou příponou. Neotvírejte ho, zapište název.
|
||||||
|
- Uložte bezpecnost.txt do Skola\1-rocnik\system. Ochranu nevypínejte.
|
||||||
|
|
||||||
|
> Tip: Když je ochrana vypnutá, nezapínejte ji naslepo třemi kliky v neznámém okně. Řekněte to učiteli, může ji vypínat školní správa.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Co má být zapnuté v Zabezpečení Windows?
|
||||||
|
- Nic, antivir zpomaluje Word
|
||||||
|
- [x] Ochrana v reálném čase a firewall
|
||||||
|
- Jen spořič obrazovky
|
||||||
|
- Jen OneDrive
|
||||||
|
> Antivir i firewall jsou součást školního počítače. Nevypínají se kvůli pohodlí.
|
||||||
|
|
||||||
|
## Který soubor neotevřete?
|
||||||
|
- poznamka.txt z vlastní složky
|
||||||
|
- [x] faktura.pdf.exe z mailu
|
||||||
|
- zadost.docx, kterou jste sami uložili
|
||||||
|
- znamky.xlsx z hodiny
|
||||||
|
> Dvojitá přípona exe je program. Mail s fakturou ho nesmí spustit.
|
||||||
|
|
||||||
|
## Kam běžný uživatel smí uložit úkol?
|
||||||
|
- Do C:\Windows
|
||||||
|
- [x] Do svých Dokumentů
|
||||||
|
- Do složky ovladačů
|
||||||
|
- Přes cizí účet
|
||||||
|
> Dokumenty vlastního účtu jsou na zápis. Systémové složky ne.
|
||||||
|
|
||||||
|
## Proč se vedle Defenderu bez učitele nedává druhý antivir?
|
||||||
|
- Windows umí jen jeden a druhý se vždy sám smaže
|
||||||
|
- [x] Dva antiviry se navzájem ruší
|
||||||
|
- Defender je freeware bez licence
|
||||||
|
- Excel pak neumí SUMA
|
||||||
|
> Dva programy, které hlídají stejné soubory, se blokují. Ve škole stačí Zabezpečení Windows.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Assignment: a school account and a tidy disk
|
||||||
|
popis: Folders, a standard account, updates and protection in one note.
|
||||||
|
nazev_cviceni: Quiz: the school account
|
||||||
|
nadpis_kvizu: Check the whole assignment
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/1-rocnik/08-zadani-windows.md
Normal file
79
content/programove-vybaveni/1-rocnik/08-zadani-windows.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-1-zadani-windows
|
||||||
|
nazev: Zadání: školní účet a pořádek
|
||||||
|
popis: Složky, běžný účet, aktualizace a ochrana v jednom zápisu.
|
||||||
|
nazev_cviceni: Kvíz: školní účet
|
||||||
|
nadpis_kvizu: Zkontrolujte celé zadání
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Složky
|
||||||
|
*Strom*
|
||||||
|
|
||||||
|
- V Dokumentech je Skola\1-rocnik a v ní word, excel a system.
|
||||||
|
- Na ploše nezůstane pracovní soubor. Plocha není archiv.
|
||||||
|
- Přípony názvů jsou vidět. poznámka se nejmenuje poznámka.txt.txt.
|
||||||
|
- Názvy jsou bez znaků \ / : * ? a datum v názvu je rok-měsíc-den.
|
||||||
|
|
||||||
|
> Tip: Cestu opište z řádku adresy. Od oka se lomítka pletou.
|
||||||
|
|
||||||
|
## Účet
|
||||||
|
*zaci*
|
||||||
|
|
||||||
|
- Cvičný účet zaci je běžný uživatel. Není ve skupině Administrators.
|
||||||
|
- Heslo má aspoň 8 znaků a nezadává se do příkazu, jen přes hvězdičku v net user zaci * /add.
|
||||||
|
- Do zápisu nepatří skutečné heslo. Patří tam pravidlo a příkaz bez hesla.
|
||||||
|
- whoami na denní práci nemá ukázat účet správce.
|
||||||
|
|
||||||
|
> Tip: Účet zakládejte jen pod dohledem. V zápisu stačí postup, když učitel účet na počítači nechce.
|
||||||
|
|
||||||
|
## Stav systému
|
||||||
|
*Tři řádky*
|
||||||
|
|
||||||
|
- winver: edice a verze.
|
||||||
|
- Windows Update: aktuální, nebo čeká restart. Datum stačí.
|
||||||
|
- Zabezpečení Windows: ochrana v reálném čase zapnutá, firewall zapnutý.
|
||||||
|
- Ze Správce úloh tři nejtěžší aplikace podle paměti. Systémové procesy neukončené.
|
||||||
|
|
||||||
|
> Tip: Když je něco vypnuté, zapište to jako nález. Neopravujte firewall naslepo.
|
||||||
|
|
||||||
|
## Odevzdání
|
||||||
|
*Jeden soubor*
|
||||||
|
|
||||||
|
- Všechno je v ucto-windows.txt ve složce Skola\1-rocnik\system.
|
||||||
|
- Jsou tam cesta ke složce word, popis účtu, verze Windows a stav ochrany.
|
||||||
|
- Není tam heslo, není tam cizí soubor a není tam vypnutý Defender.
|
||||||
|
- Soubor otevřete znovu a přečtěte ho. Cesta v textu musí po vložení do adresy opravdu vyjít.
|
||||||
|
|
||||||
|
> Tip: Když cesta z textu skončí chybou, složka neexistuje, nebo je v cestě obyčejné lomítko.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jaký účet je zaci?
|
||||||
|
- Správce
|
||||||
|
- [x] Běžný uživatel mimo skupinu Administrators
|
||||||
|
- Účet bez hesla v Public
|
||||||
|
- Sdílený účet celé třídy
|
||||||
|
> Denní účet není správce. Heslo má a do skupiny Administrators nepatří.
|
||||||
|
|
||||||
|
## Kam se ukládá pracovní soubor?
|
||||||
|
- Na plochu
|
||||||
|
- [x] Do Skola\1-rocnik a příslušné složky
|
||||||
|
- Do C:\Windows
|
||||||
|
- Do stažených souborů bez názvu
|
||||||
|
> Plocha se nearchivuje. Strom Skola drží word, excel a system odděleně.
|
||||||
|
|
||||||
|
## Co má být zapnuté?
|
||||||
|
- Jen spořič
|
||||||
|
- [x] Ochrana v reálném čase a firewall
|
||||||
|
- Dva antiviry
|
||||||
|
- Sdílení celé složky Users
|
||||||
|
> Defender a firewall zůstávají zapnuté. Do úkolu se opisuje jejich stav.
|
||||||
|
|
||||||
|
## Co v souboru ucto-windows.txt být nesmí?
|
||||||
|
- Verze z winver
|
||||||
|
- [x] Skutečné heslo
|
||||||
|
- Cesta ke složce
|
||||||
|
- Stav Windows Update
|
||||||
|
> Heslo se do textového úkolu nepíše. Příkaz ho bere přes hvězdičku, ne do sešitu.
|
||||||
6
content/programove-vybaveni/2-rocnik/01-word-styly.en.md
Normal file
6
content/programove-vybaveni/2-rocnik/01-word-styly.en.md
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Word: styles
|
||||||
|
popis: Heading 1, body text and spacing that is not empty lines.
|
||||||
|
nazev_cviceni: Quiz: styles
|
||||||
|
nadpis_kvizu: Pick the style and the shortcut
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/2-rocnik/01-word-styly.md
Normal file
79
content/programove-vybaveni/2-rocnik/01-word-styly.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-2-word-styly
|
||||||
|
nazev: Word: styly
|
||||||
|
popis: Nadpis 1, normální text a mezery, které nejsou prázdné řádky.
|
||||||
|
nazev_cviceni: Kvíz: styly
|
||||||
|
nadpis_kvizu: Vyberte styl a zkratku
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Styl, ne ruční tučné
|
||||||
|
*Nadpis*
|
||||||
|
|
||||||
|
- Nadpis 1 je styl. Ctrl+Alt+1 ho zapne. Nadpis 2 je Ctrl+Alt+2.
|
||||||
|
- Tučné a větší písmo místo stylu vypadá jako nadpis, ale obsah z něj Word nesestaví.
|
||||||
|
- Normální text je styl Normální. Ctrl+Shift+N ho vrátí, když jste omylem v nadpisu.
|
||||||
|
- V dokumentu jsou nejvýš tři úrovně nadpisů. Čtvrtá je už nepřehledná.
|
||||||
|
|
||||||
|
> Tip: Podokno Styly otevřete z karty Domů. U odstavce je vidět, jaký styl opravdu má.
|
||||||
|
|
||||||
|
## Odstavec
|
||||||
|
*Mezery ze stylu*
|
||||||
|
|
||||||
|
- Prázdný Enter mezi odstavci se nedělá. Mezera se nastaví ve stylu, třeba 8 bodů za odstavcem.
|
||||||
|
- Řádkování školního textu je 1,15 nebo 1,5. Ne dvojité přes celou stránku bez důvodu.
|
||||||
|
- Zarovnání do bloku u delšího textu, vlevo u nadpisu a u krátkého dopisu.
|
||||||
|
- Stránka je A4. Okraje 2,5 cm ze všech stran, to je předvolba Normální.
|
||||||
|
|
||||||
|
> Tip: Konec stránky je Ctrl+Enter. Řada Enterů na další stránku se při úpravě rozjede.
|
||||||
|
|
||||||
|
## Soubor
|
||||||
|
*docx a pdf*
|
||||||
|
|
||||||
|
- Pracovní soubor je .docx. Jdou v něm styly i další úpravy.
|
||||||
|
- Na odevzdání, které se už nemá měnit, je navíc PDF.
|
||||||
|
- Jednou vyexportované PDF neupravujte dál jako jediný zdroj. Opravte docx a PDF udělejte znovu.
|
||||||
|
- Název je věcný: 2026-06-12-protokol.docx. Dokument1.docx se neodevzdává.
|
||||||
|
|
||||||
|
> Tip: Soubor, Export, Vytvořit soubor PDF. Před exportem se podívejte na náhled tisku, jestli nadpis nesedí sám na konci stránky.
|
||||||
|
|
||||||
|
## Zadání: dvoustránkový text
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Dokument A4, okraje 2,5 cm, aspoň tři nadpisy stylem Nadpis 1.
|
||||||
|
- Pod každým nadpisem aspoň jeden odstavec stylem Normální. Žádné prázdné Entery mezi nimi.
|
||||||
|
- Konec první stránky je Ctrl+Enter, ne deset prázdných řádků.
|
||||||
|
- Uložte protokol.docx do Skola\1-rocnik\word a k němu protokol.pdf.
|
||||||
|
|
||||||
|
> Tip: Když v navigačním podokně nadpisy nejsou, jsou to jen tučná písma. Označte je a dejte Ctrl+Alt+1.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jak se má udělat nadpis, aby z něj šel obsah?
|
||||||
|
- Tučně a 16 bodů
|
||||||
|
- [x] Stylem Nadpis 1, zkratka Ctrl+Alt+1
|
||||||
|
- Pěti prázdnými Entery nad ním
|
||||||
|
- Obrázkem textu
|
||||||
|
> Obsah čte styly. Ruční tučné písmo v obsahu není.
|
||||||
|
|
||||||
|
## Čím se přejde na další stránku?
|
||||||
|
- Deseti Entery
|
||||||
|
- [x] Ctrl+Enter
|
||||||
|
- Mezerou za odstavcem 80 bodů
|
||||||
|
- Smazáním okrajů
|
||||||
|
> Ctrl+Enter je konec stránky. Prázdné řádky se při doplnění textu rozjedou.
|
||||||
|
|
||||||
|
## Jaké jsou školní okraje na A4?
|
||||||
|
- 0 cm, ať se vejde víc
|
||||||
|
- [x] 2,5 cm, předvolba Normální
|
||||||
|
- 5 cm vpravo a 0 vlevo
|
||||||
|
- Okraje se ve Wordu nenastavují
|
||||||
|
> Normální okraj je 2,5 cm. Text až do kraje papíru tiskárna často ořízne.
|
||||||
|
|
||||||
|
## Který soubor se dál upravuje?
|
||||||
|
- PDF
|
||||||
|
- [x] docx
|
||||||
|
- Jen vytištěná stránka
|
||||||
|
- Příloha exe
|
||||||
|
> docx drží styly. PDF je kopie na odevzdání.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Word: a table, a header and a table of contents
|
||||||
|
popis: A 4 by 3 table, a page number and a contents list from the headings.
|
||||||
|
nazev_cviceni: Quiz: contents
|
||||||
|
nadpis_kvizu: Pick where the contents come from
|
||||||
|
---
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-2-word-obsah
|
||||||
|
nazev: Word: tabulka, záhlaví a obsah
|
||||||
|
popis: Tabulka 4×3, číslo stránky a obsah z nadpisů.
|
||||||
|
nazev_cviceni: Kvíz: obsah
|
||||||
|
nadpis_kvizu: Vyberte, odkud se obsah vezme
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Tabulka
|
||||||
|
*4 řádky a 3 sloupce*
|
||||||
|
|
||||||
|
- Tabulka se vkládá z karty Vložení. Kreslení tužkou od ruky se ve školním protokolu nedělá.
|
||||||
|
- Školní tabulka má 4 řádky a 3 sloupce: záhlaví a tři záznamy.
|
||||||
|
- Záhlaví tabulky je tučné a řádek se neopakuje jako obyčejný text pod tabulkou.
|
||||||
|
- Text v buňce se nezalamuje deseti mezerami. Šířka sloupce se táhne myší.
|
||||||
|
|
||||||
|
> Tip: Když potřebujete řádek navíc, klepněte vpravo od řádku a dejte vložit. Enter v buňce jen zalomí text.
|
||||||
|
|
||||||
|
## Záhlaví a zápatí
|
||||||
|
*Číslo stránky*
|
||||||
|
|
||||||
|
- Záhlaví je nahoře, zápatí dole. Dvojklik v okraji je otevře.
|
||||||
|
- V záhlaví je název školy a název dokumentu. V zápatí je číslo stránky.
|
||||||
|
- Číslo stránky se vloží jako pole. Ručně napsaná jednička se na druhé stránce neposune.
|
||||||
|
- Záhlaví není nadpis dokumentu. Nadpis zůstává v textu jako Nadpis 1.
|
||||||
|
|
||||||
|
> Tip: Pole čísla stránky má po označení šedé pozadí. Když je to obyčejná číslice, na další stránce se nezmění.
|
||||||
|
|
||||||
|
## Obsah
|
||||||
|
*Z nadpisů*
|
||||||
|
|
||||||
|
- Obsah je na kartě Reference, Obsah. Word ho složí z Nadpis 1 a Nadpis 2.
|
||||||
|
- Ručně psaný seznam stránek obsah není. Po vložení odstavce se rozejde.
|
||||||
|
- Po změně textu se obsah aktualizuje pravým klikem, Aktualizovat pole, a volbou celá tabulka.
|
||||||
|
- Obsah stojí na začátku, za titulní řádek, na vlastní stránce nebo hned pod názvem. Ne na konci.
|
||||||
|
|
||||||
|
> Tip: Když je obsah prázdný, nadpisy nejsou styly. Ctrl+Alt+1 a obsah aktualizujte znovu.
|
||||||
|
|
||||||
|
## Zadání: protokol s tabulkou
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Vezměte protokol.docx. Přidejte tabulku 4×3: sloupec Jméno, Třída, Stav.
|
||||||
|
- Tři řádky: Anna Nováková, 1.A, odevzdáno. Druhý a třetí řádek doplňte vlastními jmény.
|
||||||
|
- Záhlaví s názvem školy, zápatí s číslem stránky, obsah z nadpisů na začátku.
|
||||||
|
- Uložte znovu docx a nové PDF. Staré PDF přepište, ať neexistují dvě verze.
|
||||||
|
|
||||||
|
> Tip: Aktualizace obsahu se ptá, jestli jen čísla, nebo celá tabulka. Po nových nadpisech berte celou tabulku.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jak velká je školní tabulka v tomto úkolu?
|
||||||
|
- [x] 4 řádky a 3 sloupce
|
||||||
|
- Jedna buňka
|
||||||
|
- 10 sloupců bez záhlaví
|
||||||
|
- Tabulka se ve Wordu nedělá
|
||||||
|
> Záhlaví plus tři záznamy jsou čtyři řádky. Sloupce jsou Jméno, Třída a Stav.
|
||||||
|
|
||||||
|
## Odkud Word vezme obsah?
|
||||||
|
- Z tučných vět
|
||||||
|
- [x] Ze stylů Nadpis 1 a Nadpis 2
|
||||||
|
- Z zápatí
|
||||||
|
- Z Excelu automaticky vždy
|
||||||
|
> Bez stylů nadpisů je obsah prázdný. Tučné písmo nestačí.
|
||||||
|
|
||||||
|
## Jak se má dostat na stránku číslo?
|
||||||
|
- Napsat 1 do zápatí ručně
|
||||||
|
- [x] Vložit pole čísla stránky
|
||||||
|
- Dát ho do názvu souboru
|
||||||
|
- Nepsat ho, Word ho do PDF doplní sám i bez pole
|
||||||
|
> Pole se na každé stránce samo zvýší. Ruční jednička zůstane jednička.
|
||||||
|
|
||||||
|
## Kdy se obsah aktualizuje celý, ne jen čísla stránek?
|
||||||
|
- [x] Když přibyl nadpis
|
||||||
|
- Když se jen změnila šířka okraje o milimetr a nadpisy zůstaly
|
||||||
|
- Po každém písmenu
|
||||||
|
- Obsah se neaktualizuje nikdy
|
||||||
|
> Nový nadpis do obsahu přibude jen při aktualizaci celé tabulky.
|
||||||
6
content/programove-vybaveni/2-rocnik/03-word-dopis.en.md
Normal file
6
content/programove-vybaveni/2-rocnik/03-word-dopis.en.md
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Word: a formal letter
|
||||||
|
popis: Sender, date, subject, greeting, body and signature on one page.
|
||||||
|
nazev_cviceni: Quiz: the letter
|
||||||
|
nadpis_kvizu: Put the parts in order
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/2-rocnik/03-word-dopis.md
Normal file
79
content/programove-vybaveni/2-rocnik/03-word-dopis.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-2-word-dopis
|
||||||
|
nazev: Word: úřední dopis
|
||||||
|
popis: Odesílatel, datum, věc, oslovení, text a podpis na jedné straně.
|
||||||
|
nazev_cviceni: Kvíz: dopis
|
||||||
|
nadpis_kvizu: Seřaďte náležitosti
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Náležitosti
|
||||||
|
*Shora dolů*
|
||||||
|
|
||||||
|
- Vlevo nahoře odesílatel: škola, jméno, adresa. Vpravo datum 12. 6. 2026.
|
||||||
|
- Pod tím adresát. Pak řádek Věc: žádost o uvolnění z výuky.
|
||||||
|
- Oslovení, text, rozloučení a jméno s podpisem. Podpis je pod jménem, ne místo něj.
|
||||||
|
- Celý dopis je jedna strana A4. Druhá stránka s jedním řádkem je chyba.
|
||||||
|
|
||||||
|
> Tip: Datum pište 12. 6. 2026, ne 12/6/26. Český úřední dopis má den, měsíc a rok.
|
||||||
|
|
||||||
|
## Vzhled
|
||||||
|
*Klidný dopis*
|
||||||
|
|
||||||
|
- Písmo jedno, třeba Calibri 11 nebo 12. V dopise není Nadpis 1 přes celou šířku.
|
||||||
|
- Řádek Věc je tučný nebo jako krátký nadpis, zbytek je Normální.
|
||||||
|
- Odstavce mají mezeru za sebou. Mezi oslovením a textem není deset Enterů.
|
||||||
|
- Okraje 2,5 cm. Text do bloku. Bez obrázku, bez tabulky, bez obsahu.
|
||||||
|
|
||||||
|
> Tip: Když se poslední řádek podpisu sleze na druhou stránku, zkraťte mezeru za odstavcem, nepřidávejte menší okraje než 2 cm.
|
||||||
|
|
||||||
|
## Hromadná pošta
|
||||||
|
*Až když je řádků víc*
|
||||||
|
|
||||||
|
- Jeden dopis se píše přímo. Hromadná korespondence se vyplatí, když je adresátů aspoň deset.
|
||||||
|
- Zdroj dat je Excel s řádkem záhlaví: Jmeno, Prijmeni, Trida.
|
||||||
|
- Word na kartě Korespondence vezme tento sešit a pole vloží do oslovení.
|
||||||
|
- Sloučený výsledek se ukládá jako nový docx. Zdrojový dopis s poli si nechte zvlášť.
|
||||||
|
|
||||||
|
> Tip: Když Excel nemá záhlaví, první žák se stane názvem sloupce a z hromadné pošty vypadne.
|
||||||
|
|
||||||
|
## Zadání: žádost
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Napište žádost o uvolnění z výuky na 12. 6. 2026. Adresát je ředitel školy, odesílatel jste vy.
|
||||||
|
- V dokumentu je Věc, oslovení, aspoň dvě věty důvodu a podpis.
|
||||||
|
- Jedna strana, A4, okraje 2,5 cm. Uložte zadost.docx a zadost.pdf do složky word.
|
||||||
|
- Hromadnou poštu v tomto úkolu nedělejte. Stačí jeden dopis.
|
||||||
|
|
||||||
|
> Tip: Přečtěte dopis nahlas. Když v něm chybí, o co žádáte a který den, věta důvodu nestačí.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Kam patří datum v tomto dopisu?
|
||||||
|
- Dospodu místo podpisu
|
||||||
|
- [x] Dopravna, 12. 6. 2026
|
||||||
|
- Do názvu souboru jako jediné místo
|
||||||
|
- Do zápatí místo čísla, datum v textu být nesmí
|
||||||
|
> Datum je vpravo nahoře. Podpis dole je jméno, ne datum.
|
||||||
|
|
||||||
|
## Jak se označí, o co v dopise jde?
|
||||||
|
- [x] Řádkem Věc
|
||||||
|
- Stylem Nadpis 3 uprostřed stránky
|
||||||
|
- Obrázkem razítka
|
||||||
|
- Obsahem na druhé straně
|
||||||
|
> Věc je krátký řádek nad oslovením, třeba žádost o uvolnění z výuky.
|
||||||
|
|
||||||
|
## Kdy se použije hromadná korespondence?
|
||||||
|
- Na jeden dopis řediteli
|
||||||
|
- [x] Když je stejný dopis pro deset a víc adresátů a data jsou v Excelu
|
||||||
|
- Na každou tabulku
|
||||||
|
- Místo PDF
|
||||||
|
> Jeden dopis se píše ručně. Hromadná pošta bere řádky z Excelu se záhlavím.
|
||||||
|
|
||||||
|
## Jak dlouhý je školní dopis z tohoto zadání?
|
||||||
|
- [x] Jedna strana A4
|
||||||
|
- Přesně tři strany
|
||||||
|
- Půl stránky a zbytek prázdných Enterů
|
||||||
|
- Deset stran se styly Nadpis 1
|
||||||
|
> Žádost se vejde na jednu stranu. Druhá stránka jen s podpisem je špatně zalomená.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Excel: cells and formulas
|
||||||
|
popis: The address A1, a formula with an equals sign and a dollar lock.
|
||||||
|
nazev_cviceni: Quiz: cells
|
||||||
|
nadpis_kvizu: Complete the formula
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/2-rocnik/04-excel-bunky.md
Normal file
79
content/programove-vybaveni/2-rocnik/04-excel-bunky.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-2-excel-bunky
|
||||||
|
nazev: Excel: buňky a vzorce
|
||||||
|
popis: Adresa A1, vzorec se rovnítkem a ukotvení dolarama.
|
||||||
|
nazev_cviceni: Kvíz: buňky
|
||||||
|
nadpis_kvizu: Doplňte vzorec
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Buňka
|
||||||
|
*Adresa*
|
||||||
|
|
||||||
|
- Sloupce jsou písmena, řádky čísla. B2 je druhý sloupec a druhý řádek.
|
||||||
|
- Do buňky patří jedna hodnota. Jméno a třída do jedné buňky nepatří.
|
||||||
|
- Číslo je číslo, text je text. Jeden apostróf před číslem z něj udělá text a přestane se sčítat.
|
||||||
|
- Sešit je soubor xlsx. List je záložka dole. Školní sešit má listy Ceník a Součet.
|
||||||
|
|
||||||
|
> Tip: Klik na záhlaví sloupce označí celý sloupec. Na číslo řádku celý řádek.
|
||||||
|
|
||||||
|
## Vzorec
|
||||||
|
*Rovnítko*
|
||||||
|
|
||||||
|
- Vzorec začíná =. Bez rovnítka je B2*C2 jen text a nic nespočítá.
|
||||||
|
- V ceníku je v D2 vzorec =B2*C2. B je počet, C je cena, D je částka.
|
||||||
|
- Český Excel odděluje argumenty funkcí středníkem. Krát je hvězdička, děleno lomítko.
|
||||||
|
- Vzorec se kopíruje za úchyt v pravém dolním rohu buňky. Neopisuje se do pěti buněk ručně.
|
||||||
|
|
||||||
|
> Tip: Když buňka ukáže vzorec místo výsledku, je sloupec úzký, nebo je buňka text. Zkontrolujte rovnítko.
|
||||||
|
|
||||||
|
## Posun a dolar
|
||||||
|
*A1 a $A$1*
|
||||||
|
|
||||||
|
- Zkopírování =B2*C2 o řádek níž udělá =B3*C3. Adresy se posunou.
|
||||||
|
- =$B$2 se neposune ani ve sloupci, ani v řádku. Dolar kotví.
|
||||||
|
- Sazba DPH v buňce F1 se ve vzorcích bere jako $F$1, ať kopírování neodjede na F2.
|
||||||
|
- Smazání hodnoty, na kterou vzorec ukazuje, udělá chybu. Vzorec na prázdnou buňku není nula sám od sebe, když čekal číslo a dostal text.
|
||||||
|
|
||||||
|
> Tip: Dolar jen u písmene, $B2, kotví sloupec. Dolar jen u čísla, B$2, kotví řádek.
|
||||||
|
|
||||||
|
## Zadání: ceník
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- List Ceník: sloupce Polozka, Pocet, Cena, Castka. Záhlaví v řádku 1, pět položek v řádcích 2 až 6.
|
||||||
|
- Castka v D2 je =B2*C2 a dolů se táhne. Žádná částka není napsaná ručně.
|
||||||
|
- Sazba v F1 je 0,21 a v E2 je =D2*$F$1. Po zkopírování dolů pořád ukazuje na F1.
|
||||||
|
- Uložte cenik.xlsx do Skola\1-rocnik\excel.
|
||||||
|
|
||||||
|
> Tip: Klik na D2 ukáže vzorec v řádku vzorců. Když tam je jen číslo, částka je opsaná a při změně počtu se nehne.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Čím začíná vzorec?
|
||||||
|
- Závorkou
|
||||||
|
- [x] Rovnítkem
|
||||||
|
- Středníkem
|
||||||
|
- Dolarama bez rovnítka
|
||||||
|
> Bez = Excel nic nepočítá. Text B2*C2 zůstane text.
|
||||||
|
|
||||||
|
## Co je v D2, když počet je v B2 a cena v C2?
|
||||||
|
- [x] =B2*C2
|
||||||
|
- B2*C2 bez rovnítka
|
||||||
|
- =B2+C2
|
||||||
|
- Ručně spočítané číslo
|
||||||
|
> Částka je součin. Sčítání by sečetlo počet s cenou, což není částka.
|
||||||
|
|
||||||
|
## Proč je sazba ve vzorci $F$1?
|
||||||
|
- [x] Aby se při kopírování dolů adresa neposunula
|
||||||
|
- Protože dolar je měna tabulky
|
||||||
|
- Aby vzorec přestal počítat
|
||||||
|
- $ se v Excelu nesmí
|
||||||
|
> F1 je jedna buňka pro všechny řádky. Bez dolarů by druhý řádek četl F2.
|
||||||
|
|
||||||
|
## Co udělá zkopírování =B2*C2 o řádek níž?
|
||||||
|
- Nechá B2 a C2
|
||||||
|
- [x] Vznikne =B3*C3
|
||||||
|
- Smaže list
|
||||||
|
- Změní se na text
|
||||||
|
> Relativní adresa se posune o stejný počet řádků jako kopírování.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Excel: functions
|
||||||
|
popis: SUM, IF and VLOOKUP. The Czech edition separates arguments with a semicolon.
|
||||||
|
nazev_cviceni: Quiz: functions
|
||||||
|
nadpis_kvizu: Pick the right formula
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/2-rocnik/05-excel-funkce.md
Normal file
79
content/programove-vybaveni/2-rocnik/05-excel-funkce.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-2-excel-funkce
|
||||||
|
nazev: Excel: funkce
|
||||||
|
popis: SUMA, KDYŽ a SVYHLEDAT. V české verzi se argumenty oddělují středníkem.
|
||||||
|
nazev_cviceni: Kvíz: funkce
|
||||||
|
nadpis_kvizu: Vyberte správný zápis
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Souhrny
|
||||||
|
*SUMA a spol.*
|
||||||
|
|
||||||
|
- SUMA(D2:D6) sečte částky. Průměr je PRŮMĚR, nejmenší MIN, největší MAX.
|
||||||
|
- POČET spočítá čísla. Prázdnou buňku nepočítá. Text nepočítá.
|
||||||
|
- Rozsah D2:D6 zahrnuje oba konce. D2:D6 jsou řádky 2 až 6, ne jen 2 a 6.
|
||||||
|
- Souhrn patří pod tabulku, nebo na list Součet. Nepočítá se na papír a neopisuje se.
|
||||||
|
|
||||||
|
> Tip: Anglický Excel má SUM a čárku. Český má SUMA a středník. Ve škole pište česky, jak to má školní Office.
|
||||||
|
|
||||||
|
## KDYŽ
|
||||||
|
*Známky*
|
||||||
|
|
||||||
|
- České známky: 1 je nejlepší, 5 je neprospěl. Prospěch je známka 1 až 4.
|
||||||
|
- =KDYŽ(D2<=4;"prospěl";"neprospěl") vrací text podle známky v D2.
|
||||||
|
- Středníky oddělují podmínku, větev ano a větev ne. Čárka v české verzi vzorec rozbije.
|
||||||
|
- Podmínka, která čeká známku aspoň 4 jako úspěch, je obráceně. Čtyřka ještě prochází, pětka ne.
|
||||||
|
|
||||||
|
> Tip: Uvozovky kolem textu ve funkci jsou povinné. Bez nich Excel hledá buňku nebo název.
|
||||||
|
|
||||||
|
## SVYHLEDAT
|
||||||
|
*Ceník*
|
||||||
|
|
||||||
|
- SVYHLEDAT najde hodnotu v levém sloupci oblasti a vrátí jiný sloupec stejného řádku.
|
||||||
|
- =SVYHLEDAT(A2;Ceník!$A$2:$C$20;3;NEPRAVDA) hledá A2, oblast je ukotvená, vrátí 3. sloupec, shoda je přesná.
|
||||||
|
- NEPRAVDA znamená přesnou shodu. PRAVDA by směla vzít nejbližší nižší a u textu plete.
|
||||||
|
- Hledaná hodnota musí být v prvním sloupci oblasti. Jinak funkce nehledá uprostřed tabulky.
|
||||||
|
|
||||||
|
> Tip: Když funkce vrátí #N/A, hodnota v prvním sloupci není. Zkontrolujte mezeru za jménem a stejný typ, text proti číslu.
|
||||||
|
|
||||||
|
## Zadání: známky a ceník
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Na list Znamky dejte pět žáků, sloupec Znamka a sloupec Stav se vzorcem KDYŽ, prospěl při známce 1 až 4.
|
||||||
|
- Pod známky SUMA nedávejte, součet známek nic neříká. Dejte PRŮMĚR.
|
||||||
|
- Na listu Ceník doplňte SVYHLEDAT, který podle kódu položky vrátí cenu. Oblast ukotvěte a dejte NEPRAVDA.
|
||||||
|
- Uložte znamky.xlsx do složky excel. Oba listy ať jsou v jednom sešitu.
|
||||||
|
|
||||||
|
> Tip: Průměr známek 1,0 až 5,0 vychází jako číslo. Když vyjde 0, počítáte prázdné buňky, nebo máte text místo čísel.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jak se v českém Excelu zapíše součet D2 až D6?
|
||||||
|
- =SUM(D2:D6)
|
||||||
|
- [x] =SUMA(D2:D6)
|
||||||
|
- =SUMA(D2,D6)
|
||||||
|
- SUMA(D2:D6) bez rovnítka
|
||||||
|
> Česká funkce je SUMA a rozsah je D2:D6. SUM je anglická verze.
|
||||||
|
|
||||||
|
## Který vzorec označí známku 5 jako neprospěl?
|
||||||
|
- [x] =KDYŽ(D2<=4;"prospěl";"neprospěl")
|
||||||
|
- =KDYŽ(D2>=4;"prospěl";"neprospěl")
|
||||||
|
- =KDYŽ(D2<=4,"prospěl","neprospěl")
|
||||||
|
- =D2<=4
|
||||||
|
> Prochází 1 až 4, tedy menší nebo rovno 4. V češtině jsou středníky, ne čárky.
|
||||||
|
|
||||||
|
## Co znamená NEPRAVDA na konci SVYHLEDAT?
|
||||||
|
- Vypne vzorec
|
||||||
|
- [x] Chce přesnou shodu
|
||||||
|
- Sečte sloupec
|
||||||
|
- Vrátí vždy první řádek
|
||||||
|
> NEPRAVDA je přesně ta hodnota. PRAVDA bere přibližnou shodu a u kódů položek lže.
|
||||||
|
|
||||||
|
## Proč je oblast Ceník!$A$2:$C$20 ukotvená?
|
||||||
|
- [x] Aby se při kopírování vzorce dolů neposunula
|
||||||
|
- Protože jinak nejde uložit xlsx
|
||||||
|
- Dolar sčítá ceny
|
||||||
|
- SVYHLEDAT ukotvení zakazuje
|
||||||
|
> Každý řádek hledá v téže tabulce. Bez dolarů by se oblast sunula dolů s vzorcem.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Excel: charts
|
||||||
|
popis: A column chart to compare, a line chart for time. A pie only for parts of a whole.
|
||||||
|
nazev_cviceni: Quiz: charts
|
||||||
|
nadpis_kvizu: Pick the chart type
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/2-rocnik/06-excel-grafy.md
Normal file
79
content/programove-vybaveni/2-rocnik/06-excel-grafy.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-2-excel-grafy
|
||||||
|
nazev: Excel: grafy
|
||||||
|
popis: Sloupcový graf pro porovnání, spojnicový pro čas. Koláč jen pro podíl celku.
|
||||||
|
nazev_cviceni: Kvíz: grafy
|
||||||
|
nadpis_kvizu: Vyberte typ grafu
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Který graf
|
||||||
|
*Typ*
|
||||||
|
|
||||||
|
- Porovnání tříd nebo položek je sloupcový graf.
|
||||||
|
- Vývoj po měsících je spojnicový. Osa x je čas, zleva doprava.
|
||||||
|
- Koláč je jen pro podíly jednoho celku, nejvýš pět výsečí. Dvanáct měsíců v koláči nečtěte.
|
||||||
|
- Dva grafy přes sebe, které říkají totéž, se nedělají.
|
||||||
|
|
||||||
|
> Tip: Když váháte, sloupec je ve škole skoro vždycky bezpečnější než koláč.
|
||||||
|
|
||||||
|
## Co musí být vidět
|
||||||
|
*Popisky*
|
||||||
|
|
||||||
|
- Graf má název, třeba Tržba po měsících. Název Graf 1 se neodevzdává.
|
||||||
|
- Osa hodnot má jednotku, Kč nebo počet. Osa kategorií má názvy, ne 1 až 12 bez legendy měsíce, pokud to z dat není jasné.
|
||||||
|
- Legenda se dá pryč, když je řada jen jedna. Zabírá místo a nic neříká.
|
||||||
|
- Data grafu jsou v buňkách. Namalovat sloupec obrázkem nejde aktualizovat.
|
||||||
|
|
||||||
|
> Tip: Klik na graf, Vybrat data. Když oblast nesedí, graf kreslí i záhlaví nebo prázdné řádky.
|
||||||
|
|
||||||
|
## Odkud bere čísla
|
||||||
|
*Tabulka*
|
||||||
|
|
||||||
|
- Nejdřív čísla, potom graf. Graf bez zdroje je obrázek.
|
||||||
|
- Nula v buňce je nula a v grafu je vidět. Prázdná buňka čáru přeruší.
|
||||||
|
- Text v číselném sloupci graf vynechá nebo ho položí jako nulu. Čísla nepište s jednotkou Kč v téže buňce.
|
||||||
|
- Změna čísla v tabulce změní graf. Když ne, graf je kopie jako obrázek.
|
||||||
|
|
||||||
|
> Tip: Kč patří do záhlaví sloupce nebo do názvu osy, ne za číslo do buňky. Jinak je buňka text.
|
||||||
|
|
||||||
|
## Zadání: jeden graf
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Na novém listu Mesice dejte leden až červen a k nim tržbu v Kč, šest čísel.
|
||||||
|
- Vložte spojnicový graf s názvem Tržba leden až červen. Jednotka ať je v názvu osy nebo v názvu grafu.
|
||||||
|
- Koláč nedělejte. Legendu jedné řady vypněte.
|
||||||
|
- Uložte do znamky.xlsx jako další list, nebo do trzba.xlsx ve složce excel.
|
||||||
|
|
||||||
|
> Tip: Náhled tisku ať graf neroztrhne na dvě stránky. Dejte ho pod tabulku, ne přes ni.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jaký graf je na tržbu leden až červen?
|
||||||
|
- Koláč se šesti výsečemi
|
||||||
|
- [x] Spojnicový
|
||||||
|
- Náhodný 3D kužel
|
||||||
|
- Obrázek sloupců vložený z Wordu
|
||||||
|
> Čas jde zleva doprava ve spojnicovém grafu. Koláč neukáže pořadí měsíců.
|
||||||
|
|
||||||
|
## Kdy je koláč na místě?
|
||||||
|
- Na dvanáct měsíců
|
||||||
|
- [x] Na podíly jednoho celku, jen pár výsečí
|
||||||
|
- Na každou tabulku
|
||||||
|
- Když chybí název
|
||||||
|
> Koláč je celek rozdělený na pár dílů. Časová řada do něj nepatří.
|
||||||
|
|
||||||
|
## Kam nepatří Kč?
|
||||||
|
- Do názvu osy
|
||||||
|
- [x] Do buňky za číslo, třeba 120 Kč
|
||||||
|
- Do názvu grafu
|
||||||
|
- Do záhlaví sloupce
|
||||||
|
> 120 Kč je text. Graf i SUMA pak číslo nevidí.
|
||||||
|
|
||||||
|
## Co se stane po změně čísla v tabulce, když je graf v pořádku?
|
||||||
|
- Graf se musí nakreslit znovu ručně
|
||||||
|
- [x] Sloupec nebo bod se změní sám
|
||||||
|
- Excel graf smaže
|
||||||
|
- Změní se licence
|
||||||
|
> Graf je navázaný na buňky. Obrázek vložený místo grafu se sám nezmění.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Excel: a table, a filter and a pivot
|
||||||
|
popis: A list as a table, a filter and a total by class.
|
||||||
|
nazev_cviceni: Quiz: the pivot table
|
||||||
|
nadpis_kvizu: Say what goes in rows and what goes in values
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/2-rocnik/07-excel-kontingence.md
Normal file
79
content/programove-vybaveni/2-rocnik/07-excel-kontingence.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-2-excel-kontingence
|
||||||
|
nazev: Excel: tabulka, filtr a kontingenční tabulka
|
||||||
|
popis: Seznam jako tabulka, filtr a součet podle třídy.
|
||||||
|
nazev_cviceni: Kvíz: kontingenční tabulka
|
||||||
|
nadpis_kvizu: Řekněte, co patří do řádků a co do hodnot
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Tabulka
|
||||||
|
*Ctrl+T*
|
||||||
|
|
||||||
|
- Seznam se záhlavím se označí a Ctrl+T z něj udělá tabulku. Filtr v záhlaví vznikne sám.
|
||||||
|
- Záhlaví je jeden řádek: Polozka, Trida, Castka. Dva řádky nadpisů Ctrl+T rozbije.
|
||||||
|
- Hned pod tabulku se nepíše další text. Souhrn je v řádku souhrnů, nebo na jiném listu.
|
||||||
|
- Řazení je šipka v záhlaví. Seřadit jen půlku sloupce mimo tabulku rozhodí řádky.
|
||||||
|
|
||||||
|
> Tip: Tabulka dostane na kartě Návrh název, třeba Prodej. Pak se na ni dá odkazovat jménem.
|
||||||
|
|
||||||
|
## Filtr
|
||||||
|
*Jen 1.A*
|
||||||
|
|
||||||
|
- Filtr Trida = 1.A ostatní řádky schová. Nesmaže je.
|
||||||
|
- Zrušení filtru je Vybrat vše, nebo Vymazat filtr na kartě Data.
|
||||||
|
- Řádek souhrnů tabulky sečte jen to, co filtr nechá vidět.
|
||||||
|
- Obyčejná SUMA přes stejné buňky sečte i řádky, které filtr schoval. Na filtrovaný součet to není.
|
||||||
|
|
||||||
|
> Tip: Když po filtru zmizí skoro všechno, podívejte se, jestli nemáte mezeru v názvu třídy. 1.A a 1.A s mezerou navíc jsou dvě hodnoty.
|
||||||
|
|
||||||
|
## Kontingenční tabulka
|
||||||
|
*Součet podle třídy*
|
||||||
|
|
||||||
|
- Kontingenční tabulka je na kartě Vložení. Zdroj je tabulka i se záhlavím.
|
||||||
|
- Do řádků přijde Trida. Do hodnot Součet z Castka. Sloupce nechte prázdné, dokud není druhý rozměr.
|
||||||
|
- Známky se v kontingenci nesčítají. U známek dejte průměr, u peněz součet.
|
||||||
|
- Kontingence patří na nový list. Když ji položíte přes zdroj, zdroj přepíšete.
|
||||||
|
|
||||||
|
> Tip: Po změně dat dejte Obnovit. Kontingenční tabulka se sama nehne.
|
||||||
|
|
||||||
|
## Zadání: prodej po třídách
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- List Prodej: aspoň 12 řádků, sloupce Polozka, Trida, Castka. Třídy jen 1.A a 1.B.
|
||||||
|
- Ctrl+T a název tabulky Prodej. Filtr ať umí ukázat jen 1.A a zase všechno.
|
||||||
|
- Kontingenční tabulka na novém listu: řádky Trida, hodnoty součet Castka.
|
||||||
|
- Uložte prodej.xlsx do složky Skola\1-rocnik\excel. Ruční součty vedle kontingence nepište.
|
||||||
|
|
||||||
|
> Tip: Když kontingence ukáže Počet místo Součet, v hodnotách počítá buňky. Přepněte souhrn na Součet.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Co udělá Ctrl+T na seznamu se záhlavím?
|
||||||
|
- Smaže ho
|
||||||
|
- [x] Udělá z něj tabulku s filtrem
|
||||||
|
- Převede ho na PDF
|
||||||
|
- Uzamkne list heslem
|
||||||
|
> Tabulka má filtr v záhlaví a jde pojmenovat. Obyčejná oblast to nemá.
|
||||||
|
|
||||||
|
## Co sečte jen řádky, které filtr nechá vidět?
|
||||||
|
- Obyčejná SUMA přes celou oblast
|
||||||
|
- [x] Řádek souhrnů tabulky
|
||||||
|
- Nadpis grafu
|
||||||
|
- Ručně opsaný součet
|
||||||
|
> SUMA schované řádky filtru pořád počítá. Řádek souhrnů tabulky bere jen viditelné.
|
||||||
|
|
||||||
|
## Kam v kontingenční tabulce patří Trida a kam Castka?
|
||||||
|
- Trida do hodnot jako součet, Castka do řádků
|
||||||
|
- [x] Trida do řádků, součet Castka do hodnot
|
||||||
|
- Obojí do filtrů a nikam jinam
|
||||||
|
- Trida do názvu souboru
|
||||||
|
> Řádky jsou třídy. Hodnoty jsou součet peněz. Součet názvů tříd nedává smysl.
|
||||||
|
|
||||||
|
## Kdy se u známek v kontingenci použije průměr?
|
||||||
|
- Vždy se známky sčítají
|
||||||
|
- [x] Když má vyjít průměrná známka, ne součet známek
|
||||||
|
- Průměr Excel neumí
|
||||||
|
- Jen u textu
|
||||||
|
> Součet známek nic neříká. Peníze se sčítají, známky se průměrují.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Assignment: a report and a sheet
|
||||||
|
popis: A Word letter and an Excel grade sheet in one folder.
|
||||||
|
nazev_cviceni: Quiz: the Office hand-in
|
||||||
|
nadpis_kvizu: Check both files
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/2-rocnik/08-zadani-office.md
Normal file
79
content/programove-vybaveni/2-rocnik/08-zadani-office.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-2-zadani-office
|
||||||
|
nazev: Zadání: protokol a tabulka
|
||||||
|
popis: Dopis ve Wordu a známky v Excelu v jedné složce.
|
||||||
|
nazev_cviceni: Kvíz: odevzdání Office
|
||||||
|
nadpis_kvizu: Zkontrolujte oba soubory
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Word
|
||||||
|
*Žádost*
|
||||||
|
|
||||||
|
- zadost.docx je jedna strana A4, okraje 2,5 cm, datum 12. 6. 2026 vpravo nahoře.
|
||||||
|
- Je v ní řádek Věc, oslovení, aspoň dvě věty a podpis. Není v ní obsah ani tabulka.
|
||||||
|
- K protokolu z dřívějška, pokud ho máte, patří styly Nadpis 1 a PDF.
|
||||||
|
- PDF se jmenuje stejně jako docx. Dvě verze final a final2 se neodevzdávají.
|
||||||
|
|
||||||
|
> Tip: Náhled tisku má ukázat jednu stránku. Podpis na druhé stránce znamená moc velké mezery.
|
||||||
|
|
||||||
|
## Excel
|
||||||
|
*Známky*
|
||||||
|
|
||||||
|
- znamky.xlsx má list Znamky: jméno, známka, stav.
|
||||||
|
- Stav je vzorec =KDYŽ(D2<=4;"prospěl";"neprospěl") nebo se sloupcem známky, který opravdu máte. Známka 5 je neprospěl.
|
||||||
|
- Pod tabulkou je PRŮMĚR známek, ne jejich součet.
|
||||||
|
- Čísla jsou čísla. Text 1 nebo 120 Kč ve stejné buňce se nepočítá.
|
||||||
|
|
||||||
|
> Tip: Klik na buňku stavu musí v řádku vzorců ukázat KDYŽ. Opsané slovo prospěl se při změně známky nehne.
|
||||||
|
|
||||||
|
## Kontrola vzorců
|
||||||
|
*Ne opis*
|
||||||
|
|
||||||
|
- V ceníku, pokud ho přikládáte, je částka =B2*C2 a sazba ukotvená jako $F$1.
|
||||||
|
- SVYHLEDAT, pokud ho máte, končí na NEPRAVDA a oblast je ukotvená.
|
||||||
|
- Graf tržby je spojnicový, má název a není to koláč dvanácti měsíců.
|
||||||
|
- Kontingenční tabulka, pokud je v sešitu, stojí na vlastním listu a sčítá částky po třídách.
|
||||||
|
|
||||||
|
> Tip: Stačí žádost a známky. Ceník, graf a kontingence jsou navíc, ale když je přiložíte, musí sedět.
|
||||||
|
|
||||||
|
## Složka
|
||||||
|
*Dva hlavní soubory*
|
||||||
|
|
||||||
|
- Ve složce Skola\1-rocnik\word je zadost.docx a zadost.pdf.
|
||||||
|
- Ve složce Skola\1-rocnik\excel je znamky.xlsx.
|
||||||
|
- Na ploše tyto soubory nejsou. Přípony jsou vidět.
|
||||||
|
- Otevřete oba znovu. Datum, věc a aspoň jedna pětka se stavem neprospěl mají být vidět.
|
||||||
|
|
||||||
|
> Tip: Když PDF nejde otevřít, export nedoběhl. Udělejte ho z docx znovu.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jaký je školní dopis z tohoto zadání?
|
||||||
|
- Tři strany se styly a obsahem
|
||||||
|
- [x] Jedna strana A4 s řádkem Věc a datem 12. 6. 2026
|
||||||
|
- Jen tabulka 4×3
|
||||||
|
- Prezentace
|
||||||
|
> Žádost je jeden list. Obsah a Nadpis 1 patří protokolu, ne tomuto dopisu.
|
||||||
|
|
||||||
|
## Který vzorec označí pětku jako neprospěl?
|
||||||
|
- [x] =KDYŽ(D2<=4;"prospěl";"neprospěl")
|
||||||
|
- =KDYŽ(D2>=4;"prospěl";"neprospěl")
|
||||||
|
- napsané slovo prospěl
|
||||||
|
- =SUMA(D2)
|
||||||
|
> Prochází známka 1 až 4. Pětka padne do druhé větve. V češtině jsou středníky.
|
||||||
|
|
||||||
|
## Co patří pod sloupec známek?
|
||||||
|
- Součet známek
|
||||||
|
- [x] Průměr
|
||||||
|
- Kontingenční součet peněz
|
||||||
|
- Nic, známky se mažou
|
||||||
|
> Součet známek nemá význam. PRŮMĚR ano.
|
||||||
|
|
||||||
|
## Které soubory se odevzdávají jako základ?
|
||||||
|
- Jen PDF bez docx
|
||||||
|
- [x] zadost.docx, zadost.pdf a znamky.xlsx
|
||||||
|
- Jen xlsx na ploše
|
||||||
|
- prezentace a video
|
||||||
|
> Word se odevzdává i jako zdroj, i jako PDF. Excel je xlsx, protože v PDF by nebyly vzorce.
|
||||||
6
content/programove-vybaveni/3-rocnik/01-databaze.en.md
Normal file
6
content/programove-vybaveni/3-rocnik/01-databaze.en.md
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: A database
|
||||||
|
popis: A table, a record, a key. When a sheet is no longer enough.
|
||||||
|
nazev_cviceni: Quiz: databases
|
||||||
|
nadpis_kvizu: Name the key and the reason for a database
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/3-rocnik/01-databaze.md
Normal file
79
content/programove-vybaveni/3-rocnik/01-databaze.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-3-databaze
|
||||||
|
nazev: Databáze
|
||||||
|
popis: Tabulka, záznam, klíč. Kdy už nestačí Excel.
|
||||||
|
nazev_cviceni: Kvíz: databáze
|
||||||
|
nadpis_kvizu: Poznejte klíč a důvod databáze
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Excel nestačí
|
||||||
|
*Vztahy*
|
||||||
|
|
||||||
|
- Excel je výborný na jeden seznam. Jakmile se třída opakuje na každém řádku žáka, začne se název třídy rozcházet.
|
||||||
|
- Databáze drží věci v samostatných tabulkách a spojuje je klíčem.
|
||||||
|
- Tabulka tridy má název třídy jednou. Tabulka zaci se na ni jen odkáže.
|
||||||
|
- Access i MySQL umí totéž v principu. Access je soubor accdb, MySQL je server a příkazy SQL.
|
||||||
|
|
||||||
|
> Tip: Když opravujete 1.A na 1. A v padesáti řádcích Excelu, má to být tabulka tříd, ne opis.
|
||||||
|
|
||||||
|
## Řádek a sloupec
|
||||||
|
*Záznam a pole*
|
||||||
|
|
||||||
|
- Řádek je záznam, třeba jeden žák. Sloupec je pole, třeba prijmeni.
|
||||||
|
- Každá hodnota je atomická. Jméno a příjmení nepatří do jedné buňky.
|
||||||
|
- Primární klíč je hodnota, která se v tabulce neopakuje. U žáka je to id, ne příjmení.
|
||||||
|
- Cizí klíč je pole, které ukazuje na primární klíč jiné tabulky. trida_id v tabulce zaci ukazuje na id v tridy.
|
||||||
|
|
||||||
|
> Tip: Dva Nováci se smějí jmenovat stejně. Jejich id je různé. Proto příjmení klíč není.
|
||||||
|
|
||||||
|
## Typy
|
||||||
|
*Číslo, text, datum*
|
||||||
|
|
||||||
|
- id je číslo. Jméno je krátký text. Datum narození je datum, ne text 12.6.
|
||||||
|
- Ano/ne je samostatný typ, ne text ano.
|
||||||
|
- Do číselného pole nepatří jednotka. Počet žáků je 28, ne 28 žáků.
|
||||||
|
- Prázdné pole a nula nejsou totéž. Nula je známá hodnota, prázdno je nevíme.
|
||||||
|
|
||||||
|
> Tip: Text v číselném poli se nepodaří uložit, nebo se sečte špatně. Typ zvolte při založení sloupce.
|
||||||
|
|
||||||
|
## Zadání: návrh na papír
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Navrhněte dvě tabulky: tridy (id, nazev) a zaci (id, jmeno, prijmeni, trida_id).
|
||||||
|
- U každého pole napište typ. id v obou tabulkách je primární klíč.
|
||||||
|
- Napište dva řádky tříd, 1.A a 1.B, a tři žáky, z toho Annu Novákovou ve třídě 1.A.
|
||||||
|
- Soubor navrh.txt uložte k databázím. Access ani MySQL ještě neotevírejte, dokud návrh nesedí.
|
||||||
|
|
||||||
|
> Tip: Šipka vede od trida_id k id tabulky tridy. Opačně by žák byl klíčem třídy, což není.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Co je primární klíč žáka?
|
||||||
|
- Příjmení
|
||||||
|
- [x] id, které se neopakuje
|
||||||
|
- Název třídy
|
||||||
|
- První sloupec, ať je v něm cokoli
|
||||||
|
> Příjmení se opakuje. id jednoho žáka ne.
|
||||||
|
|
||||||
|
## Co je trida_id v tabulce zaci?
|
||||||
|
- Primární klíč třídy v téže tabulce
|
||||||
|
- [x] Cizí klíč na tabulku tridy
|
||||||
|
- Text 1.A opsaný do každého řádku
|
||||||
|
- Heslo
|
||||||
|
> Cizí klíč drží jen číslo třídy. Název třídy žije v tabulce tridy jednou.
|
||||||
|
|
||||||
|
## Kdy už je Excel na seznam žáků těsný?
|
||||||
|
- Jakmile má víc než jeden sloupec
|
||||||
|
- [x] Když se údaj, třeba název třídy, opakuje a musí zůstat stejný
|
||||||
|
- Excel nestačí nikdy
|
||||||
|
- Jakmile je soubor xlsx
|
||||||
|
> Opakovaný název se rozjede. Databáze ho má v jedné tabulce a ostatní se na ni odkážou.
|
||||||
|
|
||||||
|
## Čím se liší nula a prázdné pole?
|
||||||
|
- Ničím
|
||||||
|
- [x] Nula je hodnota, prázdné pole znamená, že hodnota chybí
|
||||||
|
- Prázdné pole je vždy nula
|
||||||
|
- Nula je text
|
||||||
|
> Průměr nulu počítá. Prázdnou buňku často ne. Typ i význam se liší.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Access: tables and a relationship
|
||||||
|
popis: An AutoNumber, a foreign key and a one-to-many link without a cascade.
|
||||||
|
nazev_cviceni: Quiz: Access
|
||||||
|
nadpis_kvizu: Pick the key type and the cascade
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/3-rocnik/02-access-tabulky.md
Normal file
79
content/programove-vybaveni/3-rocnik/02-access-tabulky.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-3-access-tabulky
|
||||||
|
nazev: Access: tabulky a vztah
|
||||||
|
popis: Automatické číslo, cizí klíč a vztah 1:N bez kaskády.
|
||||||
|
nazev_cviceni: Kvíz: Access
|
||||||
|
nadpis_kvizu: Vyberte typ klíče a kaskádu
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Soubor
|
||||||
|
*accdb*
|
||||||
|
|
||||||
|
- Databáze Accessu je jeden soubor accdb. Jmenuje se evidence.accdb.
|
||||||
|
- Tabulku založíte v návrhovém zobrazení, ne jen v datovém listu. V návrhu je vidět typ.
|
||||||
|
- Tabulka tridy má pole id a nazev. Tabulka zaci má id, jmeno, prijmeni a trida_id.
|
||||||
|
- Název pole je bez mezery a bez diakritiky: trida_id. Popisek pro lidi se dá nastavit zvlášť.
|
||||||
|
|
||||||
|
> Tip: Datový list je na zapisování řádků. Typ pole se mění v návrhu. Když už v tabulce data jsou, změna typu může selhat.
|
||||||
|
|
||||||
|
## Klíče
|
||||||
|
*Automatické číslo*
|
||||||
|
|
||||||
|
- id je typ Automatické číslo a je to primární klíč. Access ho doplňuje sám: 1, 2, 3.
|
||||||
|
- trida_id je typ Číslo, dlouhé celé číslo. Není to automatické číslo. Píšete ho vy, nebo ho vybere vztah.
|
||||||
|
- nazev, jmeno a prijmeni jsou Krátký text. Délka 50 stačí.
|
||||||
|
- Dva primární klíče v jedné tabulce školního cvičení nejsou. Stačí id.
|
||||||
|
|
||||||
|
> Tip: Když trida_id necháte jako text, vztah na číselné id třídy Access odmítne. Typy obou konců musí sedět.
|
||||||
|
|
||||||
|
## Vztah 1:N
|
||||||
|
*Bez kaskády*
|
||||||
|
|
||||||
|
- Jedna třída má víc žáků. Žák má jednu třídu. To je vztah 1:N.
|
||||||
|
- Ve vztazích přetáhnete tridy.id na zaci.trida_id.
|
||||||
|
- Zaškrtněte vynucení referenční integrity. Žák se nesmí odkázat na třídu, která neexistuje.
|
||||||
|
- Kaskádové odstranění nechte vypnuté. Smazání třídy by jinak smazalo i žáky.
|
||||||
|
|
||||||
|
> Tip: Na straně tridy je jednička, na straně zaci je znak nekonečna. Když je to obráceně, táhli jste vztah špatným směrem.
|
||||||
|
|
||||||
|
## Zadání: evidence.accdb
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Založte evidence.accdb s tabulkami tridy a zaci podle návrhu.
|
||||||
|
- Vložte třídy 1.A a 1.B. Vložte Annu Novákovou s trida_id třídy 1.A a ještě dva žáky.
|
||||||
|
- Vztah 1:N s referenční integritou, bez kaskádového odstranění.
|
||||||
|
- Zkuste uložit žáka s trida_id 99. Access ho má odmítnout. Pak to číslo vraťte na platnou třídu.
|
||||||
|
|
||||||
|
> Tip: Když jde uložit trida_id 99, integrita není zapnutá. Otevřete vztahy a vztah vytvořte znovu.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jaký typ má id žáka?
|
||||||
|
- Krátký text, který píšete ručně
|
||||||
|
- [x] Automatické číslo a primární klíč
|
||||||
|
- Ano/ne
|
||||||
|
- Dlouhý text s celým jménem třídy
|
||||||
|
> Automatické číslo žák nedoplňuje. Access ho dá samo a v tabulce se neopakuje.
|
||||||
|
|
||||||
|
## Jaký typ má trida_id?
|
||||||
|
- Automatické číslo
|
||||||
|
- [x] Číslo, dlouhé celé číslo
|
||||||
|
- Datum
|
||||||
|
- Ano/ne
|
||||||
|
> Je to cizí klíč na id třídy, které je taky číslo. Automatické číslo by si vymýšlelo vlastní hodnoty.
|
||||||
|
|
||||||
|
## Co dělá referenční integrita?
|
||||||
|
- Smaže žáky při smazání třídy
|
||||||
|
- [x] Nedovolí žáka s třídou, která neexistuje
|
||||||
|
- Schová tabulku
|
||||||
|
- Převede accdb na xlsx
|
||||||
|
> Odkaz musí vést na skutečný řádek. Třída 99 bez řádku v tridy projít nemá.
|
||||||
|
|
||||||
|
## Proč nechat kaskádové odstranění vypnuté?
|
||||||
|
- Access ho neumí
|
||||||
|
- [x] Smazání třídy by smazalo i její žáky
|
||||||
|
- Jinak nejde uložit accdb
|
||||||
|
- Kvůli Excelu
|
||||||
|
> Třída a žáci jsou různá data. Smazat třídu omylem a přijít o žáky je špatná pojistka pro školní cvičení.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Access: queries
|
||||||
|
popis: A query that shows only class 1.A, and a criterion in quotes.
|
||||||
|
nazev_cviceni: Quiz: queries
|
||||||
|
nadpis_kvizu: Fill in the criterion
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/3-rocnik/03-access-dotazy.md
Normal file
79
content/programove-vybaveni/3-rocnik/03-access-dotazy.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-3-access-dotazy
|
||||||
|
nazev: Access: dotazy
|
||||||
|
popis: Dotaz, který ukáže jen třídu 1.A, a kritérium v uvozovkách.
|
||||||
|
nazev_cviceni: Kvíz: dotazy
|
||||||
|
nadpis_kvizu: Doplňte kritérium
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Dotaz není kopie
|
||||||
|
*Pohled*
|
||||||
|
|
||||||
|
- Dotaz data nekopíruje do nové tabulky. Přečte je a ukáže výsledek.
|
||||||
|
- Když ve třídě přibude žák, stejný dotaz ho příště ukáže taky.
|
||||||
|
- Dotaz se dělá v návrhovém zobrazení. Tabulky se přidají a pole se přetáhnou dolů.
|
||||||
|
- Uložený dotaz se jmenuje zaci_1A. Dotaz1 se neodevzdává.
|
||||||
|
|
||||||
|
> Tip: Když dotaz otevřete a data změníte, měníte zdrojovou tabulku. Na prohlížení to vadit nemusí, na omyl ano.
|
||||||
|
|
||||||
|
## Kritérium
|
||||||
|
*1.A*
|
||||||
|
|
||||||
|
- Pod pole nazev z tabulky tridy patří kritérium "1.A" včetně uvozovek.
|
||||||
|
- Bez uvozovek Access text nepozná a dotaz selže, nebo se zeptá na parametr.
|
||||||
|
- Číselné kritérium uvozovky nemá. id 1 je prostě 1.
|
||||||
|
- Chcete-li žáky obou tříd, kritérium 1.A tam nedávejte. Filtr, který tam zbyl z minula, výsledek ořeže.
|
||||||
|
|
||||||
|
> Tip: Řádek Kritéria je filtr. Řádek Zobrazit schová sloupec, který v dotazu být musí, ale ve výsledku ho nechcete.
|
||||||
|
|
||||||
|
## Spojení v dotazu
|
||||||
|
*Obě tabulky*
|
||||||
|
|
||||||
|
- Do dotazu přidejte tridy i zaci. Access použije vztah, který už máte.
|
||||||
|
- Ven dejte prijmeni, jmeno a nazev třídy. id ven dávat nemusíte.
|
||||||
|
- Řazení podle prijmeni je vzestupně. V návrhové mřížce je na to řádek Řadit.
|
||||||
|
- Žák bez třídy se při vnitřním spojení neukáže. Díky integritě takový řádek stejně nemá vzniknout.
|
||||||
|
|
||||||
|
> Tip: Když se každý žák ukáže dvakrát, tabulky nejsou spojené a Access udělal všechny kombinace. Vraťte vztah.
|
||||||
|
|
||||||
|
## Zadání: jen 1.A
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Dotaz zaci_1A ukáže jméno, příjmení a název třídy, jen pro 1.A, seřazené podle příjmení.
|
||||||
|
- Anna Nováková v něm je. Žák z 1.B v něm není.
|
||||||
|
- Uložte dotaz do evidence.accdb. Výsledek nekopírujte do Excelu jako jediný výstup.
|
||||||
|
- Změňte v tabulce příjmení Anny na Novák a dotaz otevřete znovu. Má ukázat Novák.
|
||||||
|
|
||||||
|
> Tip: Když se zeptá na parametr 1.A, kritérium nemá uvozovky a Access ho bere jako otázku.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Kam patří podmínka "1.A"?
|
||||||
|
- Do názvu souboru
|
||||||
|
- [x] Do řádku Kritéria pod polem nazev
|
||||||
|
- Do primárního klíče místo id
|
||||||
|
- Do kaskádového odstranění
|
||||||
|
> Kritéria filtrují řádky. Pole nazev drží text 1.A.
|
||||||
|
|
||||||
|
## Proč jsou u 1.A uvozovky?
|
||||||
|
- [x] Access jinak text pochopí jako parametr nebo chybu
|
||||||
|
- Protože 1.A je číslo
|
||||||
|
- Uvozovky se v Accessu nepoužívají
|
||||||
|
- Aby se zapnula kaskáda
|
||||||
|
> Textové kritérium se píše v uvozovkách. Číslo ne.
|
||||||
|
|
||||||
|
## Co se stane s dotazem, když do třídy 1.A přidáte žáka?
|
||||||
|
- Dotaz je stará kopie a žáka neukáže
|
||||||
|
- [x] Po novém otevření ho ukáže
|
||||||
|
- Access databázi zavře
|
||||||
|
- Musíte ho opsat do Excelu
|
||||||
|
> Dotaz čte tabulky. Není to zmrazený export.
|
||||||
|
|
||||||
|
## Proč se žák v dotazu objeví dvakrát u každé třídy?
|
||||||
|
- Má dva primární klíče
|
||||||
|
- [x] Tabulky v dotazu nejsou spojené vztahem
|
||||||
|
- Je seřazený podle příjmení
|
||||||
|
- Filtr je vypnutý
|
||||||
|
> Bez spojení Access zkombinuje každý řádek s každým. Vztah tomu zabrání.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Access: a form and a report
|
||||||
|
popis: Entry through a form and printing through a report. The datasheet is not for users.
|
||||||
|
nazev_cviceni: Quiz: forms
|
||||||
|
nadpis_kvizu: Pick what is for entry and what is for print
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/3-rocnik/04-access-formulare.md
Normal file
79
content/programove-vybaveni/3-rocnik/04-access-formulare.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-3-access-formulare
|
||||||
|
nazev: Access: formulář a sestava
|
||||||
|
popis: Zápis přes formulář a tisk přes sestavu. Datový list není pro uživatele.
|
||||||
|
nazev_cviceni: Kvíz: formulář
|
||||||
|
nadpis_kvizu: Vyberte, čím se data zadávají a čím tisknou
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Formulář
|
||||||
|
*Jeden žák*
|
||||||
|
|
||||||
|
- Formulář ukáže jeden záznam jako políčka. Datový list ukáže mřížku a tam se běžný uživatel snadno trefí do špatného řádku.
|
||||||
|
- Formulář Zaci se založí z tabulky zaci. Pole id ať je vidět, ale zamčené. Automatické číslo se nepíše.
|
||||||
|
- trida_id je lépe rozbalovací seznam, který ukazuje název třídy a ukládá id.
|
||||||
|
- Formulář se jmenuje frmZaci. Výchozí Formulář1 se neodevzdává.
|
||||||
|
|
||||||
|
> Tip: Rozbalovací seznam bere řádky z tabulky tridy. Viditelný sloupec je nazev, vázaný sloupec je id.
|
||||||
|
|
||||||
|
## Sestava
|
||||||
|
*Tisk*
|
||||||
|
|
||||||
|
- Sestava je na tisk a na PDF. Formulář je na zápis. Neslouží k tomu totéž.
|
||||||
|
- Sestava žáků je seskupená podle třídy a v rámci třídy seřazená podle příjmení.
|
||||||
|
- Záhlaví skupiny ukáže 1.A jednou, ne na každém řádku jako jediný nadpis celé sestavy.
|
||||||
|
- Do sestavy nepatří tlačítka formuláře. Patří do ní nadpis Evidence žáků a číslo stránky.
|
||||||
|
|
||||||
|
> Tip: Náhled sestavy je před tiskem povinný. Prázdná druhá stránka znamená velkou zápatí nebo prázdný oddíl.
|
||||||
|
|
||||||
|
## Kdo kam smí
|
||||||
|
*Ne do návrhu*
|
||||||
|
|
||||||
|
- Uživatel, který jen zapisuje žáky, dostane formulář. Návrhové zobrazení ne.
|
||||||
|
- Mazání záznamu na formuláři je vypnuté, dokud učitel neřekne jinak.
|
||||||
|
- Sestava se needituje. Když v ní přepíšete jméno, často přepisujete data, a to z sestavy dělat nechcete.
|
||||||
|
- Záloha je kopie accdb před mazáním. Jediný soubor na ploše záloha není.
|
||||||
|
|
||||||
|
> Tip: Soubor, Uložit jako, a datum v názvu: evidence-2026-06-12.accdb. Pak teprve mažete zkušební řádky.
|
||||||
|
|
||||||
|
## Zadání: formulář a sestava
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- frmZaci zapíše jméno, příjmení a třídu. id nejde přepsat.
|
||||||
|
- Sestava seskupí žáky podle třídy. Anna Nováková je pod 1.A.
|
||||||
|
- Z formuláře přidejte jednoho žáka do 1.B a v sestavě ho najděte.
|
||||||
|
- Uložte vše do evidence.accdb. PDF sestavy je evidence-zaci.pdf vedle souboru.
|
||||||
|
|
||||||
|
> Tip: Když v rozbalovacím seznamu vidíte čísla místo 1.A, zobrazujete id. Přepněte šířku sloupců, ať je vidět nazev.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Čím se ve škole zadává nový žák?
|
||||||
|
- Přímo v návrhovém zobrazení tabulky
|
||||||
|
- [x] Formulářem frmZaci
|
||||||
|
- Přepsáním sestavy
|
||||||
|
- Excelem místo Accessu bez uložení accdb
|
||||||
|
> Formulář ukáže jeden záznam a umí seznam tříd. Návrh tabulky je pro autora databáze.
|
||||||
|
|
||||||
|
## K čemu je sestava?
|
||||||
|
- K mazání sloupců
|
||||||
|
- [x] K tisku a PDF, seskupenému podle třídy
|
||||||
|
- K nastavení automatického čísla
|
||||||
|
- K instalaci Accessu
|
||||||
|
> Sestava formátuje výstup. Zápis zůstává formuláři.
|
||||||
|
|
||||||
|
## Proč je id na formuláři zamčené?
|
||||||
|
- [x] Automatické číslo se nepíše ručně
|
||||||
|
- Access id neumí ukázat
|
||||||
|
- Jinak nejde sestava
|
||||||
|
- Protože je to text
|
||||||
|
> Číslo přidělí Access. Ruční přepsání by rozbilo klíč.
|
||||||
|
|
||||||
|
## Co uděláte před mazáním zkušebních řádků?
|
||||||
|
- Nic, accdb se sám verzuje
|
||||||
|
- [x] Kopie souboru s datem v názvu
|
||||||
|
- Smažete vztah
|
||||||
|
- Export jen do JPG
|
||||||
|
> Jedna kopie accdb je záloha. Mazání bez ní nejde vzít zpět tak snadno jako Ctrl+Z ve Wordu.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: MySQL: SELECT
|
||||||
|
popis: Choosing columns, a WHERE condition and a sort. Text sits in single quotes.
|
||||||
|
nazev_cviceni: Quiz: SELECT
|
||||||
|
nadpis_kvizu: Pick the right statement
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/3-rocnik/05-mysql-select.md
Normal file
79
content/programove-vybaveni/3-rocnik/05-mysql-select.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-3-mysql-select
|
||||||
|
nazev: MySQL: SELECT
|
||||||
|
popis: Výběr sloupců, podmínka WHERE a řazení. Text je v jednoduchých uvozovkách.
|
||||||
|
nazev_cviceni: Kvíz: SELECT
|
||||||
|
nadpis_kvizu: Vyberte správný příkaz
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Databáze skola
|
||||||
|
*Dvě tabulky*
|
||||||
|
|
||||||
|
- Na serveru je databáze skola. Tabulka tridy má id a nazev. Tabulka zaci má id, jmeno, prijmeni a trida_id.
|
||||||
|
- Příkazy se píšou v MySQL, ne do Excelu. Středník příkaz ukončí.
|
||||||
|
- Nejdřív USE skola; ať další příkazy nemíří do jiné databáze.
|
||||||
|
- Heslo k serveru do sešitu nepatří. Patří učiteli a do klienta, který ho neukazuje v příkazu.
|
||||||
|
|
||||||
|
> Tip: Když klient hlásí, že tabulka neexistuje, jste v jiné databázi, nebo je v názvu překlep. SHOW TABLES; ukáže, co tam je.
|
||||||
|
|
||||||
|
## SELECT
|
||||||
|
*Jen to, co potřebujete*
|
||||||
|
|
||||||
|
- SELECT prijmeni, jmeno FROM zaci; vrátí dva sloupce všech žáků.
|
||||||
|
- Hvězdička SELECT * FROM zaci; je na průzkum. Do odevzdaného dotazu vyberte sloupce jménem.
|
||||||
|
- WHERE trida_id = 1 nechá jen jednu třídu. Číslo je bez uvozovek.
|
||||||
|
- Text se píše v jednoduchých uvozovkách: WHERE nazev = '1.A'.
|
||||||
|
|
||||||
|
> Tip: Dvojité uvozovky kolem 1.A záleží na režimu serveru. Ve škole pište jednoduché, ty platí spolehlivě.
|
||||||
|
|
||||||
|
## Pořadí
|
||||||
|
*ORDER BY*
|
||||||
|
|
||||||
|
- ORDER BY prijmeni; seřadí vzestupně, tedy A až Ž.
|
||||||
|
- ORDER BY prijmeni DESC; je sestupně.
|
||||||
|
- WHERE patří před ORDER BY. Obrácené pořadí příkazů server odmítne.
|
||||||
|
- LIMIT 5 vrátí nejvýš pět řádků. Na kontrolu ano, na úplný seznam třídy ne.
|
||||||
|
|
||||||
|
> Tip: Nejdřív FROM, pak WHERE, pak ORDER BY. SELECT je na začátku, i když se sloupce vybírají jako první v hlavě.
|
||||||
|
|
||||||
|
## Zadání: tři dotazy
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Do souboru dotazy.sql napište USE skola; a tři SELECT.
|
||||||
|
- První: příjmení a jméno všech žáků podle příjmení.
|
||||||
|
- Druhý: jen žáci s trida_id = 1.
|
||||||
|
- Třetí: název třídy 1.A z tabulky tridy. Text '1.A' je v jednoduchých uvozovkách.
|
||||||
|
|
||||||
|
> Tip: Každý příkaz ukončete středníkem. Bez něj klient čeká na pokračování.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Který příkaz vrátí příjmení žáků třídy s id 1?
|
||||||
|
- [x] SELECT prijmeni FROM zaci WHERE trida_id = 1;
|
||||||
|
- SELECT prijmeni WHERE trida_id = 1;
|
||||||
|
- SELECT * FROM tridy WHERE nazev = 1.A;
|
||||||
|
- WHERE trida_id = 1;
|
||||||
|
> SELECT říká sloupce, FROM tabulku, WHERE podmínku. Číslo je bez uvozovek.
|
||||||
|
|
||||||
|
## Jak se v podmínce zapíše název třídy?
|
||||||
|
- nazev = 1.A
|
||||||
|
- [x] nazev = '1.A'
|
||||||
|
- nazev = "bez uvozovek a bez čísla"
|
||||||
|
- nazev := 1.A
|
||||||
|
> Text patří do jednoduchých uvozovek. Bez nich to není řetězec.
|
||||||
|
|
||||||
|
## Kam patří ORDER BY?
|
||||||
|
- Před SELECT
|
||||||
|
- [x] Za WHERE
|
||||||
|
- Místo FROM
|
||||||
|
- Do názvu tabulky
|
||||||
|
> Pořadí je WHERE, potom ORDER BY. SELECT zůstává první.
|
||||||
|
|
||||||
|
## K čemu je ve škole SELECT * ?
|
||||||
|
- Na odevzdaný tisk všech osobních údajů
|
||||||
|
- [x] Na rychlý pohled, co v tabulce je
|
||||||
|
- Místo primárního klíče
|
||||||
|
- Na smazání řádků
|
||||||
|
> Hvězdička je průzkum. Odevzdaný dotaz jmenuje sloupce, které mají být vidět.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: MySQL: INSERT, UPDATE and DELETE
|
||||||
|
popis: A new row, a change and a delete. An UPDATE or DELETE without WHERE is not written in class.
|
||||||
|
nazev_cviceni: Quiz: changing data
|
||||||
|
nadpis_kvizu: Recognise the safe statement
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/3-rocnik/06-mysql-zmeny.md
Normal file
79
content/programove-vybaveni/3-rocnik/06-mysql-zmeny.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-3-mysql-zmeny
|
||||||
|
nazev: MySQL: INSERT, UPDATE a DELETE
|
||||||
|
popis: Nový řádek, oprava a smazání. UPDATE a DELETE bez WHERE se ve škole nepíšou.
|
||||||
|
nazev_cviceni: Kvíz: změny dat
|
||||||
|
nadpis_kvizu: Poznejte bezpečný příkaz
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## INSERT
|
||||||
|
*Nový žák*
|
||||||
|
|
||||||
|
- INSERT INTO zaci (jmeno, prijmeni, trida_id) VALUES ('Anna', 'Nováková', 1); přidá jeden řádek.
|
||||||
|
- Sloupce v závorce a hodnoty za VALUES musí být ve stejném pořadí a stejném počtu.
|
||||||
|
- id s automatickým číslem do výčtu nedávejte, server ho doplní.
|
||||||
|
- Jeden INSERT, jeden žák. Balit pět žáků do nepřehledného příkazu ve cvičení nemusíte.
|
||||||
|
|
||||||
|
> Tip: Když server hlásí neznámý sloupec, název nesedí s tabulkou. SHOW COLUMNS FROM zaci; ukáže pravdu.
|
||||||
|
|
||||||
|
## UPDATE
|
||||||
|
*Jen jeden řádek*
|
||||||
|
|
||||||
|
- UPDATE zaci SET trida_id = 2 WHERE id = 15; přepíše třídu jen žáku 15.
|
||||||
|
- Bez WHERE by stejný příkaz přepsat třídu všem. Ve škole se neodevzdává.
|
||||||
|
- Nejdřív SELECT s stejnou podmínkou WHERE. Až když vidíte jeden správný řádek, pusťte UPDATE.
|
||||||
|
- SET mění hodnoty. Není to SELECT a nic nevrací kromě počtu ovlivněných řádků.
|
||||||
|
|
||||||
|
> Tip: Klient ukáže, kolik řádků se změnilo. Když vidíte desítky a čekali jste jeden, zastavte se a volejte učitele. Záloha se hodí předtím, ne potom.
|
||||||
|
|
||||||
|
## DELETE
|
||||||
|
*Také s WHERE*
|
||||||
|
|
||||||
|
- DELETE FROM zaci WHERE id = 15; smaže jeden řádek.
|
||||||
|
- DELETE FROM zaci; bez WHERE smaže všechny žáky. To není čištění tabulky, to je ztráta dat.
|
||||||
|
- Smazaný řádek Ctrl+Z v MySQL nevrátí. Vrátí ho záloha, nebo ho vložíte znovu, když znáte hodnoty.
|
||||||
|
- Mazat třídu, na kterou ještě ukazují žáci, referenční pravidlo nemá dovolit. Nejdřív žáci, nebo třídu nemazat.
|
||||||
|
|
||||||
|
> Tip: Před DELETE udělejte SELECT se stejnou podmínkou. Počet řádků musí být ten, který čekáte, obvykle jeden.
|
||||||
|
|
||||||
|
## Zadání: tři změny na kopii
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Na cvičných datech vložte žáka Petr Svoboda do třídy 1, tedy trida_id 1.
|
||||||
|
- UPDATE mu změňte třídu na 2, ale jen přes jeho id, které jste předtím přečetli SELECTem.
|
||||||
|
- Téhož žáka DELETE smažte zase jen podle id. Ostatní žáci v tabulce zůstanou.
|
||||||
|
- Tři příkazy připojte do dotazy.sql pod komentář, který říká, že UPDATE a DELETE mají WHERE.
|
||||||
|
|
||||||
|
> Tip: Komentář v SQL začíná dvěma pomlčkami. Do příkazu se nepočítá, příštímu čtenáři řekne, proč tam WHERE je.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Který příkaz přidá Annu do třídy 1?
|
||||||
|
- [x] INSERT INTO zaci (jmeno, prijmeni, trida_id) VALUES ('Anna', 'Nováková', 1);
|
||||||
|
- SELECT Anna INTO zaci;
|
||||||
|
- UPDATE zaci SET Anna;
|
||||||
|
- DELETE FROM zaci WHERE jmeno = 'Anna';
|
||||||
|
> INSERT vkládá řádek. Sloupce a hodnoty drží pořadí.
|
||||||
|
|
||||||
|
## Jak se změní třída jen žáku s id 15?
|
||||||
|
- UPDATE zaci SET trida_id = 2;
|
||||||
|
- [x] UPDATE zaci SET trida_id = 2 WHERE id = 15;
|
||||||
|
- SELECT trida_id = 2;
|
||||||
|
- INSERT INTO zaci VALUES (15);
|
||||||
|
> Bez WHERE by se třída přepsala všem. WHERE id = 15 drží jeden řádek.
|
||||||
|
|
||||||
|
## Co udělá DELETE FROM zaci; bez WHERE?
|
||||||
|
- Nesmaže nic, WHERE je volitelné a server se zeptá
|
||||||
|
- [x] Smaže všechny řádky v zaci
|
||||||
|
- Smaže jen poslední řádek
|
||||||
|
- Jen vypíše žáky
|
||||||
|
> Bez podmínky je cílem celá tabulka. Ve školním cvičení takový příkaz nepište.
|
||||||
|
|
||||||
|
## Co uděláte těsně před UPDATE?
|
||||||
|
- DELETE bez WHERE
|
||||||
|
- [x] SELECT se stejnou podmínkou, ať vidíte ty řádky
|
||||||
|
- DROP tabulky
|
||||||
|
- Vypnete integritu
|
||||||
|
> SELECT ukáže, na koho UPDATE dopadne. Až pak má smysl stejné WHERE použít ke změně.
|
||||||
6
content/programove-vybaveni/3-rocnik/07-mysql-join.en.md
Normal file
6
content/programove-vybaveni/3-rocnik/07-mysql-join.en.md
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: MySQL: joining tables
|
||||||
|
popis: An INNER JOIN on trida_id, and why the class name is not repeated on every row.
|
||||||
|
nazev_cviceni: Quiz: JOIN
|
||||||
|
nadpis_kvizu: Complete the join
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/3-rocnik/07-mysql-join.md
Normal file
79
content/programove-vybaveni/3-rocnik/07-mysql-join.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-3-mysql-join
|
||||||
|
nazev: MySQL: spojení tabulek
|
||||||
|
popis: INNER JOIN přes trida_id a proč se název třídy neopakuje v každém řádku.
|
||||||
|
nazev_cviceni: Kvíz: JOIN
|
||||||
|
nadpis_kvizu: Doplňte spojení
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Jedna pravda
|
||||||
|
*Název jen jednou*
|
||||||
|
|
||||||
|
- Název 1.A je v tabulce tridy jednou. V zaci je jen trida_id.
|
||||||
|
- Když by název ležel i u žáka, oprava překlepu znamená projít všechny žáky.
|
||||||
|
- To je důvod dvou tabulek. Excel to umí jen ručně, databáze vztahem.
|
||||||
|
- JOIN tabulky spojí ve výsledku dotazu. Nesloučí je do jedné natrvalo.
|
||||||
|
|
||||||
|
> Tip: Po JOIN pořád existují dvě tabulky. Výsledek dotazu je jen pohled pro tento příkaz.
|
||||||
|
|
||||||
|
## INNER JOIN
|
||||||
|
*Shoda klíčů*
|
||||||
|
|
||||||
|
- INNER JOIN vrátí řádky, kde se klíče sejdou. Žák a jeho třída.
|
||||||
|
- ON z.trida_id = t.id je podmínka spojení. Není to totéž co WHERE na název.
|
||||||
|
- Bez ON server buď příkaz odmítne, nebo spojí každý řádek s každým.
|
||||||
|
- Přezdívky z a t jsou v dotazu proto, aby bylo jasné, která tabulka je která.
|
||||||
|
|
||||||
|
> Tip: WHERE t.nazev = '1.A' přijde až po spojení. Nejdřív se tabulky potkají, pak se filtruje.
|
||||||
|
|
||||||
|
## Celý příkaz
|
||||||
|
*Jak má vypadat*
|
||||||
|
|
||||||
|
- SELECT z.prijmeni, z.jmeno, t.nazev FROM zaci AS z INNER JOIN tridy AS t ON z.trida_id = t.id;
|
||||||
|
- WHERE t.nazev = '1.A' z toho udělá jen jednu třídu.
|
||||||
|
- ORDER BY z.prijmeni výsledek seřadí.
|
||||||
|
- Sloupce pište s přezdívkou tabulky. Samotné id by bylo nejasné, mají ho obě tabulky.
|
||||||
|
|
||||||
|
> Tip: Když příkaz hlásí nejednoznačný sloupec id, napište z.id nebo t.id. Server nehádá.
|
||||||
|
|
||||||
|
## Zadání: jeden JOIN
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Do dotazy.sql přidejte dotaz, který vypíše příjmení, jméno a název třídy.
|
||||||
|
- Jen třída 1.A, seřazené podle příjmení.
|
||||||
|
- Anna Nováková v něm je včetně textu 1.A, ne jen čísla 1.
|
||||||
|
- Příkaz spusťte dvakrát. Výsledek má být stejný, JOIN data nemění.
|
||||||
|
|
||||||
|
> Tip: Když vidíte číslo místo 1.A, vybíráte trida_id a ne t.nazev. Doplňte sloupec z tabulky tridy.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Které spojení ukáže žáka i název jeho třídy?
|
||||||
|
- SELECT * FROM zaci;
|
||||||
|
- [x] SELECT z.prijmeni, t.nazev FROM zaci AS z INNER JOIN tridy AS t ON z.trida_id = t.id;
|
||||||
|
- DELETE FROM tridy;
|
||||||
|
- INSERT INTO tridy VALUES ('1.A');
|
||||||
|
> JOIN vezme příjmení z žáků a název z tříd tam, kde se id shoduje.
|
||||||
|
|
||||||
|
## Co patří do ON?
|
||||||
|
- [x] z.trida_id = t.id
|
||||||
|
- t.nazev = '1.A'
|
||||||
|
- ORDER BY z.prijmeni
|
||||||
|
- USE skola
|
||||||
|
> ON je shoda klíčů. Filtr na název 1.A je WHERE, ne spojení.
|
||||||
|
|
||||||
|
## Proč není název třídy uložený u každého žáka?
|
||||||
|
- MySQL to neumí
|
||||||
|
- [x] Aby se název měnil na jednom místě
|
||||||
|
- Protože text v MySQL nejde uložit
|
||||||
|
- Aby nešel JOIN
|
||||||
|
> Jedna pravda v tabulce tridy. Žáci drží jen číslo.
|
||||||
|
|
||||||
|
## Co JOIN udělá s uloženými tabulkami?
|
||||||
|
- Sloučí je natrvalo do jedné
|
||||||
|
- [x] Jen složí výsledek dotazu, tabulky zůstanou dvě
|
||||||
|
- Smaže cizí klíče
|
||||||
|
- Převede je na Excel
|
||||||
|
> Výsledek je odpověď na příkaz. tridy a zaci na serveru zůstávají.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Assignment: a student register
|
||||||
|
popis: Classes, students, a relationship and one query that shows 1.A by name.
|
||||||
|
nazev_cviceni: Quiz: the register
|
||||||
|
nadpis_kvizu: Walk the keys and the query
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/3-rocnik/08-zadani-databaze.md
Normal file
79
content/programove-vybaveni/3-rocnik/08-zadani-databaze.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-3-zadani-databaze
|
||||||
|
nazev: Zadání: evidence žáků
|
||||||
|
popis: Třídy, žáci, vztah a jeden dotaz, který ukáže 1.A jménem.
|
||||||
|
nazev_cviceni: Kvíz: evidence
|
||||||
|
nadpis_kvizu: Projděte klíče i dotaz
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Struktura
|
||||||
|
*Dvě tabulky*
|
||||||
|
|
||||||
|
- tridy: id jako klíč, nazev. Řádky 1.A a 1.B.
|
||||||
|
- zaci: id jako klíč, jmeno, prijmeni, trida_id jako cizí klíč.
|
||||||
|
- Anna Nováková je ve třídě 1.A. Ve třídě 1.B je aspoň jeden jiný žák.
|
||||||
|
- Název 1.A není opsaný v tabulce žáků. Je jen v tridy.
|
||||||
|
|
||||||
|
> Tip: Ať děláte Access, nebo MySQL, tahle dvě pole a vztah jsou povinné. Nástroj je obal.
|
||||||
|
|
||||||
|
## Access
|
||||||
|
*Když odevzdáváte accdb*
|
||||||
|
|
||||||
|
- evidence.accdb má vztah 1:N, referenční integritu a vypnutou kaskádu.
|
||||||
|
- Dotaz zaci_1A a formulář frmZaci. Sestava je seskupená podle třídy.
|
||||||
|
- Žák s neexistující třídou nejde uložit. Vyzkoušeno na trida_id 99.
|
||||||
|
- PDF sestavy leží vedle accdb.
|
||||||
|
|
||||||
|
> Tip: Když učitel otevře jen accdb, formulář a dotaz v něm musí být. Samotné PDF bez souboru nestačí.
|
||||||
|
|
||||||
|
## MySQL
|
||||||
|
*Když odevzdáváte SQL*
|
||||||
|
|
||||||
|
- dotazy.sql obsahuje SELECT se WHERE, INSERT, UPDATE i DELETE, oba měnící příkazy s WHERE.
|
||||||
|
- JOIN vypíše příjmení a název 1.A, seřazené podle příjmení.
|
||||||
|
- V souboru není heslo k serveru a není DELETE bez WHERE.
|
||||||
|
- Příkazy jdou spustit znovu jen tam, kde to dává smysl. DELETE testovacího žáka v souboru má konkrétní id a komentář.
|
||||||
|
|
||||||
|
> Tip: Odevzdává se text příkazů, ne snímek obrazovky klienta. Snímek smí být navíc.
|
||||||
|
|
||||||
|
## Jedno odevzdání
|
||||||
|
*Ne obě poloviční*
|
||||||
|
|
||||||
|
- Stačí jeden nástroj, Access nebo MySQL, ale celý: struktura, data, dotaz na 1.A.
|
||||||
|
- V dotazu je Anna vidět jako 1.A, ne jako holé číslo, pokud je součástí této části zadání JOIN nebo dotaz s názvem.
|
||||||
|
- Záloha souboru má datum v názvu, třeba evidence-2026-06-12.accdb.
|
||||||
|
- Do textu úkolu nepište heslo a nepište, že jste kaskádu zapnuli, pokud jste ji zapnout neměli.
|
||||||
|
|
||||||
|
> Tip: Když umíte obojí, odevzdejte jedno pořádně. Dvě rozdělané databáze jsou horší než jedna hotová.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Kde leží text 1.A?
|
||||||
|
- V každém řádku žáka jako jediná pravda
|
||||||
|
- [x] V tabulce tridy, v poli nazev
|
||||||
|
- V názvu souboru jako jediném místě
|
||||||
|
- V hesle
|
||||||
|
> Žák má jen trida_id. Název je v tabulce tříd jednou.
|
||||||
|
|
||||||
|
## Jaký vztah mají třídy a žáci?
|
||||||
|
- [x] 1:N, jedna třída a víc žáků
|
||||||
|
- N:N bez třetí tabulky uprostřed školního cvičení
|
||||||
|
- Žádný, stačí Excel bez klíče
|
||||||
|
- 1:1, každý žák vlastní tabulku třídy
|
||||||
|
> Jedna třída, mnoho žáků. Na straně žáků je cizí klíč.
|
||||||
|
|
||||||
|
## Co musí mít UPDATE a DELETE v odevzdaném SQL?
|
||||||
|
- Žádnou podmínku, ať je příkaz krátký
|
||||||
|
- [x] WHERE, které trefí jen zamýšlené řádky
|
||||||
|
- Hvězdičku místo sloupců
|
||||||
|
- Kaskádu v příkazu SELECT
|
||||||
|
> Bez WHERE se mění nebo maže celá tabulka. Ve cvičení se to neodevzdává.
|
||||||
|
|
||||||
|
## Co Access odmítne, když je integrita zapnutá?
|
||||||
|
- Žáka se třídou 1.A
|
||||||
|
- [x] Žáka s trida_id 99, které v tridy není
|
||||||
|
- Formulář
|
||||||
|
- Sestavu podle příjmení
|
||||||
|
> Cizí klíč musí ukazovat na existující třídu. 99 v tabulce tříd není.
|
||||||
6
content/programove-vybaveni/4-rocnik/01-wordpress.en.md
Normal file
6
content/programove-vybaveni/4-rocnik/01-wordpress.en.md
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: WordPress: pages and posts
|
||||||
|
popis: A school site, a static page and a dated news item. The system is not hand-written HTML for every sentence.
|
||||||
|
nazev_cviceni: Quiz: WordPress
|
||||||
|
nadpis_kvizu: Tell a page from a post
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/4-rocnik/01-wordpress.md
Normal file
79
content/programove-vybaveni/4-rocnik/01-wordpress.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-4-wordpress
|
||||||
|
nazev: WordPress: stránky a příspěvky
|
||||||
|
popis: Web školy, statická stránka a datovaná zpráva. Systém není ručně psané HTML každé věty.
|
||||||
|
nazev_cviceni: Kvíz: WordPress
|
||||||
|
nadpis_kvizu: Rozlište stránku a příspěvek
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Co to je
|
||||||
|
*Správa obsahu*
|
||||||
|
|
||||||
|
- WordPress je systém pro web. Text se píše v administraci, ne do každé stránky jako do samostatného souboru ve Wordu.
|
||||||
|
- Školní web se jmenuje Školní den. Název se nastaví v Nastavení, Obecné.
|
||||||
|
- Administrace je cesta /wp-admin/ na adrese webu. Bez účtu tam nejste.
|
||||||
|
- Veřejná stránka a administrace jsou dva pohledy. Návštěvník administraci nevidí.
|
||||||
|
|
||||||
|
> Tip: Když se po uložení na webu nic nezměnilo, často jste jen uložili koncept. Zveřejnit je samostatný krok.
|
||||||
|
|
||||||
|
## Stránka a příspěvek
|
||||||
|
*Dva druhy*
|
||||||
|
|
||||||
|
- Stránka je trvalá: O škole, Kontakt. Nemá datum jako hlavní údaj.
|
||||||
|
- Příspěvek je zpráva: co se stalo 12. 6. 2026. Řadí se od nejnovějšího.
|
||||||
|
- Školní den má aspoň jednu stránku O škole a jeden příspěvek o dni otevřených dveří.
|
||||||
|
- Příspěvek není stránka s jiným názvem. V menu se s nimi pracuje jinak.
|
||||||
|
|
||||||
|
> Tip: V administraci jsou Příspěvky a Stránky dvě samostatné položky. Když novinku přidáte jako stránku, na výpisu zpráv nebude.
|
||||||
|
|
||||||
|
## Adresa
|
||||||
|
*Trvalý odkaz*
|
||||||
|
|
||||||
|
- Trvalý odkaz v Nastavení, Trvalé odkazy, ať je název příspěvku, ne ?p=123.
|
||||||
|
- Adresa pak nese slova, třeba /den-otevrenych-dveri/.
|
||||||
|
- Jednou zveřejněnou adresu neměňte jen kvůli stylu. Odkaz, který už někdo má, by se rozbil.
|
||||||
|
- Název webu a adresa příspěvku jsou dvě věci. Název je Školní den, adresa je konkrétní článek.
|
||||||
|
|
||||||
|
> Tip: Když škola už odkazy rozeslala, změnu trvalých odkazů nechte na učiteli. Cvičný web si klidně nastavte hned na začátku.
|
||||||
|
|
||||||
|
## Zadání: dvě věci na webu
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Na cvičném webu nastavte název Školní den.
|
||||||
|
- Zveřejněte stránku O škole, aspoň dvě věty, bez data jako hlavní osy.
|
||||||
|
- Zveřejněte příspěvek Den otevřených dveří s datem 12. 6. 2026.
|
||||||
|
- Do souboru web.txt napište adresu stránky a adresu příspěvku. Heslo do souboru nepište.
|
||||||
|
|
||||||
|
> Tip: Koncept se na veřejné stránce neukáže. U obou má být stav Publikováno.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Čím se liší stránka od příspěvku?
|
||||||
|
- Ničím, je to stejné tlačítko
|
||||||
|
- [x] Stránka je trvalá, příspěvek je datovaná zpráva
|
||||||
|
- Příspěvek nejde zveřejnit
|
||||||
|
- Stránka musí být v Excelu
|
||||||
|
> O škole je stránka. Novinka s datem je příspěvek.
|
||||||
|
|
||||||
|
## Kam se nastaví název webu Školní den?
|
||||||
|
- Do názvu počítače
|
||||||
|
- [x] Do Nastavení, Obecné
|
||||||
|
- Do buňky A1
|
||||||
|
- Do příkazu DELETE
|
||||||
|
> Název webu je nastavení WordPressu, ne název souboru Windows.
|
||||||
|
|
||||||
|
## Jaký trvalý odkaz ve cvičení chcete?
|
||||||
|
- ?p=123 natrvalo
|
||||||
|
- [x] Název příspěvku ve adrese
|
||||||
|
- Jen číslo id žáka
|
||||||
|
- Adresu z Accessu
|
||||||
|
> Adresa se slovy se čte a pamatuje. Číselný parametr ne.
|
||||||
|
|
||||||
|
## Co napsat do web.txt?
|
||||||
|
- Heslo správce
|
||||||
|
- [x] Adresy zveřejněné stránky a příspěvku
|
||||||
|
- Celou databázi MySQL
|
||||||
|
- Soubor accdb
|
||||||
|
> Úkol dokládá, že stránky jsou venku. Heslo do textového souboru nepatří.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: WordPress: users and appearance
|
||||||
|
popis: An author writes their own news, an editor also edits others. There is one administrator.
|
||||||
|
nazev_cviceni: Quiz: roles
|
||||||
|
nadpis_kvizu: Match the role
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/4-rocnik/02-wordpress-role.md
Normal file
79
content/programove-vybaveni/4-rocnik/02-wordpress-role.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-4-wordpress-role
|
||||||
|
nazev: WordPress: uživatelé a vzhled
|
||||||
|
popis: Autor píše své zprávy, šéfredaktor i cizí. Správce je jeden.
|
||||||
|
nazev_cviceni: Kvíz: role
|
||||||
|
nadpis_kvizu: Přiřaďte roli
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Role
|
||||||
|
*Nejmíň práv*
|
||||||
|
|
||||||
|
- Správce instaluje doplňky, mění šablonu a zakládá uživatele. Ve třídě je jeden, účet učitele.
|
||||||
|
- Šéfredaktor zveřejňuje a upravuje i cizí příspěvky a stránky. Správce to být nemusí.
|
||||||
|
- Autor zveřejňuje vlastní příspěvky. Cizí ne. Stránky O škole nezakládá.
|
||||||
|
- Spolužák, který jen přidává novinky, dostane roli Autor. Ne správce.
|
||||||
|
|
||||||
|
> Tip: Přihlášení každého člověka je vlastní účet. Heslo se nepůjčuje, ani když jde o školní cvičení.
|
||||||
|
|
||||||
|
## Šablona a doplňky
|
||||||
|
*Málo*
|
||||||
|
|
||||||
|
- Šablona je vzhled. Ve cvičení stačí jedna, třeba výchozí, kterou učitel určí.
|
||||||
|
- Doplněk přidává funkci. Každý doplněk je další věc, která se musí aktualizovat.
|
||||||
|
- Doplněk z neznámého webu se neinstaluje. Stačí jeden překlep a web běží s cizím kódem.
|
||||||
|
- Aktualizace WordPressu, šablony a doplňků se dělají v klidný den a po záloze, ne minutu před dnem otevřených dveří.
|
||||||
|
|
||||||
|
> Tip: Neaktivní doplněk, který nepoužíváte, smažte. Vypnutý pořád leží na disku a pořád se může hodit útočníkovi, když v něm je chyba.
|
||||||
|
|
||||||
|
## Menu
|
||||||
|
*Co návštěvník vidí*
|
||||||
|
|
||||||
|
- Menu má položku O škole na stránku, ne na koncept.
|
||||||
|
- Příspěvky se často vypisují samy na úvodu. Do menu se nemusí přidávat každý.
|
||||||
|
- Zkouškový příspěvek s textem test test do veřejného menu nepatří. Smažte ho, nebo ho nechte jako koncept.
|
||||||
|
- Název v menu a nadpis stránky ať říkají totéž. O škole a O nas jsou dvě stránky, ne jedna.
|
||||||
|
|
||||||
|
> Tip: Náhled v anonymním okně ukáže web bez vašeho přihlášení. To je pohled návštěvníka.
|
||||||
|
|
||||||
|
## Zadání: účet autora
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Založte uživatele redakce s rolí Autor. Heslo mu nastavte mimo sešit, do web.txt ho nepište.
|
||||||
|
- Ověřte, že tento účet neumí instalovat doplňky. Když umí, je to správce a roli změňte.
|
||||||
|
- Šablonu neměňte na náhodnou z internetu. Nechte tu, kterou web už má, nebo tu od učitele.
|
||||||
|
- Do web.txt dopište přihlašovací jméno autora a že role je Autor. Ne heslo.
|
||||||
|
|
||||||
|
> Tip: Uživatelé, Všichni uživatelé, sloupec Role. Autor tam musí být napsaný, nestačí, že to tak bylo v úmyslu.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jakou roli dostane spolužák, který jen píše novinky?
|
||||||
|
- Správce
|
||||||
|
- [x] Autor
|
||||||
|
- Jediný účet s vaším heslem
|
||||||
|
- Roli MySQL
|
||||||
|
> Autor zveřejní vlastní příspěvek a nesahá na doplňky ani na cizí texty.
|
||||||
|
|
||||||
|
## Kdo smí instalovat doplňky?
|
||||||
|
- Každý návštěvník
|
||||||
|
- [x] Správce
|
||||||
|
- Autor
|
||||||
|
- Kdokoli s odkazem na článek
|
||||||
|
> Doplňky mění celý web. To je práce správce, ne autora zprávy.
|
||||||
|
|
||||||
|
## Proč se doplněk nestahuje z náhodného webu?
|
||||||
|
- WordPress doplňky neumí
|
||||||
|
- [x] Je to cizí kód, který běží na školním webu
|
||||||
|
- Protože pak nejde napsat stránku
|
||||||
|
- Doplňky jsou vždycky v Excelu
|
||||||
|
> Doplněk je program. Neznámý zdroj do školního webu nepatří.
|
||||||
|
|
||||||
|
## Co do web.txt o účtu redakce nepatří?
|
||||||
|
- Přihlašovací jméno
|
||||||
|
- Role Autor
|
||||||
|
- [x] Heslo
|
||||||
|
- To, že účet nezvládne instalovat doplňky
|
||||||
|
> Heslo do textového úkolu nepište. Jméno a role ano.
|
||||||
6
content/programove-vybaveni/4-rocnik/03-power-bi.en.md
Normal file
6
content/programove-vybaveni/4-rocnik/03-power-bi.en.md
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Power BI: data from Excel
|
||||||
|
popis: One workbook, one table, a chart by class. The same data is not loaded twice.
|
||||||
|
nazev_cviceni: Quiz: Power BI
|
||||||
|
nadpis_kvizu: Pick the source and the visual
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/4-rocnik/03-power-bi.md
Normal file
79
content/programove-vybaveni/4-rocnik/03-power-bi.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-4-power-bi
|
||||||
|
nazev: Power BI: data z Excelu
|
||||||
|
popis: Jeden sešit, jedna tabulka, graf podle třídy. Stejná data se nenačítají dvakrát.
|
||||||
|
nazev_cviceni: Kvíz: Power BI
|
||||||
|
nadpis_kvizu: Vyberte zdroj a vizuál
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Soubor
|
||||||
|
*pbix*
|
||||||
|
|
||||||
|
- Power BI Desktop ukládá práci do pbix. Není to xlsx a není to obrázek grafu.
|
||||||
|
- Na odevzdání vedle pbix patří PDF stránky sestavy, ať ji otevře i člověk bez Power BI.
|
||||||
|
- Zdroj je prodej.xlsx, tabulka Prodej se sloupci Polozka, Trida, Castka.
|
||||||
|
- Načtení je Načíst data, Excel, a vybere se tabulka Prodej, ne celý sešit naslepo dvakrát.
|
||||||
|
|
||||||
|
> Tip: Když v modelu vidíte Prodej a Prodej (2), tabulka se načetla dvakrát. Jednu odeberte, než postavíte graf.
|
||||||
|
|
||||||
|
## Model
|
||||||
|
*Jedna řádka, jedna skutečnost*
|
||||||
|
|
||||||
|
- Každý řádek je jeden prodej: položka, třída, částka. Součet v tomtéž sloupci navíc řádek souhrnu být nemá.
|
||||||
|
- Řádek souhrnů z Excelu do Power BI nepatří. Součet si spočítá vizuál.
|
||||||
|
- Trida je text 1.A a 1.B. Castka je číslo bez Kč v buňce.
|
||||||
|
- Když Excel opravíte, v Power BI dejte Obnovit. Sám se o uložení xlsx nedozví.
|
||||||
|
|
||||||
|
> Tip: Sloupec, který Power BI bere jako text, se nesčítá. Často je v něm mezera nebo Kč. V Excelu ho opravte a obnovte.
|
||||||
|
|
||||||
|
## Vizuál
|
||||||
|
*Sloupec a karta*
|
||||||
|
|
||||||
|
- Sloupcový graf: osa Trida, hodnota součet Castka. Porovnání dvou tříd.
|
||||||
|
- Karta ukáže jedno číslo, celkový součet Castka.
|
||||||
|
- Koláč pro dvě třídy je zbytečný. Pro dvanáct měsíců byl špatně už v Excelu.
|
||||||
|
- Průřez, anglicky slicer, na pole Trida nechte na příští lekci. Teď ať graf ukáže obě třídy.
|
||||||
|
|
||||||
|
> Tip: Když graf ukáže počet řádků místo součtu korun, v hodnotách je Počet. Přepněte souhrn na Součet.
|
||||||
|
|
||||||
|
## Zadání: první pbix
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- prodej.pbix načte tabulku Prodej jednou.
|
||||||
|
- Na stránce jsou sloupcový graf podle třídy a karta s celkovou částkou.
|
||||||
|
- Obnovte data potom, co v Excelu změníte jednu částku. Karta se musí pohnout.
|
||||||
|
- Uložte pbix do složky Skola\1-rocnik\excel a vedle něj prodej.pdf.
|
||||||
|
|
||||||
|
> Tip: PDF je snímek sestavy. pbix je práce, ve které jde vizuál opravit. Odevzdávají se oba.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jaký soubor je pracovní v Power BI?
|
||||||
|
- xlsx jako jediný
|
||||||
|
- [x] pbix
|
||||||
|
- pdf jako jediný
|
||||||
|
- accdb
|
||||||
|
> pbix drží model a vizuály. Excel je zdroj. PDF je náhled na odevzdání.
|
||||||
|
|
||||||
|
## Jak se mají načíst data prodeje?
|
||||||
|
- [x] Tabulka Prodej jednou
|
||||||
|
- Tentýž list dvakrát
|
||||||
|
- Jako obrázek grafu z Excelu
|
||||||
|
- Přepisem do Wordu
|
||||||
|
> Jedna tabulka v modelu. Druhá kopie téhož zdroje mate součty.
|
||||||
|
|
||||||
|
## Jaký vizuál porovná částku tříd 1.A a 1.B?
|
||||||
|
- Koláč s dvanácti díly
|
||||||
|
- [x] Sloupcový graf, osa Trida, součet Castka
|
||||||
|
- Karta bez popisku a bez čísla
|
||||||
|
- Průřez místo grafu jako jediný prvek
|
||||||
|
> Dvě kategorie a jejich součet jsou sloupce. Karta je jen jedno číslo celkem.
|
||||||
|
|
||||||
|
## Co uděláte v Power BI potom, co změníte číslo v Excelu?
|
||||||
|
- Nic, pbix se mění sám v tu vteřinu
|
||||||
|
- [x] Obnovit
|
||||||
|
- Smazat pbix a začít ve Wordu
|
||||||
|
- Převést Castka na text
|
||||||
|
> Power BI si data při načtení vezme. Další změna Excelu se projeví až po obnovení.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Power BI: a slicer and a report
|
||||||
|
popis: A class slicer filters the whole page. A filter on one visual leaves the others.
|
||||||
|
nazev_cviceni: Quiz: the slicer
|
||||||
|
nadpis_kvizu: Say what the slicer affects
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/4-rocnik/04-power-bi-prurez.md
Normal file
79
content/programove-vybaveni/4-rocnik/04-power-bi-prurez.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-4-power-bi-prurez
|
||||||
|
nazev: Power BI: průřez a sestava
|
||||||
|
popis: Průřez třídy přefiltruje celou stránku. Filtr jednoho vizuálu ostatní nechá.
|
||||||
|
nazev_cviceni: Kvíz: průřez
|
||||||
|
nadpis_kvizu: Řekněte, co průřez ovlivní
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Průřez
|
||||||
|
*Celá stránka*
|
||||||
|
|
||||||
|
- Průřez na pole Trida je ovládací prvek na plátně. Čtenář klikne na 1.A.
|
||||||
|
- Sloupcový graf i karta se mají změnit. Celková částka pak není celá škola, ale jen 1.A.
|
||||||
|
- Když se karta nehne, průřez na ni není napojený, nebo karta bere jinou tabulku.
|
||||||
|
- Výběr se zruší gumou na průřezu, nebo volbou všech tříd. Data se tím nesmažou.
|
||||||
|
|
||||||
|
> Tip: Průřez filtruje. Není to nový součet uložený do Excelu.
|
||||||
|
|
||||||
|
## Filtr vizuálu
|
||||||
|
*Jen jeden graf*
|
||||||
|
|
||||||
|
- Filtr v podokně konkrétního vizuálu ovlivní jen ten vizuál.
|
||||||
|
- Školní sestava pro porovnání tříd filtr vizuálu nepotřebuje. Má ukázat obě, dokud čtenář nezvolí průřez.
|
||||||
|
- Filtr stránky schová třídu všem vizuálům na stránce, i bez klikání. Na odevzdání ho nenechávejte zapnutý omylem.
|
||||||
|
- Než sestavu vyexportujete, zrušte výběr průřezu, pokud má PDF ukázat celou školu.
|
||||||
|
|
||||||
|
> Tip: PDF zachytí průřez tak, jak je zrovna vybraný. Vybraná 1.A v PDF už druhou třídu neukáže.
|
||||||
|
|
||||||
|
## Stránka
|
||||||
|
*Jedna otázka*
|
||||||
|
|
||||||
|
- Stránka se jmenuje Prodej. Název Stránka 1 se neodevzdává.
|
||||||
|
- Nadpis na plátně říká Prodej po třídách. Graf má popisky tříd.
|
||||||
|
- Na jedné stránce jsou nejvýš průřez, jeden graf a jedna karta. Druhý graf se stejným obsahem je navíc.
|
||||||
|
- Barvy nechte klidné. Červená a zelená těsně vedle sebe se špatně čte.
|
||||||
|
|
||||||
|
> Tip: Zobrazte sestavu na projektoru, nebo aspoň v celém okně. Drobný popisek, který na vašem monitoru ujde, vzadu ve třídě zanikne.
|
||||||
|
|
||||||
|
## Zadání: stránka s průřezem
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Na stránku Prodej přidejte průřez Trida.
|
||||||
|
- Klik na 1.A změní graf i kartu. Po zrušení výběru je zase vidět celý součet.
|
||||||
|
- PDF vyexportujte bez vybrané třídy, ať ukazuje 1.A i 1.B.
|
||||||
|
- pbix uložte znovu. V modelu je tabulka Prodej pořád jen jednou.
|
||||||
|
|
||||||
|
> Tip: Když průřez nabízí prázdný řádek, v Excelu je prázdný řádek tabulky. Smažte ho ve zdroji a obnovte.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Co má průřez na Trida změnit?
|
||||||
|
- Jen barvu pozadí
|
||||||
|
- [x] Graf i kartu na stránce
|
||||||
|
- Soubor xlsx na disku
|
||||||
|
- Heslo k WordPressu
|
||||||
|
> Průřez filtruje vizuály na stránce. Karta s celkovou částkou se musí změnit taky.
|
||||||
|
|
||||||
|
## Čím se liší filtr jednoho vizuálu od průřezu?
|
||||||
|
- Ničím
|
||||||
|
- [x] Filtr vizuálu platí jen pro něj, průřez je ovládání pro stránku
|
||||||
|
- Filtr vizuálu smaže Excel
|
||||||
|
- Průřez nejde zrušit
|
||||||
|
> Průřez je na plátně pro čtenáře. Filtr v podokně vizuálu ostatní grafy nechá.
|
||||||
|
|
||||||
|
## Jaké PDF se odevzdává, když mají být vidět obě třídy?
|
||||||
|
- S vybranou jen 1.A
|
||||||
|
- [x] Bez výběru v průřezu
|
||||||
|
- Prázdná stránka
|
||||||
|
- Jen karta bez grafu a bez tříd
|
||||||
|
> PDF drží aktuální výběr. Než ho uděláte, výběr zrušte.
|
||||||
|
|
||||||
|
## Jak se má stránka jmenovat?
|
||||||
|
- Stránka 1
|
||||||
|
- [x] Prodej
|
||||||
|
- pbix
|
||||||
|
- DELETE
|
||||||
|
> Název říká, co na stránce je. Výchozí Stránka 1 se neodevzdává.
|
||||||
6
content/programove-vybaveni/4-rocnik/05-batch.en.md
Normal file
6
content/programove-vybaveni/4-rocnik/05-batch.en.md
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Batch files
|
||||||
|
popis: A bat file that creates the school folders and deletes nothing.
|
||||||
|
nazev_cviceni: Quiz: batch
|
||||||
|
nadpis_kvizu: Pick the safe command
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/4-rocnik/05-batch.md
Normal file
79
content/programove-vybaveni/4-rocnik/05-batch.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-4-batch
|
||||||
|
nazev: Dávkové soubory
|
||||||
|
popis: Soubor bat, který založí složky školy a nic nemaže.
|
||||||
|
nazev_cviceni: Kvíz: batch
|
||||||
|
nadpis_kvizu: Vyberte bezpečný příkaz
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Soubor bat
|
||||||
|
*Příkazy za sebou*
|
||||||
|
|
||||||
|
- Dávkový soubor je text s příponou bat. Příkazový řádek ho spustí řádek po řádku.
|
||||||
|
- První řádek cvičení je @echo off, ať se příkazy nevypisují podruhé do okna.
|
||||||
|
- rem je komentář. Do příkazu se nepočítá.
|
||||||
|
- Soubor se jmenuje slozky.bat a leží v Dokumentech, ne na cizím flash disku, kterému nerozumíte.
|
||||||
|
|
||||||
|
> Tip: Dvojklik spustí bat v té složce, kde soubor je. Neznámý bat z mailu se nespouští, stejně jako pdf.exe.
|
||||||
|
|
||||||
|
## Složky
|
||||||
|
*mkdir*
|
||||||
|
|
||||||
|
- mkdir založí složku. Když už existuje, příkaz ohlásí chybu a pokračuje se dál, složku nesmaže.
|
||||||
|
- set "ROOT=%USERPROFILE%\Documents\Skola" uloží cestu. %USERPROFILE% je složka účtu, u každého jiná.
|
||||||
|
- mkdir "%ROOT%\1-rocnik\word" založí i mezistupně, když je napíšete takto v nových Windows. Když ne, založte nejdřív 1-rocnik a pak word.
|
||||||
|
- Uvozovky kolem cesty jsou povinné v okamžiku, kdy v cestě je mezera. V Documents mezera není, v názvu účtu být může.
|
||||||
|
|
||||||
|
> Tip: echo Hotovo vypíše větu. pause nechá okno otevřené, ať výsledek přečtete. Bez pause dvojklik okno hned zavře.
|
||||||
|
|
||||||
|
## Co se nepouští
|
||||||
|
*del*
|
||||||
|
|
||||||
|
- del smaže soubor. Ve školním bat na založení složek žádný del není.
|
||||||
|
- Příkaz, který maže podle masky celý disk, se nepíše ani z legrace. Obnova není Ctrl+Z.
|
||||||
|
- cd /d přejde na jiný disk a složku. Než něco mažete, echo vypíše, kde jste. V tomto cvičení nemažete.
|
||||||
|
- Bat, kterému nerozumíte řádek po řádku, nespouštějte. Krátký soubor se čte celý.
|
||||||
|
|
||||||
|
> Tip: Když chcete zkusit del, zkuste ho na jeden soubor test.txt, který jste sami právě vytvořili. Ne na složku Windows.
|
||||||
|
|
||||||
|
## Zadání: slozky.bat
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- slozky.bat nastaví ROOT na %USERPROFILE%\Documents\Skola a založí 1-rocnik\word, 1-rocnik\excel a 1-rocnik\system.
|
||||||
|
- Na konci je echo s cestou a pause. Není tam del.
|
||||||
|
- Spusťte ho jednou. Složky v Průzkumníku opravdu jsou.
|
||||||
|
- Spusťte ho podruhé. Smí ohlásit, že složka už existuje. Nemá nic smazat.
|
||||||
|
|
||||||
|
> Tip: Úprava bat je v Poznámkovém bloku, ne ve Wordu. Word do něj doplní formátování a příkazový řádek pak řádek nepochopí.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Co má být první řádek školního bat?
|
||||||
|
- del C:\
|
||||||
|
- [x] @echo off
|
||||||
|
- formát disku
|
||||||
|
- heslo účtu
|
||||||
|
> @echo off jen ztiší opisování příkazů. Nic nemaže.
|
||||||
|
|
||||||
|
## Co dělá mkdir?
|
||||||
|
- Smaže složku
|
||||||
|
- [x] Založí složku
|
||||||
|
- Otevře Word
|
||||||
|
- Změní heslo
|
||||||
|
> mkdir je make directory. Mazání je jiný příkaz a v tomto cvičení není.
|
||||||
|
|
||||||
|
## Kam ukazuje %USERPROFILE%?
|
||||||
|
- Na stejnou složku na všech účtech počítače
|
||||||
|
- [x] Na profil přihlášeného účtu
|
||||||
|
- Na web WordPressu
|
||||||
|
- Na tabulku tridy
|
||||||
|
> Každý účet má vlastní profil. Stejný bat tedy založí Skola v Dokumentech toho, kdo ho spustil.
|
||||||
|
|
||||||
|
## Který bat ve cvičení nespouštíte?
|
||||||
|
- Ten, který jen zakládá složky a na konci čeká
|
||||||
|
- [x] Neznámý soubor z mailu
|
||||||
|
- slozky.bat, který jste sami přečetli
|
||||||
|
- Soubor, který ohlásí, že složka už existuje
|
||||||
|
> Dávka je program. Z mailu se nespouští, stejně jako soubor s příponou exe.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Users and groups in Windows
|
||||||
|
popis: The zaci account is in Users. It is not in Administrators.
|
||||||
|
nazev_cviceni: Quiz: groups
|
||||||
|
nadpis_kvizu: Put the account in the right group
|
||||||
|
---
|
||||||
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-4-uzivatele
|
||||||
|
nazev: Uživatelé a skupiny ve Windows
|
||||||
|
popis: Účet zaci je ve Users. Ve skupině Administrators není.
|
||||||
|
nazev_cviceni: Kvíz: skupiny
|
||||||
|
nadpis_kvizu: Zařaďte účet do skupiny
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Skupina
|
||||||
|
*Práva najednou*
|
||||||
|
|
||||||
|
- Skupina sdružuje účty, které mají mít stejná práva. Neměníte právo každému účtu zvlášť po jednom souboru.
|
||||||
|
- Users jsou běžní uživatelé. Administrators smí měnit systém a instalovat.
|
||||||
|
- Účet zaci patří do Users. Do Administrators ne.
|
||||||
|
- Nový účet je často v Users sám. Práce navíc je nestrkat ho mezi správce, ne dopisovat Users.
|
||||||
|
|
||||||
|
> Tip: Kdo je správce, vypíše net localgroup Administrators. Jméno zaci v tom seznamu být nemá.
|
||||||
|
|
||||||
|
## Příkazy
|
||||||
|
*Bez hesla v řádku*
|
||||||
|
|
||||||
|
- net user zaci * /add účet založí a na heslo se zeptá. Hvězdička znamená dotaz, ne heslo zapsané do bat.
|
||||||
|
- net user zaci vypíše účet. Je tam vidět, jestli je aktivní.
|
||||||
|
- net localgroup Users zaci /add ho přidá do Users, kdyby tam nebyl.
|
||||||
|
- net localgroup Administrators zaci /delete ho ze správců odebere, pokud tam omylem je. Příkaz chce spustit správce.
|
||||||
|
|
||||||
|
> Tip: lusrmgr.msc otevře stejné účty v okně, ale jen ve Windows Pro, Education a Enterprise. V edici Home toto okno není a zůstává net user.
|
||||||
|
|
||||||
|
## Kdo příkaz spouští
|
||||||
|
*Správce*
|
||||||
|
|
||||||
|
- Běžný uživatel účet nezaloží. Okno se musí spustit jako správce, nebo systém požádá o souhlas.
|
||||||
|
- Souhlas správce není důvod založit účet rovnou jako správce. zaci zůstává běžný.
|
||||||
|
- whoami na účtu zaci nesmí skončit na Administrators.
|
||||||
|
- Cvičný účet se po hodině dá odebrat: net user zaci /delete. Nejdřív si ověřte, že nemaže účet učitele.
|
||||||
|
|
||||||
|
> Tip: Jméno účtu zaci je cvičné. Účet, který se jmenuje jako učitel nebo správce, se nedeaktivuje a nemaže.
|
||||||
|
|
||||||
|
## Zadání: zápis, ne cizí účty
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Do ucty.txt napište příkaz, kterým se zaci založí, včetně hvězdičky místo hesla.
|
||||||
|
- Napište, v které skupině má být a ve které být nemá.
|
||||||
|
- Pokud učitel dovolí, účet opravdu založte a net localgroup Administrators opište. zaci v seznamu není.
|
||||||
|
- Heslo do ucty.txt nepište. Cizí účty na počítači neměňte.
|
||||||
|
|
||||||
|
> Tip: Když lusrmgr.msc hlásí, že neexistuje, máte edici Home. Použijte net user a do zápisu napište, že grafické okno v této edici není.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Do které skupiny patří zaci?
|
||||||
|
- Administrators
|
||||||
|
- [x] Users
|
||||||
|
- Do žádné, účet bez skupiny smí instalovat
|
||||||
|
- Do skupiny hesel
|
||||||
|
> Běžná práce je skupina Users. Správci jsou Administrators.
|
||||||
|
|
||||||
|
## Jak se účet založí, aniž by heslo zůstalo v příkazu?
|
||||||
|
- [x] net user zaci * /add
|
||||||
|
- net user zaci heslo123 /add
|
||||||
|
- mkdir zaci
|
||||||
|
- DELETE FROM zaci
|
||||||
|
> Hvězdička se zeptá. Heslo napsané v příkazu zůstane v historii.
|
||||||
|
|
||||||
|
## Kde lusrmgr.msc není?
|
||||||
|
- Ve Windows Pro
|
||||||
|
- [x] Ve Windows Home
|
||||||
|
- Ve Windows Education
|
||||||
|
- Ve Windows Enterprise
|
||||||
|
> Grafická správa účtů je v Pro, Education a Enterprise. Home ji nemá.
|
||||||
|
|
||||||
|
## Co whoami nesmí ukázat při denní práci na účtu zaci?
|
||||||
|
- Že jde o běžného uživatele
|
||||||
|
- [x] Že účet je ve skupině Administrators
|
||||||
|
- Název počítače
|
||||||
|
- To, že účet existuje
|
||||||
|
> Denní účet není správce. whoami to prozradí dřív, než něco nainstalujete.
|
||||||
6
content/programove-vybaveni/4-rocnik/07-zasady.en.md
Normal file
6
content/programove-vybaveni/4-rocnik/07-zasady.en.md
Normal file
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Local policy
|
||||||
|
popis: A minimum password of 8 characters and a lock after 300 seconds. A school domain overrides the local policy.
|
||||||
|
nazev_cviceni: Quiz: policy
|
||||||
|
nadpis_kvizu: Fill in the value and the command
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/4-rocnik/07-zasady.md
Normal file
79
content/programove-vybaveni/4-rocnik/07-zasady.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-4-zasady
|
||||||
|
nazev: Místní zásady
|
||||||
|
popis: Minimální heslo 8 znaků a zámek po 300 sekundách. Doména školy místní zásadu přebije.
|
||||||
|
nazev_cviceni: Kvíz: zásady
|
||||||
|
nadpis_kvizu: Doplňte hodnotu a příkaz
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Kde se zásady berou
|
||||||
|
*gpedit*
|
||||||
|
|
||||||
|
- Místní zásady otevře gpedit.msc. Je ve Windows Pro, Education a Enterprise, v edici Home není.
|
||||||
|
- Konfigurace počítače platí pro stroj. Konfigurace uživatele platí pro účty, které se přihlásí.
|
||||||
|
- Školní cvičení mění dvě věci: délku hesla a zámek při nečinnosti. Ostatní zásady nechte být.
|
||||||
|
- Když je počítač v doméně školy, doménová zásada vyhraje nad místní. Místní změna se pak jakoby ztratí a není to chyba klikání.
|
||||||
|
|
||||||
|
> Tip: Než něco změníte, napište si původní hodnotu. Vrátit Neznámé číslo zpět nejde, když jste si ho nezapsali.
|
||||||
|
|
||||||
|
## Heslo
|
||||||
|
*Osm znaků*
|
||||||
|
|
||||||
|
- Cesta vede přes Konfigurace počítače, Nastavení systému Windows, Nastavení zabezpečení, Zásady účtů, Zásady hesel.
|
||||||
|
- Minimální délka hesla se nastaví na 8.
|
||||||
|
- Nula znamená, že heslo smí být prázdné. To školní účet nechce.
|
||||||
|
- Zásada neopraví heslo, které už je krátké, dokud ho uživatel příště nemění. Platí pro nová hesla.
|
||||||
|
|
||||||
|
> Tip: Heslo v zásadě nenastavujete. Nastavujete pravidlo. Samotné heslo účtu zaci se zadává při net user, ne tady.
|
||||||
|
|
||||||
|
## Zámek
|
||||||
|
*300 sekund*
|
||||||
|
|
||||||
|
- Nečinnost: Konfigurace počítače, Nastavení systému Windows, Nastavení zabezpečení, Místní zásady, Možnosti zabezpečení.
|
||||||
|
- Položka Interaktivní přihlášení: limit nečinnosti počítače se nastaví na 300 sekund, tedy 5 minut.
|
||||||
|
- Nula nebo nenastaveno znamená, že tato zásada zámek nevynucuje.
|
||||||
|
- Po pěti minutách bez myši a klávesnice se má počítač zamknout, ne vypnout a ne smazat Dokumenty.
|
||||||
|
|
||||||
|
> Tip: Zámek je Win+L hned. Zásada totéž udělá sama, když odejdete od stroje a zapomenete.
|
||||||
|
|
||||||
|
## Zadání: dvě hodnoty
|
||||||
|
*Cvičení*
|
||||||
|
|
||||||
|
- Pokud gpedit.msc máte, nastavte minimální délku hesla na 8 a limit nečinnosti na 300 sekund. Původní hodnoty si zapište.
|
||||||
|
- gpupdate /force zásady načte hned, bez čekání na restart. Příkaz chce okno spuštěné jako správce.
|
||||||
|
- Do zasady.txt napište obě hodnoty a jestli je počítač v doméně. Heslo nepište.
|
||||||
|
- V edici Home napište, že gpedit.msc v ní není, a hodnoty jen popište. Nevymýšlejte, že jste je nastavili.
|
||||||
|
|
||||||
|
> Tip: Když po gpupdate hodnota v gpedit zůstane a systém se nechová podle ní, počítač je v doméně a doména místní číslo přebíjí.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Jaká je školní minimální délka hesla?
|
||||||
|
- 0
|
||||||
|
- [x] 8
|
||||||
|
- 300
|
||||||
|
- Prázdné heslo
|
||||||
|
> Osm znaků je pravidlo z první hodiny o účtech. Nula by prázdné heslo dovolila.
|
||||||
|
|
||||||
|
## Na kolik sekund se nastaví limit nečinnosti?
|
||||||
|
- 5
|
||||||
|
- [x] 300
|
||||||
|
- 8
|
||||||
|
- Na nulu, ať se počítač nezamyká
|
||||||
|
> 300 sekund je pět minut. Číslo 5 by bylo pět sekund, to v této položce není.
|
||||||
|
|
||||||
|
## Čím se místní zásady načtou hned?
|
||||||
|
- Smazáním účtu zaci
|
||||||
|
- [x] gpupdate /force
|
||||||
|
- mkdir
|
||||||
|
- SELECT * FROM zaci
|
||||||
|
> gpupdate zásady znovu načte. Bez něj si počítač může počkat na své vlastní obnovení.
|
||||||
|
|
||||||
|
## Co platí, když je počítač v doméně školy a místní heslo nastavíte jinak?
|
||||||
|
- Vždy vyhraje místní gpedit
|
||||||
|
- [x] Vyhraje doménová zásada
|
||||||
|
- Hesla se vypnou
|
||||||
|
- WordPress přestane běžet
|
||||||
|
> Doména je nad místním počítačem. Místní změna, která jí odporuje, se neuplatní.
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
---
|
||||||
|
nazev: Exam assignment
|
||||||
|
popis: Folders, a letter, grades, a register, a site, a report and an account with a password rule.
|
||||||
|
nazev_cviceni: Quiz: the whole assignment
|
||||||
|
nadpis_kvizu: Walk the hand-in
|
||||||
|
---
|
||||||
79
content/programove-vybaveni/4-rocnik/08-maturitni-zadani.md
Normal file
79
content/programove-vybaveni/4-rocnik/08-maturitni-zadani.md
Normal file
|
|
@ -0,0 +1,79 @@
|
||||||
|
---
|
||||||
|
id: sw-4-maturita
|
||||||
|
nazev: Maturitní zadání
|
||||||
|
popis: Složky, dopis, známky, evidence, web, sestava a účet s zásadou hesla.
|
||||||
|
nazev_cviceni: Kvíz: celé zadání
|
||||||
|
nadpis_kvizu: Projdi odevzdání
|
||||||
|
---
|
||||||
|
|
||||||
|
# Výklad
|
||||||
|
|
||||||
|
## Systém
|
||||||
|
*Složky a účet*
|
||||||
|
|
||||||
|
- slozky.bat založí Skola\1-rocnik\word, excel a system v Dokumentech toho účtu, který ho spustí.
|
||||||
|
- V bat není del a není v něm heslo. Je v něm @echo off, mkdir a pause.
|
||||||
|
- Účet zaci je běžný uživatel ve skupině Users, není v Administrators.
|
||||||
|
- Minimální délka hesla je 8 znaků. Zámek po nečinnosti je 300 sekund, pokud edice Windows zásady má.
|
||||||
|
|
||||||
|
> Tip: Do textového souboru patří příkazy a hodnoty. Skutečné heslo ne.
|
||||||
|
|
||||||
|
## Office
|
||||||
|
*Dopis a známky*
|
||||||
|
|
||||||
|
- zadost.docx je jedna strana, datum 12. 6. 2026, řádek Věc, k tomu PDF.
|
||||||
|
- znamky.xlsx počítá stav vzorcem KDYŽ. Známka 5 je neprospěl, 1 až 4 prospěl.
|
||||||
|
- Pod známkami je průměr, ne součet.
|
||||||
|
- prodej.xlsx a prodej.pbix: tabulka načtená jednou, průřez třídy, PDF bez výběru, ať jsou vidět obě třídy.
|
||||||
|
|
||||||
|
> Tip: pbix bez xlsx zdroje učitel neobnoví. Xlsx vedle pbix nechte.
|
||||||
|
|
||||||
|
## Data a web
|
||||||
|
*Evidence a Školní den*
|
||||||
|
|
||||||
|
- Access nebo MySQL: tabulky tridy a zaci, vztah 1:N, Anna Nováková ve třídě 1.A.
|
||||||
|
- Dotaz ukáže název 1.A, ne jen číslo. UPDATE a DELETE, pokud jsou v SQL, mají WHERE.
|
||||||
|
- WordPress: název Školní den, stránka O škole, příspěvek s datem, účet autora. Správce je jeden.
|
||||||
|
- V textech o webu a účtech není heslo.
|
||||||
|
|
||||||
|
> Tip: Stačí jeden databázový nástroj, ale celý. Access s integritou, nebo SQL s JOINem.
|
||||||
|
|
||||||
|
## Složka odevzdání
|
||||||
|
*Pořádek*
|
||||||
|
|
||||||
|
- Všechno leží pod Skola, ne na ploše a ne v Stažených.
|
||||||
|
- Přípony jsou vidět. Názvy nemají final2.
|
||||||
|
- Na obhajobu otevřete nejdřív bat a složky, pak Excel a Power BI, pak databázi a nakonec web.
|
||||||
|
- U každé části umíte říct, kdo smí heslo, kdo smí instalovat a proč pětka není prospěl.
|
||||||
|
|
||||||
|
> Tip: Když se zeptají, proč zaci není správce, odpověď je: denní účet nemá právo měnit systém.
|
||||||
|
|
||||||
|
# Kvíz
|
||||||
|
|
||||||
|
## Co slozky.bat nesmí obsahovat?
|
||||||
|
- mkdir
|
||||||
|
- @echo off
|
||||||
|
- [x] del přes celý disk nebo cizí složky
|
||||||
|
- pause
|
||||||
|
> Cvičení složky zakládá. Mazání do něj nepatří a neznámé mazání už vůbec ne.
|
||||||
|
|
||||||
|
## Jaký je stav známky 5?
|
||||||
|
- prospěl
|
||||||
|
- [x] neprospěl
|
||||||
|
- průměr
|
||||||
|
- 1.A
|
||||||
|
> Prochází 1 až 4. Pětka je neprospěl. Rozhoduje vzorec KDYŽ, ne rukou psaný text.
|
||||||
|
|
||||||
|
## Jakou roli má účet, který ve WordPressu jen píše novinky?
|
||||||
|
- Správce
|
||||||
|
- [x] Autor
|
||||||
|
- Jediný sdílený účet učitele
|
||||||
|
- Administrators ve Windows
|
||||||
|
> Autor zveřejní vlastní příspěvek. Doplňky a uživatele spravuje jeden správce.
|
||||||
|
|
||||||
|
## Jaké jsou dvě hodnoty zásad?
|
||||||
|
- Heslo 0 znaků a zámek 8 sekund
|
||||||
|
- [x] Heslo aspoň 8 znaků a zámek po 300 sekundách
|
||||||
|
- Heslo v souboru bat a zámek vypnutý
|
||||||
|
- 300 znaků hesla a 8 sekund
|
||||||
|
> Osm znaků je délka hesla. 300 sekund je pět minut nečinnosti.
|
||||||
|
|
@ -269,6 +269,26 @@ final class AppModel: ObservableObject {
|
||||||
refresh()
|
refresh()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func markSw(_ id: Int) {
|
||||||
|
progress.markSw(id)
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
func markSw2(_ id: Int) {
|
||||||
|
progress.markSw2(id)
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
func markSw3(_ id: Int) {
|
||||||
|
progress.markSw3(id)
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
|
||||||
|
func markSw4(_ id: Int) {
|
||||||
|
progress.markSw4(id)
|
||||||
|
refresh()
|
||||||
|
}
|
||||||
|
|
||||||
func markTg4(_ id: Int) {
|
func markTg4(_ id: Int) {
|
||||||
progress.markTg4(id)
|
progress.markTg4(id)
|
||||||
refresh()
|
refresh()
|
||||||
|
|
|
||||||
|
|
@ -67,6 +67,10 @@ final class Content {
|
||||||
let pg2: [J]
|
let pg2: [J]
|
||||||
let pg3: [J]
|
let pg3: [J]
|
||||||
let pg4: [J]
|
let pg4: [J]
|
||||||
|
let sw: [J]
|
||||||
|
let sw2: [J]
|
||||||
|
let sw3: [J]
|
||||||
|
let sw4: [J]
|
||||||
let cs: [J]
|
let cs: [J]
|
||||||
let cs2: [J]
|
let cs2: [J]
|
||||||
let cs3: [J]
|
let cs3: [J]
|
||||||
|
|
@ -145,6 +149,10 @@ final class Content {
|
||||||
pg2 = raw.arr("pg2")
|
pg2 = raw.arr("pg2")
|
||||||
pg3 = raw.arr("pg3")
|
pg3 = raw.arr("pg3")
|
||||||
pg4 = raw.arr("pg4")
|
pg4 = raw.arr("pg4")
|
||||||
|
sw = raw.arr("sw")
|
||||||
|
sw2 = raw.arr("sw2")
|
||||||
|
sw3 = raw.arr("sw3")
|
||||||
|
sw4 = raw.arr("sw4")
|
||||||
cs = raw.arr("cs")
|
cs = raw.arr("cs")
|
||||||
cs2 = raw.arr("cs2")
|
cs2 = raw.arr("cs2")
|
||||||
cs3 = raw.arr("cs3")
|
cs3 = raw.arr("cs3")
|
||||||
|
|
@ -219,6 +227,10 @@ final class Content {
|
||||||
func pg2Lesson(_ id: Int) -> J? { pg2.first { $0.int("id") == id } }
|
func pg2Lesson(_ id: Int) -> J? { pg2.first { $0.int("id") == id } }
|
||||||
func pg3Lesson(_ id: Int) -> J? { pg3.first { $0.int("id") == id } }
|
func pg3Lesson(_ id: Int) -> J? { pg3.first { $0.int("id") == id } }
|
||||||
func pg4Lesson(_ id: Int) -> J? { pg4.first { $0.int("id") == id } }
|
func pg4Lesson(_ id: Int) -> J? { pg4.first { $0.int("id") == id } }
|
||||||
|
func swLesson(_ id: Int) -> J? { sw.first { $0.int("id") == id } }
|
||||||
|
func sw2Lesson(_ id: Int) -> J? { sw2.first { $0.int("id") == id } }
|
||||||
|
func sw3Lesson(_ id: Int) -> J? { sw3.first { $0.int("id") == id } }
|
||||||
|
func sw4Lesson(_ id: Int) -> J? { sw4.first { $0.int("id") == id } }
|
||||||
func csLesson(_ id: Int) -> J? { cs.first { $0.int("id") == id } }
|
func csLesson(_ id: Int) -> J? { cs.first { $0.int("id") == id } }
|
||||||
func cs2Lesson(_ id: Int) -> J? { cs2.first { $0.int("id") == id } }
|
func cs2Lesson(_ id: Int) -> J? { cs2.first { $0.int("id") == id } }
|
||||||
func cs3Lesson(_ id: Int) -> J? { cs3.first { $0.int("id") == id } }
|
func cs3Lesson(_ id: Int) -> J? { cs3.first { $0.int("id") == id } }
|
||||||
|
|
|
||||||
|
|
@ -110,6 +110,14 @@ final class ProgressStore {
|
||||||
func markPg3(_ id: Int) { mark("pg3.\(id)") }
|
func markPg3(_ id: Int) { mark("pg3.\(id)") }
|
||||||
func pg4Done(_ id: Int) -> Bool { done("pg4.\(id)") }
|
func pg4Done(_ id: Int) -> Bool { done("pg4.\(id)") }
|
||||||
func markPg4(_ id: Int) { mark("pg4.\(id)") }
|
func markPg4(_ id: Int) { mark("pg4.\(id)") }
|
||||||
|
func swDone(_ id: Int) -> Bool { done("sw.\(id)") }
|
||||||
|
func markSw(_ id: Int) { mark("sw.\(id)") }
|
||||||
|
func sw2Done(_ id: Int) -> Bool { done("sw2.\(id)") }
|
||||||
|
func markSw2(_ id: Int) { mark("sw2.\(id)") }
|
||||||
|
func sw3Done(_ id: Int) -> Bool { done("sw3.\(id)") }
|
||||||
|
func markSw3(_ id: Int) { mark("sw3.\(id)") }
|
||||||
|
func sw4Done(_ id: Int) -> Bool { done("sw4.\(id)") }
|
||||||
|
func markSw4(_ id: Int) { mark("sw4.\(id)") }
|
||||||
func csDone(_ id: Int) -> Bool { done("cs.\(id)") }
|
func csDone(_ id: Int) -> Bool { done("cs.\(id)") }
|
||||||
func markCs(_ id: Int) { mark("cs.\(id)") }
|
func markCs(_ id: Int) { mark("cs.\(id)") }
|
||||||
func cs2Done(_ id: Int) -> Bool { done("cs2.\(id)") }
|
func cs2Done(_ id: Int) -> Bool { done("cs2.\(id)") }
|
||||||
|
|
@ -376,6 +384,38 @@ func summarize(_ content: Content, _ p: ProgressStore) -> ProgressSum {
|
||||||
sum.doneUnits += 1
|
sum.doneUnits += 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
for l in content.sw {
|
||||||
|
sum.totalEx += 1
|
||||||
|
sum.openUnits += 1
|
||||||
|
if p.swDone(l.int("id")) {
|
||||||
|
sum.doneEx += 1
|
||||||
|
sum.doneUnits += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for l in content.sw2 {
|
||||||
|
sum.totalEx += 1
|
||||||
|
sum.openUnits += 1
|
||||||
|
if p.sw2Done(l.int("id")) {
|
||||||
|
sum.doneEx += 1
|
||||||
|
sum.doneUnits += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for l in content.sw3 {
|
||||||
|
sum.totalEx += 1
|
||||||
|
sum.openUnits += 1
|
||||||
|
if p.sw3Done(l.int("id")) {
|
||||||
|
sum.doneEx += 1
|
||||||
|
sum.doneUnits += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for l in content.sw4 {
|
||||||
|
sum.totalEx += 1
|
||||||
|
sum.openUnits += 1
|
||||||
|
if p.sw4Done(l.int("id")) {
|
||||||
|
sum.doneEx += 1
|
||||||
|
sum.doneUnits += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
for l in content.cs {
|
for l in content.cs {
|
||||||
sum.totalEx += 1
|
sum.totalEx += 1
|
||||||
sum.openUnits += 1
|
sum.openUnits += 1
|
||||||
|
|
|
||||||
|
|
@ -137,6 +137,19 @@ enum Route: Hashable {
|
||||||
case pg4Map
|
case pg4Map
|
||||||
case pg4Lesson(Int)
|
case pg4Lesson(Int)
|
||||||
case pg4Ex(Int)
|
case pg4Ex(Int)
|
||||||
|
case swYears
|
||||||
|
case swMap
|
||||||
|
case swLesson(Int)
|
||||||
|
case swEx(Int)
|
||||||
|
case sw2Map
|
||||||
|
case sw2Lesson(Int)
|
||||||
|
case sw2Ex(Int)
|
||||||
|
case sw3Map
|
||||||
|
case sw3Lesson(Int)
|
||||||
|
case sw3Ex(Int)
|
||||||
|
case sw4Map
|
||||||
|
case sw4Lesson(Int)
|
||||||
|
case sw4Ex(Int)
|
||||||
case csYears
|
case csYears
|
||||||
case csMap
|
case csMap
|
||||||
case csLesson(Int)
|
case csLesson(Int)
|
||||||
|
|
@ -285,6 +298,19 @@ enum Route: Hashable {
|
||||||
case .pg4Map: return "pg4map"
|
case .pg4Map: return "pg4map"
|
||||||
case .pg4Lesson(let id): return "pg4unit\(id)"
|
case .pg4Lesson(let id): return "pg4unit\(id)"
|
||||||
case .pg4Ex(let id): return "pg4ex\(id)"
|
case .pg4Ex(let id): return "pg4ex\(id)"
|
||||||
|
case .swYears: return "swyears"
|
||||||
|
case .swMap: return "swmap"
|
||||||
|
case .swLesson(let id): return "swunit\(id)"
|
||||||
|
case .swEx(let id): return "swex\(id)"
|
||||||
|
case .sw2Map: return "sw2map"
|
||||||
|
case .sw2Lesson(let id): return "sw2unit\(id)"
|
||||||
|
case .sw2Ex(let id): return "sw2ex\(id)"
|
||||||
|
case .sw3Map: return "sw3map"
|
||||||
|
case .sw3Lesson(let id): return "sw3unit\(id)"
|
||||||
|
case .sw3Ex(let id): return "sw3ex\(id)"
|
||||||
|
case .sw4Map: return "sw4map"
|
||||||
|
case .sw4Lesson(let id): return "sw4unit\(id)"
|
||||||
|
case .sw4Ex(let id): return "sw4ex\(id)"
|
||||||
case .csYears: return "csyears"
|
case .csYears: return "csyears"
|
||||||
case .csMap: return "csmap"
|
case .csMap: return "csmap"
|
||||||
case .csLesson(let id): return "csunit\(id)"
|
case .csLesson(let id): return "csunit\(id)"
|
||||||
|
|
@ -570,6 +596,32 @@ enum Route: Hashable {
|
||||||
return [.pgYears, .pg4Map, .pg4Lesson(id)]
|
return [.pgYears, .pg4Map, .pg4Lesson(id)]
|
||||||
case .pg4Ex(let id):
|
case .pg4Ex(let id):
|
||||||
return [.pgYears, .pg4Map, .pg4Lesson(id), .pg4Ex(id)]
|
return [.pgYears, .pg4Map, .pg4Lesson(id), .pg4Ex(id)]
|
||||||
|
case .swYears:
|
||||||
|
return [.swYears]
|
||||||
|
case .swMap:
|
||||||
|
return [.swYears, .swMap]
|
||||||
|
case .swLesson(let id):
|
||||||
|
return [.swYears, .swMap, .swLesson(id)]
|
||||||
|
case .swEx(let id):
|
||||||
|
return [.swYears, .swMap, .swLesson(id), .swEx(id)]
|
||||||
|
case .sw2Map:
|
||||||
|
return [.swYears, .sw2Map]
|
||||||
|
case .sw2Lesson(let id):
|
||||||
|
return [.swYears, .sw2Map, .sw2Lesson(id)]
|
||||||
|
case .sw2Ex(let id):
|
||||||
|
return [.swYears, .sw2Map, .sw2Lesson(id), .sw2Ex(id)]
|
||||||
|
case .sw3Map:
|
||||||
|
return [.swYears, .sw3Map]
|
||||||
|
case .sw3Lesson(let id):
|
||||||
|
return [.swYears, .sw3Map, .sw3Lesson(id)]
|
||||||
|
case .sw3Ex(let id):
|
||||||
|
return [.swYears, .sw3Map, .sw3Lesson(id), .sw3Ex(id)]
|
||||||
|
case .sw4Map:
|
||||||
|
return [.swYears, .sw4Map]
|
||||||
|
case .sw4Lesson(let id):
|
||||||
|
return [.swYears, .sw4Map, .sw4Lesson(id)]
|
||||||
|
case .sw4Ex(let id):
|
||||||
|
return [.swYears, .sw4Map, .sw4Lesson(id), .sw4Ex(id)]
|
||||||
case .csYears:
|
case .csYears:
|
||||||
return [.csYears]
|
return [.csYears]
|
||||||
case .csMap:
|
case .csMap:
|
||||||
|
|
@ -658,6 +710,11 @@ func routeFromPage(_ page: String) -> Route? {
|
||||||
case "pg2map": return .pg2Map
|
case "pg2map": return .pg2Map
|
||||||
case "pg3map": return .pg3Map
|
case "pg3map": return .pg3Map
|
||||||
case "pg4map": return .pg4Map
|
case "pg4map": return .pg4Map
|
||||||
|
case "swyears": return .swYears
|
||||||
|
case "swmap": return .swMap
|
||||||
|
case "sw2map": return .sw2Map
|
||||||
|
case "sw3map": return .sw3Map
|
||||||
|
case "sw4map": return .sw4Map
|
||||||
case "csyears": return .csYears
|
case "csyears": return .csYears
|
||||||
case "csmap": return .csMap
|
case "csmap": return .csMap
|
||||||
case "cs2map": return .cs2Map
|
case "cs2map": return .cs2Map
|
||||||
|
|
@ -772,6 +829,30 @@ func routeFromPage(_ page: String) -> Route? {
|
||||||
if let m = page.wholeMatch(of: /fyzex(\d+)/), let n = Int(m.1) {
|
if let m = page.wholeMatch(of: /fyzex(\d+)/), let n = Int(m.1) {
|
||||||
return .fyzEx(n)
|
return .fyzEx(n)
|
||||||
}
|
}
|
||||||
|
if let m = page.wholeMatch(of: /sw4unit(\d+)/), let n = Int(m.1) {
|
||||||
|
return .sw4Lesson(n)
|
||||||
|
}
|
||||||
|
if let m = page.wholeMatch(of: /sw4ex(\d+)/), let n = Int(m.1) {
|
||||||
|
return .sw4Ex(n)
|
||||||
|
}
|
||||||
|
if let m = page.wholeMatch(of: /sw3unit(\d+)/), let n = Int(m.1) {
|
||||||
|
return .sw3Lesson(n)
|
||||||
|
}
|
||||||
|
if let m = page.wholeMatch(of: /sw3ex(\d+)/), let n = Int(m.1) {
|
||||||
|
return .sw3Ex(n)
|
||||||
|
}
|
||||||
|
if let m = page.wholeMatch(of: /sw2unit(\d+)/), let n = Int(m.1) {
|
||||||
|
return .sw2Lesson(n)
|
||||||
|
}
|
||||||
|
if let m = page.wholeMatch(of: /sw2ex(\d+)/), let n = Int(m.1) {
|
||||||
|
return .sw2Ex(n)
|
||||||
|
}
|
||||||
|
if let m = page.wholeMatch(of: /swunit(\d+)/), let n = Int(m.1) {
|
||||||
|
return .swLesson(n)
|
||||||
|
}
|
||||||
|
if let m = page.wholeMatch(of: /swex(\d+)/), let n = Int(m.1) {
|
||||||
|
return .swEx(n)
|
||||||
|
}
|
||||||
if let m = page.wholeMatch(of: /pg4unit(\d+)/), let n = Int(m.1) {
|
if let m = page.wholeMatch(of: /pg4unit(\d+)/), let n = Int(m.1) {
|
||||||
return .pg4Lesson(n)
|
return .pg4Lesson(n)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -712,6 +712,7 @@ func subjectSymbol(_ icon: String) -> String {
|
||||||
case "ruler": return "ruler.fill"
|
case "ruler": return "ruler.fill"
|
||||||
case "code": return "chevron.left.forwardslash.chevron.right"
|
case "code": return "chevron.left.forwardslash.chevron.right"
|
||||||
case "brush": return "paintbrush.fill"
|
case "brush": return "paintbrush.fill"
|
||||||
|
case "apps": return "square.grid.2x2.fill"
|
||||||
default: return "lock.fill"
|
default: return "lock.fill"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1018,6 +1018,39 @@ struct PgQuizScreen: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct SwQuizScreen: View {
|
||||||
|
@ObservedObject var vm: AppModel
|
||||||
|
let year: Int
|
||||||
|
let id: Int
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
let lesson: J? = {
|
||||||
|
switch year {
|
||||||
|
case 2: return vm.content.sw2Lesson(id)
|
||||||
|
case 3: return vm.content.sw3Lesson(id)
|
||||||
|
case 4: return vm.content.sw4Lesson(id)
|
||||||
|
default: return vm.content.swLesson(id)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if let lesson {
|
||||||
|
let spec = J([
|
||||||
|
"type": "choice",
|
||||||
|
"title": vm.tr(lesson.str("exTitleKey")),
|
||||||
|
"sub": lesson.str("quizHeadKey"),
|
||||||
|
"questions": lesson.rawArray("quiz"),
|
||||||
|
])
|
||||||
|
DispatchExercise(vm: vm, spec: spec, titleFallback: vm.tr(lesson.str("exTitleKey"))) {
|
||||||
|
switch year {
|
||||||
|
case 2: vm.markSw2(id)
|
||||||
|
case 3: vm.markSw3(id)
|
||||||
|
case 4: vm.markSw4(id)
|
||||||
|
default: vm.markSw(id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct FyzQuizScreen: View {
|
struct FyzQuizScreen: View {
|
||||||
@ObservedObject var vm: AppModel
|
@ObservedObject var vm: AppModel
|
||||||
let year: Int
|
let year: Int
|
||||||
|
|
|
||||||
|
|
@ -751,6 +751,10 @@ func routeProgress(_ vm: AppModel, _ r: Route) -> (done: Int, total: Int)? {
|
||||||
case .pg2Map: return tally(c.pg2, p.pg2Done)
|
case .pg2Map: return tally(c.pg2, p.pg2Done)
|
||||||
case .pg3Map: return tally(c.pg3, p.pg3Done)
|
case .pg3Map: return tally(c.pg3, p.pg3Done)
|
||||||
case .pg4Map: return tally(c.pg4, p.pg4Done)
|
case .pg4Map: return tally(c.pg4, p.pg4Done)
|
||||||
|
case .swMap: return tally(c.sw, p.swDone)
|
||||||
|
case .sw2Map: return tally(c.sw2, p.sw2Done)
|
||||||
|
case .sw3Map: return tally(c.sw3, p.sw3Done)
|
||||||
|
case .sw4Map: return tally(c.sw4, p.sw4Done)
|
||||||
case .csMap: return tally(c.cs, p.csDone)
|
case .csMap: return tally(c.cs, p.csDone)
|
||||||
case .cs2Map: return tally(c.cs2, p.cs2Done)
|
case .cs2Map: return tally(c.cs2, p.cs2Done)
|
||||||
case .cs3Map: return tally(c.cs3, p.cs3Done)
|
case .cs3Map: return tally(c.cs3, p.cs3Done)
|
||||||
|
|
@ -820,6 +824,12 @@ private func subjectSum(_ vm: AppModel, _ s: J) -> ProgressSum {
|
||||||
+ vm.content.pg2.filter { vm.progress.pg2Done($0.int("id")) }.count
|
+ vm.content.pg2.filter { vm.progress.pg2Done($0.int("id")) }.count
|
||||||
+ vm.content.pg3.filter { vm.progress.pg3Done($0.int("id")) }.count
|
+ vm.content.pg3.filter { vm.progress.pg3Done($0.int("id")) }.count
|
||||||
+ vm.content.pg4.filter { vm.progress.pg4Done($0.int("id")) }.count
|
+ vm.content.pg4.filter { vm.progress.pg4Done($0.int("id")) }.count
|
||||||
|
case "swyears", "swmap", "sw2map", "sw3map", "sw4map":
|
||||||
|
sum.totalEx = vm.content.sw.count + vm.content.sw2.count + vm.content.sw3.count + vm.content.sw4.count
|
||||||
|
sum.doneEx = vm.content.sw.filter { vm.progress.swDone($0.int("id")) }.count
|
||||||
|
+ vm.content.sw2.filter { vm.progress.sw2Done($0.int("id")) }.count
|
||||||
|
+ vm.content.sw3.filter { vm.progress.sw3Done($0.int("id")) }.count
|
||||||
|
+ vm.content.sw4.filter { vm.progress.sw4Done($0.int("id")) }.count
|
||||||
case "tgyears", "tgmap", "tg2map", "tg3map", "tg4map":
|
case "tgyears", "tgmap", "tg2map", "tg3map", "tg4map":
|
||||||
sum.totalEx = vm.content.tg.count + vm.content.tg2.count + vm.content.tg3.count + vm.content.tg4.count
|
sum.totalEx = vm.content.tg.count + vm.content.tg2.count + vm.content.tg3.count + vm.content.tg4.count
|
||||||
sum.doneEx = vm.content.tg.filter { vm.progress.tgDone($0.int("id")) }.count
|
sum.doneEx = vm.content.tg.filter { vm.progress.tgDone($0.int("id")) }.count
|
||||||
|
|
@ -1129,6 +1139,27 @@ private func buildSearch(_ vm: AppModel) -> [Hit] {
|
||||||
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "fyz4unit\(l.int("id"))", extra: "fyzika")
|
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "fyz4unit\(l.int("id"))", extra: "fyzika")
|
||||||
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "fyz4ex\(l.int("id"))")
|
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "fyz4ex\(l.int("id"))")
|
||||||
}
|
}
|
||||||
|
add(vm.tr("Programové vybavení"), vm.tr("search_lesson"), "swyears", extra: "office windows excel mysql")
|
||||||
|
add(vm.tr("sw_year1"), vm.tr("search_lesson"), "swmap", extra: "rocnik")
|
||||||
|
add(vm.tr("sw_year2"), vm.tr("search_lesson"), "sw2map", extra: "rocnik")
|
||||||
|
add(vm.tr("sw_year3"), vm.tr("search_lesson"), "sw3map", extra: "rocnik")
|
||||||
|
add(vm.tr("sw_year4"), vm.tr("search_lesson"), "sw4map", extra: "rocnik")
|
||||||
|
for l in vm.content.sw {
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "swunit\(l.int("id"))", extra: "windows")
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "swex\(l.int("id"))")
|
||||||
|
}
|
||||||
|
for l in vm.content.sw2 {
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw2unit\(l.int("id"))", extra: "word excel")
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw2ex\(l.int("id"))")
|
||||||
|
}
|
||||||
|
for l in vm.content.sw3 {
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw3unit\(l.int("id"))", extra: "access mysql")
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw3ex\(l.int("id"))")
|
||||||
|
}
|
||||||
|
for l in vm.content.sw4 {
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_lesson"), "sw4unit\(l.int("id"))", extra: "wordpress")
|
||||||
|
add(vm.tr(l.str("titleKey")), vm.tr("search_exercise"), "sw4ex\(l.int("id"))")
|
||||||
|
}
|
||||||
add(vm.tr("Prezentační grafika"), vm.tr("search_lesson"), "pgyears", extra: "photoshop premiere illustrator")
|
add(vm.tr("Prezentační grafika"), vm.tr("search_lesson"), "pgyears", extra: "photoshop premiere illustrator")
|
||||||
add(vm.tr("pg_year1"), vm.tr("search_lesson"), "pgmap", extra: "rocnik")
|
add(vm.tr("pg_year1"), vm.tr("search_lesson"), "pgmap", extra: "rocnik")
|
||||||
add(vm.tr("pg_year2"), vm.tr("search_lesson"), "pg2map", extra: "rocnik")
|
add(vm.tr("pg_year2"), vm.tr("search_lesson"), "pg2map", extra: "rocnik")
|
||||||
|
|
@ -1976,6 +2007,47 @@ struct CsYearsScreen: View {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct SwYearsScreen: View {
|
||||||
|
@ObservedObject var vm: AppModel
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
#if os(macOS)
|
||||||
|
let years: [(String, String, Route)] = [
|
||||||
|
("sw_year1", "sw_sub", .swMap),
|
||||||
|
("sw_year2", "sw2_sub", .sw2Map),
|
||||||
|
("sw_year3", "sw3_sub", .sw3Map),
|
||||||
|
("sw_year4", "sw4_sub", .sw4Map),
|
||||||
|
]
|
||||||
|
MacFillGrid(count: years.count, minWidth: 260, minHeight: 200) { i in
|
||||||
|
NavigationLink(value: years[i].2) {
|
||||||
|
MacLinkCard(title: vm.tr(years[i].0), subtitle: vm.tr(years[i].1), badge: "\(i + 1).", progress: routeProgress(vm, years[i].2))
|
||||||
|
}
|
||||||
|
.buttonStyle(PressScaleStyle())
|
||||||
|
}
|
||||||
|
.navigationTitle(vm.tr("Programové vybavení"))
|
||||||
|
.navigationSubtitle(vm.tr("sw_years_sub"))
|
||||||
|
#else
|
||||||
|
List {
|
||||||
|
NavigationLink(value: Route.swMap) {
|
||||||
|
ListRowLabel(title: vm.tr("sw_year1"), subtitle: vm.tr("sw_sub"), progress: routeProgress(vm, Route.swMap))
|
||||||
|
}
|
||||||
|
NavigationLink(value: Route.sw2Map) {
|
||||||
|
ListRowLabel(title: vm.tr("sw_year2"), subtitle: vm.tr("sw2_sub"), progress: routeProgress(vm, Route.sw2Map))
|
||||||
|
}
|
||||||
|
NavigationLink(value: Route.sw3Map) {
|
||||||
|
ListRowLabel(title: vm.tr("sw_year3"), subtitle: vm.tr("sw3_sub"), progress: routeProgress(vm, Route.sw3Map))
|
||||||
|
}
|
||||||
|
NavigationLink(value: Route.sw4Map) {
|
||||||
|
ListRowLabel(title: vm.tr("sw_year4"), subtitle: vm.tr("sw4_sub"), progress: routeProgress(vm, Route.sw4Map))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navigationTitle(vm.tr("Programové vybavení"))
|
||||||
|
.navigationSubtitle(vm.tr("sw_years_sub"))
|
||||||
|
.appListStyle()
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct PgYearsScreen: View {
|
struct PgYearsScreen: View {
|
||||||
@ObservedObject var vm: AppModel
|
@ObservedObject var vm: AppModel
|
||||||
|
|
||||||
|
|
@ -3175,6 +3247,72 @@ struct RouteDestination: View {
|
||||||
if let l = vm.content.cs4Lesson(id) {
|
if let l = vm.content.cs4Lesson(id) {
|
||||||
CodeLessonScreen(vm: vm, lesson: l, onSuccess: { vm.markCs4(id) })
|
CodeLessonScreen(vm: vm, lesson: l, onSuccess: { vm.markCs4(id) })
|
||||||
}
|
}
|
||||||
|
case .swYears:
|
||||||
|
SwYearsScreen(vm: vm)
|
||||||
|
case .swMap:
|
||||||
|
LessonListScreen(
|
||||||
|
vm: vm,
|
||||||
|
title: vm.tr("sw_year1"),
|
||||||
|
subtitle: vm.tr("sw_sub"),
|
||||||
|
rows: vm.content.sw.map { l in
|
||||||
|
let id = l.int("id")
|
||||||
|
return LessonRow(id: "s\(id)", title: vm.tr(l.str("titleKey")), done: vm.progress.swDone(id), destination: .swLesson(id))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
case .swLesson(let id):
|
||||||
|
if let l = vm.content.swLesson(id) {
|
||||||
|
SlidesScreen(vm: vm, title: vm.tr(l.str("titleKey")), subtitle: vm.tr(l.str("subKey")), slides: l.arr("slides"), next: .swEx(id))
|
||||||
|
}
|
||||||
|
case .swEx(let id):
|
||||||
|
SwQuizScreen(vm: vm, year: 1, id: id)
|
||||||
|
case .sw2Map:
|
||||||
|
LessonListScreen(
|
||||||
|
vm: vm,
|
||||||
|
title: vm.tr("sw_year2"),
|
||||||
|
subtitle: vm.tr("sw2_sub"),
|
||||||
|
rows: vm.content.sw2.map { l in
|
||||||
|
let id = l.int("id")
|
||||||
|
return LessonRow(id: "s2\(id)", title: vm.tr(l.str("titleKey")), done: vm.progress.sw2Done(id), destination: .sw2Lesson(id))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
case .sw2Lesson(let id):
|
||||||
|
if let l = vm.content.sw2Lesson(id) {
|
||||||
|
SlidesScreen(vm: vm, title: vm.tr(l.str("titleKey")), subtitle: vm.tr(l.str("subKey")), slides: l.arr("slides"), next: .sw2Ex(id))
|
||||||
|
}
|
||||||
|
case .sw2Ex(let id):
|
||||||
|
SwQuizScreen(vm: vm, year: 2, id: id)
|
||||||
|
case .sw3Map:
|
||||||
|
LessonListScreen(
|
||||||
|
vm: vm,
|
||||||
|
title: vm.tr("sw_year3"),
|
||||||
|
subtitle: vm.tr("sw3_sub"),
|
||||||
|
rows: vm.content.sw3.map { l in
|
||||||
|
let id = l.int("id")
|
||||||
|
return LessonRow(id: "s3\(id)", title: vm.tr(l.str("titleKey")), done: vm.progress.sw3Done(id), destination: .sw3Lesson(id))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
case .sw3Lesson(let id):
|
||||||
|
if let l = vm.content.sw3Lesson(id) {
|
||||||
|
SlidesScreen(vm: vm, title: vm.tr(l.str("titleKey")), subtitle: vm.tr(l.str("subKey")), slides: l.arr("slides"), next: .sw3Ex(id))
|
||||||
|
}
|
||||||
|
case .sw3Ex(let id):
|
||||||
|
SwQuizScreen(vm: vm, year: 3, id: id)
|
||||||
|
case .sw4Map:
|
||||||
|
LessonListScreen(
|
||||||
|
vm: vm,
|
||||||
|
title: vm.tr("sw_year4"),
|
||||||
|
subtitle: vm.tr("sw4_sub"),
|
||||||
|
rows: vm.content.sw4.map { l in
|
||||||
|
let id = l.int("id")
|
||||||
|
return LessonRow(id: "s4\(id)", title: vm.tr(l.str("titleKey")), done: vm.progress.sw4Done(id), destination: .sw4Lesson(id))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
case .sw4Lesson(let id):
|
||||||
|
if let l = vm.content.sw4Lesson(id) {
|
||||||
|
SlidesScreen(vm: vm, title: vm.tr(l.str("titleKey")), subtitle: vm.tr(l.str("subKey")), slides: l.arr("slides"), next: .sw4Ex(id))
|
||||||
|
}
|
||||||
|
case .sw4Ex(let id):
|
||||||
|
SwQuizScreen(vm: vm, year: 4, id: id)
|
||||||
case .pgYears:
|
case .pgYears:
|
||||||
PgYearsScreen(vm: vm)
|
PgYearsScreen(vm: vm)
|
||||||
case .pgMap:
|
case .pgMap:
|
||||||
|
|
|
||||||
|
|
@ -1110,6 +1110,8 @@ STD = [
|
||||||
("technicka-grafika/3-rocnik", "tg3"), ("technicka-grafika/4-rocnik", "tg4"),
|
("technicka-grafika/3-rocnik", "tg3"), ("technicka-grafika/4-rocnik", "tg4"),
|
||||||
("prezentacni-grafika/1-rocnik", "pg"), ("prezentacni-grafika/2-rocnik", "pg2"),
|
("prezentacni-grafika/1-rocnik", "pg"), ("prezentacni-grafika/2-rocnik", "pg2"),
|
||||||
("prezentacni-grafika/3-rocnik", "pg3"), ("prezentacni-grafika/4-rocnik", "pg4"),
|
("prezentacni-grafika/3-rocnik", "pg3"), ("prezentacni-grafika/4-rocnik", "pg4"),
|
||||||
|
("programove-vybaveni/1-rocnik", "sw"), ("programove-vybaveni/2-rocnik", "sw2"),
|
||||||
|
("programove-vybaveni/3-rocnik", "sw3"), ("programove-vybaveni/4-rocnik", "sw4"),
|
||||||
]
|
]
|
||||||
CODE = [
|
CODE = [
|
||||||
("programovani/1-rocnik", "cs"), ("programovani/2-rocnik", "cs2"),
|
("programovani/1-rocnik", "cs"), ("programovani/2-rocnik", "cs2"),
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue