Jump to content
Sign in to follow this  
acr

Ciclo for - duvida

Recommended Posts

acr

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? 🤔

Obrigado!

Share this post


Link to post
Share on other sites
vasco16

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? 🤔

Obrigado!

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

Share this post


Link to post
Share on other sites
softklin

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.


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites
acr

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!

Share this post


Link to post
Share on other sites
OldCoder

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.

Share this post


Link to post
Share on other sites
acr

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

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

Share this post


Link to post
Share on other sites
softklin

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!


Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.