Buscar

4 - RepetiçãoEmC_Teoria

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes
Você viu 3, do total de 29 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

Você também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes
Você viu 6, do total de 29 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

Você também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes

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ê também pode ser Premium ajudando estudantes
Você viu 9, do total de 29 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

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Repetição
‹nº›
1
‹nº›
Exemplo motivador
Faça um programa em C que pergunte a matrícula e a data de nascimento de um aluno e exiba sua matrícula e idade no dia atual.
	Entrada de matrícula e data de nascimento	
	Calcular Idade	obter data do sistema
		calcular idade
	Exibir matr,idade	
Algoritmo:
Dados necessários: matrícula, data de nascimento ( informado pelo usuário), data atual (obtido do sistema)
Respostas Exibidas : idade
‹nº›
Solução
#include <stdio.h>
#include <time.h>
#include <locale.h>
int detIdade(int diaN,int mesN,int anoN){
	int idade;
	/*+++==================================*/
	/* Para obter o dia de hoje do sistema */
	struct tm *hoje;
	time_t t;
	int diaHj,mesHj,anoHj;
	t = time(NULL); //tempo em segundos
	hoje = localtime(&t); //converte segundos para a data atual
	diaHj = hoje -> tm_mday; //acessa o dia
	mesHj = hoje -> tm_mon + 1; //acessa o mes
	anoHj = hoje -> tm_year + 1900; //acessa o ano
	/*=====================================*/
	idade = anoHj - anoN;
	// ainda não fez aniversário?
	if (mesHj< mesN || 
 (mesHj == mesN && diaHj < diaN)) 
		idade = idade - 1;
	return idade;
}
int main(void){
	int diaN,mesN,anoN,idade,matr;
	setlocale(LC_ALL, "Portuguese"); 
	printf ("\nMatríc? ");scanf ("%i", &matr);
	printf ("\nDia, mês e ano do nascimento:");
	scanf ("%d%d%d", &diaN, &mesN, &anoN);
	idade = detIdade(diaN,mesN,anoN);
	printf ("\n%i,vc está com %d anos\n",matr,idade); 
	return 0;
}
	
PROBLEMA:
O QUE DEVE SER FEITO PARA QUE ESTE PROGRAMA EXIBA A IDADE DE 10 ALUNOS?
‹nº›
Problema
Faça um programa em C que pergunte a matrícula e a data de nascimento de 10 alunos, informando a cada um, sua matrícula e idade no dia atual.
Este trecho deve ser executado 10 vezes:
Solução: 
	Entrada de matr e data de nascimento	
	Calcular Idade	obter data do sistema
		calcular idade
	Exibir matr, idade	
Estrutura de repetição
‹nº›
Estrutura de Repetição
Permite que um bloco de instruções seja executado mais de uma vez, enquanto determinadas condições (representadas por expressões lógicas) são satisfeitas. 
Normalmente, as repetições são finitas. São interrompidas quando a condição de controle não é mais satisfeita.
Quanto à quantidade de repetições (número de ciclos), há dois tipos de repetição:
Determinada: o número de ciclos é conhecido a priori
Indeterminada: o número de ciclos é desconhecido
	Entrada de matr e data de nascimento	
	Calcular Idade	obter data do sistema
		calcular idade
	Exibir matr, idade	
‹nº›
Controlando os tipos de repetição
Indeterminada: 
A quantidade de execuções é desconhecida 
Nadar até cansar
Lotação de um elevador por peso máximo
A repetição é interrompida por determinação do usuário (por exemplo, ao digitar um valor específico, considerado finalizador) ou pela ocorrência de um determinado contexto (avaliação de valores das variáveis)
Determinada: 
A quantidade de execuções é conhecida a priori. 
Nadar 50 piscinas 
Lotação de um elevador por número de pessoas
A repetição é interrompida ao atingir a meta determinada e, para isso é necessário contar o número de execuções
X
Quanto a quantidade de ciclos, a repetição pode ser:
‹nº›
6
‹nº›
Estrutura de repetição while 
O comando while é uma das estruturas de repetição da linguagem C
Sintaxe:
bloco
condição
V
F
while (condição)
{
	 bloco
}
O bloco de comandos será executado enquanto o resultado da expressão lógica (condição) seja verdadeiro:
Avalia a expressão lógica da condição. Caso, seja verdadeira, executa o bloco de instruções
Ao encontrar o fim do bloco, o controle da execução retorna para a 1ª linha do laço e avalia novamente a expressão lógica: • Se continua verdadeira, reexecuta o bloco; • Se falsa, interrompe a execução do bloco e continua no próximo comando após a estrutura de repetição.
 •Obs: se o teste da expressão lógica da condição for falso desde o início, o bloco não é executado.
‹nº›
Código a ser repetido no exemplo
#include <stdio.h>
#include <time.h>
#include <locale.h>
int detIdade(int diaN,int mesN,int anoN);
int main(void){
	int diaN,mesN,anoN,idade,matr;
	setlocale(LC_ALL, "Portuguese"); 
	
	
	
	return 0;
}
#include <stdio.h>
#include <time.h>
#include <locale.h>
int detIdade(int diaN,int mesN,int anoN);
int main(void){
	int diaN,mesN,anoN,idade,matr;
	setlocale(LC_ALL, "Portuguese"); 
	while(condição)
	{
	 printf ("\nMatríc? ");scanf ("%i", &matr);
 printf ("\nDia, mês e ano do nascimento:");
 scanf ("%d%d%d", &diaN, &mesN, &anoN);
 idade = detIdade(diaN,mesN,anoN);
 	 printf ("\n%i,vc está com %d anos\n", matr, idade);
 }
 return 0;
}
	
printf ("\nMatríc? ");scanf ("%i", &matr);
printf ("\nDia, mês e ano do nascimento:");
scanf ("%d%d%d", &diaN, &mesN, &anoN);
idade = detIdade(diaN,mesN,anoN);
printf ("\nVocê está com %d anos\n", idade);
printf ("\nMatríc? ");scanf ("%i", &matr);
printf ("\nDia, mês e ano do nascimento:");
scanf ("%d%d%d", &diaN, &mesN, &anoN);
idade = detIdade(diaN,mesN,anoN);
printf ("\n%i,vc está com %d anos\n",matr,idade);
‹nº›
Repetição Determinada com while
‹nº›
Exemplo
Faça um programa em C que pergunte a matrícula e a data de nascimento de 10 alunos, informando a cada um, sua matrícula e idade no dia atual.
	Entrada de matr e data de nascimento	
	Calcular Idade	obter data do sistema
		calcular idade
	Exibir matr e idade	
 10 vezes
‹nº›
Repetição Determinada com while
É necessário contar o número de execuções do bloco para interromper o ciclo quando o número de repetições atingir a meta.
Para contar é preciso:
 uma variável para armazenar o número de repetições já executadas (contador)
Deve ser inicializada ANTES da estrutura de repetição
Deve ser atualizada a cada repetição
o número total de repetições desejadas ( meta) 
 "Enquanto o contador de repetições não tiver o mesmo valor da meta, o bloco de comandos deve ser executado"
‹nº›
 
Condição para executar: o número de execuções do bloco ainda não atingiu a meta  COMPARAR o valor da variável contador com a meta
o número total de repetições desejadas ( meta) 
uma variável contador para armazenar o número de repetições já executadas
 qual o valor inicial dessa variável? 
 como atualizar o valor dessa variável cada vez que o processo é realizado?
while (
 )
 ?? < meta
 jafiz < meta 
}
int jafiz;
jafiz = 0;
jafiz =jafiz + 1;
{
Repetição Determinada com while
‹nº›
12
‹nº›
Repetição Determinada- Estrutura Básica
int jafiz;
jafiz = 0;
while (jafiz < meta)
{
	................
	................
	jafiz = jafiz + 1;
}
// variável contador – armazena o número de execuções realizadas
// condição
// atualização do contador
// inicialização da variável contador 
A meta pode ser:
constante, especificada no enunciado ou
 obtida/calculada ANTES da execução da estrutura de repetição
‹nº›
Solução do exemplo para 10 alunos 
#include <stdio.h>
#include <time.h>
#include <locale.h>
int detIdade(int diaN,int mesN,int anoN);
int main(void){
 int diaN,mesN,anoN,idade,matr;
 int jafiz;
 setlocale(LC_ALL, "Portuguese"); 	
	jafiz = 0;
	while (jafiz < 10)	{
		printf ("\nMatríc? ");scanf ("%i", &matr);
	printf ("\nDia, mês e ano do nascimento:");
	scanf ("%d%d%d", &diaN, &mesN, &anoN);
	idade = detIdade(diaN,mesN,anoN);
	printf ("\n%i,vc está com %d anos\n", matr, idade);
		jafiz = jafiz + 1;
	}
	return 0;
}
Meta constante 10  especificada no enunciado
Como informar a idade de cada um dos alunos de uma turma cuja quantidade é conhecida pelo usuário?
Faça um programa em C que pergunte a matrícula e a data de nascimento de 10 alunos, informando a cada um, sua matricula e idade no dia atual.
‹nº›
Solução do exemplo para n (obtido) alunos
#include <stdio.h>
#include <time.h>
#include <locale.h>
int detIdade(int diaN,int mesN,int anoN);
int main(void){
 int diaN,mesN,anoN,idade,matr;int jafiz, nAlunos;
 printf( "Quantos alunos?");
	 scanf( "%d", &nAlunos);
 setlocale(LC_ALL, "Portuguese"); 	
	 jafiz = 0;
	 while (jafiz < nAlunos)	 {
		printf ("\nMatríc? ");scanf ("%i", &matr);
	printf ("\nDia, mês e ano do nascimento:");
	scanf ("%d%d%d", &diaN, &mesN, &anoN);
	idade = detIdade(diaN,mesN,anoN);
	printf ("\n%i,vc está com %d anos\n", matr, idade);
		jafiz = jafiz + 1;
	 }
	return 0;
}
Faça um programa em C que pergunte a quantidade de alunos e, a seguir, a matrícula e a data de nascimento de cada aluno, informando a cada um, sua matrícula e idade no dia atual.
Meta nAlunos obtida ANTES da execução da estrutura de repetição
‹nº›
Repetições aninhadas
‹nº›
Exemplo
Faça um programa em C que mostre a matrícula e a idade de cada um dos alunos de 5 turmas. 
Para cada turma, é obtido a quantidade de alunos e, a seguir, a matrícula e a data de nascimento de cada aluno desta turma, informando a cada um, sua matrícula e idade no dia atual.
#include <stdio.h>
#include <time.h>
#include <locale.h>
int detIdade(int diaN,int mesN,int anoN);
int main(void){
 int diaN,mesN,anoN,idade,matr;
 int jafiz, nAlunos;
 setlocale(LC_ALL, "Portuguese");
 printf( "Quantos alunos?");
	scanf( "%d", &nAlunos);
	jafiz = 0;
	while (jafiz < nAlunos)
	{	printf ("\nMatríc? ");scanf ("%i", &matr);
	printf ("\nDia, mês e ano do nascimento:");
	scanf ("%d%d%d", &diaN, &mesN, &anoN);
	idade = detIdade(diaN,mesN,anoN);
	printf ("\n%i,vc está com %d anos\n", matr, idade);
		jafiz = jafiz + 1;
	}
	return 0;
}
Processamento de 1 turma
5
vezes
‹nº›
Repetições Aninhadas
Uma estrutura de repetição pode ser utilizada dentro de outra estrutura de repetição.
Cada estrutura de repetição tem sua variável de controle!!!
Exemplo:
Para cada turma ( contador de turmas)
	Para cada aluno desta turma ( contador de alunos da turma)
		obtém dados do aluno
		calcula idade do aluno
		exibe matr e idade do aluno
‹nº›
Repetições Aninhadas - Exemplo
Faça um programa em C que mostre a matrícula e a idade de cada um dos alunos de 5 turmas. 
Para cada turma, é obtido a quantidade de alunos e, a seguir, a matrícula e a data de nascimento de cada aluno desta turma, informando a cada um, sua matrícula e idade no dia atual.
Cada estrutura de repetição tem sua variável de controle!!!
Para cada turma ( contador de turmas)
	Para cada aluno desta turma ( contador de alunos da turma)
		obtém dados do aluno
		calcula idade do aluno
		exibe matr e idade do aluno
contTurma=0
while (contTurma <5){
	//Processa uma turma
	contTurma=contTurma+1
}
scanf("%d“,&nAlunos);
contAlunos=0
while (contAlunos < nAlunos){
	//Processa um aluno
	contAlunos=contAlunos+1
}
‹nº›
Solução 5 turmas – sem função para turma
#include <stdio.h>
#include <time.h>
#include <locale.h>
int detIdade(int diaN,int mesN,int anoN);
int main(void){
 int diaN,mesN,anoN,idade,contAlunos, nAlunos,matr;
 int contTurmas;
 setlocale(LC_ALL, "Portuguese"); 	
 contTurmas=0;
 while (contTurmas<5){
	 printf( "Quantos alunos?"); scanf( "%d", &nAlunos);
	 contAlunos = 0;
	 while (contAlunos < nAlunos){
			printf ("\nMatríc? ");scanf ("%i", &matr);
			printf ("\nDia, mês e ano do nascimento:");
			scanf ("%d%d%d", &diaN, &mesN, &anoN);
			idade = detIdade(diaN,mesN,anoN);
			printf ("\n%i,vc está com %d anos\n", matr, idade);
			contAlunos = contAlunos + 1;
}
contTurmas=contTurmas+1;
 }
 return 0;
}
‹nº›
Solução 5 turmas – com função para turma
#include <stdio.h>
#include <time.h>
#include <locale.h>
int detIdade(int diaN,int mesN,int anoN);
void procUmaTurma(int nAlunos){
	int diaN,mesN,anoN,idade,contAlunos,matr;
	int contAlunos = 0;
	while (contAlunos < nAlunos){
		printf ("\nMatríc? ");scanf ("%i", &matr);
		printf ("\nDia, mês e ano do nascimento:");
		scanf ("%d%d%d", &diaN, &mesN, &anoN);
		idade = detIdade(diaN,mesN,anoN);
	 printf ("\n%i,vc está com %d anos\n", matr, idade);
		contAlunos = contAlunos + 1;
	}
	return;
}
int main(void){
 int contTurmas,nAlunos;
 setlocale(LC_ALL, "Portuguese"); 	
 contTurmas=0;
 while (contTurmas<5){
	 printf( "Quantos alunos?");
	 scanf( "%d", &nAlunos);
	 procUmaTurma(nAlunos));
	 contTurmas=contTurmas+1;
 }
 return 0;
}
‹nº›
Repetição Indeterminada com while
‹nº›
Repetição Indeterminada com while
Quando a estrutura de repetição é iniciada, a quantidade de execuções do bloco é desconhecida.
A interrupção pode ser determinada:
pelo usuário, ao digitar um valor que interrompe a execução ( flag)
pelo contexto, quando valores de variáveis satisfazem a condição de término
 "Enqto não for digitado o valor finalizador, 
 o bloco de comandos deve ser executado"
while
}
{
(o usuário quiser)
while
}
{
(contexto de término não ocorrer)
 " Enqto os valores de variáveis ≠ da condição de parada, 
 o bloco de comandos deve ser executado"
‹nº›
Repetição Indeterminada interrompida pelo usuário 
O usuário deve digitar um valor pré-estabelecido, em geral definido no enunciado, quando deseja interromper o programa. Este valor é chamado de flag ou sinalizador de fim 
Exemplo: 
Faça um programa em C que pergunte a matrícula e a data de nascimento dos alunos de uma turma, informando a cada um, sua matricula e idade no dia atual. O término da entrada de dados ocorre quando o usuário digitar 0 como valor de matrícula.
Variável de controle da repetição: matrícula
Valor digitado que interrompe a repetição: 0
while
}
{
(o usuário quiser)
while
}
{
(o valor digitado em determinada variável != flag)
while
}
{
(matr!= 0)
‹nº›
24
‹nº›
 
Condição para executar: o valor digitado pelo usuário e armazenado na variável responsável pela comunicação de continuação ou não da repetição não é o valor finalizador  COMPARAR o valor da variável com o valor finalizador
Repetição Indeterminada interrompida pelo usuário 
 ?? != flag	 
 varEnt != flag 
while ( )
}
int varEnt;
scanf("%i“,&varEnt);
scanf("%i“,&varEnt);
{
printf(“Digite outro valor ou ... para finalizar:”);
printf(“Digite outro valor ou ... para finalizar:”);
É necessário conhecer :
 o valor finalizador (flag) 
 a variável de entrada de dados (varEnt) que armazena o valor digitado
 qual o valor inicial dessa variável? 
 Preenchido pelo usuário
como atualizar o valor dessa variável cada vez que o processo é realizado? 
Perguntando novamente ao usuário
‹nº›
25
‹nº›
Solução do exemplo para um n° indeterminado de alunos 
#include <stdio.h>
#include <time.h>
#include <locale.h>
int detIdade(int diaN,int mesN,int anoN);
int main(void){
 int diaN,mesN,anoN,idade,matr;
 int jafiz;
 setlocale(LC_ALL, "Portuguese"); 
printf ("\nMatrícula ou 0 para finalizar: "); 
scanf ("%i", &matr);
	while (matr != 0)	{
		printf ("\nDia, mês e ano do nascimento:");
	scanf ("%d%d%d", &diaN, &mesN, &anoN);
	idade = detIdade(diaN,mesN,anoN);
	printf ("\n%i,vc está com %d anos\n", matr, idade);
		printf ("\nMatrícula ou 0 para finalizar: "); 
		scanf ("%i", &matr);
	}
	return 0;
}
Valor da variável matrícula indica se o usuário quer ou não continuar.
Faça um programa em C que pergunte a matrícula e a data de nascimento dos alunos de uma turma, informando a cada um, sua matricula e idade no dia atual. O término da entrada de dados ocorre quando o usuário digitar 0 como valor de matrícula.
‹nº›
Repetição Indeterminada interrompida pelo contexto 
O valor de uma ou mais variáveis determinam a continuação ou interrupção do bloco de execução. O contexto ( valor atual das variáveis) de término é descrito no enunciado.
Exemplo: 
Faça um programa em C que pergunte a matrícula e a data de nascimento dos alunos de uma turma, informando a cada um, sua matricula e idade no dia atual. O término da entrada de dados ocorre quando 3 alunos menores de idade tiverem sido processados.
Variável de controle da repetição: quantidade demenores de idade (qtMenores)
Contexto que interrompe a repetição: qtMenores < 3
while
}
{
(matr!= 0)
while
}
{
(contexto de término não ocorrer)
‹nº›
27
‹nº›
 
Condição para executar: o valor digitado pelo usuário e armazenado na variável responsável pela comunicação de continuação ou não da repetição não é o valor finalizador  COMPARAR o valor da variável com o valor finalizador
Repetição Indeterminada interrompida pelo usuário 
 ?? != flag	 
 varEnt != flag 
while ( )
}
int varEnt;
scanf("%i“,&varEnt);
scanf("%i“,&varEnt);
{
printf(“Digite outro valor ou ... para finalizar:”);
printf(“Digite outro valor ou ... para finalizar:”);
É necessário conhecer :
 o valor finalizador (flag) 
 a variável de entrada de dados (varEnt) que armazena o valor digitado
 qual o valor inicial dessa variável? 
 Preenchido pelo usuário
como atualizar o valor dessa variável cada vez que o processo é realizado? 
Perguntando novamente ao usuário
‹nº›
28
‹nº›
Solução do exemplo para um n° indeterminado de alunos 
#include <stdio.h>
#include <time.h>
#include <locale.h>
int detIdade(int diaN,int mesN,int anoN);
int main(void){
 int diaN,mesN,anoN,idade,matr;
 int qtMen;
 setlocale(LC_ALL, "Portuguese"); 
 qtMen=0;
	while (qtMen < 3)	{
		printf ("\nMatríc? ");scanf ("%i", &matr);
		printf ("\nDia, mês e ano do nascimento:");
	scanf ("%d%d%d", &diaN, &mesN, &anoN);
	idade = detIdade(diaN,mesN,anoN);
	printf ("\n%i,vc está com %d anos\n", matr, idade);
		if (idade <18)
			qtMen++;
	}
	return 0;
}
A quantidade de ocorrências de menores de idade controla a repetição.
Faça um programa em C que pergunte a matrícula e a data de nascimento dos alunos de uma turma, informando a cada um, sua matricula e idade no dia atual. O término da entrada de dados ocorre quando 3 alunos menores de idade tiverem sido processados..
‹nº›
Repetição Indeterminada: repetir um número desconhecido de vezes
Controle da repetição: Pode ser interrompido de duas formas: 
Por determinação do usuário: via entrada de dados
Por determinado contexto: valores das variáveis
Exemplos: 
 enquanto a soma dos valores digitados for inferior a 7 
 enquanto o número de inscritos na turma 1 for diferente do número de inscritos na turma 2
while 
}
int var;
scanf(“%d”,&var);
{
(var != valor finaizador )
scanf(“%d”,&var);
Repetição Determinada: repetir um número conhecido de vezes 
Controle da repetição: 
 Por contagem das execuções do bloco.
 (interrompe quando atinge a meta)
Resumo 
while (
}
int jafiz;
jafiz = 0;
jafiz =jafiz + 1;
{
jafiz < meta )
‹nº›
30
‹nº›

Outros materiais