acr Posted November 23, 2009 at 09:14 PM Report Share #297337 Posted November 23, 2009 at 09:14 PM 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! Link to comment Share on other sites More sharing options...
vasco16 Posted November 23, 2009 at 09:25 PM Report Share #297338 Posted November 23, 2009 at 09:25 PM 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 Link to comment Share on other sites More sharing options...
softklin Posted November 23, 2009 at 09:53 PM Report Share #297341 Posted November 23, 2009 at 09:53 PM 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? Sim2 é 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? Sim2 é 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 😄 , 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. Link to comment Share on other sites More sharing options...
acr Posted November 23, 2009 at 10:27 PM Author Report Share #297349 Posted November 23, 2009 at 10:27 PM 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! Link to comment Share on other sites More sharing options...
OldCoder Posted November 23, 2009 at 10:48 PM Report Share #297356 Posted November 23, 2009 at 10:48 PM 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. Link to comment Share on other sites More sharing options...
acr Posted November 23, 2009 at 11:02 PM Author Report Share #297357 Posted November 23, 2009 at 11:02 PM Hehe, fiz mais 3 exercicios do género e já percebi. Softclean e oldcoder, muito obrigado mais uma vez! Grato 😄 Link to comment Share on other sites More sharing options...
softklin Posted November 24, 2009 at 10:00 AM Report Share #297381 Posted November 24, 2009 at 10:00 AM 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 😄 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. Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now