Você está na página 1de 29

Linguagem C: funes

Prof: Alexandra Aguiar

alexandra.aguiar@unilasalle.edu.br
Baseado no material cedido pelo prof Paulo Wagner

Introduo
Muitos problemas com solues complexas podem ser divididos, sucessivamente em problemas menores, com lgica mais simples e de compreenso mais fcil. Em vez de escrever um algoritmo grande, escrevem-se vrios algoritmos menores, os quais em conjunto resolvem o problema proposto.
Modularidade a tcnica de programar desenvolvendo um programa a partir de pequenas partes ou mdulos.

Dividir para conquistar


Criar um mdulo em C definir uma funo. Uma funo um trecho de cdigo (bloco) contendo um conjunto de comandos com o objetivo de efetuar uma determinada tarefa.
2

Vantagens
Subdiviso de programas complexos:
facilita o entendimento, pois o cdigo fica mais organizado.

Facilita a estruturao lgica do programa:


auxilia na deteco de erros e na documentao.

Economia de cdigo:
quando o mesmo conjunto de comandos executado em vrios pontos do programa, geralmente sobre valores diferentes.

Facilidade de manuteno:
os erros so mais fceis de isolar e corrigir, as alteraes ficam limitadas ao mdulo, ao invs de interferir em todo o programa.

Reduz o tempo de desenvolvimento do programa:


vrias pessoas podem se encarregar de cada tarefa.

Reutilizao:
construo de uma biblioteca.

Tipos de funes
Um programa em C um conjunto de funes, em que a main a principal funo e por onde inicia a execuo do programa;
Funes pr-definidas (disponveis na biblioteca padro do C):
math.h clculos matemticos: pow, sqrt, ... string.h manipulao de strings: strcpy, strcmp, ... stdio.h entrada e sada de dados: printf, scanf, ...

Definidas pelo programador:


Funes que no existem nas bibliotecas. Exemplo:
int maior(int x, int y) { if (x>y) return x; return y; }

Forma geral de uma funo


Sintaxe: <tipo_retorno> <nomef> ([<lista_parmetros>])
{ <declaraes> <comandos> return [<expresso>]; // variveis locais

}
tipo_retorno:
Tipo de retorno da funo: pode ser int, float, double, char, etc mais o tipo especial void (no retorna nenhum valor);

nomef:
Nome da funo

Forma geral de uma funo


lista_parmetros:
Tambm chamada de lista de argumentos. opcional. O nome do argumento sempre vem precedido de seu tipo. Os diversos argumentos so separados por vrgula.
tipo1 arg1, tipo2 arg2, ..., tipon argn

return:
Indica o trmino da funo. Retorna o controle para o local onde a funo foi ativada (chamada). O tipo de dado da <expresso> deve ser do mesmo tipo que o definido no <tipo_retorno> da funo. Se o <tipo_retorno> da funo for void (no retorna nada) ento o valor da <expresso> deve ser omitido. O comando return tem capacidade de retornar apenas UM valor.

Forma geral de uma funo


Exemplos de retornos de funes.
Corretos
void func1( ) { <comandos> }

Incorretos
void func1( ) { <comandos> return 0; } int func2( ) { <comandos> return; }

int func2( ) { <comandos> return 1; }


void func3( ) { <comandos> return; }

float func3( ) { <comandos> }

Primeiro exemplo
#include <stdio.h>
void funcao_teste(){ printf(Eu sou a funcao teste!!\n\n); } void main(){ printf(Sou a funcao principal e vou chamar a funca_teste\n); funcao_teste(); printf(Agora sou eu, a funcao principal de novo!\n\n); }

Escopo de variveis
Representa a rea do programa em que a varivel pode ser utilizada. As variveis podem ser classificadas em:
Locais:
So as variveis declaradas dentro do corpo da funo. So visveis somente nesta funo. O programa principal (main) e as demais funes no podem utilizar esta varivel. Tempo de vida: durao da funo

Globais:
So as variveis declaradas fora das funes. Estas variveis so visveis por todas as funes do programa. Tempo de vida: enquanto o programa estiver sendo executado
9

Primeiro exemplo
#include <stdio.h> int y=20; //variavel global void funcao_teste(){ int x=80, z=30; //variaveis locais funcao_teste printf(Somos as variaveis x e z da funcao_teste: %d, %d\n, x, z); y = 55; printf(Sou a variavel y, global, na funcao_teste! %d\n,y); } void main(){ int x=10, z=15; //variaveis locais funcao principal printf(Somos as variaveis x e z da funcao principal: %d, %d\n, x, z); printf(Sou a variavel y, global, na funcao principal antes de chamar a funcao teste! %d\n,y); funcao_teste(); printf(Somos, de novo, as variaveis x e z da funcao principal: %d, %d\n, x, z); printf(Sou a variavel y, global, na funcao principal depois de chamar a funcao teste! %d\n,y); }

10

Parmetros
As funes podem se comunicar de duas formas:
atravs das variveis globais: no recomendvel, evitar; atravs dos parmetros existentes nas funes.

Os parmetros so categorizados em:


Parmetros formais:
So os parmetros utilizados na definio da funo. Devem ser variveis e so tratadas como variveis locais.

Parmetros reais:
So os parmetros utilizados na chamada da funo. Podem ser tanto variveis quanto valores. Os parmetros reais so utilizados para inicializar os parmetros formais. 11

Parmetros
Os parmetros formais e reais devem se corresponder em:
Nmero Tipo de dado Ordem
#include <stdio.h> float media(float x, float y, float z) { return (x+y+z)/3; } main() { float n1,n2,med; printf (Entre com duas notas:); scanf (%f %f, &n1, &n2); med = media(n1, n2, 8.5); printf (Media = %.2f \n, med); }

parmetros formais

parmetros reais

12

Chamada de uma funo


As funes podem ser classificadas de dois tipos:
Procedimento: no retornam nada (void).
Exemplo de Procedimento:
void exibe(int val) { printf(valor: %d, val); }

Forma de chamada (ativao) de um procedimento:


main() { int x; x=10; exibe(x); }

Sempre um comando isolado no local da chamada

13

Exemplo - Procedimento
#include <stdio.h>
void funcao_teste(int a, int b){ printf(A soma dos parametros eh %d\n,a+b); } void main(){ int x=10, z=15; printf(Somos as variaveis x e z da funcao principal: %d, %d\n, x, z); funcao_teste(x, z); printf(Sou a funcao principal de novo!\n\n); }

14

Chamada de uma funo


Funo: retornam um valor atravs do comando return.

Exemplo de Funo:
int soma(int a, int b) { return a + b; }

Formas de chamada (ativao) de uma funo:


Atribuindo o seu resultado a uma varivel
res = soma(x, y);

Em uma condio
if ( soma(x,y) > 10 )

Em uma sada de dados


printf(soma = %d, soma(x,y));

15

Exemplo - Funo
#include <stdio.h>
int funcao_teste(int a, int b){ int soma; soma = a + b; return soma; } void main(){ int x=10, z=15, resultado; printf(Somos as variaveis x e z da funcao principal: %d, %d\n, x, z); resultado = funcao_teste(x, z); printf(Sou a funcao principal de novo e o resultado da soma eh %d!\n\n, resultado); }

16

Passagem de parmetros
Existem dois mecanismos de passagem de parmetros:
Passagem por valor (by value) Passagem por referncia (by reference)

Passagem por valor:


Passa uma cpia dos valores da chamada para os argumentos. As alteraes nos argumentos no tem reflexo fora da funo.
Os argumentos so de entrada: s recebem valores

17

Exemplo: Passagem de parmetros POR VALOR


int soma(int x, int y) { return (x+y); } int produto(int x, int y) { return x*y; } main() { int v1,v2,s; printf (Entre com dois valores:); scanf (%d %d, &v1, &v2); Passa valores para a funo soma s = soma(v1, v2); 18 printf (Soma = %d\n, s); Passa valores para a printf (Produto = %d\n, produto(v1,v2)); } funo produto

Passagem de parmetros
Passagem por referncia:
Passa o endereo de memria da varivel da chamada para o argumento. As alteraes realizadas nos argumentos afetaro as variveis na chamada.
Os argumentos so de entrada e sada: recebem e devolvem valores

19

Exemplo: Passagem de parmetros POR REFERNCIA


Sintaxe do C padro
void somaprod(int x, int y, int *s, int *p) { *s = x+y; *p = x*y; } main() { int v1,v2,s,p; printf (Entre com dois valores:); scanf (%d %d, &v1, &v2); somaprod(v1, v2, &s, &p); printf (Soma = %d\n, s); printf (Produto = %d\n, p); }

* na funo

& na chamada
20

Exemplo: Passagem de parmetros POR REFERNCIA


Sintaxe baseada em OO (orientao a objetos) utilizar g++ (e programas em C++, no Dev). Extenso do programa em .cpp
int somaprod(int x, int y, int &s, int &p) { s = x+y; p = x*y; } main() { int v1,v2,s,p; printf (Entre com dois valores:); scanf (%d %d, &v1, &v2); somaprod(v1, v2, s, p); printf (Soma = %d\n, s); printf (Produto = %d\n, p); }

& na funo

normal

chamada normal
21

Qual a diferena?
Na passagem por VALOR, as variveis que foram como parmetro de quem EST CHAMANDO a funo PERMANECEM COM OS MESMOS VALORES! Na passagem por REFERNCIA, as variveis que foram como parmetro de quem EST CHAMANDO a funo PODEM SER MUDADAS PELA FUNO CHAMADA!

22

Exemplo: diferena entre passagem por valor e por referncia


#include <stdio.h> #include <conio.h> void pass_valor(int a, int b){ a = 10; b = 15; printf ("Imprimindo na funcao pass_valor a=%d e b=%d\n",a,b); } void pass_ref(int *a, int *b){ *a = 10; *b = 15; printf ("Imprimindo na funcao pass_ref a=%d e b=%d\n",*a,*b); }

int main(){ int x=100, z=200; printf("Somos x = %d e z = %d da funcao principal ANTES de chamar pass_valor.\n", x, z); pass_valor(x, z); printf("Somos x = %d e z = %d da funcao principal DEPOIS de chamar pass_valor.\n\n", x, z);
printf("Somos x = %d e z = %d da funcao principal ANTES de chamar pass_ref.\n", x, z); pass_ref(&x, &z); printf("Somos x = %d e z = %d da funcao principal DEPOIS de chamar pass_ref.\n\n", x, z); getch(); return 0; }

23

Localizao das funes


Regra: toda a funo deve ser declarada antes de ser usada. Quando a funo definida, automaticamente est declarada.
#include <stdio.h> int soma(int a, int b) { int res; res = a + b; return res; }

Definio da funo

main() { int x, y, resultado; printf (Informe dois numeros inteiros); scanf (%d %d, &x, &y); resultado = soma(x, y); printf (%d + %d = %d\n, x, y, resultado); }

Chamada da funo 24

Localizao das funes


Prottipo da funo: permite que a funo seja utilizada antes de sua definio.
#include <stdio.h> int soma(int a, int b);

Prottipo da funo

main() { int x, y, resultado; printf (Informe dois numeros inteiros); scanf (%d %d, &x, &y); resultado = soma(x, y); printf (%d + %d = %d\n, x, y, resultado); } int soma(int a, int b) { return = a + b; }

Chamada da funo

Definio da funo

25

Exerccios
1) Faa uma funo que recebe por parmetro um valor inteiro e retorna o valor lgico Verdadeiro caso o valor seja maior do que zero e Falso caso o valor seja menor do que zero. (Para usar tipo bool, programa tem que ser em c++. Se fizer em C, usar int e atribuir 1 para Verdadeiro e 0 para falso)
2) Faa uma funo que recebe trs nmeros por parmetro e retorna o maior deles. 3) Faa uma funo que l 50 valores inteiros e retorna a mdia dos valores lidos.
26

Exerccios
4) Analise o programa abaixo e mostre exatamente o que aparecer na tela do computador.
#include <stdio.h> #define NUM 3 int Triplica(int x) { return(3*x); } int SomaQuadrado(int x, int y) { return( (x * x) + (y * y) ); } main() { int x, y=15, z; x = y / NUM; z = Triplica(2); y = SomaQuadrado(x,z); z = ++x - y + (NUM * x) + Triplica(x); printf("\n x = %d, y = %d, z = %d ", x, y, z); }

27

Exerccios
5) Faa um exerccio que receba dois nmeros positivos por parmetro e retorne a soma dos N nmeros inteiros existentes entre eles. 6) Crie uma funo que receba trs nmeros inteiros a, b e c, sendo a maior que 1. A funo dever somar todos os inteiros entre b e c que sejam divisveis por a (inclusive b e c) e retornar o resultado para a funo principal, onde ser impresso. 7) Faa uma funo que receba um nico valor representando segundos. Essa funo dever convert-la para horas minutos e segundos. Todas as variveis devem ser passadas como parmetro, no havendo variveis globais.

28

Exerccios
8) Elabore um programa contendo uma sub-rotina que receba as trs notas de um aluno como parmetros e uma letra. Se a letra for A, a sub-rotina dever calcular a mdia aritmtica das notas do aluno; se for P, dever calcular a mdia ponderada, com pesos 5, 3 e 2. A mdia calculada dever ser devolvida ao programa principal para, ento, ser mostrada. 9) Faa uma sub-rotina que leia cinco valores inteiros, determine e mostre o maior e o menor deles. 10) Faa uma funo que receba um valor inteiro como referncia e retorne o resto da diviso deste nmero por 10. Altere tambm o valor da varivel passada por referncia, dividindo-a por 10. Mostre, na funo principal, o valor da varivel passada ANTES e DEPOIS da chamada funo.

29

Você também pode gostar