Upload
others
View
3
Download
0
Embed Size (px)
Citation preview
DIM0108.0 - Conceitos e Técnicas de Programação
Sub-rotinas
David Déharbe
1
1Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Objetivos da aula
•Os conceitos de sub-rotina, funções e procedimentos;•Como usar sub-rotinas em C:‣parâmetros de sub-rotinas:‣parâmetros formais e parâmetros efetivos. ‣passagem de parâmetro por valor
•Como definir novas sub-rotinas em C.•Sub-rotinas e tipos.
2
2Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Roteiro da aula
•Motivação;
•Conceitos gerais;
•Uso de sub-rotinas;
•Definição de sub-rotinas;
•Exercícios.
3
3Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Motivação
•Até agora, vimos programas onde todo o código executado encontra-se na função main.
•As vezes usamos recursos externos‣#include <stdio.h>
✓printf, scanf‣#include <math.h>
✓cos, log, pow
•Esses recursos externos são componentes de programa, pré-definidos e empacotados na biblioteca padrão da linguagem C.
•Cada um desses componentes possui um papel preciso: imprimir um texto, calcular o cosseno de um ângulo em radianos, etc.
4
4Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Motivação
•Quando uma aplicação real é projetada, identifica-se a necessidade de definir novos componentes.‣Exemplo 1 (processamento numérico): inversão de uma matriz.‣Exemplo 2 (sistema acadêmico): ordenar os alunos de uma turma pela ordem alfabética.‣Exemplo 3 (jogo de poker): identificar qual mão ganha.
•Sub-rotinas são unidades de código responsável por desempenhar um certo papel, de forma relativamente independente do resto do programa.
5
5Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Vantagens
•Vantagens‣Decomposição de uma tarefa complexa (desenvolver uma aplicação) em múltiplas tarefas menores (desenvolver sub-rotinas).‣Reutilização de código dentro de um programa: cada vez que há trechos de código repetidos, há oportunidade para criar uma sub-rotina. Diminui o tamanho do código.‣Reutilização de código entre aplicações: uma mesma rotina pode ser usada em vários programas.‣Divisão do trabalho em uma equipe de programadores: cada programador é responsável por sub-rotinas específicas.
•Desvantagem‣Aumenta ligeiramente o tempo de execução.
6
6Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Definição (Wikipedia)
•Uma sub-rotina consiste em uma porção de código que resolve um problema muito específico, parte de um problema maior (a aplicação final).‣Qual problema muito específico as seguintes sub-rotinas resolvem: printf, scanf, cos, exp, pow?
•Geralmente é feita a distinção entre função e procedimento.
•Uma função é uma sub-rotina que retorna algum valor (fun.
•Um procedimento é uma sub-rotina que não retorna valor.
7
7Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Os elementos de uma sub-rotina
•Uma sub-rotina possui um nome, que é a identidade dela dentro do programa. ‣ Idealmente esse nome reflete o problema que a sub-rotina resolve.
•Uma sub-rotina possui um corpo, que é a porção de código que é executada, quando a sub-rotina é usada.
•Uma sub-rotina possui parâmetros, que são dados à sub-rotina quando é usada; esses parâmetros são utilizados no corpo.
•Uma sub-rotina possui um resultado, que é calculado no corpo, e depende dos parâmetros.
8
8Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Uma definição de sub-rotina em C
9
int max (int x, int y){ int result; if (x > y) result = x; else result = y; return result;}
9Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Uma definição de sub-rotina em C
9
int max (int x, int y){ int result; if (x > y) result = x; else result = y; return result;}
nome
9Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Uma definição de sub-rotina em C
9
int max (int x, int y){ int result; if (x > y) result = x; else result = y; return result;}
nome
corpo
9Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Uma definição de sub-rotina em C
9
int max (int x, int y){ int result; if (x > y) result = x; else result = y; return result;}
nome
corpo
parâmetros formais
9Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Uma definição de sub-rotina em C
9
int max (int x, int y){ int result; if (x > y) result = x; else result = y; return result;}
nome
corpo
parâmetros formais
resultado (tipo)
resultado (expressão)
9Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Uso de sub-rotinas
•Sub-rotina pode ser visto como uma prestação de serviço computacional.‣O usuário passa valores à sub-rotina.‣A sub-rotina efetua uma computação, e‣possivelmente retorna um resultado.
•Para usar a sub-rotina, usa-se a seguinte sintaxe: ‣nome da sub-rotina, ‣parêntese esquerda, ‣ lista de valores separados por vírgulas, ‣parêntese direita.
•Obs: fazemos isto desde a primeira aula!10
10Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Uso de sub-rotinas
•Sub-rotina pode ser visto como uma prestação de serviço computacional.‣O usuário passa valores à sub-rotina.‣A sub-rotina efetua uma computação, e‣possivelmente retorna um resultado.
•Para usar a sub-rotina, usa-se a seguinte sintaxe: ‣nome da sub-rotina, ‣parêntese esquerda, ‣ lista de valores separados por vírgulas, ‣parêntese direita.
•Obs: fazemos isto desde a primeira aula!10
#include <stdio.h>
int main (void){ int v1, v2; int m; scanf("%i %i", &v1, &v2); m = max(v1, v2); printf("%i\n", m); return 0;}
10Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Uso de sub-rotinas
•A interface da sub-rotina corresponde a o contrato desta prestação de serviço:‣Exemplo: int max(int, int);
•A interface tem o tipo do resultado (int), o nome da sub-rotina (max) e o tipo dos parâmetros (int e int).
•O usuário da rotina deve respeitar o contrato: aplicar a sub-rotina a valores do tipo correto, e usar o resultado usando a informação de tipo.‣ int i = 3;i = max(2, i);
11
11Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
O tipo void
•Na linguagem C, o tipo void pode ser usado para indicar a ausência de valor.
•Uma sub-rotina sem parâmetro e sem retorno:‣void print_full_line (void){ printf("******************************"); printf("\n");}
12
12Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Definição de sub-rotina em C: sintaxe
•<definição de subrotina> ::= <tipo> <nome> (<lista de parâmetros>) <corpo>
<corpo> ::= <bloco de comandos>
<lista de parâmetros> ::= void | | <parâmetro> | <parâmetro> , <lista de parâmetros>
<parâmetro> ::= <tipo> <nome>
13
13Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina.
•Os parâmetros formais de uma sub-rotina comportam-se como variáveis.
•Cada vez que uma sub-rotina é chamada, para cada parâmetro formal:‣um compartimento de memória é alocado,‣o valor inicialmente guardado é o valor da expressão que aparece como parâmetro efetivo na chamada.
•Quando a sub-rotina termina a sua execução, a memória é desalocada.
14
14Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina.
•Exemplo:•int f (int c){ return c * 2;}
int main (void){ int a = 1, b = 0; b = f(a); a = f(b); printf("a = %i, b = %i\n", a, b); return 0;}
15
15Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina.
•Exemplo:•int f (int c){ return c * 2;}
int main (void){ int a = 1, b = 0; b = f(a); a = f(b); printf("a = %i, b = %i\n", a, b); return 0;}
15
a b -
1 0 -
15Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina.
•Exemplo:•int f (int c){ return c * 2;}
int main (void){ int a = 1, b = 0; b = f(a); a = f(b); printf("a = %i, b = %i\n", a, b); return 0;}
15
a b c
1 0 1
15Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina.
•Exemplo:•int f (int c){ return c * 2;}
int main (void){ int a = 1, b = 0; b = f(a); a = f(b); printf("a = %i, b = %i\n", a, b); return 0;}
15
a b c
1 0 1
15Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina.
•Exemplo:•int f (int c){ return c * 2;}
int main (void){ int a = 1, b = 0; b = f(a); a = f(b); printf("a = %i, b = %i\n", a, b); return 0;}
15
a b -
1 2 -
15Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina.
•Exemplo:•int f (int c){ return c * 2;}
int main (void){ int a = 1, b = 0; b = f(a); a = f(b); printf("a = %i, b = %i\n", a, b); return 0;}
15
a b c
1 2 2
15Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina.
•Exemplo:•int f (int c){ return c * 2;}
int main (void){ int a = 1, b = 0; b = f(a); a = f(b); printf("a = %i, b = %i\n", a, b); return 0;}
15
a b c
1 2 2
15Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina.
•Exemplo:•int f (int c){ return c * 2;}
int main (void){ int a = 1, b = 0; b = f(a); a = f(b); printf("a = %i, b = %i\n", a, b); return 0;}
15
a b -
4 2 -
15Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina: exercício
•void misterio (int c, int d){ int t; t = c; c = d; d = t;}
int main (void){ int a = 1, b = 0; misterio(a, b); printf("a = %i, b = %i\n", a, b); return 0;}
16
16Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina: exercício
•void misterio (int c, int d){ int t; t = c; c = d; d = t;}
int main (void){ int a = 1, b = 0; misterio(a, b); printf("a = %i, b = %i\n", a, b); return 0;}
16
a b - - -
1 0 - - -
16Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina: exercício
•void misterio (int c, int d){ int t; t = c; c = d; d = t;}
int main (void){ int a = 1, b = 0; misterio(a, b); printf("a = %i, b = %i\n", a, b); return 0;}
16
a b c d -
1 0 1 0 -
16Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina: exercício
•void misterio (int c, int d){ int t; t = c; c = d; d = t;}
int main (void){ int a = 1, b = 0; misterio(a, b); printf("a = %i, b = %i\n", a, b); return 0;}
16
a b c d t
1 0 1 0 ?
16Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina: exercício
•void misterio (int c, int d){ int t; t = c; c = d; d = t;}
int main (void){ int a = 1, b = 0; misterio(a, b); printf("a = %i, b = %i\n", a, b); return 0;}
16
a b c d t
1 0 1 0 1
16Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina: exercício
•void misterio (int c, int d){ int t; t = c; c = d; d = t;}
int main (void){ int a = 1, b = 0; misterio(a, b); printf("a = %i, b = %i\n", a, b); return 0;}
16
a b c d t
1 0 0 0 1
16Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina: exercício
•void misterio (int c, int d){ int t; t = c; c = d; d = t;}
int main (void){ int a = 1, b = 0; misterio(a, b); printf("a = %i, b = %i\n", a, b); return 0;}
16
a b c d t
1 0 0 1 1
16Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina: exercício
•void misterio (int c, int d){ int t; t = c; c = d; d = t;}
int main (void){ int a = 1, b = 0; misterio(a, b); printf("a = %i, b = %i\n", a, b); return 0;}
16
a b - - -
1 0 - - -
16Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Chamada de sub-rotina: exercício
•void misterio (int c, int d){ int t; t = c; c = d; d = t;}
int main (void){ int a = 1, b = 0; misterio(a, b); printf("a = %i, b = %i\n", a, b); return 0;}
16
a b - - -
1 0 - - -
Passagem de parâmetros por valor: não modifica o conteúdo das variáveis!
16Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Exercícios
•Define uma função que, dados três valores do tipo int, retorna o maior dos três.
•Define uma sub-rotina que, dado um valor do tipo int, retorna o quadrado deste valor.
•Define uma sub-rotina que, dado um valor do tipo int, digamos n, retorna n4.‣Pense como utilizar a sub-rotina do exercício anterior para resolver este exercício.
•Defina um programa que lê um número inteiro e imprime este número elevado à potência 4.
17
17Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Exercícios
•Define uma função que, dados três valores do tipo int, retorna o maior dos três.
•Para fazer o cálculo do Índice de Massa Corporal, basta dividir o peso em quilogramas pela altura ao quadrado (em metros). ‣Define uma função que faz o cálculo do IMC. Esta função tem como parâmetro o peso em kg, e a altura em cm.
•A classificação segundo o IMC é:• < 18 : magreza ; [18;25[: saudável; [25;30[: peso em excesso; • [30;35[:obesidade 1; [35; 40[: obesidade 2; ≥40: obesidade 3.‣Defina uma função que, dada o IMC imprime a classificação.
•Escreva um programa que lê os dados de uma pessoa e imprima seu IMC e sua classificação.
18
18Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Exercício
•Defina uma sub-rotina que tem como argumento um valor do tipo unsigned char e imprima a sua codificação binária.
•Defina uma sub-rotina que tem como um argumento um número do tipo unsigned short, digamos v, e retorna um valor do tipo unsigned char que corresponde ao primeiro byte de v.
•Defina uma sub-rotina que tem como um argumento um número do tipo unsigned short, digamos v, e retorna um valor do tipo unsigned char que corresponde ao segundo byte de v.
•Defina uma sub-rotina que tem como argumento um valor do tipo unsigned short e imprima a sua codificação binária.
19
19Monday, August 22, 2011
DIM0108.0 - Conceitos e Técnicas de Programação
Questão em aberto
•Supondo que, dado um número n, queiramos calcular o quadrado e o cubo deste número.
•Podemos escrever uma sub-rotina para cada resultado.‣Haverá o cálculo n*n na primeira‣Haverá o cálculo n*n*n na segunda
•Ganhariamos uma multiplicação se tivessemos a possibilidade de retornar dois resultados de uma sub-rotina‣ resultado1 = n * n ‣ resultado2 = resultado1 * n‣ return resultado 1, resultado2
•Não é permitido em C.•Veremos como fazer isto com ponteiros na próxima aula.
20
20Monday, August 22, 2011