Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

44
Linguagem C – funções IF61A/IF71A - Computação 1 Prof. Leonelo Almeida Universidade Tecnológica Federal do Paraná

Transcript of Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Page 1: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Linguagem C – funções

IF61A/IF71A - Computação 1

Prof. Leonelo Almeida

Universidade Tecnológica Federal do Paraná

Page 2: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Até agora ...

• Introdução à linguagem C

▫ ...

▫ Operadores aritméticos, de comparação e lógicos

▫ Entrada e saída de dados

▫ Estruturas condicionais

▫ Estruturas de repetição

▫ Vetores

▫ Matrizes

Page 3: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Aula de hoje

Crie um programa que faça:

• Cadastro de pontos em um sistema 3D

• Desenho de grafos de pontos

• Cálculo de planos, volumes, distância

• ...

Page 4: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Aula de hoje

Crie um programa que faça:

• Cadastro de pontos em um sistema 3D

• Desenho de grafos de pontos

• Cálculo de planos, volumes, distância

• ...

• Potencialmente centenas ou milhares de linhas

• Como mais de um programador poderia trabalhar no mesmo código?

Page 5: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Aula de hoje

Funções

(ou subprogramas)

Page 6: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Funções

• Problemas longos e/ou complexos podem (e devem) ser quebrados em subproblemas menores

• Exemplos:scanf(“%d”, &x);

x = pow(v_num, 2);

Page 7: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Funções

• Problemas longos e/ou complexos podem (e devem) ser quebrados em subproblemas menores

• Exemplos:scanf(“%d”, &x);

x = pow(v_num, 2);

Agrupam conjuntos de comando que são executados quando a função é chamada.

Funções podem retornar valores (resultados) após serem executadas.

Page 8: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Vantagens no uso de funções

• Evitar blocos de código muito grandes

• Separar o programa em partes

• Permite o reuso de códigos

• Evita que o mesmo trecho de código seja repetido várias vezes em um mesmo programa

• Facilita a alteração/correção do código

Page 9: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Declaração de uma função

tipo nome (tipo parâmetro1, ..., tipo parâmetroN) {

comandos;

return valor_retorno;

}

• Toda função tem um tipo de retorno (int, char, float, void, etc)

• Parâmetros são variáveis inicializadas na chamada (ou invocação) da função

• Return devolve para quem chamou a função o resultado da execução da função

Page 10: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Exemplo

int soma (int a, int b) {

int c;

c = a + b;

return c;

}

• A função retorna um valor inteiro e recebe dois parâmetros inteiros

• O valor de retorno é sempre do mesmo tipo que o tipo da função

Page 11: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Usando (chamando) a função soma

#include <stdio.h>

int soma (int a, int b) {

int c;

c = a + b;

return c;

}

int main(){

int r;

r = soma(12, 90);

r = soma (-9, 45);

}

Page 12: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Função sem parâmetros

int leNumero() {

int c;

printf(“Digite um numero:”);

scanf(“%d”, &c);

return c;

}

int main() {

int r;

r = leNumero();

printf(“Número digitado %d\n”, r);

}

Page 13: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Declaração de funções

• Não é possível declarar uma função dentro de outra.

• Exemplo incorreto:int main(){

int f1(int a, int b){

return (a+b);

}

c = f1(9, 90);

}

Page 14: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Chamando (invocando) funções

• Em atribuições:

x = soma(100, 2);

• Em outras expressões:

printf(“A soma é: %d\n”, soma(a,b));

Page 15: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Chamando (invocando) funções

• Atenção:

▫ Para cada parâmetro da função deve ser informada uma constante ou uma variável do mesmo tipo e na mesma ordem da declaração da função

▫ As variáveis passadas como parâmetros nãosão afetadas pela função. O que a função usa é somente uma cópia dos valores dessas variáveis.

Page 16: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Chamando (invocando) funções

• Ainda usando a função soma, que tem dois parâmetros, é incorreto:

x = soma();

x = soma(50);

x = soma(100, 2, 50);

x = soma(10.25, 50);

Número incorreto de parâmetros

Tipo incorreto do primeiro

parâmetro

Page 17: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Exemplo de função#include <stdio.h>

int somaEsq (int x, int y) {

x = x + 1;

y = y + 1;

return (x + y);

}

int main () {

int a, b;

a=10;

b=5;

printf ("Soma de a e b: %d\n", a + b);

printf ("Soma de x e y: %d\n", somaEsq(a, b));

printf ("a: %d\n", a);

printf ("b: %d\n", b);

return 0;

}

O que será impresso na tela?

Page 18: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Exemplo de função#include <stdio.h>

int somaEsq (int x, int y) {

x = x + 1;

y = y + 1;

return (x + y);

}

int main () {

int a, b;

a=10;

b=5;

printf ("Soma de a e b: %d\n", a + b);

printf ("Soma de x e y: %d\n", somaEsq(a, b));

printf ("a: %d\n", a);

printf ("b: %d\n", b);

return 0;

}

O que será impresso na tela?

Os valores de a e b não são afetados pela função.

Page 19: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Outro exemplo – return• A função termina quando encontra o comando

return. Nada após ele é executado.

int leNumero(){

int n;

printf("Digite um numero:");

scanf("%d",&n);

return n;

printf("bla bla bla bla");

}

int soma(int a, int b){

return (a+b);

}

int main(){

int x1, x2;

x1 = leNumero();

x2 = leNumero();

printf("Soma e: %d\n",soma(x1,x2));

}

Page 20: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Outro exemplo – return• A função termina quando encontra o comando

return. Nada após ele é executado.

int leNumero(){

int n;

printf("Digite um numero:");

scanf("%d",&n);

return n;

printf("bla bla bla bla");

}

int soma(int a, int b){

return (a+b);

}

int main(){

int x1, x2;

x1 = leNumero();

x2 = leNumero();

printf("Soma e: %d\n", soma(x1,x2));

}

Esse comando nunca será executado.

Page 21: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

O tipo void

• É um tipo especial• Ele significa “nada” ou “vazio”• Usado para:▫ Indicar que uma função não retorna nenhum

valor▫ A lista de parâmetros de uma função é vazia▫ Tornar funções mais genéricas

• Exemplo:void imprime (int numero) {

printf(“Número $d\n”, numero)

}

Page 22: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Exemplo

#include <stdio.h>

void imprime (int numero) {

printf ("Numero %d\n", numero);

}

int main (void) {

imprime (10);

imprime (20);

return 0;

}

Page 23: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Exemplo 2#include <stdio.h>

void funcImp(void *val, int t) {

switch (t) {

case 1:

printf("%4d",*(int*)val); break;

case 2:

printf(“%c",*(char*)val); break;

case 3:

printf("%.2f",*(float*)val); break;

}

}

int main () {

int a=10; char b='9'; float c=10.2;

void *ptr;

ptr = &a;

funcImp(ptr, 1);

ptr = &b;

funcImp(ptr, 2);

ptr = &c;

funcImp(ptr, 3);

}

Page 24: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

A função main

• É uma função especial

• Todo programa começa a ser executado por ela

• Tem sempre o tipo fixo int

• O comando return na função main:

▫ 0 se o programa terminou corretamente

▫ Outro valor se ocorreu algum erro

Page 25: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

A função main –

passagem de parâmetros• Pode-se usar 2 parâmetros:

int main(int argc, char *argv[])

• argc – número de parâmetros passados na linha de comando

• argv – vetor de strings contendo os parâmetros passados pela linha de comando

▫ Atenção: na primeira posição de argv está o nome do programa

Page 26: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Exemplo

int main(int argc, char *argv[]) {

int i;

for (i = 0; i < argc; i++)

printf("%s\n", argv[i]);

return 0;

}

• Na linha de comando:nome_programa arg1 arg2 ... argn

Page 27: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Protótipos de funções

• Até o momento as funções são declaradas antes da função main.

• Se a declaração estiver após a main, em certos, compiladores ocorrerá um erro.

#include <stdio.h>

int main () {

float a = 0, b = 5;

printf ("%f\n", soma (a, b));

return 0;

}

float soma (float op1, float op2) {

return (op1 + op2);

}

Pode gerar erro de compilação!

Page 28: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Protótipos de funções

• Podemos adicionar os protótipos das funções no início do programa. Assim é possível declarar as funções em qualquer ordem.

• O protótipo nada mais é do que o cabeçalho da função

• Exemplo:tipo nome (tipo parâmetro1, ... tipo parâmetroN);

Page 29: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Exemplo

#include <stdio.h>

float soma (float op1, float op2);

int main () {

float a = 0, b = 5;

printf (“%f\n”, soma (a, b));

return 0;

}

float soma (float op1, float op2) {

return (op1 + op2);

}

Page 30: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Exemplo com mais de uma função#include <stdio.h>

float soma (float op1, float op2);

float subt (float op1, float op2);

int main () {

float a = 0, b = 5;

printf ("%f\n %f\n", soma (a, b),subt(a, b));

return 0;

}

float soma (float op1, float op2) {

return (op1 + op2);

}

float subt (float op1, float op2) {

return (op1 - op2);

}

Page 31: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Variáveis

int funcao1(char c, float f) {

float res;

...

}

int funcao2(void) {

float res;

...

}

O que acontece ao tentar compilar um código-fonte que tenha essas

duas funções?

Page 32: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Escopo de Variáveis (locais e globais)

Característica Escopo Local Escopo Global

Declaração Dentro de uma função Fora das funções

Existência Após a execução da função a variável deixa de existir

Durante toda a execução do programa

Visibilidade Somente dentro da função

Qualquer função pode acessá-las e alterá-las

Parâmetros de funções São variáveis locais -

Valores passados ao parâmetros de funções

Podem ser locais, globais, ponteiros ou constantes.

Page 33: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Organização geral de programas#include <stdio.h>

#include <outras bibliotecas>

Protótipos de funções

Declaração de Variáveis Globais

int main(){

Declaração de variáveis locais

Comandos;

}

int fun1(Parâmetros){

Declaração de variáveis locais

Comandos;

}

int fun2(Parâmetros){

Declaração de variáveis locais

Comandos;

}

Page 34: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Exemplo#include<stdio.h>

void fun1();

int fun2(int local_b);

int global;

int main() {

int local_main;

...

}

void fun1() {

int local_a;

...

}

int fun2(int local_b){

int local_c;

...

}

Quais as variáveis visíveis aqui?

Quais as variáveis visíveis aqui?

Quais as variáveis visíveis aqui?

Page 35: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Exemplo#include<stdio.h>

void fun1();

int fun2(int local_b);

int global;

int main() {

int local_main;

...

}

void fun1() {

int local_a;

...

}

int fun2(int local_b){

int local_c;

...

}

Quais as variáveis visíveis aqui?

Quais as variáveis visíveis aqui?

Quais as variáveis visíveis aqui?

global, local_main

global, local_a

global, local_b, local_c

Page 36: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Escopo de variáveis

• E se houver uma variável local com o mesmo nome de uma global? Exemplo:

#include <stdio.h>

void fa();

int nota = 10;

int main(){

nota = 20;

fa();

}

void fa() {

int nota;

nota = 5;

}

Page 37: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Escopo de variáveis

• E se houver uma variável local com o mesmo nome de uma global? Exemplo:

#include <stdio.h>

void fa();

int nota = 10;

int main(){

nota = 20;

fa();

}

void fa() {

int nota;

nota = 5;

}

A variável local “esconde” a global, ou seja, dentro da

função é considerada somente a variável local.

Page 38: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Exemplo completo

• Testar se um número é primo:

divisor = 2;

eprimo=1;

while(divisor<=candidato/2) {

if(candidato % divisor == 0){

eprimo=0;

break;

}

divisor++;

}

if(eprimo)

printf(" %d, ", candidato);

Page 39: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Imprimir os n primeiros primosint main(){

int divisor=0, n=0, eprimo=0, candidato=0, primosImpr=0;

printf(“\n Digite número de primos a imprimir:”);

scanf(“%d”,&n);

if(n>=1){

printf("2, ");

primosImpr=1;

candidato=3;

while(primosImpr < n){

divisor = 2;

eprimo=1;

while( divisor <= candidato/2 ){

if(candidato % divisor == 0){

eprimo=0;

break;

}

divisor++;

}

if(eprimo){

printf("%d, ",candidato);

primosImpr++;

}

candidato=candidato+2;

} } }

Page 40: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Criar uma função para dizer se é primo

int ePrimo(int candidato)

int divisor = 2, eprimo=1;

while(divisor<=candidato/2) {

if(candidato % divisor == 0){

eprimo=0;

break;

}

divisor++;

}

if(eprimo)

return 1;

else

return 0;

}

}

Page 41: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Código com a função#include <stdio.h>

int ePrimo(int candidato);

int main(){

int divisor=0, n=0, eprimo=0, candidato=0, primosImpr=0;

printf("\n Digite numero de primos a imprimir:");

scanf("%d",&n);

if(n >= 1){

printf("2, ");

primosImpr = 1;

candidato = 3;

while(primosImpr < n){

if( ePrimo(candidato) ){

printf("%d, ",candidato);

primosImpr++;

}

candidato=candidato+2;

}

}

}

Page 42: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Atividades

• Crie um programa que contém uma função que calcula ab (não use bibliotecas para isso)

▫ double pot(double a, double b)

• Usando a mesma função agora crie um programa que imprime: a0, a1, a2, ... ab

Page 43: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Atividades

• Escreva um programa que tenha uma função que computa o fatorial de um numero n passado por parâmetro.

▫ long fat(long n);

▫ Se n <= 0 seu programa deve retornar 1.

• Agora use a mesma função anterior e crie um programa que imprima todos os valores de 1! até n!

Page 44: Linguagem C funções - pessoal.dainf.ct.utfpr.edu.br

Atividades

• Reescreva o programa de soma de matrizes. Utilize uma função para lê-las, outra para calcular a soma e uma terceira para imprimir a soma.

• Escreva uma função que recebe um número inteiro n passado por parâmetro e devolve o primeiro número da série de fibonacci que é maior ou igual a n.