Maturita

{%- raw -%}

Arduino — Semafor

Tlačítko (pin 2): zapnout / vypnout  ·  Potenciometr (A0): rychlost střídání
schéma.svg — ilustrační schéma zapojení
Arduino Uno GND pin 3 pin 4 pin 5 5V GND pin 2 A0 GND 5V 220Ω ZELENÁ 220Ω ORANŽ. 220Ω ČERVENÁ 10kΩ TLAČÍTKO POT VCC A0 GND POTENCIOMETR
semafor.ino
// === DEFINICE PINŮ ===
// #define je zkratka — všude kde napíšeš "cervena", Arduino dosadí číslo 5
#define cervena  5   // červená LED → pin 5, 220Ω rezistor do GND
#define oranzova 4   // oranžová LED → pin 4, 220Ω rezistor do GND
#define zelena   3   // zelená LED  → pin 3, 220Ω rezistor do GND
#define tlacitko 2   // tlačítko → pin 2, 10kΩ pull-down do GND, druhý konec na 5V
#define pot      A0  // prostřední nožička potenciometru → A0 (VCC a GND na krajní nožičky)

// === GLOBÁLNÍ PROMĚNNÁ ===
// bool může být jen true nebo false
// "bezi" si pamatuje, jestli semafor aktuálně funguje nebo je vypnutý
// Je mimo funkce → vidí ji jak loop(), tak prepni()
bool bezi = true;

// === SETUP — spustí se jednou při startu Arduina ===
void setup() {
  // OUTPUT = Arduino bude na tento pin posílat proud (rozsvítí LED)
  pinMode(cervena,  OUTPUT);
  pinMode(oranzova, OUTPUT);
  pinMode(zelena,   OUTPUT);
  // INPUT = Arduino bude z tohoto pinu číst stav (HIGH nebo LOW)
  pinMode(tlacitko, INPUT);
  // attachInterrupt = nastav "přerušení"
  // Kdykoli pin 2 zachytí náběžnou hranu (RISING = přechod 0V→5V = stisk),
  // Arduino OKAMŽITĚ zavolá funkci prepni() bez ohledu na to, co dělá v loop()
  attachInterrupt(digitalPinToInterrupt(tlacitko), prepni, RISING);
}

// === LOOP — opakuje se donekonečna ===
void loop() {
  // analogRead vrátí 0–1023 → použijeme přímo jako milisekundy do delay()
  int cas = analogRead(pot);

  if (bezi == true) {
    // FÁZE 1: červená
    digitalWrite(cervena, HIGH); delay(cas);
    // FÁZE 2: červená + oranžová (přechod na zelenou)
    digitalWrite(oranzova, HIGH); delay(cas);
    digitalWrite(cervena, LOW); digitalWrite(oranzova, LOW);
    // FÁZE 3: zelená
    digitalWrite(zelena, HIGH); delay(cas); digitalWrite(zelena, LOW);
    // FÁZE 4: oranžová (přechod zpět na červenou)
    digitalWrite(oranzova, HIGH); delay(cas); digitalWrite(oranzova, LOW);
  } else {
    // VYPNUTO: bliká oranžová (jako semafor mimo provoz)
    digitalWrite(oranzova, HIGH); delay(cas);
    digitalWrite(oranzova, LOW);  delay(cas);
  }
}

// === PREPNI — volá se automaticky přerušením při stisku tlačítka ===
// ! = negace: true→false, false→true
void prepni() { bezi = !bezi; }

/* DEBOUNCE VARIANTA (použij pokud tlačítko přepíná dvakrát najednou):
void prepni() {
  static unsigned long posledni = 0;
  unsigned long ted = millis();        // millis() = čas od startu v ms
  if (ted - posledni > 400) { bezi = !bezi; }
  posledni = ted;
} */
🗄️

SQL — E-shop databáze

Tabulky: zákazníci · produkty · objednávky · položky objednávek
eshop_schema.sql
-- ============================================================
-- E-SHOP DATABÁZE — schéma
-- Tabulky: zakaznici, produkty, objednavky, polozky_objednavky
-- ============================================================

-- 1. ZÁKAZNÍCI
CREATE TABLE zakaznici (
  id         INT          PRIMARY KEY AUTO_INCREMENT,
  jmeno      VARCHAR(100) NOT NULL,
  email      VARCHAR(100) UNIQUE NOT NULL,
  telefon    VARCHAR(20)
);

-- 2. PRODUKTY
CREATE TABLE produkty (
  id         INT            PRIMARY KEY AUTO_INCREMENT,
  nazev      VARCHAR(200)  NOT NULL,
  cena       DECIMAL(10,2) NOT NULL,   -- cena v Kč, dvě desetinná místa
  sklad      INT            DEFAULT 0   -- počet kusů na skladě
);

-- 3. OBJEDNÁVKY
-- Relace 1:N — jeden zákazník může mít mnoho objednávek
CREATE TABLE objednavky (
  id            INT      PRIMARY KEY AUTO_INCREMENT,
  zakaznik_id   INT      NOT NULL,
  datum         DATETIME DEFAULT NOW(),
  stav          VARCHAR(30) DEFAULT 'nova',  -- nova / odeslana / dorucena

  FOREIGN KEY (zakaznik_id) REFERENCES zakaznici(id)
    ON DELETE RESTRICT  -- zákazníka s objednávkami nejde smazat
);

-- 4. POLOŽKY OBJEDNÁVKY (vazební tabulka N:M — objednávky ↔ produkty)
-- Jedna objednávka má více produktů, jeden produkt se vyskytuje ve více objednávkách
CREATE TABLE polozky_objednavky (
  objednavka_id  INT            NOT NULL,
  produkt_id     INT            NOT NULL,
  mnozstvi       INT            NOT NULL DEFAULT 1,
  cena_ks        DECIMAL(10,2) NOT NULL,  -- cena v době nákupu (může se lišit od aktuální)

  PRIMARY KEY (objednavka_id, produkt_id),  -- složený PK
  FOREIGN KEY (objednavka_id) REFERENCES objednavky(id) ON DELETE CASCADE,
  FOREIGN KEY (produkt_id)    REFERENCES produkty(id)   ON DELETE RESTRICT
);

-- ============================================================
-- TESTOVACÍ DATA
-- ============================================================

INSERT INTO zakaznici (jmeno, email, telefon) VALUES
  ('Jan Novák',    'jan@email.cz',   '777111222'),
  ('Eva Dvořák',   'eva@email.cz',   '777333444'),
  ('Petr Svoboda', 'petr@email.cz',  '777555666');

INSERT INTO produkty (nazev, cena, sklad) VALUES
  ('Filament PLA 1kg',  499.00, 150),
  ('Filament PETG 1kg', 599.00, 80),
  ('Tryska 0.4mm',      89.00,  300),
  ('Tisková podložka',  349.00, 40);

INSERT INTO objednavky (zakaznik_id, stav) VALUES
  (1, 'dorucena'),  -- objednávka č. 1, Jan Novák
  (2, 'odeslana'),  -- objednávka č. 2, Eva Dvořák
  (1, 'nova');      -- objednávka č. 3, Jan Novák (druhá)

INSERT INTO polozky_objednavky (objednavka_id, produkt_id, mnozstvi, cena_ks) VALUES
  (1, 1, 2, 499.00),  -- obj.1: 2× PLA
  (1, 3, 1, 89.00),   -- obj.1: 1× tryska
  (2, 2, 1, 599.00),  -- obj.2: 1× PETG
  (2, 4, 2, 349.00),  -- obj.2: 2× podložka
  (3, 1, 1, 499.00);  -- obj.3: 1× PLA
Najdi objednávku č. 2 — jméno zákazníka, celková cena, počet produktů
SELECT
  z.jmeno                              AS zakaznik,
  o.id                                 AS objednavka_id,
  o.stav,
  SUM(p.mnozstvi * p.cena_ks)          AS celkova_cena,   -- součet (množství × cena/ks) přes všechny řádky
  SUM(p.mnozstvi)                      AS pocet_kusu,     -- celkový počet kusů
  COUNT(p.produkt_id)                  AS pocet_polozek   -- kolik různých produktů

FROM objednavky o
JOIN zakaznici z           ON z.id = o.zakaznik_id       -- spoj s tabulkou zákazníků
JOIN polozky_objednavky p  ON p.objednavka_id = o.id     -- spoj s položkami

WHERE o.id = 2             -- jen objednávka č. 2

GROUP BY o.id, z.jmeno, o.stav;  -- GROUP BY potřebujeme kvůli SUM() a COUNT()

-- Výsledek:
-- zakaznik  | objednavka_id | stav     | celkova_cena | pocet_kusu | pocet_polozek
-- Eva Dvořák|      2        | odeslana |   1297.00    |     3      |      2
Všechny objednávky zákazníka — seřazené od nejnovější
SELECT
  o.id          AS objednavka_id,
  o.datum,
  o.stav,
  SUM(p.mnozstvi * p.cena_ks) AS celkova_cena

FROM objednavky o
JOIN zakaznici z           ON z.id = o.zakaznik_id
JOIN polozky_objednavky p  ON p.objednavka_id = o.id

WHERE z.jmeno = 'Jan Novák'   -- nebo: WHERE o.zakaznik_id = 1

GROUP BY o.id, o.datum, o.stav
ORDER BY o.datum DESC;       -- nejnovější objednávka první

-- Výsledek:
-- objednavka_id | datum               | stav     | celkova_cena
--       3       | 2024-01-15 10:30:00 | nova     |   499.00
--       1       | 2024-01-10 09:00:00 | dorucena |  1087.00
Nejprodávanější produkty — seřazené podle celkového prodaného množství
SELECT
  pr.nazev,
  pr.cena                              AS cena_kc,
  SUM(p.mnozstvi)                      AS prodano_kusu,
  SUM(p.mnozstvi * p.cena_ks)          AS trzby_celkem

FROM produkty pr
JOIN polozky_objednavky p  ON p.produkt_id = pr.id

GROUP BY pr.id, pr.nazev, pr.cena
ORDER BY prodano_kusu DESC;   -- nejprodávanější nahoře

-- Výsledek:
-- nazev              | cena_kc | prodano_kusu | trzby_celkem
-- Tisková podložka   | 349.00  |      4       |  1396.00
-- Filament PLA 1kg   | 499.00  |      3       |  1497.00
-- Filament PETG 1kg  | 599.00  |      1       |   599.00
-- Tryska 0.4mm       |  89.00  |      1       |    89.00
C#

C# — Konzolové aplikace

Kalkulačka  ·  Poznámkový blok (zápisník)
Kalkulačka — sčítání, odčítání, násobení, dělení. Smyčka dokud uživatel nezadá "exit".
using System;

namespace Calculator
{
    class Program
    {
        static void Main(string[] args)
        {
            // Proměnné deklarujeme před smyčkou — budou platit v celém do-while bloku
            double cislo1, cislo2, vysledek;
            string operace, konec;

            // do-while se provede aspoň jednou, pak opakuje dokud konec != "exit"
            do
            {
                Console.Clear();  // smaže konzoli před každým výpočtem

                Console.WriteLine("Vložte první číslo:");
                string scislo1 = Console.ReadLine();
                Console.WriteLine("Vložte druhé číslo:");
                string scislo2 = Console.ReadLine();
                Console.WriteLine("Zvolte operaci + - * /");
                operace = Console.ReadLine();

                // TryParse = pokusí se převést string na double
                // Vrátí true/false a výsledek uloží do cislo1/cislo2 (out)
                // Bezpečnější než Parse(), které při chybě vyhodí výjimku
                bool prevod1 = double.TryParse(scislo1, out cislo1);
                bool prevod2 = double.TryParse(scislo2, out cislo2);

                if (operace == "+" && prevod1 && prevod2)
                {
                    vysledek = cislo1 + cislo2;
                    Console.WriteLine(vysledek + "\nPro exit napište: exit, jinak enter");
                }
                else if (operace == "-" && prevod1 && prevod2)
                {
                    vysledek = cislo1 - cislo2;
                    Console.WriteLine(vysledek + "\nPro exit napište: exit, jinak enter");
                }
                else if (operace == "*" && prevod1 && prevod2)
                {
                    vysledek = cislo1 * cislo2;
                    Console.WriteLine(vysledek + "\nPro exit napište: exit, jinak enter");
                }
                else if (operace == "/" && prevod1 && prevod2)
                {
                    if (cislo2 == 0)
                    {
                        // Speciální případ — dělení nulou není definováno
                        Console.WriteLine("Nelze dělit nulou\nPro exit napište: exit, jinak enter");
                    }
                    else
                    {
                        vysledek = cislo1 / cislo2;
                        Console.WriteLine(vysledek + "\nPro exit napište: exit, jinak enter");
                    }
                }
                else
                {
                    // Špatný vstup — TryParse selhal nebo neznámá operace
                    Console.WriteLine("Zkontrolujte zadané znaky, pro exit zadejte exit");
                }

                konec = Console.ReadLine();

            } while (konec != "exit");
        }
    }
}
Zápisník — čtení, zápis, přepis a mazání textového souboru. Nekonečná smyčka.
using System;
using System.IO;        // File, FileStream, StreamReader
using System.Text;      // UTF8Encoding
using System.Threading; // Thread.Sleep

namespace textak
{
    class Program
    {
        static void Main(string[] args)
        {
            // Cesta k souboru — uprav podle potřeby
            string file = @"C:\Users\filip.zika\Downloads\test.txt";
            // @ před stringem = verbatim string — zpětná lomítka nemusíš escapovat (\\ → \)

            do  // while (0 == 0) = nekonečná smyčka
            {
                Console.Clear();
                bool existuje = File.Exists(file); // zkontroluj jestli soubor existuje

                if (existuje == true)
                {
                    Console.WriteLine("Pro přepis napište P, pro výpis V, pro vymazání D");
                    string answ = Console.ReadLine();

                    // switch = přehlednější alternativa k if-else if pro více možností
                    switch (answ)
                    {
                        case "d":
                            File.Delete(file); // smaže soubor z disku
                            break;

                        case "v":
                            // ReadAllText = přečte celý soubor najednou jako jeden string
                            Console.WriteLine(File.ReadAllText(file));
                            break;

                        case "p":
                            // File.Create vytvoří nový soubor (nebo přepíše existující)
                            // Vrátí FileStream — proud bajtů pro zápis
                            FileStream fs = File.Create(file);
                            Console.WriteLine("Vložte text:");
                            string text = Console.ReadLine();
                            // UTF8Encoding převede string na pole bajtů (Byte[])
                            Byte[] title = new UTF8Encoding(true).GetBytes(text);
                            fs.Write(title, 0, title.Length); // zapiš bajty do souboru
                            fs.Close(); // VŽDY zavři FileStream po použití
                            break;
                    }
                    Console.ReadLine(); // počkej na Enter před dalším cyklem
                }
                else  // soubor neexistuje
                {
                    Console.WriteLine("Chcete soubor vytvořit? Y/N");
                    string odpoved = Console.ReadLine();

                    if (odpoved == "n")
                    {
                        Console.WriteLine("Program se ukončí za 3 vteřiny.");
                        Thread.Sleep(3000); // pozastaví vlákno na 3000 ms
                        Environment.Exit(1);  // ukončí program (1 = chybový kód)
                    }
                    else if (odpoved == "y")
                    {
                        // Vytvoř soubor a zapiš text
                        FileStream fs = File.Create(file);
                        Console.WriteLine("Vložte text:");
                        string text = Console.ReadLine();
                        Byte[] title = new UTF8Encoding(true).GetBytes(text);
                        fs.Write(title, 0, title.Length);
                        fs.Close();

                        // StreamReader = čtení ze souboru řádek po řádku nebo celý najednou
                        StreamReader sr = new StreamReader(file);
                        string napsanyText = sr.ReadToEnd(); // přečti vše
                        Console.Write("Toto je vepsáno: " + napsanyText);
                        sr.Close(); // zavři i StreamReader
                    }
                    else
                    {
                        Console.WriteLine("Toto neznám, zkuste znovu");
                    }
                    Console.ReadLine();
                }

            } while (0 == 0); // 0 == 0 je vždy true → nekonečná smyčka
        }
    }
}
{%- endraw -%}