estruturas de repetição (ciclos) -...

20
Estruturas de repetição (Ciclos) 1 Universidade Metodista de Angola, Departamento de Engenharias Introdução Vamos começar por tentar resolver os seguintes exercícios com base nos conhecimentos Que 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ã.

Upload: hoangkien

Post on 24-Sep-2018

237 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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ã.

Page 2: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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

Page 3: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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

Page 4: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

• 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

Page 5: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

• 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

Page 6: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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

Page 7: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

• 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.

Page 8: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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

Page 9: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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:

Page 10: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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

Page 11: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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

Page 12: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

• 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

Page 13: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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

Page 14: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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

Page 15: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

• 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;

Page 16: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

#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

Page 17: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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

Page 18: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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

Page 19: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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

Page 20: Estruturas de repetição (Ciclos) - web.ist.utl.ptweb.ist.utl.pt/ist153068/...I_Cap_7_Estruturas_de_repeticao_ciclos.pdf · Estruturas de repetição (Ciclos) Universidade Metodista

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); }