Pole a cykly

Pole a cykly

1. Pole v divadle

Celé toto cvičení prováďejte v JavaScript konzoli.

  1. Vytvořte nějaké pole celých čísel, například počty diváků na několika po sobě jdoucích divadelních představeních. Použije metodu push a přidejte do pole počet diváků na novém představení.
  2. Vytvořte nějaké pole desetinných čísel, například zaplněnost divadla v několika po sobě jdoucích představeních.
  3. Vytvořte nějaké pole řetězců, například seznam názvů několika divadelních představení, která divadlo hraje. Uložte toto pole do proměnné plays. Uložte do nějaké proměnné druhou položku tohoto pole. Pomocí metody shift odstraňte z pole první představení, které už divadlo nehraje.
  4. Do proměnné reviews uložte pole hodnocení, které obdržela divadelní hra Plyšáci na útěku v různých recenzních časopisech. Hodnocení je vždy dvouprvkové pole obsahující název recenzního časopisu jako řetězec a samotné hodnocení jako číslo mezi 1 až 10. Pomocí metody unshift přidejte na začátek nové hodnocení z časopisu Divadelní oběžník.

Řešení

'use strict';

// 1
const poctyUcastniku = [8, 5, 10];
poctyUcastniku.push(7);
console.log(poctyUcastniku);

// 2
const zaplnenost = [0.5, 0.8, 0.7];

// 3
const plays = ['Sen noci svatojánské', 'Hamlet', 'Macbeth', 'Otello'];
const hra = plays[1];
plays.shift();
console.log(hra, plays);

// 4
const reviews = [
  ['Večerní divadlo', 8],
  ['Divadelní deník', 6],
  ['Divadelní měsíčník', 6],
];
reviews.unshift(['Divadelní oběžník', 9]);

2. Šachovnice

Založte JavaScriptový program a vytvořte v něm pole, které bude reprezentavat rozehranou šachovou partii jako na obrázku.

Šachovnice

  1. Šachovnici reprezentujte jako pole polí, kde každý řádek je reprezentován jako jedno pole. Políčka reprerezentujte jako čísla dle následujícího klíče.
    figura bilá černá
    prázdné pole0
    pěšec1-1
    věž2-2
    kůň3-3
    střelec4-4
    dáma5-5
    král6-6
  2. Otevřete tento program v konzoli a napište příkaz, který přesune bílého koně z pozice f3 na pozici e5.

Řešení

'use strict';

const sachovnice = [
  [0, 0, 0, 0, 0, -2, -6, 0],
  [0, 0, 0, 0, 0, -1, -1, -1],
  [0, 0, -1, 0, -1, 0, 0, 0],
  [0, -1, 1, 0, 0, 0, 0, 0],
  [0, 1, 0, 0, 0, 0, 0, 0],
  [0, 0, 0, 0, 0, 3, 0, 1],
  [0, 0, 0, 0, 4, 1, 1, 0],
  [0, 0, 0, 0, 0, 0, 6, 0],
];

console.log(sachovnice);

sachovnice[5][5] = 0;
sachovnice[3][4] = 3;

console.log(sachovnice);

3. Počítání pomocí WHILE

  1. Napište cyklus WHILE, který do konzole vypíše všecha čísla od jedné až do sta.
  2. Napište cyklus WHILE, který do konzole vypíše všecha sudá čísla od jedné až do sta.
  3. Napište cyklus WHILE, který do konzole vypíše všecha sudá čísla pozpátku od sta až k nule.

Řešení

'use strict';

// 1
let cislo = 1;
while (cislo <= 100) {
  console.log(cislo);
  cislo += 1;
}

// 2
let sude = 2;
while (sude <= 100) {
  console.log(sude);
  sude += 2;
}

// 3
let sudeZpet = 100;
while (sudeZpet > 0) {
  console.log(sudeZpet);
  sudeZpet -= 2;
}

4. Počítání pomocí FOR

Přepište všechy WHILE cykly z předchozího cvičení na FOR cykly.

Řešení

'use strict';

// 1
for (let cislo = 1; cislo <= 100; cislo += 1) {
  console.log(cislo);
}

// 2
for (let sude = 2; sude <= 100; sude += 2) {
  console.log(sude);
}

// 3
for (let sudeZpet = 100; sudeZpet > 0; sudeZpet -= 2) {
  console.log(sudeZpet);
}

5. Uživatelé

Založte JavaScriptový program s následujícím seznamem uživatelů.

const users = ['paja', 'kaja', 'vlasta', 'peta', 'alex', 'misa'];
  1. Pomocí cyklu FOR vypište všechna tato jména do konzole.
  2. Do konzole vypište všechna jména jako emailové adresy z domény gmail.com. Uživatel 'paja' tak bude 'paja@gmail.com'.
  3. Vypište do konzole emaily pouze těch uživatelů, jejichž jméno má nejvýše 4 znaky.

Řešení

'use strict';

const users = ['paja', 'kaja', 'vlasta', 'peta', 'alex', 'misa'];

// 1
for (let i = 0; i < users.length; i += 1) {
  console.log(users[i]);
}

// 2
for (let i = 0; i < users.length; i += 1) {
  console.log(`${users[i]}@gmail.com`);
}

// 3
for (let i = 0; i < users.length; i += 1) {
  if (users[i].length <= 4) {
    console.log(`${users[i]}@gmail.com`);
  }
}

6. Pohyby na účtu

Založe JavaScriptový program s následujícím s záznamem vkladů a výběrů na nějakém bankovním účtu.

const amounts = [2500, -550, 1000, -1200, -3000, 1270, 2300];
  1. Napište cyklus FOR, který spočítá výsledný zůstatek na účtu za předpokladu, že na účtu byla na začátku nula.
  2. Napište cyklus WHILE, který zjistí číslo pohybu, ve kterém se účet dostal poprvé do mínusu. Vypište jak číslo pohybu, tak výši záporného zůstatku.

Řešení

'use strict';

const amounts = [2500, -550, 1000, -1200, -3000, 1270, 2300];

// 1
let vysledek = 0;
for (let i = 0; i < amounts.length; i += 1) {
  vysledek += amounts[i];
}
console.log(vysledek);

// 2
let zustatek = 0;
let i = 0;
while (zustatek >= 0) {
  zustatek += amounts[i];
  i += 1;
}
console.log(i - 1, zustatek);

7. Na doma | Počítání hodin

Napište cyklus WHILE, který do konzole postupně vypíše všechny časové údaje v rámci jednoho dne od 0:00 až po 23:59.

Ukázka výstupu:

0:00
0:01
0:02
...
23:58
23:59

Řešení

'use strict';

let i = 0;
while (i < 60 * 24) {
  const hours = Math.floor(i / 60);
  const minutes = String(i % 60).padStart(2, '0');
  console.log(`${hours}:${minutes}`);
  i += 1;
}

8. Na doma | Čekání na šestku

Založte JavaScriptový program a splňte následující úkoly.

  1. Napište funkci roll, která simuluje hod kostkou. Vrátí tedy náhodné číslo od 1 do 6 tak, že všechna čísla mají stejnou pravděpodobnost.
  2. Váš program nechť hází kostkou tak dlouho, až poprvé padne šestka. Vypište na výstup na kolikátý pokus šestka padla.
  3. Spusťte váš program desetkrát za sebou a zaznamenejte výsledky. Sdílejte vaše výsledky s ostatními abychom nasbírali co nejvíce dat.

Řešení

'use strict';

const roll = () => {
  return Math.floor(Math.random() * 6) + 1;
};
let pocetHoduNezPadneSestka = 1;
while (roll() != 6) {
  pocetHoduNezPadneSestka += 1;
}

console.log(pocetHoduNezPadneSestka);

9. Na doma | Malé algoritmy

Založte si nový JavaScriptový program a na jeho začátek vložte následující seznam čísel. Budeme jej používat ve všech následujících úlohách.

const numbers = [
  -24, -11, 27, 29, -4, -28, -21, -14, 3, -8, 24, 19, -25, -2, -1, 11, 32, -31, 5
];
  1. Vypište na výstup všechna čísla.
  2. Vypište na výstup druhé mocniny všech čísel.
  3. Vypište na výstup pouze záporná čísla.
  4. Vypište na výstup absolutní hodnotu všech čísel.
  5. Vypište na výstup pouze ta čísla, jejíchž absolutní hodnota je dělitelná třemi.
  6. Vypište na výstup pouze sudá čísla.
  7. Vypište na výstup jak daleko je každé číslo v seznamu od čísla 5.
  8. Vypište na výstup druhé mocnicny vzdáleností všech čísel od čísla 5.
  9. Spočítejte, kolik je v seznamu záporných čísel.
  10. Spočítejte součet všech čísel v poli.
  11. Spočítejte průměr všech čísel v poli.
  12. Spočítejte součet všech pozitivních čísel v poli.

Řešení

'use strict';

const numbers = [
  -24,
  -11,
  27,
  29,
  -4,
  -28,
  -21,
  -14,
  3,
  -8,
  24,
  19,
  -25,
  -2,
  -1,
  11,
  32,
  -31,
  5,
];

// 1
numbers.forEach((number) => {
  console.log(number);
});

// 2
numbers.forEach((number) => {
  console.log(number ** 2);
});

// 3
numbers.forEach((number) => {
  if (number < 0) {
    console.log(number);
  }
});

// 4
numbers.forEach((number) => {
  console.log(Math.abs(number));
});

// 5
numbers.forEach((number) => {
  if (Math.abs(number) % 3 === 0) {
    console.log(number);
  }
});

// 6
numbers.forEach((number) => {
  if (number % 2 === 0) {
    console.log(number);
  }
});

// 7
numbers.forEach((number) => {
  console.log(Math.abs(5 - number));
});

// 8
numbers.forEach((number) => {
  console.log(Math.abs(5 - number) ** 2);
});

// 9
let pocetZapornych = 0;
numbers.forEach((number) => {
  if (number < 0) {
    pocetZapornych += 1;
  }
});
console.log(pocetZapornych);

// 10
let soucet = 0;
numbers.forEach((number) => {
  soucet += number;
});
console.log(soucet);

// 11
let soucet2 = 0;
numbers.forEach((number) => {
  soucet2 += number;
});
console.log(soucet2 / numbers.length);

// 12
let soucetKladnych = 0;
numbers.forEach((number) => {
  if (number > 0) {
    soucetKladnych += number;
  }
});
console.log(soucetKladnych);

10. Bonus | Registrace

Stáhněte se připravenou stránku s registračním formulářem pro nového uživatele. Doplňte do stránky JavaScriptový kód tak, aby byly splněny následující požadavky.

  1. Pokud uživatel zadá uživatelské jméno, které je již obsaženo v poli users, vypište do prvku s třídou reg-form__error chybovou hlášku ve smyslu, že zadané uživatelské jméno je již zabráno.
  2. Zkontrolujte, že heslo zadané do prvního políčka je dostatečně bezpečené. Heslo považujeme za bezpečné, pokud má alespoň 10 znaků nebo obsahuje alespoň jeden ze znaků pomlčka -, podtržítko _ nebo dvojtečka :.

Řešení

'use strict';

const users = [
  'petr',
  'jana-34',
  'husky16',
  '66beruska',
  'thegodofU',
  'rene_gade',
  'tommy',
  'luciluci',
  'tanko',
  'poltergeist',
  'hlava-havla',
  'telo-ramba',
];

document.querySelector('#btn-register').addEventListener('click', () => {
  const usernameElm = document.querySelector('#username');
  const passwordElm = document.querySelector('#pass1');
  const formErrorElm = document.querySelector('.reg-form__error');

  let zprava = '';

  if (users.includes(usernameElm.value)) {
    zprava = 'Zadané uživatelské jméno je již zabráno.';
  }

  if (passwordElm.value.length < 10) {
    if (
      !passwordElm.value.includes('-') &&
      !passwordElm.value.includes('_') &&
      !passwordElm.value.includes(':')
    ) {
      zprava += 'Slabé heslo.';
    }
  }
  formErrorElm.textContent = zprava;
});

11. Bonus | Těžší algoritmy

Založte si nový JavaScriptový program a na jeho začátek vložte následující seznam čísel. Budeme jej používat ve všech následujících úlohách.

const numbers = [
  -24, -11, 27, 29, -4, -28, -21, -14, 3, -8, 24, 19, -25, -2, -1, 11, 32, -31, 5
];
  1. Vypište na výstup všechna čísla, která jsou větší než jejich předchůdce.
  2. Vypište na výstup všechny vrcholy v daném poli. Vrchol je číslo, které je větší než jeho předchůdce i jeho následovník.
  3. Nejprve spočítejte průměr čísel v poli a výsledek si ulože do proměnné mean. Poté spočítejte součet druhých mocnin vzdáleností všech čísel od průměru.
  4. Spočítejte směrodatnou odchylku čísel v poli. To provedete tak, že nejprve spočítáte takzvaný rozptyl, což je průměr druhých mocnin vzdáleností všech čísel od průměru. Rozptyl pak odmocníte pomocí funkce Math.sqrt.
  5. Najděte s seznamu největší prvek.
  6. Najděte s seznamu největší prvek, který je menší než číslo 16.

Řešení

'use strict';

const numbers = [
  -24,
  -11,
  27,
  29,
  -4,
  -28,
  -21,
  -14,
  3,
  -8,
  24,
  19,
  -25,
  -2,
  -1,
  11,
  32,
  -31,
  5,
];

// 1
let predchoziCislo = null;
numbers.forEach((number) => {
  if (predchoziCislo !== null && number > predchoziCislo) {
    console.log(number);
  }
  predchoziCislo = number;
});

// 2
let predPredchoziCislo = null;
let predchoziCislo2 = null;
numbers.forEach((number) => {
  if (predPredchoziCislo !== null && predchoziCislo2 !== null) {
    if (predchoziCislo2 > predPredchoziCislo && predchoziCislo2 > number) {
      console.log(predchoziCislo2);
    }
  }
  predPredchoziCislo = predchoziCislo2;
  predchoziCislo2 = number;
});

// 3
let soucet = 0;
numbers.forEach((number) => {
  soucet += number;
});
const mean = soucet / numbers.length;
console.log(mean);

let soucetDruhychMocninVdalenostiOdPrumeru = 0;
numbers.forEach((number) => {
  const vzdalenostOdPrumeru = number - mean;
  soucetDruhychMocninVdalenostiOdPrumeru += vzdalenostOdPrumeru ** 2;
});
console.log(soucetDruhychMocninVdalenostiOdPrumeru);

// 4
const rozptyl = soucetDruhychMocninVdalenostiOdPrumeru / numbers.length;
const smerodatnaOdchylka = Math.sqrt(rozptyl);
console.log(rozptyl, smerodatnaOdchylka);

// 5
let nejvyssiPrvek = null;
numbers.forEach((number) => {
  if (number > nejvyssiPrvek) {
    nejvyssiPrvek = number;
  }
});
console.log(nejvyssiPrvek);

// 6
let nejvyssiPrvekPo16 = null;
numbers.forEach((number) => {
  if (number < 16) {
    if (number > nejvyssiPrvekPo16) {
      nejvyssiPrvekPo16 = number;
    }
  }
});
console.log(nejvyssiPrvekPo16);

12. Bonus | Algoritmy pro fajnšmekry

Založte si nový JavaScriptový program a na jeho začátek vložte následující seznam čísel. Budeme jej používat ve všech následujících úlohách.

const numbers = [
  -24, -11, 27, 29, -4, -28, -21, -14, 3, -8, 24, 19, -25, -2, -1, 11, 32, -31, 5
];
  1. Vypište na výstup délku nejdelší rostoucí sekvence čísel, které v poli následují přímo po sobě.
  2. Vypište na výstup délku nejdelší rostoucí nebo klesající sekvence čísel, které v seznamu následují přímo po sobě.
  3. Najděte druhý největší prvek v seznamu.
  4. Najděte nejnižší vrchol a nejvyšší údolí. Údolí je číslo, které je menší než jeho předchůdce i následovník.

Řešení

Řešení zatím nikdo nepřidal.