Ir ao conteúdo

Ajuda pra entender os laços aninhados do while, do while


dedeboy2005

Posts recomendados

Postado

Olá amigos estou com uma duvída pra entender os laços aninhados do laço while, do while.

Eu sou iniciante na linguagem C e estou estudando num livro e parei nesse tópico e já estou três semana tentando entender mas até agora não estou conseguindo já reeli um monte de vezes e até agora não consigo, estou t exeentando fazer exercicios mas não estou conseguindo em desenvolver por causa dessa função WHILE e gostaria de uma vez se alguém pudesse me explicar com funciona essa função para eu puder progredir no estudo.

Muito Obrigado pela atenção

Postado

Ola dedeboy2005,

não sei se entendi bem a sua questão... Você está com problemas para entender "while" e "do while", certo?

Se você está lendo um livro, certamente já passou por algum tópico chamado "if / else"... O que o if faz é testar uma condição, e executar um determinado comando caso a condição seja verdadeira.

Exemplo:

if (numero == 0)
printf("Ola mundo!");

Este comando imprime na tela do usuário a mensagem "Ola mundo!" caso a variável "numero" seja igual a 0...

A diferença do if para o while é que o while executa a mesma função até que a condição torne-se falsa...

Exemplo:

while (numero == 0)
printf("Ola mundo!");

Neste caso, o programa irá imprimir "Ola mundo!" na tela do usuário até que a variável numero seja 0.

Porém repare que no meu exemplo, não há como isso acontecer, pois a variável numero nunca altera seu conteúdo...

Um outro exemplo para melhor entendimento:

// Assuma que a variável numero valia inicialmente 0
while (numero < 10){
printf("Ola mundo!");
numero = numero + 1;
}

Ai neste exemplo, a função testa a condição:

"numero" é menor que 10? Isto é, 0 é menor que 10?

Isso é verdadeiro e, portanto, o programa executa os comandos dentro do laço:

Imprime "Ola mundo!", e "numero" passa a valer "numero" + 1, isto é, 0 + 1 = 1.

Daí em seguida como não há mais nada a ser executado, ele volta a testar a condição:

"numero" é menor que 10? Isto é, 1 é menor que 10?

Isso é verdadeiro, então ele repete o processo...

Isso prossegue até que a variável "numero" seja igual a 10.

Daí ele testa a condição:

10 é menor que 10?

isso é falso, pois 10 é igual a 10, e não menor. portanto ele não executa os comandos que estão dentro do laço, e continua lendo o resto do programa.

-------------------------------

A principal diferença entre "while" e "do while" é que o laço "do while" é executado ao menos uma vez, mesmo que a condição inicial já seja falsa.

Isto não ocorre no laço "while", observe:

int numero = 5;
while (numero < 4)
printf("Ola mundo!");

No caso acima, o programa verifica a condição:

numero é menor que 4? Isto é, 5 é menor que 4?

Como isso é falso, os comandos dentro do laço nunca são executados.

Agora neste caso:

int numero = 5;
do{
printf("Ola mundo!");
}while(numero < 4);

O programa imprime "Ola mundo" na tela do usuário pelo menos uma vez, mas após testar a condição, e verificar que a variável "numero" não é menor que 4, ele não executa os comandos dentro do laço novamente.

Acho que é basicamente isso... :P

Abraços,

Thiago.

Postado

Ahhh sim, durds...

É, eu não tinha entendido mesmo... :lol:

Bom, laços aninhados são, basicamente, laços dentro de laços...

Imagine que você tem uma matriz de números inteiros, e precisa zerar todos seus valores...

Haja braço pra fazer isso oh:

matriz[0][0] = 0;
matriz[0][1] = 0;
matriz[0][2] = 0;
...

pra isso usamos um while que percorre as colunas da matriz...

int coluna = 0;
while (coluna < N){
matriz[0][coluna] = 0;
coluna = coluna + 1;
}

Ai emcima, estamos na primeira linha da matriz (a linha 0, que está dentro do primeiro par de colchetes "matriz[0]...").

A variável coluna vale, inicialmente, 0.

Enquanto a variável coluna for menor que N (N representa a quantidade de colunas da matriz), a nossa função vai percorrendo cada coluna da primeira linha, fazendo o valor da matriz, naquela posição, valer 0.

Mostrando isso passo a passo:

0 X X (coluna = 0); 0 0 X (coluna = 1); 0 0 0 (coluna = 2).

Porém como percorrer todas as colunas de cada uma das linhas desta matriz?

Também é muito cansativo fazer isso deste modo:

int coluna = 0;
while (coluna < N){
matriz[0][coluna] = 0;
coluna = coluna + 1;
}
coluna = 0;
while (coluna < N){
matriz[1][coluna] = 0;
coluna = coluna + 1;
}
coluna = 0;
while (coluna < N){
matriz[2][coluna] = 0;
coluna = coluna + 1;
}
...

Então usamos outro while pra percorrer todas as linhas da matriz, e dentro deste while, colocamos outro while pra percorrer todas as colunas...

Assim, temos o seguinte:

int linha = 0;
int coluna;

while (linha < N){
coluna = 0;
while (coluna < N){
matriz[linha][coluna] = 0;
coluna = coluna + 1;
}
linha = linha + 1;
}

Veja que o primeiro while sempre faz coluna valer 0;

Daí em seguida o segundo while percorre todas as colunas desta linha:

0 0 0 (linha = 0)

X X X

X X X

ao final do segundo while, temos o comando: linha = linha + 1, que faz com que a função desça uma linha, e retorne ao segundo while que percorrerá todas as colunas da segunda linha:

0 0 0

0 0 0 (linha = 1)

X X X

E assim a função segue até que a condição do primeiro laço torne-se falsa... Ai o programa continua lendo o resto do programa...

Esta é apenas uma única aplicação para laços aninhados... Tem uma infinidade de casos onde usamos estes laços... :P

Enfim, acho que é isso, se a explicação ficou confusa volte ai, ok?! :lol:

Abraços,

Thiago.

Postado

Agora você me complicou mais ainda nós poderia conversar pelo msn para você me explicar melhor daí vou tirando as dúvidas é só esse tópico que estou quebrando a cabeça mas desde já agradeço por querer me ajudar.

Muito Obrigado.

Postado

Então tdtadeu li e reeli mas não estou conseguindo entender ainda poderia me explicar assim logicamente.

Nossa esse topico tá me deixando louco.:confused:

Muito Obrigado.

Postado

Oi dedeboy2005

Eu não sei bem a ordem normal de aprender essas coisas... mas enfim...

Sei lá se essa é a melhor forma de explicar isso, mas eu vou tentar com um exemplo bem bobo:

Digamos que você tenha um caminhão cheio de laranjas, e você quer saber quantas dúzias de laranjas tem nesse caminhão...

Obviamente, você pode pegar o numero total de laranjas, e dividir por 12... Mas eu como sou um cara muito esperto resolvi fazer de uma outra forma (é sarcasmo isso tá?!)

Eu resolvi contar laranja por laranja, e sempre que eu conto 12 laranjas, eu marco um X no meu caderno... Ai depois é só eu contar quantos X eu tenho no meu caderno e saberei o número de dúzias de laranjas que tinha dentro do caminhão.

Agora quando estamos programando, a gente pode fazer essa mesma operação, só que não há caderno, nem algum lugar pra marcar X... O que temos, na prática, são variáveis que podem ser usadas para contar alguma coisa, ou guardar algum valor...

Eu vou escrever um pseudo-código, porque laços aninhados não se aplicam só a C/C++...

int contarLaranjas;
int numeroDeDezias = 0;

[COLOR="Red"]while (HaLaranjasDentroDoCaminhao == verdade)[/COLOR]
{
contarLaranjas = 0;

[COLOR="Lime"]while(contarLaranjas < 12)[/COLOR]
{
[COLOR="Blue"]if(HaLaranjasDentroDoCaminhao == verdade)[/COLOR]
{
[COLOR="Orange"]contarLaranjas = contarLaranjas + 1;[/COLOR]
}
}
[COLOR="Purple"]numeroDeDuzias = numeroDeDuzias + 1;[/COLOR]
}

Bom, a parte do código em vermelho é o primeiro laço... tudo que estiver dentro dele será executado enquanto houver laranjas a serem contadas...

O primeiro comando desse laço é zerar o contador de laranjas, afinal a gente só ta interessado em contar de 12 em 12 laranjas, e não de 1 a 1 milhão, certo?!

A parte do código em verde é o segundo laço...

Repare que este segundo laço está dentro do primeiro... Por isso temos 2 laços aninhados... Pois um está dentro do outro... :P

A parte do código em azul é executada até o número de laranjas contadas for igual a 12... Quando o número de laranjas chegar a 12, o a condição do while verde não é mais verdadeira, e ai o programa vai para a parte roxa do código, onde ele adiciona 1 ao número de dúzias... Logo após isso o while vermelho verifica se ainda há laranjas a serem contadas... Caso isso seja verdade, ele zera o contador de laranjas, e entra no laço verde novamente...

Enfim, isso que faz dois laços serem aninhados... é um estar dentro do outro... :P

Tem um erro no código acima que eu não quis corrigir pra não te confundir... Mas é o fato de que se não houver mais laranjas a serem contadas, o programa não faz nada... e simplesmente fica tentando contar novamente... Mas isso ai adicionaria umas linhas de código inuteis para a explicação... Enfim, é isso ae... =D

Abraços,

Thiago.

Postado

Olá agora estou começando entender :lol:

Então o primeiro laço eu uso como uma referência de onde eu tenho que começar e o segundo laço ele começa a contar daí quando ele der 12 ele vai pular de código e ele volta no verde pra saber se tem mais laranja pra contar se não tiver ele para isso?

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!