Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork3
Loops: while and for#79
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
Uh oh!
There was an error while loading.Please reload this page.
Changes fromall commits
22e67d2
ac45f55
604a3a3
d1cfebf
5f77e5d
6b7ec81
8cfd1f4
5d83267
91b1ce1
9dae4f5
3f5b411
365b270
e4315be
657a600
e6c02a3
be6052f
4e96419
7d3a5f3
7e040fa
010b94b
5d9d5ff
f8fe05a
fb0c0cf
File filter
Filter by extension
Conversations
Uh oh!
There was an error while loading.Please reload this page.
Jump to
Uh oh!
There was an error while loading.Please reload this page.
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,30 +1,31 @@ | ||
Tato úloha ukazuje, jak může prefixová a postfixová notace vést k rozdílným výsledkům, když je použijeme v porovnání. | ||
1. **Od 1do 4** | ||
```js run | ||
let i = 0; | ||
while (++i < 5) alert( i ); | ||
``` | ||
První hodnota je`i = 1`,jelikož `++i`nejprve zvýší `i`a pak vrátí novou hodnotu. První porovnání je tedy`1 < 5`a`alert`zobrazí `1`. | ||
Následují`2, 3, 4…` --hodnoty se zobrazí jedna po druhé. Porovnání se vždy dívá na zvýšenou hodnotu, protože `++`je před proměnnou. | ||
Nakonec `i = 4` se zvýší na `5`, porovnání `while(5 < 5)` neuspěje a cyklus skončí. Takže `5` se nezobrazí. | ||
2. **Od 1 do 5** | ||
```js run | ||
let i = 0; | ||
while (i++ < 5) alert( i ); | ||
``` | ||
První hodnota je opět`i = 1`.Postfixová notace`i++`zvýší `i`a pak vrátí *starou* hodnotu, takže porovnání`i++ < 5`se dívá na`i = 0` (na rozdíl od `++i < 5`). | ||
Avšak`alert`se volá odděleně. Je to další příkaz, který se spustí až po zvýšení a porovnání. Proto obdrží aktuální `i = 1`. | ||
Následují `2, 3, 4…` | ||
Zastavme se u `i = 4`.Prefixová notace`++i`by je zvýšila a v porovnání by použila `5`. Tady však máme postfixovou notaci`i++`.Ta zvýší`i`na `5`,ale vrátí starou hodnotu. Proto se provede porovnání`while(4 < 5)` --pravda, tudíž řízení přejde k `alert`. | ||
Hodnota`i = 5`je poslední, jelikož další krok`while(5 < 5)`dává nepravdu. |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -1,17 +1,17 @@ | ||||||
**Odpověď: od `0`do `4`v obou případech.** | ||||||
```js run | ||||||
for (let i = 0; i < 5; ++i) alert( i ); | ||||||
for (let i = 0; i < 5; i++) alert( i ); | ||||||
``` | ||||||
Lze to snadno odvodit z algoritmu pro `for`: | ||||||
1.Nejdříve se jedenkrát vykoná`i = 0`(začátek). | ||||||
2.Ověří se podmínka `i < 5`. | ||||||
3.Je-li `true`, vykoná se tělo cyklu`alert(i)` a pak `i++`. | ||||||
Zvýšení`i++`je odděleno od testu podmínky(2).Je to jen další příkaz. | ||||||
Hodnota vrácená zvýšením se tady nepoužívá, takže mezi`i++`a `++i` zde není žádný rozdíl. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -2,18 +2,18 @@ importance: 4 | ||||||
--- | ||||||
#Které hodnoty zobrazí cyklus „for“? | ||||||
Pro oba cykly zapište hodnoty, které budou zobrazeny, a pak je porovnejte s řešením. | ||||||
Vypíše`alert`v obou cyklech stejné hodnoty, nebo ne? | ||||||
1.Postfixová forma: | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
| ||||||
```js | ||||||
for (let i = 0; i < 5; i++) alert( i ); | ||||||
``` | ||||||
2.Prefixová forma: | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
| ||||||
```js | ||||||
for (let i = 0; i < 5; ++i) alert( i ); | ||||||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -2,8 +2,8 @@ importance: 5 | ||
--- | ||
#Vypište sudá čísla v cyklu | ||
Použitím cyklu `for`vypište sudá čísla od`2`do `10`. | ||
[demo] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -3,7 +3,7 @@ | ||
```js run | ||
let i = 0; | ||
while (i < 3) { | ||
alert( `číslo ${i}!` ); | ||
i++; | ||
} | ||
``` | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,15 +1,15 @@ | ||
```js run demo | ||
letčíslo; | ||
do { | ||
číslo = prompt("Zadejte číslo větší než100", 0); | ||
} while (číslo <= 100 &&číslo); | ||
``` | ||
Cyklus`do..while`se opakuje, dokud jsou obě podmínky splněny: | ||
1.Podmínka `číslo <= 100` --tedy že zadaná hodnota stále není větší než `100`. | ||
2.Podmínka`&&číslo` je nepravdivá, když `číslo` je `null`nebo prázdný řetězec. Pak se cyklus`while`rovněž zastaví. | ||
P.S.Jestliže `číslo` je `null`, pak `číslo <= 100`vydá `true`,takže bez druhé podmínky by se cyklus nezastavil, kdyby uživatel stiskl Storno. Obě podmínky jsou zapotřebí. |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -2,12 +2,12 @@ importance: 5 | ||||||
--- | ||||||
#Opakujte, dokud vstup nebude správně | ||||||
Napište cyklus, který se bude ptát na číslo větší než `100`.Pokud návštěvník zadá jiné číslo, zeptejte se ho znovu. | ||||||
Cyklus se musí ptát na číslo tak dlouho, až návštěvník zadá číslo větší než`100`nebo zruší vstup či zadá prázdný řádek. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
| ||||||
Zde můžeme předpokládat, že uživatel zadává pouze čísla. V této úloze nemusíte implementovat zvláštní zacházení s nečíselnými vstupy. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others.Learn more. Suggested change
| ||||||
[demo] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,29 @@ | ||
Pro tuto úlohu existuje mnoho algoritmů. | ||
Použijeme vnořený cyklus: | ||
```js | ||
pro každé iv intervalu { | ||
ověř, zda imá dělitele mezi 1..i | ||
pokud ano =>i není prvočíslo | ||
pokud ne =>i je prvočíslo, zobraz ho | ||
} | ||
``` | ||
Kód s použitím návěští: | ||
```js run | ||
let n = 10; | ||
dalšíPrvočíslo: | ||
for (let i = 2; i <= n; i++) { //pro každé i... | ||
for (let j = 2; j < i; j++) { //hledáme dělitele... | ||
if (i % j == 0) continuedalšíPrvočíslo; //není to prvočíslo, přejdeme k dalšímu i | ||
} | ||
alert( i ); //je to prvočíslo | ||
} | ||
``` | ||
Je zde mnoho prostoru k optimalizaci. Můžeme se například dívat jen na dělitele od`2`do odmocniny`i`.Kdybychom však chtěli být opravdu efektivní i pro velké intervaly, museli bychom změnit přístup a zaměřit se na vysokou matematiku a složité algoritmy, např. [kvadratické síto](https://en.wikipedia.org/wiki/Quadratic_sieve), [Obecné číselné teoretické síto (GNFS)](https://en.wikipedia.org/wiki/General_number_field_sieve)atd. |
Uh oh!
There was an error while loading.Please reload this page.