← IT

Strukturované programování

Doplněný obsah — není z archivu podkladů, napsáno podle ŠVP. Vhodné ověřit u vyučujícího.

Pozn. ke kódu: obecné principy jsou nejdřív popsané slovně, ke konkrétním konstrukcím jsou pak ukázky reálného, spustitelného kódu v Pythonu a v C# vedle sebe – ve škole se běžně používají oba jazyky, princip řídicích struktur je ale ve všech běžných jazycích stejný.

Datové typy

Proměnné a konstanty

Řídicí struktury

Větvení – if / else

Python:

vek = 20
ma_obcanku = True

if vek >= 18 and ma_obcanku:
    print("může volit")
else:
    print("nemůže volit")

C#:

int vek = 20;
bool maObcanku = true;

if (vek >= 18 && maObcanku)
{
    Console.WriteLine("může volit");
}
else
{
    Console.WriteLine("nemůže volit");
}

Větvení podle hodnoty – switch / case

Python (od verze 3.10 lze použít match, ve starším kódu se místo toho běžně používá řetězec if / elif):

den = 3

match den:
    case 1:
        print("pondělí")
    case 2:
        print("úterý")
    case 3:
        print("středa")
    case _:
        print("neznámý den")

C#:

int den = 3;

switch (den)
{
    case 1:
        Console.WriteLine("pondělí");
        break;
    case 2:
        Console.WriteLine("úterý");
        break;
    case 3:
        Console.WriteLine("středa");
        break;
    default:
        Console.WriteLine("neznámý den");
        break;
}

Cyklus s pevným počtem opakování – for

Python:

for i in range(10):   # i postupně nabývá hodnot 0 až 9
    print(i)

C#:

for (int i = 0; i < 10; i++)
{
    Console.WriteLine(i);
}

Cyklus s podmínkou na začátku – while

Python:

pocet = 0
while pocet < 5:
    print(pocet)
    pocet += 1

C#:

int pocet = 0;
while (pocet < 5)
{
    Console.WriteLine(pocet);
    pocet++;
}

Cyklus s podmínkou na konci – do-while

Python nemá vestavěný do-while, stejné chování (tělo se provede vždy alespoň jednou) se zapisuje pomocí while True a break na konci těla:

Python:

pocet = 0
while True:
    print(pocet)          # tělo se provede vždy alespoň jednou
    pocet += 1
    if not (pocet < 5):
        break

C#:

int pocet = 0;
do
{
    Console.WriteLine(pocet);
    pocet++;
} while (pocet < 5);

Práce s textovým řetězcem

Python:

text = "Ahoj, světe!"

print(len(text))                       # délka řetězce -> 12
pozdrav = text + " Jak se máš?"        # spojování (konkatenace)
cast = text[6:11]                      # podřetězec (substring) -> "světe"
print("světe" in text)                 # hledání podřetězce -> True
nahrazeno = text.replace("Ahoj", "Nazdar")
velka = text.upper()                   # "AHOJ, SVĚTE!"
mala = text.lower()                    # "ahoj, světe!"
casti = text.split(", ")               # rozdělení -> ["Ahoj", "světe!"]
spojeno = "-".join(casti)              # spojení zpět -> "Ahoj-světe!"
cislo = int("42")                      # převod řetězce na číslo
retezec = str(42)                      # převod čísla na řetězec

C#:

string text = "Ahoj, světe!";

Console.WriteLine(text.Length);                 // délka řetězce -> 12
string pozdrav = text + " Jak se máš?";         // spojování (konkatenace)
string cast = text.Substring(6, 5);             // podřetězec -> "světe"
Console.WriteLine(text.Contains("světe"));      // hledání podřetězce -> True
string nahrazeno = text.Replace("Ahoj", "Nazdar");
string velka = text.ToUpper();                  // "AHOJ, SVĚTE!"
string mala = text.ToLower();                   // "ahoj, světe!"
string[] casti = text.Split(", ");              // rozdělení -> ["Ahoj", "světe!"]
string spojeno = string.Join("-", casti);       // spojení zpět -> "Ahoj-světe!"
int cislo = int.Parse("42");                    // převod řetězce na číslo
string retezec = cislo.ToString();              // převod čísla na řetězec

Pole

Python (v Pythonu se místo pole typicky používá list, který má navíc dynamickou velikost):

znamky = [1, 2, 1, 3, 5]

print(znamky[0])            # přístup přes index -> 1
soucet = sum(znamky)
prumer = soucet / len(znamky)

for znamka in znamky:       # průchod polem (iterace)
    print(znamka)

# vícerozměrné pole (matice) 2x3 – seznam seznamů
matice = [[1, 2, 3], [4, 5, 6]]
print(matice[1][2])         # řádek 1, sloupec 2 -> 6

C#:

int[] znamky = { 1, 2, 1, 3, 5 };

Console.WriteLine(znamky[0]);          // přístup přes index -> 1
int soucet = znamky.Sum();             // vyžaduje "using System.Linq;"
double prumer = (double)soucet / znamky.Length;

foreach (int znamka in znamky)         // průchod polem (iterace)
{
    Console.WriteLine(znamka);
}

// vícerozměrné pole (matice) 2x3
int[,] matice = { { 1, 2, 3 }, { 4, 5, 6 } };
Console.WriteLine(matice[1, 2]);       // řádek 1, sloupec 2 -> 6

Typické algoritmy

Ukázka postupně řeší na stejném poli všechny čtyři algoritmy z předchozích odrážek (součet/průměr, maximum, lineární vyhledávání, bublinkové řazení):

Python:

cisla = [5, 3, 8, 1, 9, 2]

# součet a průměr prvků pole
soucet = 0
for cislo in cisla:
    soucet += cislo
prumer = soucet / len(cisla)

# hledání maxima
maximum = cisla[0]
for cislo in cisla:
    if cislo > maximum:
        maximum = cislo

# lineární vyhledávání hodnoty 8
hledana_hodnota = 8
nalezeno_na_indexu = -1
for i in range(len(cisla)):
    if cisla[i] == hledana_hodnota:
        nalezeno_na_indexu = i
        break

# bublinkové řazení (bubble sort) vzestupně
for i in range(len(cisla) - 1):
    for j in range(len(cisla) - 1 - i):
        if cisla[j] > cisla[j + 1]:
            cisla[j], cisla[j + 1] = cisla[j + 1], cisla[j]

print(cisla)   # [1, 2, 3, 5, 8, 9]

C#:

int[] cisla = { 5, 3, 8, 1, 9, 2 };

// součet a průměr prvků pole
int soucet = 0;
foreach (int cislo in cisla)
{
    soucet += cislo;
}
double prumer = (double)soucet / cisla.Length;

// hledání maxima
int maximum = cisla[0];
foreach (int cislo in cisla)
{
    if (cislo > maximum)
    {
        maximum = cislo;
    }
}

// lineární vyhledávání hodnoty 8
int hledanaHodnota = 8;
int nalezenoNaIndexu = -1;
for (int i = 0; i < cisla.Length; i++)
{
    if (cisla[i] == hledanaHodnota)
    {
        nalezenoNaIndexu = i;
        break;
    }
}

// bublinkové řazení (bubble sort) vzestupně
for (int i = 0; i < cisla.Length - 1; i++)
{
    for (int j = 0; j < cisla.Length - 1 - i; j++)
    {
        if (cisla[j] > cisla[j + 1])
        {
            int docasna = cisla[j];
            cisla[j] = cisla[j + 1];
            cisla[j + 1] = docasna;
        }
    }
}

Zobecnění, testování a ladění

Hodnocení a porovnávání algoritmů, časová a paměťová složitost