Naučte se myslet jako programátor

Algoritmy Naučte se myslet jako programátor

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)


 

  Aktivity (1)

Článek pro vás napsal Mediel
Avatar
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

Jak se ti líbí článek?
Celkem (7 hlasů) :
4.142864.142864.142864.14286 4.14286


 


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

 

 

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

Avatar
Martin Bednář (xbedm01):

8. v GML:

i=0; zapornych=0; nul=0; kladnych=0;
repeat 40{
a[i]=floor(random_range(-100,100));
if a[i]<0 zapornych+=1;
else if a[i]==0 nul+=1;
else if a[i]>0 kladnych+=1;
i+=1;}
Odpovědět  -2 22.6.2013 21:15
I bez motta se dá žít
Avatar
Matěj Kripner
Redaktor
Avatar
Matěj Kripner:

Yes, mám to :D

Odpovědět 4.5.2014 10:36
"We reject kings, presidents and voting. We believe in rough consensus and running code" David Clark
Avatar
wolf661
Člen
Avatar
wolf661:

Caute. Ja len doplnim, ze na stranke hackerrank.com su podobne ulohy na precvicovanie algoritmov atd. Kod mozete pisat rovno na stranke, aj skompilovat a rovno vam povie ci je vystup spravny alebo nie.

Odpovědět  +1 4.6.2014 1:15
Situácia normálna, všetko v hajzli.
Avatar
Jopo123
Člen
Avatar
Jopo123:

1. v Jave

public void Jeden(int pole[]) {
        int min = Integer.MAX_VALUE;
        for (int i = 0; i < pole.length; i++) {
            if (min > pole[i]) {
                min = pole[i];
            }
        }
        int min2 = Integer.MAX_VALUE;
        for (int i = 0; i < pole.length; i++) {
            if (min2 > pole[i] && pole[i] > min) {
                min2 = pole[i];
            }
        }
        System.out.println(min2);
    }
Odpovědět  +1 8.7.2015 16:58
Na programovanie je potrebný aj rozum, nie len vedieť príkazy.
Avatar
Dominik Hošic
Redaktor
Avatar
Dominik Hošic:

8. v C#

public string CountPosNegZeroNums(List<int> list)
{
    var positive = list.Where(q => (q > 0 && q != 0));
    var negative = list.Where(q => (q < 0 && q != 0));
    var zero = list.Where(q => (q == 0));
    return String.Format("List obsahuje {0} kladných, {1} záporných a {2} nulových čísel", positive.Count(), negative.Count(), zero.Count());
}
Odpovědět  -1 30.8.2015 20:44
Klient: Nefunguje mi internet co s tím uděláte? Operátor: a co vidíte na monitoru? Klient: No signal...
Avatar
Mediel
Redaktor
Avatar
Odpovídá na Dominik Hošic
Mediel:

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
Odpovídá na Dominik Hošic
Ondřej Štorc:

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:

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ý:

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:

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. listopadu 3:26
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 27. Zobrazit vše