• Nenhum resultado encontrado

Programação modular. Função

N/A
N/A
Protected

Academic year: 2021

Share "Programação modular. Função"

Copied!
16
0
0

Texto

(1)

PC-I © MAP 2016 Programação modular

Programação modular

214

X

Função

Definição computacional Uma unidade autônoma de código definida para executar um processamento específico. Definição matemá>ca Uma relação entre elementos de um conjunto (entrada) e elementos de outro conjunto (saída), com a propriedade que cada elemento da entrada relaciona-se com exatamente um elemento da saída. Outra definição Um conjunto de instruções agrupados em um bloco que recebe um nome e, através deste, pode ser executado.

(2)

PC-I © MAP 2016 Programação modular

Vantagens do uso de funções

• Dividir um único programa em unidades menores, mais fáceis de codificar e corrigir. • Facilitar a compreensão e depuração do programa-fonte. • Evitar a repe>ção de trechos de código. • Permi>r a reu>lização de código já construído (por você ou por outros programadores.) • Desenvolver a construção de programas complexos a par>r de módulos mais simples (o todo é a soma das partes). 216 cada um no seu quadrado

Paradigma de programação modular em C

int main() programa

função 1 função 2 função n ...

(3)

PC-I © MAP 2016 Programação modular

Execução de funções

Quando uma função é “chamada”, o fluxo do programa é interrompido e desviado para a execução do bloco de instruções da função. Quando a execução a>nge o final do bloco da função, o fluxo do programa retorna ao ponto do programa onde a função foi chamada. 218 Programa Programa Função

. . .

E você nem desconfiava...

•  Todo programa em C é formado por um conjunto de funções:

printf(), scanf(), if(), while(), gets(), puts(), eita(), ... •  A int main() também é uma função!!!

•  A execução de todo programa em C inicia pela função int main().

Como todas as outras en>dades de um programa em C...

(4)

PC-I © MAP 2016 Programação modular

A biblioteca math.h

Contém a definição de diversas funções matemá>cas. 220 função retorna sin(x) seno de x cos(x) cosseno de x tan(x) tangente de x fabs(x) sqrt(x) log(x) ln x log10(x) log10 x exp(x) ex pow(x,y) xy xx Funções da biblioteca math.h Geralmente usam argumentos do >po double e retornam valores do >po double.

Forma geral de funções em C definidas pelo usuário

tipo identificador(tipo arg1, ..., tipo argN) { declaração de variáveis; corpo da função; } A lista de variáveis (>po e iden>ficador) u>lizadas pela função, separadas por vírgulas O nome da função O >po de valor produzido pela função (primi>vo ou definido pelo usuário) As variáveis internas da função Os comandos da função O bloco da função

(5)

PC-I © MAP 2016 Programação modular

Passagem de argumentos

A declaração de uma função estabelece a lista >pada de argumentos necessários para seu processamento. As variáveis que compõem a lista de argumentos de uma função são conhecidas como parâmetros formais da função. Na chamada à função, apenas os valores (variáveis ou constantes) necessários para o processamento da função devem ser informados entre parênteses, na mesma ordem em que foram declarados na definição da função. Se uma função não precisar de argumentos para realizar o processamento, a lista de parâmetros será vazia. 222

O comando return()

Após o processamento, uma função poderá produzir algum valor que poderá será u>lizado pelo programa. O comando return() é u>lizado para retornar para o programa um único valor resultante do processamento de uma função. O valor retornado pela função será uma variável de um dos seguintes >pos: • primi>vos: char, int, float ou double (ou ponteiros desses >pos); • definidos pelo usuário (ou ponteiros desses >pos). Atenção! Se uma função deve retornar múl>plos valores, então ela deverá ser redefinida em múl>plas funções, cada uma retornando apenas um valor.

(6)

PC-I © MAP 2016 Programação modular

Função definida pelo usuário

Exemplo: Exibir os valores da função f(x) = 3x3 – 5x2 – x + 5, num intervalo [a, b] informado pelo usuário. 224 double F(double X) { return(3*X*X*X – 5*X*X – X + 5); } int main() { double a, b, x, y;

printf("Informe os extremos do intervalo: "); scanf("%f %f", &a, &b);

for (x = a; x <= b; x = x + 0.1) { y = F(x); printf("f(%f) = %f\n", x, y); } system("PAUSE"); return(0); } primeiro calcula a expressão e depois retorna o resultado COMECE AQUI! chamada à função F(): x será copiado em X

Função definida pelo usuário

Exemplo: Calcular y = x2: double Sqr(double x) { double y; y = x*x; return(y); } int main() {

double valor, resultado; printf("Informe um numero: "); scanf("%lf", &valor);

resultado = Sqr(valor);

printf("%f^2 = %f\n", valor, resultado); system("PAUSE"); return(0); } chamada à função sqr(): valor será copiado em x depois do processamento da função, y será copiado em resultado COMECE AQUI! y é variável interna da função

(7)

PC-I © MAP 2016 Programação modular

Função definida pelo usuário

Exemplo: Calcular o fatorial de um número inteiro posi>vo. 226 double Fatorial(int n) { int i; double fat = 1; for (i = 1; i <= n; i++) fat = fat * i; return(fat); } int main() { int n;

printf("Informe um número inteiro positivo: "); scanf("%d", &n); printf("%d! = %.0f\n", n, Fatorial(n)); system("PAUSE"); return(0); } o resultado retornado pela função será exibido aqui. COMECE AQUI!

Função definida pelo usuário

Exemplo: Apresentar um menu e ler a opção do usuário. char Menu() { char opc;

printf("Escolha a operacao a ser realizada\n");

printf("[+] Adicao\n[-] Subtracao\n[*] Multiplicacao\n[/] Divisao\n"); printf("Opcao: "); scanf("%c", &opc); return(opc); } int main() { float a, b; char op;

printf("Informe os operandos: "); scanf("%f %f", &a, &b);

op = Menu(); ... } O valor lido dentro desta função será retornado para a função main() O valor retornado pela função será atribuído à uma variável. UIA!? Uma função sem parâmetros! COMECE AQUI!

(8)

PC-I © MAP 2016 Programação modular

Função definida pelo usuário

Exemplo: Calcular a soma de 2 números complexos. 228 typedef struct { double Re; double Im; } complexo;

complexo CpxSoma(complexo z1, complexo z2) {

complexo z;

z.Re = z1.Re + z2.Re; z.Im = z1.Im + z2.Im; return(z);

}

int main()

{

complexo x, y, w;

printf("Primeiro numero complexo: "); scanf("%lf %lf", &x.Re, &x.Im); printf("Segundo numero complexo: "); scanf("%lf %lf", &y.Re, &y.Im); w = CpxSoma(x, y);

printf("Resultado: %f + %fi\n", w.Re, w.Im); system("PAUSE"); return(0); }

Retornando valores

A definição de funções que retornam vetores de algum >po primi>vo (char, int, float ou double) ou definido pelo usuário é feita usando-se ponteiros. Retornando uma string: char *NomeFuncao(...) Retornando um vetor de inteiros: int *NomeFuncao(...) Retornando uma matriz de valores reais de dupla precisão: double **NomeFuncao(...)

(9)

PC-I © MAP 2016 Programação modular

Retornando uma string

Exemplo: Gerar uma senha usando n caracteres aleatórios da tabela ASCII. 230 char *GeraString(int n) { int i; char *s;

// alocar memoria para a string

s = (char *) calloc(n + 1, sizeof(char)); // gerar a string elemento a elemento for (i = 0; i < n; i++)

s[i] = 33 + rand()%(126 - 33 + 1);// usar os caracteres do intervalo [33, 126] s[n] = '\0'; return(s); } ATENÇÃO: n deverá ser informado antes da chamada à função Atenção! Em programas que u>lizam números aleatórios, a inicialização do gerador da semente através do comando srand(time(0)); deverá ser feita na função int main().

Retornando um vetor

Exemplo: Gerar apostas na Mega-Sena com n dezenas (n informado pelo usuário.) int *Aposta(int n) {

int *v; // vetor de apostas

int i, pos;

// alocar memoria para o vetor de apostas v = (int *) calloc(60, sizeof(int)); // sortear as dezenas

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

pos = rand()%60; // posição sorteada

if (v[pos] == 1) // se a posição já havia sido sorteada, escolha outra i--; else v[pos] = 1; } return(v); }

(10)

PC-I © MAP 2016 Programação modular

Retornando uma matriz

Exemplo: Criar uma matriz de Hilbert de ordem n. 232 double **Hilbert(int n) { double **a; int i, j;

// alocar memória para os elementos da matriz a = (double **) calloc(n, sizeof(double *)); for (i = 0; i < n; i++)

a[i] = (double *) calloc(n, sizeof(double)); // elementos da matriz de Hilbert

for (i = 0; i < n; i++) for (j = 0; j < n; j++) a[i][j] = 1.0/(i + j + 1); return(a); }

O >po primi>vo void

O >po void é u>lizado apenas para definir funções que não retornam nenhum valor para a função que a chamou. Atenção! void Menu() {

printf("Escolha a operacao a ser realizada\n");

printf("[+] Adicao\n[-] Subtracao\n[*] Multiplicacao\n[/] Divisao\n"); printf("Opcao: "); } int main() { float a, b; char op;

printf("Informe os operandos: "); scanf("%f %f", &a, &b);

Menu();

scanf(“%c”, &op); ...

(11)

PC-I © MAP 2016 Programação modular

O >po primi>vo void

Calcular e exibir a tabuada do 7. 234 int main() { int i, j; for (j = 0; j < 16; j++) printf("-"); printf("\n"); printf("| Tabuada do 7 |\n"); for (j = 0; j < 16; j++) printf("-"); printf("\n"); for (i = 1; i <= 10; i++) printf(”%2d X 7 = %2d\n”, i, 7*i); for (j = 0; j < 16; j++) printf("-"); printf("\n"); system("PAUSE"); return(0); }

void Linha(int n, char ch) { int j; for (j = 0; j < n; j++) printf("%c", ch); printf("\n"); } int main() { int i; Linha(16, '-'); printf("| Tabuada do 7 |"); Linha(16, '-'); for (i = 1; i <= 10; i++) printf(”%2d X 7 = %2d\n", i, 7*i); Linha(16, '-'); system("PAUSE"); return(0); }

Escopo de variáveis

Existem dois >pos de variáveis em um programa em C: Variáveis locais

• São aquelas definidas dentro do bloco de alguma função.

• São visíveis apenas pela função onde foram declaradas e não podem ser usadas ou modificadas por outras funções do programa (nem pela função main()).

• Os parâmetros formais também são variáveis locais da função. • Existem apenas enquanto a função es>ver sendo executada.

Variáveis globais

• São aquelas definidas fora do bloco de alguma função.

• São visíveis por qualquer função e podem ser usadas ou modificadas por qualquer função do programa. • Existem durante todo o tempo de execução do programa. Importante! Se houverem variáveis locais e globais com o mesmo nome, a função irá u>lizar apenas a variável local.

(12)

PC-I © MAP 2016 Programação modular

Escopo de variáveis

236

int i; // i é variável global

int F1(int n) // F1() tem uma variável local chamada n {

j = n; // erro: j não foi declarada como variável global ou local de f1()

... }

float F2(int i) // F2() tem uma variável local chamada i {

int j; // F2() tem uma variável local chamada j i = 2*i // alterando a variável local i

j = F1(i); // alterando a variável local j ...

}

int main() // COMECE AQUI! {

float j; // j é variável local de main() i = 1; // alterando a variável global i

j = F2(i); // j recebe o resultado retornado pela função F2() ... }

Escopo de variáveis

O uso de variáveis globais permite trabalhar com funções sem argumentos. #include <stdio.h> #include <stdlib.h>

float nota1, nota2, nota3, media; void LeNotas()

{

printf("Informe as notas das 3 provas: "); printf("1a prova = ");

scanf("%f", &nota1); printf("2a prova = "); scanf("%f", &nota2);

printf("3a prova = "); scanf("%f", &nota3); }

int main()

{

LeNotas();

media = (nota1 + nota2 + nota3)/3;

printf("Media aritmetica = %f\n", media);

system("PAUSE"); return(0);

(13)

PC-I © MAP 2016 Programação modular

Passagem de parâmetros

A chamada à uma função pode conter uma lista de variáveis que serão u>lizadas no processamento da função. Cada variável da lista pode ser passada de duas formas: 238 Passagem por valor • O valor da variável é copiado para o respec>vo parâmetro formal da função.

• As alterações realizadas dentro da função não modificam o valor original da variável.

Passagem por referência

• O endereço da variável é passado para o respec>vo parâmetro formal da função. • As alterações realizadas dentro da função modificam o valor original da variável.

Exemplo: Passagem por valor

Execução: Main: 2 5 Funcao: 5 2 Main: 2 5 Pressione...

void Troca(int a, int b)

{ int aux; aux = a; a = b; b = aux; printf("Funcao: %d %d\n", a, b); } int main() { int i = 2, j = 5; printf("Main: %d %d\n", i, j); Troca(i,j); printf("Main: %d %d\n", i, j); system("PAUSE"); return(0); } OOOPS! A troca não modificou os valores originais.

(14)

PC-I © MAP 2016 Programação modular

Exemplo: Passagem por referência

Execução: Main: 2 5 Funcao: 5 2 Main: 5 2 Pressione... 240

void Troca(int *a, int *b)

{ int aux; aux = *a; *a = *b; *b = aux; printf("Funcao: %d %d\n", *a, *b); } int main() { int i = 2, j = 5; printf("Main: %d %d\n", i, j); Troca(&i,&j); printf("Main: %d %d\n", i, j); system("PAUSE"); return(0); } TCHÃÃÃ! A troca modificou os valores originais.

Passagem de parâmetros

Exemplo: Inverter uma string. Atenção! Na declaração de funções que u>lizam strings, vetores e matrizes como parâmetros devem ser u>lizados ponteiros. Logo, essas variáveis são sempre passadas por referência, ou seja, as modificações realizadas dentro da função alteram o valor original.

void Inverte(char *str)

{

int i, n; char tmp;

n = strlen(str); // determina o tamanho da string

for (i = 0; i < n/2; i++) { tmp = str[i]; str[i] = str[n - 1 - i]; str[n - 1 - i] = tmp; } }

(15)

PC-I © MAP 2016 Programação modular

Passagem de parâmetros

Exemplo: “Cruzar” 2 vetores binários com n elementos, usando os p primeiros elementos do 1º vetor e os n-p seguintes do 2º vetor.

242

int *Cruzamento(int *v1, int *v2, int n, int p)

{

int i; int *v;

v = (int *) calloc(n, sizeof(int)); for (i = 0; i < n; i++) { if (i < p) v[i] = v1[i]; else v[i] = v2[i]; } return(v); }

Estratégias de programação

Exemplo: Calcular a soma dos n primeiros números naturais. S(n) = n * ( (n + 1) / 2 ) S(n) = n + S(n – 1) Função fechada Estabelece uma seqüência de comandos onde o problema original não aparece. Função recursiva Depende do valor da própria função, calculada para um caso reduzido.

(16)

PC-I © MAP 2016 Programação modular

Funções recursivas

São funções que fazem chamadas a si mesmas. A cada chamada, cria-se na memória uma nova ocorrência da função, com comandos e variáveis próprios, isolados das chamadas anteriores. A função será executada até que todas as ocorrências sejam resolvidas. Exemplo: n! = n * (n – 1)! = n * (n – 1) * (n – 2)! = ... 244 double Fatorial(int n) { double valor; if ( n <= 1 ) return (1); else { valor = n * Fatorial(n - 1); return (valor); } }

Funções recursivas

Exemplo: Cálculo de 3!. retorna 1 retorna 2 retorna 6 fat = Fatorial(3); main: valor = 3 * Fatorial(2); return (valor); Fatorial(3): valor = 2 * Fatorial(1); return (valor); Fatorial(2): return (1); Fatorial(1):

Referências

Documentos relacionados

Esta pesquisa buscou abordar um assunto extremamente necessário e urgente para a educação básica brasileira, as competências socioemocionais em sala de aula, tanto é que um

Funções são tão comuns e intuitivas provavelmente você já usou funções no Excel, que mesmo sem definir o que elas são, nós já utilizamos funções nas seções anteriores:

 lista de parâmetros - é uma lista de nomes e tipos de variáveis separadas por vírgulas, que recebem os valores dos argumentos quando a função é chamada..

O uso de econometria espacial se faz necessário, pois o modelo básico proposto pela abordagem clássica para o estudo de convergência depende fortemente do pressuposto

Para valores menores ou iguais que a unidade de medida caseira: PERCENTUAL DE MEDIDA CASEIRA FRAÇÃO A INDICAR até 30% 1/4 de ... METODOLOGIA A SER EMPREGADA PARA

Os conceitos introduzidos neste capítulo podem ser adaptados a outros tipos de ar- tefatos, tais como documentos, auxílios (help) e tutoriais. Os elementos usados ao desenvolver

Quando se referem nomes simb´ olicos externos ou definidos em segmentos de mem´ oria recoloc´ aveis, os respectivos endere¸cos aparecem a zero nas listagens (linhas 20 a 23 de

Para evitar esse trabalho e facilitar a reutiliza¸ c˜ ao de c´ odigo ´ e recomend´ avel trabalhar sempre que poss´ıvel com segmentos ditos recoloc´ aveis.. Os endere¸ cos