Buscar

11. Laços de Repetição While e Do While

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 3, do total de 49 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 6, do total de 49 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você viu 9, do total de 49 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Prévia do material em texto

Ju
d
so
n
 S
an
to
s 
S
an
ti
ag
o
LOOPS WHILE E DO WHILE
Programação de Computadores
Objetivos da Aula
Aprender a usar o loop while, do while e for 
no processamento de strings, vetores e 
matrizes
Expressões Relacionais 
While
Do While
Loops for Aninhados
Matrizes
Introdução
 Computadores fazem mais que apenas 
armazenar dados, eles:
 Analisam
 Rearranjam
 Extraem
 Modificam
 Extrapolam
 Sintetizam
 ... Manipulam dados
Introdução
 Para fazer tais manipulações as linguagens de 
programação precisam de ferramentas para:
 Executar ações repetitivas:
 for
 while
 do while
 Tomar decisões:
 if
 switch
Introdução
 Estas estruturas de controle fazem uso 
freqüente de expressões
 Relacionais
 > (maior), < (menor)
 >= (maior ou igual),<= (menor ou igual)
 == (igual), != (diferente) 
 Lógicas
 && (e), || (ou)
 ! (não)
Expressões Relacionais
 Computadores não são máquinas que fazem 
apenas cálculos, eles têm também a 
capacidade de comparar valores
 Esta é a ferramenta base para a tomada de 
decisões
 Em C++ comparações são feitas através de 
expressões relacionais
 As expressões relacionais são criadas com o 
uso de operadores relacionais
Expressões Relacionais
 Operadores Relacionais:
 A avaliação de uma expressão relacional 
resulta em um valor true ou false
Operador Significado
< Menor
<= Menor ou igual
== Igual
> Maior
>= Maior ou igual
!= Diferente
Expressões Relacionais
 Alguns exemplos:
 Operadores aritméticos têm maior 
precedência que os operadores relacionais
for (x=20; x > 5; x--) // verdadeiro se x é maior que 5 
for (x=1; y != x; ++x) // verdadeiro se y não é igual a x
for (cin >> x; x == 0; cin >> x) // verdadeiro se x é 0
x + 3 > y - 2 // expressão 1
(x + 3) > (y - 2) // expressão equivalente a expressão 1
x + (3 > y) - 2 // expressão diferente da expressão 1
Expressões Relacionais
 Não confundir uma expressão de atribuição 
com uma expressão de comparação
 Uma atribuição não é interpretada como erro
material == 4 // comparação
// o valor da expressão é true ou false
material = 4 // atribuição
// o valor da expressão é igual a 4
for (cin >> x; x == 1; cin >> x) // repita enquanto x é 1
for (cin >> x; x = 1; cin >> x) // teste é sempre verdadeiro
Expressões Relacionais
#include <iostream>
using namespace std;
int main()
{
int nota[10]= {10, 10, 10, 10, 10, 9, 7, 8, 5, 6};
cout << "Fazendo da maneira certa:\n";
int i;
for (i = 0; nota[i] == 10; i++)
cout << "Nota " << i << " é um 10\n";
cout << "Fazendo da forma errada:\n";
for (i = 0; nota[i] = 10; i++)
cout << "Nota " << i << " é um 10\n";
system("pause");
return 0;
}
Expressões Relacionais
 A saída do programa:
Fazendo da maneira certa:
Nota 0 é um 10
Nota 1 é um 10
Nota 2 é um 10
Nota 3 é um 10
Nota 4 é um 10
Fazendo da forma errada:
Nota 0 é um 10
Nota 1 é um 10
Nota 2 é um 10
Nota 3 é um 10
Nota 4 é um 10
Nota 5 é um 10
Nota 6 é um 10
Nota 7 é um 10
Nota 8 é um 10
Nota 9 é um 10
...
Comparando Strings
 Uma string não pode ser comparada usando 
os operadores relacionais
 Assim como o nome de um vetor, uma string
representa um endereço de memória
 Use a função strcmp() para comparar strings
 Recebe duas strings como argumento
 Retorna zero se as duas strings são iguais
char palavra[20] = "colega";
palavra == "colega" // expressão com valor false
Comparando Strings
#include <iostream>
#include <cstring> // protótipo para strcmp()
using namespace std;
int main()
{ 
char palavra[8]= "?oleque";
for (char ch = 'a'; strcmp(palavra, "moleque"); ch++)
{ 
cout << palavra << endl;
palavra[0] = ch;
}
cout << "A palavra é " << palavra << endl;
system("pause");
return 0;
}
Comparando Strings
 A saída do programa:
?oleque
aoleque
boleque
coleque
doleque
eoleque
foleque
goleque
holeque
ioleque
joleque
koleque
loleque
A palavra é moleque
Comparando Ponto-flutuante
 Valores ponto-flutuante não podem ser 
comparados usando o operador relacional 
de igualdade
#include <iostream>
using namespace std;
int main()
{
float a = 6.9f;
float b = 0.9f;
cout << boolalpha << (a - int(a) == b) << endl;
system("pause");
return 0;
}
6.9000001
0.89999998
0.9000001 0.89999998
Loop while
 O loop while é um laço for sem as partes de 
inicialização e atualização
while (condição)
corpo
Repete enquanto a condição é verdadeira
Instrução (ou bloco de instruções) a ser repetida
Loop while
instrução1;
while (teste)
instrução2;
instrução3
instrução 1
instrução 3
instrução 2teste
Loop while
falso
verdadeiro
Loop while
 O ciclo de teste e execução continua até que 
a expressão de teste seja falsa
 Para encerrar o loop é preciso fazer algo no 
corpo do loop que torne a condição falsa
 O while é um loop que avalia a expressão de 
teste na entrada do loop
 Se a condição é falsa na primeira passagem, o 
corpo do loop nunca é executado
Loop while
#include <iostream>
using namespace std;
int main()
{
cout << "Digite seu primeiro nome: "; 
char nome[20]; 
cin >> nome;
cout << "Seu nome na vertical e em códigos ASCII:\n";
int i = 0; // comece no início da string
while (nome[i] != '\0') // processa até o fim da string
{ 
cout << nome[i] << ": " << int(nome[i]) << endl;
i++;
}
system("pause");
return 0;
}
Loop while
 A saída do programa:
 As duas formas abaixo são equivalentes pois 
o caractere nulo tem código zero (falso)
Digite seu primeiro nome: Muffy
Seu nome na vertical e em códigos ASCII:
M: 77
u: 117
f: 102
f: 102
y: 121
while (nome[i] != '\0') 
while (nome[i]) 
for versus while
 Os laços for e while são equivalentes
 O laço for
 Pode ser reescrito como while:
for (inicialização; teste; atualização)
{
instruções
}
inicialização;
while (teste)
{
instruções
atualização;
}
for versus while
 Os laços for e while são equivalentes
 O laço while
 Pode ser reescrito como for:
while (teste)
{
instruções
}
for ( ; teste; )
{
instruções
}
for versus while
 A escolha entre for e while é uma questão de 
estilo do programador
 Normalmente usa-se o loop for para loops 
que precisam de contadores
 A inicialização, teste e atualização do contador 
estão todos no mesmo lugar
 Normalmente usa-se o loop while quando 
não se sabe antecipadamente quantas vezes 
o loop será executado
Cuidados com o Loop while
 Indentação não define um bloco
 O loop while não contém ponto e vírgula
i = 0;
while (nome[i] != '\0')
cout << nome[i] << endl;
i++; // instrução fora do loop, nunca é executada
cout << "Pronto\n";
i = 0;
while (nome[i] != '\0'); // problema com o ponto e vírgula
{
cout << nome[i] << endl;
i++;
}
cout << "Pronto\n";
Loop Temporizador
 Algumas vezes é útil fazer uma pausa na 
execução de um programa
 O loop while é ideal para produzir este efeito
 Uma técnica usada no início dos 
computadores pessoais consistia em fazer o 
computador contar por alguns instantes
long espera = 0;
while (espera < 10000)
espera++; // conta silenciosamente
Loop Temporizador
 O problema dessa técnica antiga é que o 
tempo de pausa muda com a velocidade do 
computador
 Uma solução melhor é usar o relógio da CPU:
 A função clock() retorna o tempo transcorrido 
desde o início do programa, porém:
 O tempo retornado não é em segundos
 O tipo de retorno é do tipo clock_t
Loop Temporizador
 O arquivo de cabeçalhoctime (ou time.h) 
contém soluções para este problema:
 A constante CLOCKS_PER_SEC define o número 
de unidades de tempo por segundo
 Dividindo o retorno da função clock() pela constante 
resulta no tempo em segundos
 Multiplicando um tempo em segundos pela 
constante resulta em unidades de tempo
int segundos = clock() / CLOCKS_PER_SEC;
clock_t pausa = segundos * CLOCKS_PER_SEC;
Loop Temporizador
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
cout << "Entre com o tempo de pausa em segundos: "; 
long segs;
cin >> segs;
clock_t pausa = segs * CLOCKS_PER_SEC;
cout << "Iniciando\a\n";
clock_t inicio = clock();
while (clock() – inicio < pausa)
; 
cout << "Pronto\a\n";
system("pause");
return 0;
}
Apelidos de Tipos
 C++ permite definir um apelido para um tipo 
existente usando um dos métodos abaixo:
 Método define (linguagem C)
 Método typedef (linguagem C++)
#define BYTE char
typedef char byte;
typedef unsigned short ushort;
typedef char * string;
typedef long clock_t;
Loop do while
 O loop do while é diferente dos demais por 
verificar a condição apenas na saída do loop
do
corpo
while (condição);
Repete enquanto a condição é verdadeira
Instrução (ou bloco de instruções) a ser repetida
Loop do while
instrução1;
do
istrução2;
while (teste);
instrução3;
instrução 1
instrução 3
instrução 2
teste
Loop do while
falso
verdadeiro
Loop do while
 No loop do while o corpo do loop é executado 
pelo menos uma vez 
 O corpo do loop pode ser um bloco de 
instruções delimitado por chaves
 O loop do while termina com ponto e vírgula
do
{
instruções;
} 
while (teste);
Loop do while
#include <iostream>
using namespace std;
int main()
{
int n; 
cout << "Digite um número entre 0-10\n";
do
{
cin >> n;
} 
while (n != 7); 
cout << "Sim, 7 é meu número favorito.\n";
system("pause");
return 0;
}
Loop do while
 A saída do programa:
Digite um número entre 0-10: 
4
5
9
3
1
7
Sim, 7 é meu número favorito.
Loops e Entrada de Texto
#include <iostream>
using namespace std;
int main()
{
char ch;
int cont = 0; 
cout << "Digite caracteres, use # para sair:\n";
cin >> ch; // lê um caractere
while (ch != '#') // testa o caractere
{
cout << ch; // imprime o caractere
++cont; // conta o número de caracteres
cin >> ch; // lê o próximo caractere
}
cout << endl << cont << " caracteres lidos.\n";
system("pause");
return 0;
}
Loops e Entrada de Texto
 A saída do programa:
 A entrada com cin ignora os caractere de 
espaços e tabulação
 A entrada com cin é armazenada em um 
buffer, por isso é possível digitar após # 
Digite caracteres, use # para sair: 
Ele pode correr#muito rápido
Elepodecorrer
13 caracteres lidos.
Loops e Entrada de Texto
 Normalmente programas que lêem a entrada 
caractere por caractere precisam examinar 
todos os caracteres incluindo espaços, 
tabulações e novas linhas:
 A função cin.get(ch) lê o próximo caractere da 
entrada e o atribui a variável ch
 A entrada com cin.get() ainda usa um buffer, 
assim é possível digitar além do #
char ch; 
cin.get(ch);
Loops e Entrada de Texto
#include <iostream>
using namespace std;
int main()
{
char ch;
int cont = 0; 
cout << "Digite caracteres, use # para sair:\n";
cin.get(ch); // lê um caractere
while (ch != '#') // testa o caractere
{
cout << ch; // imprime o caractere
++cont; // conta o número de caracteres
cin.get(ch); // lê o próximo caractere
}
cout << endl << cont << " caracteres lidos.\n";
system("pause");
return 0;
}
Loops e Entrada de Texto
 A saída do programa:
 C++ permite ter funções com o mesmo nome, 
contanto que os argumentos sejam de tipos 
(ou em quantidades) diferentes
 Este é um recurso da linguagem chamado de 
sobrecarga de funções
Digite caracteres, use # para sair: 
Ele pode correr#muito rápido
Ele pode correr
15 caracteres lidos.
Matrizes
 Vetores são visualizados como linhas de 
elementos do mesmo tipo
 Matrizes (ou vetores bidimensionais) são 
tabelas de elementos do mesmo tipo
5 4 3 8 0 9 6 7 1 2int visitas[10];
int maxtemp[4][5];
5 4 3 8 0
9 6 7 1 2
2 1 0 7 8
4 6 3 1 4
Matrizes
 Uma matriz é um vetor em que cada 
elemento também é um vetor
Maxtemp é um vetor de 4 elementos
Cada elemento é um vetor de 5 inteiros
int maxtemp[4][5];
maxtemp[0] maxtemp[1] maxtemp[2] maxtemp[3]
maxtemp
maxtemp[0][0] maxtemp[1][0] maxtemp[2][0] maxtemp[3][0]
Matrizes
 Para acessar um elemento de um vetor 
bidimensional é preciso usar dois subscritos:
 O primeiro é a linha da matriz
 O segundo é a coluna da matriz
maxtemp[0][0]
0 1 2 3 4
0
1
2
3
maxtemp[0][1] maxtemp[0][2] maxtemp[0][3] maxtemp[0][4]
maxtemp[1][0] maxtemp[1][1] maxtemp[1][2] maxtemp[1][3] maxtemp[1][4]
maxtemp[2][0] maxtemp[2][1] maxtemp[2][2] maxtemp[2][3] maxtemp[2][4]
maxtemp[3][0] maxtemp[3][1] maxtemp[3][2] maxtemp[3][3] maxtemp[3][4]
lin
h
as
colunas
Matrizes
 Um loop for dentro de outro (aninhado) é a 
escolha natural para processar vetores 
bidimensionais (matrizes)
 Usa-se um loop para mudar de linha e outro para 
mudar de coluna
for (int i = 0; i < MaxLinha; i++)
{
for (int j = 0; j < MaxColuna; j++)
cout << maxtemp[i][j] << "\t";
cout << endl;
}
Matrizes
 Vetores unidimensionais podem ser 
inicializados na instrução de declaração
 Vetores bidimensionais são inicializados por 
uma série de listas de valores entre chaves
int btus[5] = {7500, 1000, 12000, 15000, 30000};
int maxtemp[4][5] = 
{
{35, 28, 25, 20, 24}, // valores para maxtemp[0]
{15, 19, 23, 35, 32}, // valores para maxtemp[1]
{34, 36, 30, 31, 30}, // valores para maxtemp[2]
{31, 36, 38, 32, 26} // valores para maxtemp[3]
};
Matrizes
#include <iostream>
using namespace std;
const int Cids = 4;
const int Anos = 5;
int main()
{
const char * cidades[Cids] =
{"Mossoró", "Assu", "Angicos", "Baraunas"};
int maxtemp[Cids][Anos] =
{
{35, 28, 25, 20, 24}, // valores para maxtemp[0]
{15, 19, 23, 35, 32}, // valores para maxtemp[1]
{34, 36, 30, 31, 30}, // valores para maxtemp[2]
{31, 36, 38, 32, 26} // valores para maxtemp[3]
};
Continua 
Matrizes
int maxtemp[Cids][Anos] =
{
{35, 28, 25, 20, 24}, // valores para maxtemp[0]
{15, 19, 23, 35, 32}, // valores para maxtemp[1]
{34, 36, 30, 31, 30}, // valores para maxtemp[2]
{31, 36, 38, 32, 26} // valores para maxtemp[3]
};
cout << "Temperaturas máximas dos últimos anos:\n\n";
for (int i=0; i < Cids; ++i)
{
cout << cidades[i] << ":\t";
for (int j=0; j < Anos; ++j)
cout << maxtemp[i][j] << "\t";
cout << endl;
}
system("pause");
return 0;
}
Matrizes
 A saída do programa:
 O programa cria um vetor constante, seus 
elementos não podem ser modificados
Temperaturas máximas dos últimos anos:
Mossoró: 35 28 25 20 24 
Assu: 15 19 23 35 32
Angicos: 34 36 30 31 30
Baraúnas: 31 36 38 32 26
const char * cidades[Cids] =
{"Mossoró", "Assu", "Angicos", "Baraunas"};
Conclusão
 C++ oferece três variedades de loops:
 for
 while
 do while
 Um loop repete um conjunto de instruções
 A repetição continua enquanto a condição for 
verdadeira (ou não nula)
 A repetição encerra quando a condição é falsa
(ou equivalente ao valor zero)
Conclusão
 Expressões relacionais são comumente 
usadas para compor os testes de parada
 Os operadores relacionais são:
<, <=, ==, >=, >, !=
 Expressões relacionais resultam em um valor 
booleano: true ou false
 Loops aninhadosfornecem um método fácil 
para percorrer vetores bidimensionais

Outros materiais

Outros materiais