Estruturas de repetição (Ciclos) -...

Post on 24-Sep-2018

239 views 0 download

Transcript of Estruturas de repetição (Ciclos) -...

Estruturas de repetição (Ciclos)

1Universidade Metodista de Angola, Departamento de Engenharias

Introdução

Vamos começar por tentar resolver os seguintes exercícios com base nos conhecimentosQue já temos até agora.

Problema 1:

Escreva um programa em ANSI-C que escreve os primeiros 10 números inteiros no ecrã.

Problema 2:

Escreva um programa em C que escreve os primeiros 100 números inteiros no ecrã.

Problema 3:

Escreva um programa em C que escreve os primeiros 1000 números inteiros no ecrã.

Problema 4:

Escreva um programa em C que escreve os primeiros 10.000 números inteiros no ecrã.

Estruturas de repetição (Ciclos)

2Universidade Metodista de Angola, Departamento de Engenharias

#include <stdio.h>#include <stdlib.h>

int main(){

printf(“1”);printf(“2”);printf(“3”);printf(“4”);printf(“5”);printf(“6”);printf(“7”);printf(“8”);printf(“9”);printf(“10”);

exit(0);}

Solução do Problema 1

#include <stdio.h>#include <stdlib.h>

int main(){

putchar(‘1’);putchar(‘2’);putchar(‘3’);putchar(‘4’);putchar(‘5’);putchar(‘6’);putchar(‘7’);putchar(‘8’);putchar(‘9’);putchar(‘10’); //erro

exit(0);}

ou

#include <stdio.h>#include <stdlib.h>

int main(){

putchar(‘1’);putchar(‘2’);putchar(‘3’);putchar(‘4’);putchar(‘5’);putchar(‘6’);putchar(‘7’);putchar(‘8’);putchar(‘9’);putchar(‘1’);putchar(‘0’);

exit(0);}

ou

#include <stdio.h>#include <stdlib.h

int main(){

puts(“1”);puts(“2”);puts(“3”);puts(“4”);puts(“5”);puts(“6”);puts(“7”);puts(“8”);puts(“9”);puts(“10”);

exit(0);}

Solução 1 Solução 4Solução 3Solução 2

ou

Estruturas de repetição (Ciclos)

3Universidade Metodista de Angola, Departamento de Engenharias

Solução do Problema 1

Outputs:

Solução 1 Solução 2 Solução3 Solução4

imprime o seguinte: não funciona imprime o seguinte: imprime o seguinte:

12345678910 12345678910 123455678910

• Resolução do Problema 2, tinha que se usar 100 instruções printf ou puts. • Resolução do Problema 3, tinha que se usar 1000 instruções printf ou puts.• Resolução do Problema 4, tinha que se usar 10.000 instruções printf ou puts.

• Não é a melhor forma de programar.• Existem instruções em C que permitem fazer repetições• Essas instruções são as seguintes:

• Instrução while também conhecido por ciclo while• Instrução do-while• Instrução for também conhecido por ciclo for

– Essas instruções são as mesmas na linguagem C++, linguagem java.– Quando se diz que são as mesmas quer dizer a sintaxe é exactamente igual nessas linguagens de

programação.– No visual basic a sintaxe é um pouco diferente.

Estruturas de repetição (Ciclos)

4Universidade Metodista de Angola, Departamento de Engenharias

• Vamos então estudar cada uma delas, começando pela sintaxe e depois exemplos.• Lembrem-se que queremos resolver o problema 2, problema 3 e o problema

4.• Instrução while

Sintaxe:while ( condição )

instrução ou bloco de instruções;

Estruturas de repetição (Ciclos)

5Universidade Metodista de Angola, Departamento de Engenharias

condiçãoNão Sim

Instruções; ou bloco de instruções

Entrada do ciclo

Saída do ciclo

Fluxograma da instrução while

Interpretação: enquanto a condição for verdadeira executar o bloco de instruções

Estruturas de repetição (Ciclos)

6Universidade Metodista de Angola, Departamento de Engenharias

#include <stdio.h>#include <stdlib.h>

int main(){

int i = 1;

while( i <= 10 ){

printf(“%d”,i);i++;

}exit(0);}

Solução do problema 1Usando a instrução while

#include <stdio.h>#include <stdlib.h>

int main(){

int i = 1;

while( i <= 100 ){

printf(“%d”,i);i++;

}exit(0);}

Solução do problema 2Usando a instrução while

#include <stdio.h>#include <stdlib.h>

int main(){

int i = 1;

while( i <= 1000 ){

printf(“%d”,i);i++;

}exit(0);}

Solução do problema 3Usando a instrução while

Instrução while

• Instrução do-whileSintaxe:

doinstrução ou bloco de instruções;

while ( condição );

Estruturas de repetição (Ciclos)

7Universidade Metodista de Angola, Departamento de Engenharias

condiçãoNão Sim

Instruções; ou bloco de instruções

Entrada do ciclo

Saída do ciclo

Fluxograma da instrução do-while

Interpretação: do fazer while enquanto

Fazer, enquanto….As instruções são executadas pelo menos

uma vez.

Estruturas de repetição (Ciclos)

8Universidade Metodista de Angola, Departamento de Engenharias

#include <stdio.h>#include <stdlib.h>

int main(){

int i = 1;

do{

printf(“%d”,i);i++;

}while( i <= 10 );exit(0);}

Solução do problema 1Usando a instrução do-while

#include <stdio.h>#include <stdlib.h>

int main(){

int i = 1;

do{

printf(“%d”,i);i++;

}while( i <= 100 );exit(0);}

Solução do problema 2Usando a instrução do-while

#include <stdio.h>#include <stdlib.h>

int main(){

int i = 1;

do{

printf(“%d”,i);i++;

}while( i <= 1000 );exit(0);}

Solução do problema 3Usando a instrução do-while

Instrução do-while

Estruturas de repetição (Ciclos)

9Universidade Metodista de Angola, Departamento de Engenharias

• Instrução forSintaxe:

for( inicializações ; condição ; pos-instrução)instrução ou bloco de instruções;

Fluxograma da instrução for

condiçãoNão Sim

Instruções; ou bloco de instruções

Entrada do ciclo

Saída do ciclo

inicializações

Pós-instrução

for( i = 1 ; i <= 10 ; i++ ){printf(“%d”,i);

}

Exemplo:

Estruturas de repetição (Ciclos)

10Universidade Metodista de Angola, Departamento de Engenharias

#include <stdio.h>#include <stdlib.h>

int main(){

int i;

for( i = 1 ; i <= 100 ; i++){

printf(“%d”,i);}

exit(0);}

Solução do problema 1Usando a instrução for

#include <stdio.h>#include <stdlib.h>

int main(){

int i;

for( i = 1 ; i <= 10 ; i++ ){

printf(“%d”,i);}

exit(0);}

Solução do problema 2Usando a instrução for

#include <stdio.h>#include <stdlib.h>

int main(){

int i;

for( i = 1 ; i <= 1000 ; i++){

printf(“%d”,i);}

exit(0);}

Solução do problema 3Usando a instrução forInstrução for

Estruturas de repetição (Ciclos)

11Universidade Metodista de Angola, Departamento de Engenharias

condiçãoNão Sim

Instruções; ou bloco de instruções

Entrada do ciclo

Saída do ciclo

condiçãoNão Sim

Instruções; ou bloco de instruções

Entrada do ciclo

Saída do ciclo condiçãoNão Sim

Instruções; ou bloco de instruções

Entrada do ciclo

Saída do ciclo

inicializações

Pós-instrução

Fluxograma do ciclo while Fluxograma do ciclo do-while Fluxograma do ciclo for

Resumo

Testa a condição antes de Executar as instruções

As instruções são executadasZero ou mais vezes

Testa a condição depois de Executar as instruções

As instruções são executadasUma ou mais vezes

Testa a condição antes de Executar as instruções

As instruções são executadasZero ou mais vezes

• Instrução break1. Terminar a execução das instruções dentro da instrução switch.2. A instrução break, quando aplicada a um ciclo, termina o correspondente

ciclo.

• Instrução continue– A instrução continue dentro de um ciclo, permite passar para próxima

iteração.

Estruturas de repetição (Ciclos)

12Universidade Metodista de Angola, Departamento de Engenharias

#include <stdio.h>#include <stdlib.h>

int main(){

int i;

for( i = 1 ; i <= 30 ; i++ ){

if(i==15)break;

else printf(“%d ”,i);

}exit(0);}

Exemplo usando a instrução break

O que é que esse programa imprime no ecrã?

Resposta: O programa imprime:1 2 3 4 5 6 7 8 9 10 11 12 13 14

Imprime todos os números inteiros entre 0 e 15

Estruturas de repetição (Ciclos)

13Universidade Metodista de Angola, Departamento de Engenharias

#include <stdio.h>#include <stdlib.h>

int main(){

int i;

for( i = 1 ; i <= 30 ; i++ ){

if(i%2==0)continue;

else printf(“%d ”,i);

}exit(0);}

Exemplo usando a instrução continue

O que é que esse programa imprime no ecrã?

Resposta: O programa imprime:1 3 5 7 9 11 13 15 16 17 19 21 23 25 27 29

Imprime todos os números impares entre 0 e 30

Estruturas de repetição (Ciclos)

14Universidade Metodista de Angola, Departamento de Engenharias

#include <stdio.h>

int main(){

int i, j, n;char c;

printf("introduza um número:");scanf("%d",&n);//c=getchar();printf("introduza um caracter:");scanf("%c",&c);

for( i = 1 ; i <= n ; i++){

for( j = 1 ; j <= n ; j++)putchar(c);putchar('\n');

}exit(0);

}

O programa exemplifica dois ciclos for Encadeados.

Este exemplo foi tirado do livro do prof.Luis Damas. (pag 150).

O programa pede ao utilizador que insiraUm número e um caracter, e posteriormenteEscreve n linhas, cada uma delas com n caracteres.

exemplo:

Introduza um número: 4Introduza um caracter:#Output:# # # # # # # ## # # ## # # #

Os ciclos podem ser encadeados

• Ciclos que nunca terminam, ou seja, a condição é sempre verdadeira• Exemplos

• Esses tipos de ciclos são normalmente usados quando não se sabe a partida o número de vezes que se vai iterar o ciclo.

• Para terminar o ciclo infinito usa-se a instrução break ou return;

• No slide que se segue, é mostrado dois exemplos de terminação de ciclos infinitos usando as instruções break e return.

• O exemplo que se segue, permite esclarecer a diferença entre a instrução break e a instrução return.

Estruturas de repetição (Ciclos)

15Universidade Metodista de Angola, Departamento de Engenharias

Ciclos infinitos

while (1)instruções;

doInstruções; while(1);

for( ; ; )instruções;

#include <stdio.h>#include <stdlib.h>

int main()

int i=1;

for( ; ; ){

if(i==3)break;

i++;}printf("Rubem");exit(0);

}

Estruturas de repetição (Ciclos)

16Universidade Metodista de Angola, Departamento de Engenharias

#include <stdio.h>#include <stdlib.h>

int main()

int i=1;

for( ; ; ){

if(i==3)return;

i++;}printf("Rubem");exit(0);

}

Output:Rubem

Output:None - Nothing

O break termina o ciclo O return sai da função, ou seja, sai da função main

Exercícios

17Universidade Metodista de Angola, Departamento de Engenharias

Escreva um programa em Linguagem C que lê um inteiro positivo e determina se esse número é primo.Solução:

O número 7 é primo?

7 % 1 = 07 % 2 = 17 % 3 = 17 % 4 = 37 % 5 = 27 % 6 = 17 % 7 = 0

O número 6 é primo?

6 % 1 = 06 % 2 = 06 % 3 = 06 % 4 = 26 % 5 = 16 % 6 = 0

iresto

num

resto = 0 e i = num

resto = 0 e i ≠ num

18Universidade Metodista de Angola, Departamento de Engenharias

inicio

Ler (num)

i = 2

resto=num % i

resto == 0 e num == i ?

resto == 0 e num ≠ i ?

“é primo”

“não é primo”

i <= num ?

i++

fim

sim

não

sim

não

sim

não

do-while clcle

#include <stdio.h>#include <stdlib.h>

int main(){

int num,i,resto;

i=2;printf("insira um inteiro positivo:");scanf("%d",&num);do{

resto = num % i;if(resto == 0 && num == i){printf("\n%d é primo\n",num);

}elseif(resto == 0 && num != i){

printf("\n%d ñ é primo\n",num);break;

}i++;

}while(i <= num);

exit(0);}

Solução 1

19Universidade Metodista de Angola, Departamento de Engenharias

inicio

Ler (num)

divisor = 2resto=num % divisor

resto != 0

resto = num % divisor

divisor ++

num == divisor ?

“é primo” “é primo”

fim

sim

sim

não

não

while cicle

#include <stdio.h>#include <stdlib.h>

int main(){int num,divisor,resto;

printf(“insira um numero:");scanf("%d",&num);

divisor=2;

resto = num % divisor;

while(resto != 0){divisor++;

resto = num % divisor;}

if(divisor == num)printf("%d é primo",num);

elseprintf("%d ñ é primo",num);

exit(0); }

Solução 2

20Universidade Metodista de Angola, Departamento de Engenharias

Esses algoritmo ou programas só funcionampara números inteiros maiores que 1

#include <stdio.h>#include <stdlib.h>

int main(){int num,i,resto;i=2;printf("insira um inteiro positivo:");scanf("%d",&num);

if(num == 1){ /*Para n = 1*/printf(“%d é primo”,num);return;

}

do{

resto = num % i;if(resto == 0 && num == i){

printf("\n%d é primo\n",num);}else

if(resto == 0 && num != i){printf("\n%d ñ é primo\n",num);break;

}i++;

}while(i <= num);

exit(0);}

#include <stdio.h>#include <stdlib.h>

int main(){int num,divisor,resto;

printf(“insira um numero:");scanf("%d",&num);divisor=2;

if(num == 1){//para n=1printf(“%d é primo”,num);return;

}resto = num % divisor;

while(resto != 0){divisor++;

resto = num % divisor;}

if(divisor == num)printf("%d é primo",num);

elseprintf("%d ñ é primo",num);

exit(0); }