Maturita
{%- raw -%}
{%- endraw -%}
Arduino — Semafor
Tlačítko (pin 2): zapnout / vypnout · Potenciometr (A0): rychlost střídání
Schéma zapojení
schéma.svg — ilustrační schéma zapojení
Kód
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
Vytvoření databáze
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
Dotazy
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 } } }
Maturitní taháky · Arduino · SQL · C#