Úlohy na procivčování ke čtvrté hodině

Omlouvám se za špatně zvolený příklad na násobení čísel v řádku a sčítání výsledků v řádcích, ten nelze tak jak jsem vám popisoval rozumně vyřešit. Ke stažení je korektní verze, která dělá to co má, ale ta rozpoznává řádky tak, že si je nejprve celé načte a pak používá funkci sscanf(), která funguje úplně stejně jako scanf(), ale nenačítá z klávesnice, nýbrž čte řetězec uložený někde v paměti. Dále jsem použil funkce strspn() a strcspn(), které vrací počet prvních znaků v řetězci, které obsahují (respektive neobsahují) znak ze specifikovaných. Podívejte se kdyžtak do helpu.

Násobení matic

Uvažujeme vynásobení dvou čtvercových (tj. stejný počet řádků jako sloupců) matic. Tyto matice zadejte v programu "na tvrdo" - nenačítejte je ze vstupu. Dále udělejte program, který dvě matice vynásobí a výsledek vypíše. Výsledkem je opět čtvercová matice se stejnými rozměry jako původní dvě, které se násobí.

Matice se násobí následujícím způsobem: Řekněme, že násobíme matice A, B a C je výsledná matice. Potřebujeme určit hodnoty prvků ve výsledné matici. Postupně procházíme všechny prvky matice C a určujeme její hodnoty. Podíváme se, na jakém řádku a v jakém sloupci se nachází prvek, jehož hodnotu chceme určit. Vezmeme stejný řádek z matice A a stejný sloupec z matice B a tyto vynásobíme skalárně. Tj. první prvky vynásobíme spolu, druhé spolu, třetí spolu atd. a všechny tyto součiny posčítáme. Co nám vyjde je příslušný prvek matice C.

Tento postup evokuje i řešení. To budou tři for cykly zanořené v sobě. Pomocí prvních dvou si určíme pozici v matici C, kterou budeme počítat a pro každou takovou pozici provedeme skalární násobení, což bude zajišťovat nejvnitřnější cyklus.

#define SIZE 3

// zde budou deklarace matic (dvourozmernych poli) A, B, C

// zde bude naplneni matic A a B nejakymi hodnotami
// zde bude vynulovani matice C, protoze v programu rovnou do prvku matice pricitame

// i je radek, j je sloupec
for (int i = 0; i < SIZE; i++)
   for (int j = 0; j < SIZE; j++)
      for (int k = 0; k < SIZE; k++)
         c[i][j] = a[][] * b[][]; // doplnte co bude v zavorkach za a, b

Quick Sort

Quick Sort je algoritmus na třídění, který se často používá. My zde budeme třídit pole celých čísel, ale je možné třídit cokoliv, u čeho se dá rozhodnout, který prvek je větší a který menší. Např. řadit řetězce podle abecedy.

Quick Sort používá rekurzivní volání. To znamená, že napíšeme funkci, které specifikujeme začátek a konec prvků, odkud kam se má třídit a ona si prvky nějak přerozdělí a zavolá sama sebe na menší kousky.

Algoritmus i s příkladem (v Pascalu) je popsán hezky zde quicksort1.jpg, quicksort2.jpg. (Převzato z učebnice Algoritmy a programovací techniky, Pavel Töpfer.) Pozor, oba obrázky mají téměř 1MB, zobrazte si je v plné velikosti.