Příklady ke zkoušce
Completion requirements
Pozn. Kurzívou jsou označena místa, která je třeba doprogramovat. Pokud není řečeno jinak, všechny matice jsou čtvercové. Pole jsou obvykle do podprogramů předávána hodnotou, pokud jsou předávána odkazem, pak je to výslovně uvedeno.
4. Matice
4.5. Operace s prvky - těžší příklady
- Násobení matic:
static void NasobMatice(int n, int[,] iPole, int[,] iPole1, int[,] iPole2) { Pro všechny indexy řádků výsledné matice iPole Pro všechny indexy sloupců výsledné matice iPole // Hodnota prvku výsledku je skalárním součinem řádku první matice a sloupce druhé matice Deklarovat a nulovat soucet Pro všechny indexy od 0 do rozměru matice - 1 Do soucet přičíst postupně součin hodnoty prvku na řádku první matice a hodnoty sloupce druhé matice, hodnoty indexu řádku první matice odpovídá řádku výsledku a hodnota sloupce druhé matice je rovna sloupci výsledku Zapsat soucet do prvku výsledku }
- Překlopení podle hlavní diagonály:
static void HlTransMat(int n, ref int[,] a) { Deklarace a vymezení pomocného dvourozměrného pole Pro všechny indexy řádků matice a Pro všechny indexy sloupců matice a Překopírovat prvek matice do pomocné matice tak, že se při kopírování zamění řádky a sloupce, např. pomPole[j, i] = a[i, j] Parametr pro předání pole odkazem změnit na pomocné pole, původní pole automaticky zmizí }
Překlopení podle vedlejší diagonály:
static void VedTransMat(int n, ref int[,] a) { Deklarace a vymezení pomocného dvourozměrného pole pomPole
Pro všechny indexy řádků matice a Pro všechny indexy sloupců matice a Překopírovat prvek matice do pomocné matice tak, že se při kopírování šikovně zamění řádky a sloupce, např. pomPole[n - j - 1, n - i - 1] = a[i, j] Parametr pro předání pole odkazem změnit na pomocné pole, původní pole automaticky zmizí }
- Otočit matici vlevo:
static void OtocVlevoMat(int n, ref int[,] a) {
Deklarace a vymezení pomocného dvourozměrného pole pomPole Pro všechny indexy řádků matice a Pro všechny indexy sloupců matice a Překopírovat prvek matice do pomocné matice tak, že se při kopírování šikovně zamění řádky a sloupce, např. pomPole[n - j - 1, i] = a[i, j] Parametr pro předání pole odkazem změnit na pomocné pole, původní pole automaticky zmizí }
- Otočit matici vpravo:
static void OtocVpravoMat(int n, ref int[,] a) {
Deklarace a vymezení pomocného dvourozměrného pole pomPole Pro všechny indexy řádků matice a Pro všechny indexy sloupců matice a Překopírovat prvek matice do pomocné matice tak, že se při kopírování šikovně zamění řádky a sloupce např. pomPole[j, n - i - 1] = a[i, j] Parametr pro předání pole odkazem změnit na pomocné pole, původní pole automaticky zmizí }
- Překlopit matici podle svislé osy:
//Překlopit matici podle svislé osy static void PreklopenaSvisle(int n, ref int[,] a) {
Deklarace a vymezení pomocného dvourozměrného pole pomPole Pro všechny indexy řádků matice a Pro všechny indexy sloupců matice a Zrcadlově se kopírují řádky, např. PomPole[i, n - j - 1] = a[i, j] Parametr pro předání pole odkazem změnit na pomocné pole, původní pole automaticky zmizí }
- Překlopit matici podle vodorovné osy:
static void PreklopenaVodorovne(int n, ref int[,] a) {
Deklarace a vymezení pomocného dvourozměrného pole pomPole Pro všechny indexy řádků matice a Pro všechny indexy sloupců matice a Zrcadlově se kopírují sloupce, např. PomPole[n - i - 1, j] = a[i, j] Parametr pro předání pole odkazem změnit na pomocné pole, původní pole automaticky zmizí }
- Vytvořit matici z jiné jako součet liché a sudé řádky:
static void SoucetLichaSuda(int n, int[,] a, int[,] b) { Pro všechny liché indexy řádků matice a Pro všechny indexy sloupců matice a Do matice b se pro řádku s polovičním indexem matice se sečtou hodnoty prvku na řádce a s hodnotou prvku na následující řádce, např. b[i / 2, j] = a[i, j] + a[i + 1, j] }
- Vytvořit matici z jiné vynecháním sudých řádek:
static void VynechSude(int n, int[,] a, int[,] b) { Pro všechny liché indexy řádků matice a Pro všechny indexy sloupců matice a Do matice b se pro řádku s polovičním indexem matice se nakopírují hodnoty na řádce a např. b[i / 2, j] = a[i, j]) }
- Spočítat kolik hodnot v matici je v zadaných mezích:
static int VMezich(int n, int[,] a, int d, int h) { Deklarovat a nulovat pocet Pro všechny indexy řádků matice a Pro všechny indexy sloupců matice a Je-li prvek matice mezi d a h včetně mezí, inkrementovat pocet Navrátit pocet }
- Spočítat, kolik hodnot v matici je bezezbytku dělitelných zadanou hodnotou:
static int BezeZbytkuDelitelne(int n, int[,] a, int h) { Deklarovat a nulovat kolik Pro všechny indexy řádků matice a Pro všechny indexy sloupců matice a Je-li prvek matice dělitelný h, navýšit kolik Navrátit kolik }
- Výpočet vektoru řádkových součtů:
static void RadkoveSoucty(int n, int[,] a, int[] v) { Pro všechny indexy řádků matice a Nulovat prvek výstupního vektoru v s daným indexem Pro všechny indexy sloupců matice a Navýšit hodnotu prvku vektoru o hodnotu prvku matice }
- Rozhodnout zda součet řádkových maxim je větší než zadaná hodnota:
static bool RozhodniSoucetMaximRadek(int n, int[,] a, int prah) { Deklarovat a nulovat suma Deklarovat pomocný vektor v Pro všechny indexy řádků matice a Nulovat prvek vektoru a indexem řádky matice Pro všechny indexy sloupců matice a Je-li hodnota prvku matice větší než hodnota prvku vektoru s indexem řádky matice, naplnit prvek vektoru hodnotou prvku matice Navýšit suma o hodnotu prvku vektoru Navrátit true, pokud je suma větší než prah, jinak false }
- Spočítat, počet prvočísel nad hl. diagonálou a počet prvočísel nad vedlejší diagonálou:
static void PrvoNadDiag(int n, int[,] a, out int prvonadhl, out int prvonadvedl) { Nulovat prvonadhl a prvonadvedl Pro všechny prvky matice Je-li prvek matice nad hlavní diagonálou a je prvočíslem Navýšit prvonadhl Je-li prvek matice nad vedlejší diagonálou a je prvočíslem Navýšit prvonadvedl }