• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

acr

Ciclo for - duvida

7 mensagens neste tópico

Vou ter frequência de Programação e Computadores nesta 4º. Sei que vai calhar um exercício de for, ou seja, muito semelhante ao que vou postar mais abaixo. Eu até compreendo a utilidade do ciclo for, mas não percebo quando os ciclo for's ficam por dentro dum outro ciclo for.

Aqui está um exemplar da frequência do ano passado, onde temos de dizer o resultado apresentado na consola:

#include <iostream>
using namespace std;
int main() {
int i, j;
for (i = 1; i <= 4; i++) {
for (j = i ; j < 4; j++)
cout << "A";
cout << "*" << endl;
}
}

Já fiz de tudo para tentar perceber o exercício, até fui às folhas das aulas teóricas e livros mas ainda não consegui entender.

Senhores programadores, podem me ajudar a entender o funcionamento? Haverá algum método para não me enganar e saber realmente o que vai sair daquele código? :hmm:

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vou ter frequência de Programação e Computadores nesta 4º. Sei que vai calhar um exercício de for, ou seja, muito semelhante ao que vou postar mais abaixo. Eu até compreendo a utilidade do ciclo for, mas não percebo quando os ciclo for's ficam por dentro dum outro ciclo for.

Aqui está um exemplar da frequência do ano passado, onde temos de dizer o resultado apresentado na consola:

#include <iostream>
using namespace std;
int main() {
int i, j;
for (i = 1; i <= 4; i++) {
for (j = i ; j < 4; j++)
cout << "A";
cout << "*" << endl;
}
}

Já fiz de tudo para tentar perceber o exercício, até fui às folhas das aulas teóricas e livros mas ainda não consegui entender.

Senhores programadores, podem me ajudar a entender o funcionamento? Haverá algum método para não me enganar e saber realmente o que vai sair daquele código? :hmm:

Obrigado!

Duplo for preenche por exemplo uma Matriz ou seja um array bidimensional

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um ciclo for dentro de outro executa i*j vezes, isto é por cada iteração i do ciclo "de fora", tens que o de dentro corre j vezes.

Vamos fazer uma análise passo a passo: nesse exemplo, o que me parece que se quer testar é se consegues distinguir as situações das condições/guardas. Tens no ciclo de fora i = 1, e a condição de continuação é i<=4. Isto é, da primeira vez que entras no ciclo, a variável i vai tomar o valor 1. O ciclo continua, vai correndo a instrução i++ (incrementando), e continua quando? Continua enquanto i for inferior ou igual a 4. Então, podes fazer uma lista dos valores que o i toma:

1 é inferior ou igual a 4? Sim

2 é inferior ou igual a 4? Sim

3 é inferior ou igual a 4? Sim

4 é inferior ou igual a 4? Sim

5 é inferior ou igual a 4? NÃO! Parou aqui, e não faz o 5º passo.

Por isso como viste, o ciclo com variável i corre 4 vezes.

Raciocínio análogo para o ciclo de dentro:

O ciclo corre enquanto j for inferior (e apenas inferior) a 4. Lista:

1 é inferior a 4? Sim

2 é inferior a 4? Sim

3 é inferior a 4? Sim

4 é inferior a 4? NÃO! Parou aqui, e não faz o 4º passo.

Corre então 3 vezes.

Vamos pensar de dentro para fora: o teu ciclo interno (o de dentro) vai imprimir no ecrã "A*\n" (o \n é o endl, que vai fazer uma quebra de linha). Sabes que isso vai correr 3 vezes, pela lista que fizeste para o ciclo de dentro. Vai ficar algo do género

A*

A*

A*

Agora que temos o resultado do ciclo de dentro, vamos aplicá-lo ao ciclo de fora. Sabes, pelos cálculos anteriores, que o ciclo de fora corre 4 vezes. Logo, vamos ter algo como

A*

A*

A*

A*

A*

A*

A*

A*

A*

A*

A*

A*

Cada cor representa uma iteração do ciclo de fora, totalizando as 4.

Se não perceberes diz, eu tenho tendência para encher textos com palha  :D , mas o que é essencial é que percebas. Não é difícil, e se te ajudar, podes tentar simular isso numa folha de rascunho, como vez são 12 passos que tens de seguir, nem são muitos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Antes de mais nada obrigado pelas respostas!

Softclean, eu percebi o raciocinio todo. Mas, na verdade, se compilar isso tudo, o que me dá na consola é o seguinte:

AAA*

AA*

A*

*

logo, não estou a perceber totalmente, embora tenha seguido o raciocinio a fundo.

Obrigado!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que o softclean só não reparou que o j é inicializado com o valor de i de cada vez...

Ou seja, modificando o exemplo dado...

i é agora 1.

i é inferior ou igual a 4? Sim.

    Então, entramos noutro ciclo, em j.

    j é agora i, ou seja, 1.

    j é inferior a 4? Sim.

    imprime 'A'.

    j incrementa-se, e é agora 2. ...

    ... repetir, até que se tenha imprimido 3 vezes 'A'.

    j é inferior a 4? Não. Ciclo concluído: regressar.

imprime '*' e muda de linha.

i incrementa-se, e é agora 2.

i é inferior ou igual a 4? Sim.

    Então, entramos noutro ciclo, em j.

    j é agora i, ou seja, 2. ...

    ... imprimir 'A' 2 vezes.

    Ciclo concluído: regressar.

imprime '*' e muda de linha.

i incrementa-se, e é agora 3. ...

... e assim sucessivamente.

A indentação ajuda a tornar o código mais claro. Vou escrevê-lo de novo, e acrescentar chavetas, para tornar a cadeia de ciclos mais visível:

#include <iostream>

using namespace std;

int main()
{
   int i, j;
   for (i = 1; i <= 4; i++)
   {
      for (j = i ; j < 4; j++)
      {
         cout << "A";
      }
      cout << "*" << endl;
   }

   return 0;
}

Boa sorte para a frequência, já agora.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hehe, fiz mais 3 exercicios do género e já percebi.

Softclean e oldcoder, muito obrigado mais uma vez! Grato :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epá... :$ Eu ontem estava a olhar para isso, nem reparei no pormenor da (falta de) chavetas, e confundi o i com um 1 :$

De qualquer maneira ainda bem que percebeste, e obrigado oldcoder pela chamada de atenção :D E também te desejo boa sorte!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora