Algoritmos
computacional que executa uma tarefa bem definida, sendo que essa tarefa pode ser executada (chamada) diversas vezes num mesmo programa.
Necessidade de dividir um problema computacional em pequenas partes. Os programadores verificaram que muitas destas pequenas partes se repetiam. Ex.: Impresso de mensagens, zerar um vetor, fazer uma operao matricial, etc.
Deve-se usar subrotinas sempre que: Utilizar uma parte do cdigo em vrias partes do programa;
No funcionam sozinhas: devem ser chamadas por um programa principal ou por outra subrotina
Facilita a legibilidade do cdigo atravs da: estruturao (subrotinas so agrupadas fora do programa principal) enxugamento (atravs de diversas chamadas da mesma subrotina)
Funes: retornam valor. So utilizadas para realizar uma operao e retornam alguma resposta relativa operao realizada.
<nome do procedimento> (<lista de parmetros>) { <declarao de variveis locais> <comandos> } Variveis necessrias para a
codificao do procedimento, alm das passados na lista de parmetros.
imprimeMaior(inteiro X, inteiro Y)
imprimeMaior(inteiro X, inteiro Y) { se (X > Y) { imprima(X); } seno { imprima(Y); } } principal { inteiro A, B; leia(A,B); imprimeMaior(A,B); }
Toda varivel pertencente ao procedimento chamada de varivel local, pois ela s pode ser utilizada dentro do escopo do procedimento. Fazem parte das variveis locais de um procedimento: - as variveis declaradas no procedimento; - todos os parmetros recebidos pelo procedimento.
Chamada por valor: passado uma cpia da varivel para a subrotina, ou seja, feito uma cpia do argumento para o parmetro. Qualquer alterao feita no parmetro no reflete em alterao no argumento. Chamada por referncia: todas as alteraes realizadas no parmetro, refletem em alteraes no argumento, ou seja, ambas as variveis apontam para o mesmo endereo de memria. Para isso, necessrio utilizar o modificar ref, indicando que ser uma referncia a uma varivel.
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); P8 Z X; P9 } Linha principal seno A B C { P1 imprima(Y); P8 P2 Z Y; P3 P9 P4 } P5 } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10
imprimeMaior X Y Z
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); P8 Z X; P9 } Linha principal seno A B C { P1 imprima(Y); P8 P2 Z Y; P3 P9 P4 } P5 } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10
imprimeMaior X Y Z -
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); P8 Z X; P9 } Linha principal seno A B C { P1 imprima(Y); P8 P2 lixo lixo lixo Z Y; P3 P9 P4 } P5 } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10
imprimeMaior X Y Z -
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); P8 Z X; P9 } principal Linha seno A B C { P1 imprima(Y); P8 P2 lixo lixo lixo Z Y; P3 22 lixo lixo P9 P4 } P5 } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10
imprimeMaior X Y Z -
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); P8 Z X; P9 } principal Linha seno A B C { P1 imprima(Y); P8 P2 lixo lixo lixo Z Y; P3 22 lixo lixo P9 P4 22 11 lixo } P5 } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10
imprimeMaior X Y Z -
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); P8 Z X; P9 } principal Linha seno A B C { P1 imprima(Y); P8 P2 lixo lixo lixo Z Y; P3 22 lixo lixo P9 P4 22 11 lixo } P5 22 11 lixo } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10
imprimeMaior X Y Z -
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); P8 Z X; P9 } principal Linha seno A B C { P1 imprima(Y); P8 P2 lixo lixo lixo Z Y; P3 22 lixo lixo P9 P4 22 11 lixo } P5 22 11 lixo } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10 22 11 lixo
imprimeMaior X Y Z 22 11 lixo
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) // (22 > 11) P7 { imprima(X); P8 Z X; P9 } principal Linha seno A B C { P1 imprima(Y); P8 P2 lixo lixo lixo Z Y; P3 22 lixo lixo P9 P4 22 11 lixo } P5 22 11 lixo } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10 22 22 11 11 lixo lixo
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); // imprima (22) P8 Z X; P9 } principal Linha seno A B C { P1 imprima(Y); P8 P2 lixo lixo lixo Z Y; P3 22 lixo lixo P9 P4 22 11 lixo } P5 22 11 lixo } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10 22 22 22 11 11 11 lixo lixo lixo
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); P8 Z X; // Z 22 P9 } principal Linha seno A B C { P1 imprima(Y); P8 P2 lixo lixo lixo Z Y; P3 22 lixo lixo P9 P4 22 11 lixo } P5 22 11 lixo } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10 22 22 22 22 11 11 11 11 lixo lixo lixo
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); P8 Z X; // Z 22 P9 } principal Linha seno A B C { P1 imprima(Y); P8 P2 lixo lixo lixo Z Y; P3 22 lixo lixo P9 P4 22 11 lixo } P5 22 11 lixo } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10 22 22 22 22 11 11 11 11 lixo lixo lixo 22
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); P8 Z X; P9 } principal Linha seno A B C { P1 imprima(Y); P8 P2 lixo lixo lixo Z Y; P3 22 lixo lixo P9 P4 22 11 lixo } P5 22 11 lixo } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); }
P6 P7 P8 P9 P8 P9 P10 22 22 22 22 11 11 11 11 lixo lixo lixo 22
P6 imprimeMaior(inteiro X, inteiro Y,ref inteiro Z) { se (X > Y) P7 { imprima(X); P8 Z X; P9 } principal Linha seno A B C { P1 imprima(Y); P8 P2 lixo lixo lixo Z Y; P3 22 lixo lixo P9 P4 22 11 lixo } P5 22 11 lixo } P1 principal { P2 inteiro A, B, C; 22; P3 A 11; P4 B P5 imprimeMaior(A,B,C); P10 imprima(C); //imprima(22) }
P6 P7 P8 P9 P8 P9 P9 22 22 22 22 11 11 11 11 lixo lixo lixo 22
22
11
22
Em C, para que uma subrotina atue como um procedimento devemos declarar algo do tipo:
void imprime (int val) { printf( %d ,val); }
Variveis do main: x
um tipo especial de procedimento Retorna como resultado o valor calculado pela funo, que deve ser do tipo bsico definido.
<tipo bsico> <nome da funo> (<lista de parmetros formais>) { <declarao de variveis locais> <comandos> retorne <valor de retorno>; }
<tipo bsico> <nome da funo> (<lista de parmetros formais>) { <declarao de variveis locais> <comandos> retorne <valor de retorno>; }
<tipo bsico> <nome da funo> (<lista de parmetros formais>) { <declarao de variveis locais> <comandos> retorne <valor de retorno>; } Declarao das variveis locais e sequencia de comandos para a realizao da funo.
<tipo bsico> <nome da funo> (<lista de parmetros formais>) { <declarao de variveis locais> <comandos> retorne <valor de retorno>; } A funo permite retornar um valor, resultado das aes nela programadas. Este valor deve ser do <tipo bsico> declarado antes do nome da funo.
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
principal A D
valorAbsoluto X Y
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
principal A D -
valorAbsoluto X Y -
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
valorAbsoluto X Y -
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
valorAbsoluto X Y -
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
valorAbsoluto X Y -
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
valorAbsoluto X -40 Y -
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
principal A lixo -40 -40 -40 -40 D lixo lixo ??? ??? ???
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) // (-40 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
principal A lixo -40 -40 -40 -40 -40 D lixo lixo ??? ??? ??? ???
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) // (-40 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
principal A lixo -40 -40 -40 -40 -40 D lixo lixo ??? ??? ??? ???
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) // (-40 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
principal A lixo -40 -40 -40 -40 -40 D lixo lixo ??? ??? ??? ???
-40
???
-40
40
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) // (-40 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
principal A lixo -40 -40 -40 -40 -40 D lixo lixo ??? ??? ??? ???
-40 -40
??? 40
-40 -40
40 40
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) // (-40 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
principal A lixo -40 -40 -40 -40 -40 D lixo lixo 40 ??? ??? ???
-40 -40
??? 40
-40 -40
40 40
Funes
exemplo
P5 real valorAbsoluto ( real X ) { P6 real Y; P7 se (X 0) // (-40 0) { Linha P8 Y X; } P1 seno P2 { P3 P8 Y - X; P4 } P5 P9 retorne Y; P6 } P1 principal P7 { P8 P2 real A,D; P8 P3 A -40; P9 P4 D valorAbsoluto(A); P10 P10 imprima (D); }
principal A lixo -40 -40 -40 -40 -40 D lixo lixo 40 ??? ??? ???
??? 40 40
-40 -40
40 40
Funes: retornam valor. So utilizadas para realizar uma operao e retornam alguma resposta relativa operao realizada.
Exemplo:
int soma (int a, int b) { return (a+b); }
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
25 50 75 a b c
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
25 50 75 a b c
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
&a a1 &b b1 25 50 75 a b c
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
&a a1 &b b1 25 aux 25 50 75 a b c
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
&a a1 &b b1 25 aux 50 50 75 a b c
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
&a a1 50 25 75 a b c
&b b1 25 aux
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
50 25 75 a b c
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
&b a1 &c b1 50 25 75 a b c
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
&b a1 &c 25 b1 aux 50 25 75 a b c
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
&b a1 &c 25 b1 aux 50 75 75 a b c
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
&b a1 &c 25 b1 aux 50 75 25 a b c
Mem ria
#include <stdio.h> void Troca(int *a1, int *b1) { int aux=*a1; *a1=*b1; *b1=aux; } int main() { int a=25, b=50, c=75; Troca(&a,&b); Troca(&b,&c); printf( %d,%d,%d ,a,b,c); return 0; }
50 75 25 a b c
int Func1(int a); //prottipo main() { ...... x=Func1(10); ..... } int Func1(int a) { ........ }
Exerccios
1) O que ser impresso no programa abaixo?
#include <stdio.h> void calculo (int *p, int *q) { *p = *p * 10; *q = *q + 10; } int main() { int x = 2, y = 5; calculo(&x,&y); printf("%d - %d",x,y); return 0; }
Exerccios
2) Qual a sada do programa abaixo:
#include <stdio.h> int calculo (int p, int q) { p = p * 10; q = q + 10; return(p + q); } int main() { int x = 2, y = 5; printf( %d %d %d ,x,y,calculo(x,y)); return 0; }
Exerccios
3) Qual a sada do programa abaixo:
#include <stdio.h> int calculo (int p, int *q) { p = p * 10; *q = *q + 10; return(p); } int main() { int x = 2, y = 5, z; z = calculo(x,&y); printf( %d %d %d ,x,y,z); return 0; }
Exerccios
4) Qual a sada do programa abaixo:
#include <stdio.h> int cal(int p, int *q, int *r) { p = p * 10; *q = *q + 10; *r = *r - 10; return(p); } int main() { int x = 2, y = 5, z = 3, r; r = cal(x,&y,&z); printf( %d %d %d %d ,x,y,z,r); return 0; }
Subrotinas
DCC 120
REVISO: Forma Geral A forma geral de uma subrotina : especificador_tipo nome ( lista parmetros ) { corpo da subrotina; return xxx; }
funes
int Soma (int a, int b) { return (a+b); }
int Func1(int a); //prottipo main() { ...... x=Func1(10); ..... } int Func1(int a) { ........ }
Exerccios
1) Escreva um procedimento que receba como parmetro dois valores inteiros n1 e n2 e imprima o intervalo fechado entre eles, do menor para o maior. Por exemplo: se n1 = 2 e n2 = 5, o procedimento ir imprimir 2, 3, 4, 5. 2) Faa um procedimento que receba por parmetro o tempo de durao de um experimento expresso em segundos e imprima na tela esse mesmo tempo em horas, minutos e segundos. 3) Faa uma funo que receba por parmetro o raio de uma esfera e calcula o seu volume: v = (4 * PI * R3) /3. 4) Faa uma funo que receba a idade de uma pessoa em anos, meses e dias e retorna essa idade expressa em dias.
Exerccios
5) Faa um programa que apresente o seguinte Menu para o usurio: Escolha uma opo de clculo para dois nmeros: 1) Soma 2) Produto 3) Quociente 4) Sair Opo:__
O Menu acima deve ser apresentado para o usurio enquanto ele no escolher a opo 4 (sair do programa). O usurio fornecer 2 nmeros se escolher as opes de clculo 1, 2 ou 3. Para cada opo de clculo deve existir (obrigatoriamente) uma funo definida (soma, produto e quociente dos dois nmeros fornecidos pelo usurio). O resultado do clculo deve ser escrito na tela.
Exerccios
6) Idem ao exerccio 1, agora com o seguinte Menu Escolha uma opo de clculo para um nmero: a) Fatorial b) Exponencial c) Raiz quadrada d) Sair Opo: __