Pouze tento týden sleva až 80 % na e-learning týkající se C# .NET. Zároveň využij akci až 30 % zdarma při nákupu e-learningu - Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
discount 30 + hiring

Naučte sa myslieť ako programátor

Vitajte v mojom ďalšom článku, tu si budeme trénovať programátorské myslenia. Budeme sa učiť zostavovať algoritmy pre nejaké (na oko banálne) úlohy. Bohužiaľ programovací jazyk nie je tak dokonalý ako ľudský mozog a tak sa to programu musí celé vysvetliť ako úplnému hlupákovi, aby vôbec vedel, čo má robiť :) Tieto úlohy som našiel na disku ešte zo školy :) Takže to nie je môj výtvor avšak všetky tieto úlohy mám napísané v jazyku C #.

Ak sa naozaj chcete niečomu naučiť, tak nepodvádzajte a skúste si každú úlohu urobiť poctivo a sami. Výsledky potom môžete vkladať vo forme zdrojovej kódu alebo obrázka do komentárov. Nezabudnite uviesť číslo úlohy, ktorú ste vyriešili :)

Tu máte úvod do teórie algoritmov

  1. Program dostane na vstup postupnosť 30 celých čísel. Zostavte vývojový diagram k algoritmu, podľa ktorého program nájde a vypíše druhé najmenšie zo zadaných čísel. Vyplňte tabuľku obsahu premenných pre vstup začínajúcich číslami 8, -2, 1, -5, ...
  2. Program dostane na vstup postupnosť celých kladných čísel; zadávanie je ukončené nulou. Zostavte vývojový diagram k algoritmu, podľa ktorého program nájde a vypíše druhé najväčšie zo zadaných čísel. Vyplňte tabuľku obsahu premenných pre vstup začínajúcich číslami 8, 3, 5, 15, ...
  3. Program dostane na vstup 2 kladné celé čísla. Zostavte vývojový diagram k algoritmu, podľa ktorého program nájde a vypíše najväčší spoločný deliteľ zadaných čísel. Vyplňte tabuľku obsahu premenných pre čísla 12 a 18.
  4. Program dostane na vstup 2 kladné celé čísla. Zostavte vývojový diagram k algoritmu, podľa ktorého program nájde a vypíše najmenší spoločný násobok zadaných čísel. Vyplňte tabuľku obsahu premenných pre čísla 12 a 8.
  5. Zostavte vývojový diagram k algoritmu, podľa ktorého program rozhodne, či zadané číslo je alebo nie je prvočíslo. Vyplňte tabuľku obsahu premenných pre číslo 15.
  6. Program dostane na vstup postupnosť 30 celých čísel. Zostavte vývojový diagram k algoritmu, podľa ktorého program rozhodne a vypíše, či zadaná postupnosť je alebo nie je rastúca. Vyplňte tabuľku obsahu premenných pre vstup začínajúcich číslami 2, 3, 1, 5, ...
  7. Program dostane na vstup postupnosť celých čísel; zadávanie je zakončené nulou. Zostavte vývojový diagram k algoritmu, podľa ktorého program rozhodne a vypíše, či zadaná postupnosť je alebo nie je klesajúci. Vyplňte tabuľku obsahu premenných pre vstup začínajúcich číslami 18, 13, 15, 9, ...
  8. Program dostane na vstup postupnosť 40 celých čísel. Zostavte vývojový diagram k algoritmu, podľa ktorého program spočíta a vypíše, koľko bolo medzi zadanými číslami kladných, záporných a nulových hodnôt. Vyplňte tabuľku obsahu premenných pre vstup začínajúcich číslami 0, 13, -15, -9, ...
  9. Program dostane na vstup postupnosť celých čísel; zadávanie je zakončené nulou. Zostavte vývojový diagram k algoritmu, podľa ktorého program nájde a vypíše najväčšie číslo, najmenšie číslo a aritmetický priemer zo zadaných čísel. Vyplňte tabuľku obsahu premenných pre vstup začínajúcich číslami 10, 13, -15, -9, ...
  10. Program dostane na vstup číslo X a potom postupnosť 50 čísel. Zostavte vývojový diagram k algoritmu, podľa ktorého program nájde a vypíše to číslo z postupnosti, ktoré je hodnotou najbližšie zadanému číslu X. Vyplňte tabuľku obsahu premenných pre vstup začínajúcich číslami 20, 33, 2, 15, ...
  11. Zostavte vývojový diagram k algoritmu, podľa ktorého program spočíta hodnotu N! (N faktoriál) pre zadané prirodzené číslo N. Vyplňte tabuľku obsahu premenných pre zadané číslo 4.Pozn. N! = N. (N-1). (N-2). ... .3.2.1 (napr. 5! = 5.4.3.2.1 = 120)
  12. Zostavte vývojový diagram k algoritmu, podľa ktorého program vyrieši kvadratickú rovnicu ax2 + Bx + C = 0. Program dostane na vstup koeficienty A, B a C. Pokiaľ je zadávaný koeficient A rovný nule, program vypíše upozornenie a nechá si zadávať inú hodnotu tak dlho, dokiaľ nebude rôzna od nuly. Vyplňte tabuľku obsahu premenných pre zadané čísla 0, 0, 1, 2, 1.
  13. Program dostane na vstup 2 celé čísla A a B a jedno prirodzené číslo X. Zostavte vývojový diagram k algoritmu, podľa ktorého program vypíše z intervalu <A; B> všetky čísla deliteľná číslom X. Vyplňte tabuľku obsahu premenných pre zadané čísla 3, 20, 5.
  14. Zostavte vývojový diagram k algoritmu, podľa ktorého program rozhodne, či zadané prirodzené číslo je alebo nie je tzv. Dokonalým číslom. Vyplňte tabuľku obsahu premenných pre zadané číslo 12. Pozn. Dokonalé číslo je také číslo, ktoré je rovné súčtu všetkých svojich deliteľov okrem seba samého. Napríklad 28 je dokonalé číslo, pretože 28 = 1 + 2 + 4 + 7 + 14.
  15. Zostavte vývojový diagram k algoritmu, podľa ktorého program rozhodne, či zadané prirodzené čísla sú alebo nie sú tzv. Priateľské čísla. Vyplňte tabuľku obsahu premenných pre zadané čísla 12 a 16. Pozn. Spriatelenými číslami sa nazývajú dve rôzne prirodzené čísla a, b takých vlastností, že sa súčet všetkých vlastných deliteľov čísla a rovná číslu ba naopak. Príkladom spriatelených čísel je dvojica čísel 220 a 284.
  16. Zostavte vývojový diagram k algoritmu, podľa ktorého program prevedie zadané číslo z desiatkovej sústavy do dvojkovej. Vyplňte tabuľku obsahu premenných pre zadané číslo 9.
  17. Je daný počet dní v mesiaci (tj. Číslo z rozmedzia 28 až 31) a informácie, na ktorý deň v týždni pripadá prvý deň v mesiaci (v tvare poradového čísla: pondelok = 1, utorok = 2, ..., nedeľa = 7). Zostavte vývojový diagram k algoritmu, ktorý zistí a vypíše koľko je v danom mesiaci piatkov. Vyplňte tabuľku obsahu premenných pre vstup: 30, 6.
  18. Je daný počet dní v mesiaci (tj. Číslo z rozmedzia 28 až 31) a informácie, na ktorý deň v týždni pripadá prvý deň v mesiaci (v tvare poradového čísla: pondelok = 1, utorok = 2, ..., nedeľa = 7). Zostavte vývojový diagram k algoritmu, ktorý zistí a vypíše koľko je v danom mesiaci pracovných dní. Vyplňte tabuľku obsahu premenných pre vstup: 29, 3.
  19. Zostavte vývojový diagram k algoritmu, podľa ktorého program prevedie zadané číslo z dvojkovej sústavy do desiatkovej. Vyplňte tabuľku obsahu premenných pre zadané číslo 11010.
  20. Zostavte vývojový diagram k algoritmu, ktorý spočíta a vypíše ciferný súčet daného prirodzeného čísla. Vyplňte tabuľku obsahu premenných pre zadané číslo 3059.
  21. Hodnotu Ludolfovho čísla pí možno aproximovať nekonečnou radom pí = 4. (1 - 1/3 + 1/5 - 1/7 + 1/9 - ...) Zostavte vývojový diagram k algoritmu, ktorý vypočíta pomocou tejto rady hodnotu pí s ľubovoľnou presnosťou (zadá užívateľ). Vyplňte tabuľku obsahu premenných pre zadanú presnosť 0,1.

V ďalšom diele spojíme ľahké algoritmy s funkciami. Budeme teda vymýšľať ľahké programy a ich hlavné časti vkladať do funkcií (metód)


 

Všetky články v sekcii
Česká encyklopédia algoritmov
Preskočiť článok
(neodporúčame)
Online test znalostí algoritmizácia
Článok pre vás napísal Mediel
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování v C#, ThaiBoxu, ženám a posilování :) „Jestliže si vsugerujete neúspěch, pak vás čeká neúspěch. Někdo říká, že je nesmělý, hloupý. Zopakujte si to desetkrát za sebou a vaše nesmělost a hloupost se tím jen prohloubí.“ MUHAMMAD
Aktivity

 

 

Komentáre

Avatar
Ondřej Štorc
Tvůrce
Avatar
Ondřej Štorc:1.9.2015 13:19

Btw. ty && jsou v zbytečný, jak něco může být menší, nebo větší než nula a zároveň stejný jako nula?

Odpovedať
1.9.2015 13:19
Život je příliš krátký na to, abychom bezpečně odebírali USB z počítače..
Avatar
Radim Horáček:8.9.2015 12:18

Omlouvám se, ale nechápu tu větu "Vyplňte tabulku obsahu proměnných pro vstup začínající čísly 8, -2, 1, -5, ...". Nemůžu v té posloupnosti najít žádný vzor pro doplnění dalších čísel... Nebo tam žádný není a mám doplnit co chci?

 
Odpovedať
8.9.2015 12:18
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovedá na Radim Horáček
Jan Vargovský:8.9.2015 12:23

Každá posloupnost má vzor. Každopádně si dej jako vstup co chceš.

 
Odpovedať
8.9.2015 12:23
Avatar
Josef Fischer:25.11.2016 3:26

Cha! Mam to! :-) Zatím jen úlohu č. 1.
Jedná se o vlastně můj první kód v JavaScriptu, tak kdybyste mě pochválili anebo konstruktivně usměrnili, bylo by super :-)

Co jsem nepochopil je proč mi to nefungovalo když jsem měl M3 = M2 a M2 = M1, ale když mam Vysledek = M3, tak to jde..

/*Použité proměnné:*/
var M1 = {poloha:-1,hodnota:Infi­nity};
var M2 = {poloha:-1,hodnota:Infi­nity};
var M3 = {poloha:-1,hodnota:Infi­nity};
var Vysledek = {poloha:-1,hodnota:Infi­nity};

for (i=0 ; i < cnt ; i++)
{
if(RadaCisel[i] < M1.hodnota)
{
M3.poloha = M2.poloha; M3.hodnota = M2.hodnota; /*M3 = M2;*/

M2.poloha = M1.poloha; M2.hodnota = M1.hodnota; /*M2 = M1;*/

M1.poloha = i; M1.hodnota = RadaCisel[i];
}
}

if (M1 == M2) {Vysledek = M3;}
else {Vysledek = M2;}

 
Odpovedať
25.11.2016 3:26
Avatar
Marek Pochyba:12.1.2017 21:24

úloha č.2:
int[] pole = { 8, 3, 5, 15, 41, 7, 19, 3, 9, 0 };
int max = pole.Length - 1;
int d = 0;
int r = 0;
for (int i = 0;i <= pole.Length - 1;i++)
{
if (pole[i] > max)
max = pole[i];
pole[i] = max;
if (pole[1] < max)
r = max - pole[1];
for (int j = i+2;j <= pole.Length - 1;j++)
{
if ((pole[j] < max) && (max - pole[j] < r))
d = pole[j];
}
}
Console.Write­Line(d);

 
Odpovedať
12.1.2017 21:24
Avatar
Odpovedá na Marek Pochyba
Jiří Charousek:6.3.2017 9:21

čau Marku, myslím že to takhle nefunguje, např když změníš 9 na 49 tak to dává pořád oněch 19 a i v jinejch případech to nefunguje, já jsem to taky zkoušel, mám to takto :

int[] array = {8, 3, 5, 15, 41, 88, 7, 19, 31, 49, 0};
int max1 = 0;
int max2 = 0;
for (int i = 0; i <= (array.length - 1); i++) {

if (array[i] > max2) {
max2 = array[i];
};
if (max2 > max1) {
int temp = max1;
max1 = max2;
max2 = temp;
};

}
for (int k = 0; k < array.length; k++) {
System.out.prin­t(array[k] + " ");
}
System.out.prin­tln(" ");
System.out.prin­t("2.max: " + max2);
System.out.prin­tln(" ");
// výpis obsahu proměnných pro vstup začínající čísly 8, 3, 5, 15, ...
char[] prvniZnak = new char[array.length];
char[] druhyZnak = new char[array.length];
for (int k = 0; k < array.length; k++) {
String str = String.valueOf(a­rray[k]);
prvniZnak[k] = str.charAt(0);
if (str.length() > 1) {
druhyZnak[k] = str.charAt(1);
} else {
druhyZnak[k] = '*';
}
}
for (int k = 0; k < array.length; k++) {
if (prvniZnak[k] == '8') {
System.out.prin­t(array[k] + " cislo zacinajici na " + prvniZnak[k] + " index " + k);
System.out.prin­tln("");
}
if (prvniZnak[k] == '3') {
System.out.prin­t(array[k] + " cislo zacinajici na " + prvniZnak[k] + " index " + k);
System.out.prin­tln("");
}
if (prvniZnak[k] == '5') {
System.out.prin­t(array[k] + " cislo zacinajici na " + prvniZnak[k] + " index " + k);
System.out.prin­tln("");
}
if (prvniZnak[k] == '1' && druhyZnak[k] == '5') {
System.out.prin­t(array[k] + " cislo zacinajici na " + prvniZnak[k] + druhyZnak[k] + " index " + k);
System.out.prin­tln("");
}
}
}

run:
8 3 5 15 41 88 7 19 31 49 0
2.max: 49
8 cislo zacinajici na 8 index 0
3 cislo zacinajici na 3 index 1
5 cislo zacinajici na 5 index 2
15 cislo zacinajici na 15 index 3
88 cislo zacinajici na 8 index 5
31 cislo zacinajici na 3 index 8

...nedá se udělat nějak jinak ten výpis "obsahu proměnných pro vstup začínající čísly 8, 3, 5, 15, ..." ?
za radu případně díky J. ( jsem na začátku cesty :-) )

 
Odpovedať
6.3.2017 9:21
Avatar
Martin InothingtoLose Sedlacek:18.12.2017 8:01

Moje riešenie 1. úlohy v Javascripte

const arr = [8,-2,1,-5,0,17,55,9,-21,6,3,-3,70,-4];

//najde minimum v poli
function najdiMin(pole) {
        let min=pole[0];
        for(let i=0;i<pole.length;i++) {
                if(pole[i] < min) {
                        min = pole[i];
                }
        }
        return min;
}

//zobere pole a vrati zotriedene
function zotriedPole(pole) {
        const dlzka = pole.length;
        let z = [];
        for(let i = 0; i < dlzka; i++) {
                z.push(najdiMin(pole));
                pole.splice(pole.indexOf(najdiMin(pole)),1);
        }
        return z;
}

function main() {
        const zotriedene = zotriedPole(arr);
        console.log(zotriedene[1]);
}

main();
 
Odpovedať
18.12.2017 8:01
Avatar
Odpovedá na Jiří Charousek
Marek Pochyba:18.5.2018 1:19

ja viem je to sprostosť, predtým ako som to tu pridal som si to riadne nevyskúšal

 
Odpovedať
18.5.2018 1:19
Avatar
Erik Hawlasek:30.9.2018 19:34

Moje řešení úlohy 5 pro zjištění, zda se jedná o prvočíslo

/* 5 */
            int cislo,counter=0,help=2;
            cislo = int.Parse(Console.ReadLine());
            while(counter!=1 && help != cislo - 1)
            {
                if(counter!=1 && help<cislo)
                {
                    if (cislo % help == 0)
                    {
                        counter++;
                    }
                    else
                        help++;
                }
            }
            if (counter == 0)
            {
                Console.WriteLine("Je to prvočíslo");
            }
            else
                Console.WriteLine("Není to prvočíslo");

            Console.ReadKey();
Odpovedať
30.9.2018 19:34
Za zeptání nic nedáš.
Avatar
Daniel Tocháček:8.5.2020 17:15

první v Javě:

        public static void main(String[] args) {
                int pole [] = new int [30];
                int min = Integer.MAX_VALUE;
                int min2 = Integer.MAX_VALUE;
                for (int i = 0; i < pole.length; i++) {
                        if (min > pole[i]) {
                                min = pole [i];
                        }
                }
                for (int i = 0; i < pole.length; i++) {
                        if ((min2 > pole[i]) && (min != pole[i])) {
                                min2 = pole [i];
                        }
                }
                System.out.println(min2);
        }
}
 
Odpovedať
8.5.2020 17:15
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zatiaľ nikto nevložil komentár - buď prvý!