Chci geek triko! Chci geek triko!
Extra 10 % bodů navíc a tričko zdarma při zadání kódu "TRIKO10"

Naučte se myslet jako programátor

Algoritmy Naučte se myslet jako programátor

ONEbit hosting Unicorn College Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Vítejte v mém dalším článku, zde si budeme trénovat programátorské myšlení. Budeme se učit sestavovat algoritmy pro nějaké (na oko banální) úlohy. Bohužel programovací jazyk není tak dokonalý jako lidský mozek a tak se to programu musí celé vysvětlit jako naprostému hlupákovi, aby vůbec věděl, co má dělat :) Tyto úlohy jsem našel na disku ještě ze školy :) Takže to není můj výtvor avšak všechny tyto úlohy mám napsané v jazyce C#.

Pokud se doopravdy chcete něčemu naučit, tak nepodvádějte a zkuste si každou úlohu udělat poctivě a sami. Výsledky pak můžete vkládat ve formě zdrojové kódu nebo obrázku do komentářů. Nezapomeňte uvést číslo úlohy, kterou jste vyřešili :)

Zde máte úvod do teorie algoritmů

  1. Program dostane na vstup posloupnost 30 celých čísel. Sestavte vývojový diagram k algoritmu, podle kterého program nalezne a vypíše druhé nejmenší ze zadaných čísel. Vyplňte tabulku obsahu proměnných pro vstup začínající čísly 8, -2, 1, -5, ...
  2. Program dostane na vstup posloupnost celých kladných čísel; zadávání je ukončeno nulou. Sestavte vývojový diagram k algoritmu, podle kterého program nalezne a vypíše druhé největší ze zadaných čísel. Vyplňte tabulku obsahu proměnných pro vstup začínající čísly 8, 3, 5, 15, ...
  3. Program dostane na vstup 2 kladná celá čísla. Sestavte vývojový diagram k algoritmu, podle kterého program nalezne a vypíše největší společný dělitel zadaných čísel. Vyplňte tabulku obsahu proměnných pro čísla 12 a 18.
  4. Program dostane na vstup 2 kladná celá čísla. Sestavte vývojový diagram k algoritmu, podle kterého program nalezne a vypíše nejmenší společný násobek zadaných čísel. Vyplňte tabulku obsahu proměnných pro čísla 12 a 8.
  5. Sestavte vývojový diagram k algoritmu, podle kterého program rozhodne, zda zadané číslo je nebo není prvočíslo. Vyplňte tabulku obsahu proměnných pro číslo 15.
  6. Program dostane na vstup posloupnost 30 celých čísel. Sestavte vývojový diagram k algoritmu, podle kterého program rozhodne a vypíše, zda zadaná posloupnost je nebo není rostoucí. Vyplňte tabulku obsahu proměnných pro vstup začínající čísly 2, 3, 1, 5, ...
  7. Program dostane na vstup posloupnost celých čísel; zadávání je zakončeno nulou. Sestavte vývojový diagram k algoritmu, podle kterého program rozhodne a vypíše, zda zadaná posloupnost je nebo není klesající. Vyplňte tabulku obsahu proměnných pro vstup začínající čísly 18, 13, 15, 9, ...
  8. Program dostane na vstup posloupnost 40 celých čísel. Sestavte vývojový diagram k algoritmu, podle kterého program spočítá a vypíše, kolik bylo mezi zadanými čísly kladných, záporných a nulových hodnot. Vyplňte tabulku obsahu proměnných pro vstup začínající čísly 0, 13, -15, -9, ...
  9. Program dostane na vstup posloupnost celých čísel; zadávání je zakončeno nulou. Sestavte vývojový diagram k algoritmu, podle kterého program nalezne a vypíše největší číslo, nejmenší číslo a aritmetický průměr ze zadaných čísel. Vyplňte tabulku obsahu proměnných pro vstup začínající čísly 10, 13, -15, -9, ...
  10. Program dostane na vstup číslo X a poté posloupnost 50 čísel. Sestavte vývojový diagram k algoritmu, podle kterého program nalezne a vypíše to číslo z posloupnosti, které je hodnotou nejblíže zadanému číslu X. Vyplňte tabulku obsahu proměnných pro vstup začínající čísly 20, 33, 2, 15, ...
  11. Sestavte vývojový diagram k algoritmu, podle kterého program spočítá hodnotu N!(N faktoriál) pro zadané přirozené číslo N. Vyplňte tabulku obsahu proměnných pro zadané číslo 4.Pozn. N! = N.(N-1).(N-2). ... .3.2.1 (např. 5! = 5.4.3.2.1 = 120)
  12. Sestavte vývojový diagram k algoritmu, podle kterého program vyřeší kvadratickou rovnici Ax2+Bx+C=0. Program dostane na vstup koeficienty A, B a C. Pokud je zadávaný koeficient A roven nule, program vypíše upozornění a nechá si zadávat jinou hodnotu tak dlouho, dokud nebude různá od nuly. Vyplňte tabulku obsahu proměnných pro zadaná čísla 0, 0, 1, 2, 1.
  13. Program dostane na vstup 2 celá čísla A a B a jedno přirozené číslo X. Sestavte vývojový diagram k algoritmu, podle kterého program vypíše z intervalu <A;B> všechna čísla dělitelná číslem X. Vyplňte tabulku obsahu proměnných pro zadaná čísla 3, 20, 5.
  14. Sestavte vývojový diagram k algoritmu, podle kterého program rozhodne, zda zadané přirozené číslo je nebo není tzv. dokonalým číslem. Vyplňte tabulku obsahu proměnných pro zadané číslo 12. Pozn. Dokonalé číslo je takové číslo, které je rovno součtu všech svých dělitelů kromě sebe sama. Například 28 je dokonalé číslo, protože 28 = 1 + 2 + 4 + 7 + 14.
  15. Sestavte vývojový diagram k algoritmu, podle kterého program rozhodne, zda zadaná přirozená čísla jsou nebo nejsou tzv. spřátelená čísla. Vyplňte tabulku obsahu proměnných pro zadaná čísla 12 a 16. Pozn. Spřátelenými čísly se nazývají dvě různá přirozená čísla a, b takových vlastností, že se součet všech vlastních dělitelů čísla a rovná číslu b a naopak. Příkladem spřátelených čísel je dvojice čísel 220 a 284.
  16. Sestavte vývojový diagram k algoritmu, podle kterého program převede zadané číslo z desítkové soustavy do dvojkové. Vyplňte tabulku obsahu proměnných pro zadané číslo 9.
  17. Je dán počet dní v měsíci (tj. číslo z rozmezí 28 až 31) a informace, na který den v týdnu připadá první den v měsíci (ve tvaru pořadového čísla: pondělí = 1, úterý = 2, …, neděle = 7). Sestavte vývojový diagram k algoritmu, který zjistí a vypíše kolik je v daném měsíci pátků. Vyplňte tabulku obsahu proměnných pro vstup: 30, 6.
  18. Je dán počet dní v měsíci (tj. číslo z rozmezí 28 až 31) a informace, na který den v týdnu připadá první den v měsíci (ve tvaru pořadového čísla: pondělí = 1, úterý = 2, …, neděle = 7). Sestavte vývojový diagram k algoritmu, který zjistí a vypíše kolik je v daném měsíci pracovních dní. Vyplňte tabulku obsahu proměnných pro vstup: 29, 3.
  19. Sestavte vývojový diagram k algoritmu, podle kterého program převede zadané číslo z  dvojkové soustavy do desítkové. Vyplňte tabulku obsahu proměnných pro zadané číslo 11010.
  20. Sestavte vývojový diagram k algoritmu, který spočítá a vypíše ciferný součet daného přirozeného čísla. Vyplňte tabulku obsahu proměnných pro zadané číslo 3059.
  21. Hodnotu Ludolfova čísla pí lze aproximovat nekonečnou řadou pí = 4 . (1 – 1/3 + 1/5 – 1/7 + 1/9 - …) Sestavte vývojový diagram k algoritmu, který vypočítá pomocí této řady hodnotu pí s libovolnou přesností (zadá uživatel). Vyplňte tabulku obsahu proměnných pro zadanou přesnost 0,1.

V dalším díle spojíme lehké algoritmy s funkcemi. Budeme tedy vymýšlet lehké programy a jejich hlavní části vkládat do funkcí (metod)


 

 

Článek pro vás napsal Mediel
Avatar
Jak se ti líbí článek?
10 hlasů
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
Miniatura
Předchozí článek
Ostatní algoritmy
Miniatura
Všechny články v sekci
Česká encyklopedie algoritmů
Miniatura
Následující článek
Naučte se myslet jako programátor II
Aktivity (1)

 

 

Komentáře
Zobrazit starší komentáře (22)

Avatar
Mediel
Redaktor
Avatar
Mediel:1.9.2015 13:09

Pěkné řešení, ale není to asi cílem tohoto procvičování :)

Odpovědět 1.9.2015 13:09
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
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?

Odpovědět  +1 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?

 
Odpovědět 8.9.2015 12:18
Avatar
Jan Vargovský
Redaktor
Avatar
Odpovídá 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š.

 
Odpovědět  +1 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;}

 
Odpovědět 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);

 
Odpovědět 12.1.2017 21:24
Avatar
Odpovídá 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 :-) )

 
Odpovědět 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();
 
Odpovědět 18.12.2017 8:01
Avatar
Odpovídá na Jiří Charousek
Marek Pochyba:18. května 1:19

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

 
Odpovědět 18. května 1:19
Avatar
Erik Hawlasek:30. září 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();
Odpovědět 30. září 19:34
Za zeptání nic nedáš.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 32. Zobrazit vše