- Notifications
You must be signed in to change notification settings - Fork111
Loops: while and for#77
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
base:master
Are you sure you want to change the base?
Uh oh!
There was an error while loading.Please reload this page.
Changes fromall commits
e4765a4
f313154
b17dba1
78ae1b7
cfa3af4
765fbe0
787a0ec
1c87f6a
0e8eaef
b8d6da2
59c82e1
784e756
e0fccfc
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,32 @@ | ||
Este exercício demonstra como formas posfixadas/prefixadas podem levar a resultados distintos quando utilizadas em comparações. | ||
odsantos marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
1. **De 1a 4** | ||
```js run | ||
let i = 0; | ||
while (++i < 5) alert( i ); | ||
``` | ||
O primeiro valor é `i = 1`,pois `++i`primeiro incrementa `i`e em seguida retorna o novo valor. Então, a primeira comparação é `1 < 5`e o `alert`exibe `1`. | ||
Em seguida vêm`2, 3, 4…` --os valores aparecem um depois do outro. A comparação sempre usa o valor incrementado, pois `++`vem antes da variável. | ||
Finalmente, `i = 4` é incrementado a `5`, a comparação `while(5 < 5)` falha, e o loop termina. Assim, `5` não é exibido. | ||
2. **De 1 a 5** | ||
```js run | ||
let i = 0; | ||
while (i++ < 5) alert( i ); | ||
``` | ||
O primeiro valor é novamente `i = 1`.A forma posfixada`i++`incrementa`i`e em seguida retorna o valor *antigo*, então a comparação `i++ < 5`utilizará`i = 0` (diferente de `++i < 5`). | ||
odsantos marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
Mas a chamada de`alert`é separada. Ela é uma declaração distinta que executa após o incremento e a comparaçào. Assim, ela recebe o valor atual `i = 1`. | ||
Em seguida, vêm `2, 3, 4…` | ||
Vamos parar em `i = 4`.A forma prefixada `++i`iria incrementar e utilizar`5`na comparação. Mas aqui temos a forma posfixada`i++`.Ela incrementa`i`para `5`,mas retorna o valor antigo. Portanto a comparação é, na verdade,`while(4 < 5)` --verdadeira, e o controle passa para `alert`. | ||
odsantos marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
O valor `i = 5` é o último, porque na próxima etapa `while(5 < 5)` é falso. | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,17 +1,17 @@ | ||
**Resposta: de `0`a `4`nos dois casos.** | ||
```js run | ||
for (let i = 0; i < 5; ++i) alert( i ); | ||
for (let i = 0; i < 5; i++) alert( i ); | ||
``` | ||
Isso pode ser facilmente deduzido do algoritmo de `for`: | ||
1.Executar`i = 0`uma vez antes de tudo (início). | ||
2.Verificar a condição `i < 5`. | ||
odsantos marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
3.Caso verdadeira (`true`), executar o corpo doloop `alert(i)`,e em seguida`i++`. | ||
odsantos marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
O incremento `i++`é separado do teste da condição (2).Trata-se de outra declaração. | ||
O valor retornado pelo incremento não é utilizado aqui, então não há diferença entre `i++`e `++i`. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -2,18 +2,18 @@ importance: 4 | ||
--- | ||
#Quais valores são mostrados pelo loop "for"? | ||
Pada cada loop, anote quais os valores retornados. Depois, comparecom a resposta. | ||
Ambos osloopsretornam em`alert`os mesmos valores, ou não? | ||
1.A forma posfixada: | ||
odsantos marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
```js | ||
for (let i = 0; i < 5; i++) alert( i ); | ||
``` | ||
2.A forma prefixada: | ||
```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 | ||
--- | ||
#Retornar valores pares no loop | ||
Utilize o loop`for`para retornar números pares de`2`a `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( `número ${i}!` ); | ||
i++; | ||
} | ||
``` | ||
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -2,12 +2,12 @@ importance: 5 | ||
--- | ||
#Repetir até que oinputesteja correto | ||
Escreva um loopque peça um número maior que`100`.Se o usuário digitar outro número, peça para digitar novamente. | ||
O loopdeve pedir um número até que o usuário digite um número maior que`100`ou cancele o diálogo/submeta uma linha em branco. | ||
Aqui podemos assumir que o usuário só digita números. Não é preciso implementar um tratamento especial para inputs não-numéricos neste exercício. | ||
odsantos marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
[demo] |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,29 +1,29 @@ | ||
Há muitos algotimos para esta tarefa. | ||
odsantos marked this conversation as resolved. Show resolvedHide resolvedUh oh!There was an error while loading.Please reload this page. | ||
Vamos utilizar umloop dentro de outro (isto é, aninhado): | ||
```js | ||
Para cada ino intervalo { | ||
testar se i tem um divisorde 1 ai | ||
se sim =>o valor não é um primo | ||
se não =>o valor e um primo, mostre-o | ||
} | ||
``` | ||
O código usando um label: | ||
```js run | ||
let n = 10; | ||
nextPrime: | ||
for (let i = 2; i <= n; i++) { //para cada i... | ||
for (let j = 2; j < i; j++) { //procurar um divisor.. | ||
if (i % j == 0) continue nextPrime; //não é primo, passar para o próximo i | ||
} | ||
alert( i ); //é primo | ||
} | ||
``` | ||
Há muitas maneiras de otimizá-lo. Por exemplo, podemos procurar divisores de`2`até a raiz quadrada de`i`.De qualquer modo, se quisermos ser realmente eficientes para intervalos maiores, precisamos de mudar a abordagem e usar matemática avançada e algoritmos complexos como o [Crivo Quadrático](https://en.wikipedia.org/wiki/Quadratic_sieve),o [Campo de número de peneira geral](https://pt.wikipedia.org/wiki/Campo_de_n%C3%BAmero_de_peneira_geral), etc. |
Uh oh!
There was an error while loading.Please reload this page.