Linguagem C: Elementos fundamentais

Documentos relacionados
INF1007: Programação 2. 0 Revisão. 06/08/2015 (c) Dept. de Informática - PUC-Rio 1

Cap. 2 Expressões na linguagem C

Estruturas de Dados. Módulo 4 Funções. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

PROGRAMAÇÃO I E N T R A DA E S A Í DA D E DA D O S

Introdução à Linguagem C Variáveis e Expressões

Introdução a Programação de Jogos

Estruturas da linguagem C. 1. Identificadores, tipos primitivos, variáveis e constantes, operadores e expressões.

Tipos Básicos. Operadores de Incremento e Decremento. Operador Sizeof. Estruturas de Dados Aula 2: Estruturas Estáticas

Estruturas de Dados Aula 2: Estruturas Estáticas 02/03/2011

controle de fluxo - condicionais

Linguagem C: Introdução

Métodos Computacionais. Operadores, Expressões Aritméticas e Entrada/Saída de Dados

Capítulo 2: Introdução à Linguagem C

LÓGICA DE PROGRAMAÇÃO. PROFª. M.Sc. JULIANA H Q BENACCHIO

INF 1005 Programação I

Linguagem C. Prof.ª Márcia Jani Cícero

Módulo 5 Vetores e Alocação Dinâmica

INF 1007 Programação II

Programação de Computadores II. Cap. 5 Vetores

Linguagens de Programação I

Introdução à Linguagem C++

Tipos de Dados, Variáveis e Entrada e Saída em C. DCC 120 Laboratório de Programação

Linguagens de Programação PROGRAMAÇÃO DE COMPUTADORES. Linguagem C. Linguagem C Estrutura Básica. Constante (literais) Linguagem C Primeiro Programa

ponteiros INF Programação I Prof. Roberto Azevedo

Variáveis primitivas e Controle de fluxo

Linguagem C (estruturas condicionais)

Introdução à Linguagem C

MC102 Algoritmos e Programação de Computadores

Hello World. Linguagem C. Tipos de Dados. Palavras Reservadas. Operadores Aritméticos. Pré e pós incremento e pré e pós decremento

Revisão C++ - Parte 1

Curso de C. Declaração de Variáveis 18/3/ :48 1

K&R: Capitulo 2 IAED, 2012/2013

Linguagem C Controle do Fluxo de Execução. Lógica de Programação

Capítulo 2 Operadores. A função scanf()

Linguagem C Princípios Básicos (parte 1)

Alocação Dinâmica em C

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

Exercícios Repetição

Métodos Computacionais. Comandos Condicionais e de Repetição em C

Estrutura do programa

ALGORITMOS E TÉCNICAS DE PROGRAMAÇÃO

LINGUAGEM C: VARIÁVEIS E EXPRESSÕES

Conceitos básicos de programação

Módulo 1. Introdução. AEDS I C++ (Rone Ilídio)

Linguagem de Programação C. Prof. Fabrício Olivetti de França

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

C Operadores e Expressões

A linguagem C (visão histórica)

Entender o problema Encontrar um algoritmo para resolvê-lo. Implementar o algoritmo numa linguagem de programação

Comandos de entrada. e saída. Comandos de entrada. Comandos de entrada. Comandos de entrada. Comandos de entrada. Comandos de entrada.

Faculdade Anglo-Americano Curso de Ciência da Computação Linguagem de Programação. Lista de Exercícios 1

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

Aula 5 Oficina de Programação Introdução ao C. Profa. Elaine Faria UFU

Instituto de C. Linguagem C: Listas. Luis Martí Instituto de Computação Universidade Federal Fluminense -

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 29 de agosto de 2008

Aula 12- Variáveis e valores reais

Computação para Informática - Prof. Adriano Joaquim de Oliveira Cruz Segunda Aula Prática - 3 de setembro de 2010

Capítulo 2: Condicionais. Pontifícia Universidade Católica Departamento de Informática

Capítulo 4: Condicionais

Introdução à Ciência da Computação scc-120

Programação de Computadores II. Cap. 7 Cadeias de Caracteres 1/2

Capítulo 3: Programando com Funções

3. Linguagem de Programação C

Computadores Digitais 2. Prof. Rodrigo de Souza Couto

Linguagem C (repetição)

Faculdade de Computação

C Comandos de Controle

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

Estruturas de Repetição

Programação: Vetores

Algoritmos e Estruturas de Dados I IEC012. Linguagem C - Guia de bolso - Prof. César Melo

Controlo de Execução. K&R: Capitulo 3

5. Vetores e alocação dinâmica

Introdução à Computação MAC0110

Linguagem de Programação C

Linguagem de Programação C

INF1005: Programação 1. Condicionais. 08/03/10 (c) Rogério Rodrigues 1

Introdução à Linguagem C

Introdução a JAVA. Variáveis, tipos, expressões, comandos e blocos

Programação Orientada a Objetos

Aula 4. Comandos de Repetição. Prof. Filipe Mutz.

Comandos em C (cont.)

Métodos Computacionais. Funções, Escopo de Variáveis e Ponteiros

Disciplina de Algoritmos e Programação

PROGRAMAS BÁSICOS EM C++ Disciplina: Introdução à Ciência da Computação Prof. Modesto Antonio Chaves Universidade estadual do Sudoeste da Bahia

EXERCÍCIO DE SONDAGEM TURMA 01 SEMESTRE DATA: 01/11/2016. Matrícula Nome Nota

Algoritmos RESUMO - LINGUAGEM C

Introdução à Programação

Programação de Computadores I Funções de Repetição da Linguagem C PROFESSORA CINTIA CAETANO

Introdução a C Tipos de Dados Variáveis Operadores

Introdução a Linguagem C. Prof. Me. Hélio Esperidião

Métodos Computacionais. Vetores e Matrizes Dinâmicas

Linguagem C: Variáveis e Operadores. Prof. Leonardo Barreto Campos 1

Apostila de Estruturas de Dados

Introdução à Ciência da Computação

Algoritmos e Estruturas de Dados I (DCC/003) 2013/1. Estruturas Básicas. Aula Tópico 4

INF1005: Programação 1. Repetições. 08/03/10 (c) Paula Rodrigues 1

Transcrição:

Instituto de C Linguagem C: Elementos fundamentais Luis Martí Instituto de Computação Universidade Federal Fluminense lmarti@ic.uff.br - http://lmarti.com

Tópicos Principais Variáveis e Constantes Operadores e Expressões Entrada e Saída Tomada de Decisão Construções com Laços Definição de Funções Pilha de Execução Funções Recursivas Variáves Globais X Variáveis Estáticas 18/11/12 Estrutura de Dados II 2

Variáveis e Constantes Tipos básicos na linguagem C: Tipo Tamanho Menor valor Maior valor char 1 byte -128 +127 unsigned char 1 byte 0 +255 short int (short) 2 bytes -32.768 +32.767 unsigned short int 2 bytes 0 +65.535 int (*) 4 bytes -2.147.483.648 +2.147.483.647 long int (long) 4 bytes -2.147.483.648 +2.147.483.647 unsigned long int 4 bytes 0 +4.294.967.295 float 4 bytes -10 38 +10 38 double 8 bytes -10 308 +10 308 (*) depende da máquina, sendo 4 bytes para arquiteturas de 32 bits 18/11/12 Estrutura de Dados II 3

Variáveis e Constantes Valor Constante: armazenado na memória possui um tipo, indicado pela sintaxe da constante 123 /* constante inteira do tipo int */ 12.45 /* constante real do tipo double */ 1245e-2 /* constante real do tipo double */ 12.45F /* constante real do tipo float */ 18/11/12 Estrutura de Dados II 4

Variáveis e Constantes Variável: espaço de memória para armazenar um dado não é uma variável no sentido matemático possui um tipo e um nome nome: identifica o espaço de memória tipo: determina a natureza do dado 18/11/12 Estrutura de Dados II 5

Variáveis e Constantes Declaração de variável: variáveis devem ser explicitamente declaradas variáveis podem ser declaradas em conjunto int a; /* declara uma variável do tipo int */ int b; /* declara uma variável do tipo int */ float c; /* declara uma variável do tipo float */ int d, e; /* declara duas variáveis do tipo int */ 18/11/12 Estrutura de Dados II 6

Variáveis e Constantes Declaração de variável: variáveis só armazenam valores do mesmo tipo com que foram declaradas int a; /* declara uma variável do tipo int */ a = 4.3; /* a armazenará o valor 4 */ 18/11/12 Estrutura de Dados II 7

Variáveis e Constantes Variável com valor indefinido: uma variável pode receber um valor quando é definida (inicializada), ou através de um operador de atribuição int a = 5, b = 10; /* declara e inicializa duas variáveis do tipo int */ float c = 5.3; /* declara e inicializa uma variável do tipo float */ 18/11/12 Estrutura de Dados II 8

Variáveis e Constantes Variável com valor indefinido: uma variável deve ter um valor definido quando é utilizada int a, b, c; /* declara e inicializa duas variáveis do tipo int */ a = 2; c = a + b; /* ERRO: b contém lixo */ 18/11/12 Estrutura de Dados II 9

Operadores e Expressões Operadores: aritméticos: +, -, *, /, % atribuição: =, +=, -=, *=, /=, %= incremento e decremento: ++, -- relacionais e lógicos: <, <=, ==, >=, >,!= outros 18/11/12 Estrutura de Dados II 10

Operadores e Expressões Operadores aritméticos ( +, -, *, /, % ): operações são feitas na precisão dos operandos o operando com tipo de menor expressividade é convertido para o tipo do operando com tipo de maior expressividade divisão entre inteiros trunca a parte fracionária int a double b, c; a = 3.5; /* a recebe o valor 3 */ b = a / 2.0; /* b recebe o valor 1.5 */ c = 1/3 + b; /* 1/3 retorna 0 pois a operação será sobre inteiros */ /* c recebe o valor de b */ 18/11/12 Estrutura de Dados II 11

Operadores e Expressões Operadores aritméticos (cont.): o operador módulo, %, aplica-se a inteiros precedência dos operadores: *, /, -, + x % 2 /* o resultado será 0, se x for par; caso contrário, será 1 */ a + b * c / d é equivalente a (a + ((b * c) / d)) 18/11/12 Estrutura de Dados II 12

Operadores e Expressões Operadores de atribuição : ( =, +=, -=, *=, /=, %= ) C trata uma atribuição como uma expressão a ordem é da direita para a esquerda C oferece uma notação compacta para atribuições em que a mesma variável aparece dos dois lados var op= expr é equivalente a var = var op (expr) i += 2; é equivalente a i = i + 2; x *= y + 1; é equivalente a x = x * (y +1); 18/11/12 Estrutura de Dados II 13

Operadores e Expressões Operadores de incremento e decremento ( ++, -- ): incrementa ou decrementa de uma unidade o valor de uma variável os operadores não se aplicam a expressões o incremento pode ser antes ou depois da variável ser utilizada n++ ++n incrementa n de uma unidade, depois de ser usado incrementa n de uma unidade, antes de ser usado n = 5; x = n++; /* x recebe 5; n é incrementada para 6 */ x = ++n; /* n é incrementada para 6; x recebe 6 */ a = 3; b = a++ * 2; / b termina com o valor 6 e a com o valor 4 */ 18/11/12 Estrutura de Dados II 14

Operadores e Expressões Operadores relacionais (<, <=, ==, >=, >,!=): o resultado será 0 ou 1 (não há valores booleanos em C) int a, b; int c = 23; int d = c + 4; c < 20 retorna 0 d > c retorna 1 18/11/12 Estrutura de Dados II 15

Operadores e Expressões Operadores lógicos ( &&,,! ) a avaliação é da esquerda para a direita a avaliação pára quando o resultado pode ser conhecido int a, b; int c = 23; int d = c + 4; a = (c < 20) (d > c); /* retorna 1 */ /* as duas sub-expressões são avaliadas */ b = (c < 20) && (d > c); /* retorna 0 */ /* apenas a primeira sub-expressão é avaliada */ 18/11/12 Estrutura de Dados II 16

Operadores e Expressões sizeof: retorna o número de bytes ocupados por um tipo int a = sizeof(float) /* armazena 4 em a */ 18/11/12 Estrutura de Dados II 17

Operadores e Expressões conversão de tipo: conversão de tipo é automática na avaliação de uma expressão conversão de tipo pode ser requisita explicitamente float f; /* valor 3 é convertido automaticamente para float */ float f = 3; /* ou seja, passa a valer 3.0F, antes de ser atribuído a f */ int g, h; /* 3.5 é convertido (e arredondado) para int */ g = (int) 3.5; /* antes de ser atribuído à variável g */ h = (int) 3.5 % 2 /* e antes de aplicar o operador módulo % */ 18/11/12 Estrutura de Dados II 18

Entrada e Saída Função printf : possibilita a saída de valores segundo um determinado formato printf (formato, lista de constantes/variáveis/expressões...); printf ("%d %g", 33, 5.3); tem como resultado a impressão da linha: 33 5.3 printf ("Inteiro = %d Real = %g", 33, 5.3); com saída: Inteiro = 33 Real = 5.3 18/11/12 Estrutura de Dados II 19

Entrada e Saída Especificação de formato: %c especifica um char %d especifica um int %u especifica um unsigned int %f especifica um double (ou float) %e especifica um double (ou float) no formato científico %g especifica um double (ou float) no formato mais apropriado (%f ou %e) %s especifica uma cadeia de caracteres 18/11/12 Estrutura de Dados II 20

Entrada e Saída Especificação de tamanho de campo: 18/11/12 Estrutura de Dados II 21

Entrada e Saída Impressão de texto: printf("curso de Estruturas de Dados\n"); exibe na tela a mensagem: Curso de Estruturas de Dados 18/11/12 Estrutura de Dados II 22

Entrada e Saída Função scanf : captura valores fornecidos via teclado scanf (formato, lista de endereços das variáveis...); int n; scanf ("%d", &n); valor inteiro digitado pelo usuário é armazenado na variável n 18/11/12 Estrutura de Dados II 23

Entrada e Saída Especificação de formato: %c especifica um char %d especifica um int %u especifica um unsigned int %f,%e,%g especificam um float %lf, %le, %lg especificam um double %s especifica uma cadeia de caracteres 18/11/12 Estrutura de Dados II 24

Entrada e Saída Função scanf (cont.): caracteres diferentes dos especificadores no formato servem para cercar a entrada espaço em branco dentro do formato faz com que sejam "pulados" eventuais brancos da entrada %d, %f, %e e %g automaticamente pulam os brancos que precederem os valores numéricos a serem capturados scanf ("%d:%d", &h, &m); valores (inteiros) fornecidos devem ser separados pelo caractere dois pontos (:) 18/11/12 Estrutura de Dados II 25

Tomada de Decisão Comando if : comando básico para codificar tomada de decisão se expr for verdadeira ( 0), executa o bloco de comandos 1 se expr for falsa (= 0), executa o bloco de comandos 2 if ( expr ) { bloco de comandos 1 else { bloco de comandos 2 ou if ( expr ) { bloco de comandos 18/11/12 Estrutura de Dados II 26

Exemplo /* nota */ #include <stdio.h> int main (void) { float nota ; printf("digite sua nota: "); scanf("%f", &nota); if (nota >= 7 ){ printf(" Boa nota, parabens! \n"); else { printf(" Voce precisa melhorar. \n"); return 0; 18/11/12 Estrutura de Dados II 27

Exemplo /* nota */ #include <stdio.h> int main (void) { float nota ; printf("digite sua nota: "); scanf("%f", &nota); if (nota >= 7 ) printf(" Boa nota, parabens! \n"); else printf(" Voce precisa melhorar. \n"); return 0; 18/11/12 Estrutura de Dados II 28

Bloco de comandos { comando1; comando2;... ou comando; 18/11/12 Estrutura de Dados II 29

Tomada de Decisão Exemplo: função para qualificar a temperatura: se a temperatura for menor do que 20 o C, então está frio se a temperatura estiver entre 20 o C e 30 o C, então está agradável se a temperatura for maior do que 30 o C, então está quente 18/11/12 Estrutura de Dados II 30

Tomada de Decisão /* temperatura (versao 1 - incorreta) */ #include <stdio.h> int main (void) { int temp; printf("digite a temperatura: "); scanf("%d", &temp); if (temp < 30) if (temp > 20) printf(" Temperatura agradável \n"); else printf(" Temperatura quente \n"); return 0; 18/11/12 Em C, um else está associado Estrutura ao último de Dados if que II não tiver seu próprio else. 31

Tomada de Decisão /* temperatura (versao 1 - incorreta) */ #include <stdio.h> int main (void) { int temp; printf("digite a temperatura: "); scanf("%d", &temp); if (temp < 30) if (temp > 20) printf(" Temperatura agradável \n"); else printf(" Temperatura quente \n"); return 0; 18/11/12 Estrutura de Dados II 32

Tomada de Decisão /* temperatura (versao 2) */ #include <stdio.h> int main (void) { int temp; printf ( "Digite a temperatura: " ); scanf ( "%d", &temp ); if ( temp < 30 ) { if ( temp > 20 ) printf ( " Temperatura agradável \n" ); else printf ( " Temperatura quente \n" ); return 0; 18/11/12 Estrutura de Dados II 33

/* temperatura (versao 3) */ #include <stdio.h> int main (void) { int temp; printf("digite a temperatura: "); scanf("%d", &temp); if (temp < 10) printf("temperatura muito fria \n"); else if (temp < 20) printf(" Temperatura fria \n"); else if (temp < 30) printf("temperatura agradável \n"); else printf("temperatura quente \n"); return 0; 18/11/12 Estrutura de Dados II 34

/* temperatura (versao 3) */ #include <stdio.h> int main (void) { int temp; printf("digite a temperatura: "); scanf("%d", &temp); if (temp < 10) printf("temperatura muito fria \n"); else if (temp < 20) printf(" Temperatura fria \n"); else if (temp < 30) printf("temperatura agradável \n"); else printf("temperatura quente \n"); return 0; 18/11/12 Estrutura de Dados II 35

/* temperatura (versao 3) */ #include <stdio.h> int main (void) { int temp; printf("digite a temperatura: "); scanf("%d", &temp); if (temp < 10) printf("temperatura muito fria \n"); else if (temp < 20) printf(" Temperatura fria \n"); else if (temp < 30) printf("temperatura agradável \n"); else printf("temperatura quente \n"); return 0; 18/11/12 Estrutura de Dados II 36

/* temperatura (versao 3) */ #include <stdio.h> int main (void) { int temp; printf("digite a temperatura: "); scanf("%d", &temp); if (temp < 10) printf("temperatura muito fria \n"); else if (temp < 20) printf(" Temperatura fria \n"); else if (temp < 30) printf("temperatura agradável \n"); else printf("temperatura quente \n"); return 0; 18/11/12 Estrutura de Dados II 37

Tomada de Decisão Estrutura de bloco: declaração de variáveis: só podem ocorrer no início do corpo da função ou de um bloco (esta restrição não existe no C99) escopo de uma variável: uma variável declarada dentro de um bloco é válida no bloco após o término do bloco, a variável deixa de existir if ( n > 0 ) { int i;...... /* a variável i não existe neste ponto do programa */ 18/11/12 Estrutura de Dados II 38

Tomada de Decisão Operador condicional: formato geral: se a condição for verdadeira, a expressão1 é avaliada; caso contrário, a expressão2 é avaliada exemplo: condição? expressão1 : expressão2; comando maximo = a > b? a : b ; comando if equivalente if ( a > b ) maximo = a; else maximo = b; 18/11/12 Estrutura de Dados II 39

Construções com laços Exemplo: fatorial de um número inteiro não negativo: n!= n ( n 1 ) ( n 2)... 3 2 1 onde: 0!= 1 18/11/12 Estrutura de Dados II 40

Construções com laços Exemplo: definição recursiva da função fatorial: Ν Ν fatorial(0) = 1 fatorial(n) = n x fatorial(n-1) cálculo não recursivo de fatorial(n) k = 1 fatorial = 1 comece com: faça enquanto k n fatorial = fatorial * k incremente k 18/11/12 Estrutura de Dados II 41

Construções com laços Comando while : enquanto expr for verdadeira, o bloco de comandos é executado quando expr for falsa, o comando termina while ( expr ) { bloco de comandos 18/11/12 Estrutura de Dados II 42

/* Fatorial */ #include <stdio.h> int main (void) { int i; int n; long int f = 1; printf("digite um numero inteiro nao negativo:"); scanf("%d", &n); /* calcula fatorial */ i = 1; while (i <= n) { f = f * i; /* equivalente a f *= i */ i = i + 1; /* equivalente a i++ */ printf(" Fatorial = %d \n", f); return 0; 18/11/12 Estrutura de Dados II 43

Construções com laços Comando for : forma compacta para exprimir laços for (expressão_inicial; expressão_booleana; expressão_de_incremento) { bloco de comandos equivalente a: expressão_inicial; while ( expressão_booleana ) { bloco de comandos... expressão_de_incremento 18/11/12 Estrutura de Dados II 44

/* Fatorial (versao 2) */ #include <stdio.h> int main (void) { int i; int n; int f = 1; printf("digite um numero inteiro nao negativo:"); scanf("%d", &n); /* calcula fatorial */ for (i = 1; i <= n; i=i+1) { f = f * i; printf(" Fatorial = %d \n", f); return 0; 18/11/12 Estrutura de Dados II 45

/* Fatorial (versao 2) */ #include <stdio.h> int main (void) { int i; int n; int f = 1; printf("digite um numero inteiro nao negativo:"); scanf("%d", &n); /* calcula fatorial */ for (i = 1; i <= n; i+1) {/* o que acontece com este programa? */ f = f * i; printf(" Fatorial = %d \n", f); return 0; 18/11/12 Estrutura de Dados II 46

Construções com laços Comando do-while : teste de encerramento é avaliado no final do { bloco de comandos while (expr); 18/11/12 Estrutura de Dados II 47

/* Fatorial (versao 3) */ #include <stdio.h> int main (void) { int i; int n; int f = 1; /* requisita valor até um número não negativo ser informado */ do { printf("digite um valor inteiro nao negativo:"); scanf ("%d", &n); while (n<0); /* calcula fatorial */ for (i = 1; i <= n; i++) f *= i; printf(" Fatorial = %d\n", f); return 0; 18/11/12 Estrutura de Dados II 48

/* Fatorial (versao 4) */ #include <stdio.h> int main (void) { int i; int n; int f = 1; /* O que faz este programa? */ do { printf("digite um valor inteiro nao negativo:"); scanf ("%d", &n); /* calcula fatorial */ for (i = 1; i <= n; i++) f *= i; printf(" Fatorial = %d\n", f); while (n>=0); return 0; 18/11/12 Estrutura de Dados II 49

Construções com laços Interrupção de laços - Comando break : termina a execução do comando de laço #include <stdio.h> int main (void) { int i; for (i = 0; i < 10; i++) { if (i == 5) break; printf("%d ", i); printf("fim\n"); return 0; A saída deste programa, se executado, será: 0 1 2 3 4 fim 18/11/12 Estrutura de Dados II 50

Construções com laços Interrupção de laços - Comando continue : termina a iteração corrente e passa para a próxima #include <stdio.h> int main (void) { int i; for (i = 0; i < 10; i++ ) { if (i == 5) continue; printf("%d ", i); printf("fim\n"); return 0; gera a saída: 0 1 2 3 4 X5 6 7 8 9 fim 18/11/12 Estrutura de Dados II 51

Construções com laços Interrupção de laços - Comando continue : deve-se ter cuidado para criar uma iteração eterno /* INCORRETO */ #include <stdio.h> int main (void) { int i = 0; while (i < 10) { if (i == 5) continue; printf("%d ", i); i++; printf("fim\n"); return 0; cria iteração eterna pois i não será mais incrementado quando chegar a 5 18/11/12 Estrutura de Dados II 52

Construções com laços Comando switch : seleciona uma entre vários casos ( op k deve ser um inteiro ou caractere) switch ( expr ) { case op1: bloco de comandos 1; break; case op2: bloco de comandos 2; break;... default: bloco de comandos default; break; 18/11/12 Estrutura de Dados II 53

/* calculadora de quatro operações */ #include <stdio.h> int main (void) { float num1, num2; char op; printf("digite: numero op numero\n"); scanf ("%f %c %f", &num1, &op, &num2); switch (op) { case '+': printf(" = %f\n", num1+num2); break; case '-': printf(" = %f\n", num1-num2); break; case '*': printf(" = %f\n", num1*num2); break; case '/': printf(" = %f\n", num1/num2); break; default: printf("operador invalido!\n"); break; return 0; 18/11/12 Estrutura de Dados II 54

Definição de Funções Comando para definição de função: tipo_retornado nome_da_função ( lista de parâmetros... ) { corpo da função 18/11/12 Estrutura de Dados II 55

/* programa que lê um número e imprime seu fatorial */ #include <stdio.h> int fat (int n); int main (void) { int n, r; printf( Digite um número nao negativo: ); chamada da função scanf("%d", &n); fat(n); main retorna um inteiro: return 0; 0 : execução OK 0 : execução OK /* função para calcular o valor do fatorial */ declaração da função: int fat (int n) indica o tipo da saída e o tipo e nome das entradas { int i; int f = 1; for (i = 1; i <= n; i++) f *= i; printf( Fatorial = %f, f); protótipo da função: deve ser incluído antes da função ser chamada 18/11/12 Estrutura de Dados II 56

void fat (int n); /* obs: existe ; no protótipo */ void fat(int n) /* obs: não existe ; na declaração */ { 18/11/12 Estrutura de Dados II 57

/* programa que lê um número e imprime seu fatorial (versão 2) */ #include <stdio.h> int fat (int n); int main (void) { int n, r; printf( Digite um número nao negativo: ); scanf("%d", &n); r = fat(n); printf("fatorial = %d\n", r); return 0; protótipo da função: deve ser incluído antes da função ser chamada chamada da função main retorna um inteiro: 0 : execução OK 0 : execução OK /* função para calcular o valor do fatorial */ declaração da função: int fat (int n) indica o tipo da saída e { int i; o tipo e nome das entradas int f = 1; for (i = 1; i <= n; i++) f *= i; return f; retorna o valor da função 18/11/12 Estrutura de Dados II 58

Pilha de Execução Comunicação entre funções: funções são independentes entre si transferência de dados entre funções: através dos parâmetros e do valor de retorno da função chamada passagem de parâmetros é feita por valor variáveis locais a uma função: definidas dentro do corpo da função (incluindo os parâmetros) não existem fora da função são criadas cada vez que a função é executada deixam de existir quando a execução da função terminar 18/11/12 Estrutura de Dados II 59

Pilha de Execução Comunicação entre funções (cont.): Pergunta: Como implementar a comunicação entre funções? Resposta: Através de uma pilha c b a 'x' 112 - variável c no endereço 112 com valor igual a 'x' 43.5 7 108 - variável b no endereço 108 com valor igual a 43.5 104 - variável a no endereço 104 com valor igual a 7 18/11/12 Estrutura de Dados II 60

/* programa que lê um numero e imprime seu fatorial (versão 3) */ #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; int fat (int n) { int f = 1; while (n!= 0) { f *= n; n--; return f; Exemplo: Fatorial iterativo simulação da chamada fat(5): declaração das variáveis n e r, locais à função main declaração das variáveis n e f, locais à função fat alteração no valor de n em fat não altera o valor de n em main a variável n possui valor 0 ao final da execução de fat, mas o valor 18/11/12 Estrutura de Dados II 61 de n no programa principal ainda será 5

Exemplo: Início do programa /* programa que lê um numero e imprime seu fatorial (versão 3) */ #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; int fat (int n) { int f = 1; while (n!= 0) { f *= n; n--; return f; 18/11/12 Estrutura de Dados II 62

Exemplo: Declaração de n e r na main() /* programa que lê um numero e imprime seu fatorial (versão 3) */ #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; int fat (int n) { int f = 1; while (n!= 0) { f *= n; n--; return f; 18/11/12 Estrutura de Dados II 63

Exemplo: Declaração de n na fat(int n) /* programa que lê um numero e imprime seu fatorial (versão 3) */ #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; int fat (int n) { int f = 1; while (n!= 0) { f *= n; n--; return f; 18/11/12 Estrutura de Dados II 64

Exemplo: Declaração de n e f na fat(int n) /* programa que lê um numero e imprime seu fatorial (versão 3) */ #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; int fat (int n) { int f = 1; while (n!= 0) { f *= n; n--; return f; 18/11/12 Estrutura de Dados II 65

Exemplo: no final do laço /* programa que lê um numero e imprime seu fatorial (versão 3) */ #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; int fat (int n) { int f = 1; while (n!= 0) { f *= n; n--; return f; 18/11/12 Estrutura de Dados II 66

Exemplo: no retorno /* programa que lê um numero e imprime seu fatorial (versão 3) */ #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; int fat (int n) { int f = 1; while (n!= 0) { f *= n; n--; return f; 18/11/12 Estrutura de Dados II 67

Funções Recursivas Tipos de recursão: direta: uma função A chama a ela própria indireta: uma função A chama uma função B que, por sua vez, chama A Comportamento: quando uma função é chamada recursivamente, cria-se um ambiente local para cada chamada as variáveis locais de chamadas recursivas são independentes entre si, como se estivéssemos chamando funções diferentes 18/11/12 Estrutura de Dados II 68

Funções Recursivas Exemplo: definição recursiva de fatorial n!= { 1, se n=0 n (n 1)!, se n>0 /* Função recursiva para cálculo do fatorial */ int fat (int n) { if (n==0) return 1; else return n*fat(n-1); 18/11/12 Estrutura de Dados II 69

Funções Recursivas #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; /* Função recursiva para cálculo do fatorial */ int fat (int n) { f int f; if (n==0) fat(5) n f=1; r else f= n*fat(n-1); main n return f; 18/11/12 Estrutura de Dados II 70-5 - 5

Funções Recursivas #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; f /* Função recursiva para cálculo do fatorial */ int fat (int n) fat(4) n { f int f; if (n==0) fat(5) n f=1; r else f= n*fat(n-1); main n return f; 18/11/12 Estrutura de Dados II 71-4 - 5-5

Funções Recursivas #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; f /* Função recursiva para cálculo do fatorial */ int fat (int n) fat(4) n { f int f; if (n==0) fat(5) n f=1; r else f= n*fat(n-1); main n return f; 18/11/12 Estrutura de Dados II 72 f fat(0) n f fat(1) n f fat(2) n f fat(3) n 1 0-1 - 2-3 - 4-5 - 5

Funções Recursivas #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; f /* Função recursiva para cálculo do fatorial */ int fat (int n) fat(4) n { f int f; if (n==0) fat(5) n f=1; r else f= n*fat(n-1); main n return f; 18/11/12 Estrutura de Dados II 73 f fat(1) n f fat(2) n f fat(3) n 1 1-2 - 3-4 - 5-5

Funções Recursivas #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; f /* Função recursiva para cálculo do fatorial */ int fat (int n) fat(4) n { f int f; if (n==0) fat(5) n f=1; r else f= n*fat(n-1); main n return f; 18/11/12 Estrutura de Dados II 74 f fat(2) n f fat(3) n 2 2-3 - 4-5 - 5

Funções Recursivas #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; f /* Função recursiva para cálculo do fatorial */ int fat (int n) fat(4) n { f int f; if (n==0) fat(5) n f=1; r else f= n*fat(n-1); main n return f; 18/11/12 Estrutura de Dados II 75 f fat(3) n 6 3-4 - 5-5

Funções Recursivas #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; f /* Função recursiva para cálculo do fatorial */ int fat (int n) fat(4) n { f int f; if (n==0) fat(5) n f=1; r else f= n*fat(n-1); main n return f; 18/11/12 Estrutura de Dados II 76 24 4-5 - 5

Funções Recursivas #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; /* Função recursiva para cálculo do fatorial */ int fat (int n) { f int f; if (n==0) fat(5) n f=1; r else f= n*fat(n-1); main n return f; 18/11/12 Estrutura de Dados II 77 120 5-5

Funções Recursivas #include <stdio.h> int fat (int n); int main (void) { int n = 5; int r; r = fat ( n ); printf("fatorial de %d = %d \n", n, r); return 0; /* Função recursiva para cálculo do fatorial */ int fat (int n) { int f; if (n==0) f=1; r else f= n*fat(n-1); main n return f; 18/11/12 Estrutura de Dados II 78 120 5

Variáveis Globais Variável global: declarada fora do corpo das funções: visível por todas as funções subseqüentes não é armazenada na pilha de execução: não deixa de existir quando a execução de uma função termina existe enquanto o programa estiver sendo executado utilização de variáveis globais: deve ser feito com critério pode-se criar um alto grau de interdependência entre as funções dificulta o entendimento e o reuso do código 18/11/12 Estrutura de Dados II 79

Variáveis Globais #include <stdio.h> int s, p; /* variáveis globais */ void somaprod (int a, int b) { s = a + b; p = a * b; int main (void) { int x, y; scanf("%d %d", &x, &y); somaprod(x,y); printf("soma = %d produto = %d\n", s, p); return 0; 18/11/12 Estrutura de Dados II 80

Variáveis Estáticas Variável estática: declarada no corpo de uma função: visível apenas dentro da função em que foi declarada não é armazenada na pilha de execução: armazenada em uma área de memória estática continua existindo antes ou depois de a função ser executada utilização de variáveis estáticas: quando for necessário recuperar o valor de uma variável atribuída na última vez que a função foi executada 18/11/12 Estrutura de Dados II 81

Variáveis Estáticas Exemplo: void imprime ( float a ) { static int n = 1; printf(" %f ", a); if ((n % 5) == 0) printf(" \n "); n++; função para imprimir números reais: imprime um número por vez, separando-os por espaços em branco e colocando, no máximo, cinco números por linha 18/11/12 Estrutura de Dados II 82

Variáveis Estáticas X Globais variáveis estáticas e variáveis globais: são inicializadas com zero, se não forem explicitamente inicializadas variáveis globais estáticas: são visíveis para todas as funções subseqüentes não podem ser acessadas por funções definidas em outros arquivos funções estáticas: não podem ser chamadas por funções definidas em outros arquivos 18/11/12 Estrutura de Dados II 83

Exercícios Faça um programa que recebe como entrada as notas de três provas de um aluno e calcula e exibe a média deste aluno, se ele estiver aprovado, ou informa a necessidade de uma prova final, se ele não tiver satisfeito o seguinte critério: Todas as notas maiores ou iguais a 3; e Média aritmética maior ou igual a 5 Coloque o cálculo da média em uma função separada 18/11/12 Estrutura de Dados II 84

Exercícios #include <stdio.h> float calculamedia(float g1, float g2, float g3); int main(void) { float g1, g2, g3, media; printf( Digite os graus G1, G2 e G3: ); scanf( %f %f %f, &g1, &g2, &g3); media = calculamedia(g1, g2, g3); if (media >= 5.0 && g1 >= 3.0 && g2 >= 3.0 && g3 >= 3.0) { printf( SF = APROVADO, MF = %f\n, media); else { printf( ALUNO EM PROVA FINAL.\n ); float calculamedia(float g1, float g2, float g3) { float media; media = (g1 + g2 + g3) / 3; return media; 18/11/12 Estrutura de Dados II 85

Exercícios Implemente uma função que retorne uma aproximação do valor de PI, de acordo com a Fórmula de Leibniz: Π =4 (1 1 3 + 1 5 1 7 + 1 9 1 11 +... ) Ou seja: ( 1) i n 1 Π =4 i=0 2 i+1 A função deve obedecer ao protótipo: float pi(int n); 18/11/12 Estrutura de Dados II 86

#include <stdio.h> float pi(int n); Exercícios int main(void) { int n; float p; printf("digite o numero de termos: "); scanf("%d", &n); if (n < 1) { printf("erro! O numero de termos deve ser maior que zero.\n"); else { p = pi(n); printf("pi = %f\n", p); return 0; float pi(int n) { float soma; int i; soma = 1; for (i = 1; i < n; i++) { if (i % 2) { soma = soma - (1.0 / ((2 * i) + 1)); else { soma = soma + (1.0 / ((2 * i) + 1)); return 4*soma; 18/11/12 Estrutura de Dados II 87

#include <stdio.h> #include <math.h> Exercícios float pi(int n); int main(void) { int n; float p; printf("digite o numero de termos: "); scanf("%d", &n); if (n < 1) { printf("erro! O numero de termos deve ser maior que zero.\n"); else { p = pi(n); printf("pi = %f\n", p); return 0; float pi(int n) { float soma; int i; soma = 1; for (i = 1; i < n; i++) { soma = soma + (pow(-1,i) / ((2 * i) + 1)); return 4*soma; 18/11/12 Estrutura de Dados II 88

Referências Waldemar Celes, Renato Cerqueira, José Lucas Rangel, Introdução a Estruturas de Dados, Editora Campus (2004) Capítulo 1 Ciclo de Desenvolvimento Capítulo 2 Expressões e E/S Capítulo 3 Controle de Fluxo Capítulo 4 Funções 18/11/12 Estrutura de Dados II 89

Material adaptado por Luis Martí a partir dos slides de José Viterbo Filho que forem elaborados por Marco Antonio Casanova e Marcelo Gattas para o curso de Estrutura de Dados para Engenharia da PUC-Rio, com base no livro Introdução a Estrutura de Dados, de Waldemar Celes, Renato Cerqueira e José Lucas Rangel, Editora Campus (2004).