Programação Aplicada à Engenharia
Universidade Federal Rural do Semi-Árido Departamento de Ciências Ambientais
Silvio Fernandes 2009.1
Introdução
• A melhor maneira de desenvolver e manter um grande programa é construí-lo a partir de pequenas partes ou componentes
• Técnica “Dividir para Conquistar” • Técnica “Dividir para Conquistar”
• Os módulos em C++ são chamados funções e classes
• Combinação entre funções novas que o programador escreve e “funções
pré-empacotadas” da biblioteca padrão
Introdução
• Funções definem tarefas específicas que
podem ser usadas em muitos pontos de um programa
• Um função é invocada (executar a tarefa • Um função é invocada (executar a tarefa designada por ela) por uma chamada de função
• Uma chamada de função especifica o nome da função e fornece informações (argumentos)
Introdução
• Uma analogia: o chefe (chamador de função) pede para um funcionário (função chamada) executar uma tarefa e retornar (devolver) os resultados
resultados
4
main
worker1 worker2 worker3
Funções da biblioteca matemática
• Permitem o programador executar cálculosmatemáticos comuns
• As funções normalmente são chamadas
escrevendo o nome da função seguido pelo escrevendo o nome da função seguido pelo parêntese esquerdo, depois pelo argumento (ou uma lista separados por vírgula) e o
parêntese direito
Funções da biblioteca matemática
• A função sqrt é chamada para calcular a raizquadrada de 900.0. Essa função recebe um double e retorna um double
• Todas as funções da biblioteca matemática • Todas as funções da biblioteca matemática
retornam double
• Para usar as funções da biblioteca
matemática, inclua o arquivo de cabeçalho <cmath> ou <math.h>
Funções da biblioteca matemática
• Os argumentos de funções podem serconstantes, variáveis ou expressões
• Se c1 = 13.0, d = 3.0 e f = 4.0, o comando cout << sqrt(c1+d*f);
cout << sqrt(c1+d*f);
• Calcula e imprime a raiz quadrada de 25, ou seja, 5
• A seguir alguma funções da biblioteca matemática, onde as variáveis x e y são double
Funções da biblioteca matemática
Método Descrição Exemplo
ceil( x ) arredonda x para o menor inteiro não menor que x
ceil( 9.2 ) é 10.0 ceil( -9.8 ) é -9.0 cos( x ) co-seno trigonométrico de x (radianos) cos( 0.0 ) é 1.0
exp( x ) função exponencial ex exp( 1.0 ) é 2.71828
fabs( x ) valor absoluto de x fabs( 5.1 ) é 5.1 fabs( -8.6 ) é 8.6 fabs( -8.6 ) é 8.6 floor( x ) arredonda x para o maior inteiro não maior
que x
floor( 9.2 ) é 9.0 floor( -9.8 ) é -10.0
fmod( x, y ) resto de x/y como ponto flutuante fmod(13.657, 2333) é 1.992 log( x ) logaritmo natural de x (base e) log (2.718282 ) é 1.0
log10( x ) logaritmo de x (base 10) log10( 100.0 ) é 2.0 pow( x, y ) x elevado à potência de y pow( 2, 7 ) é 128 sin( x ) seno trigonométrico de x (em radianos) sin( 0.0 ) é 0
sqrt( x ) raiz quadrada de x sqrt( 900.0 ) é 30.0
Definições de funções
• Todas as variáveis declaradas em definições de função são variáveis locais – elas só são
conhecida na função na qual são definidas • A maioria das funções tem uma lista de • A maioria das funções tem uma lista de
parâmetros que provêem os meios para transferir informações entre funções
• Os parâmetros de uma função também são variáveis locais
Definições de funções
• Cada programa consiste em uma função main que chama as funções da biblioteca padrão ou definidas pelo programador para realizar as
tarefas tarefas
10
#include <iostream>
int square( int ); //protótipo da função int main(){ for ( int x = 1; x <= 10; x++ ) cout << square( x ) << " “; cout << endl; return 0; } // Definição da função int square( int y ){
return y * y; }
Definições de funções
• O formato de uma definição de função é
tipo do valor de retorno nome da função(lista de parâmetros){ declarações e comandos //corpo da função ou bloco
}}
• Um tipo de retorno void indica que a função não retorna um valor
• A lista de parâmetros é separada por vígula, incluindo o tipo de cada parâmetro. Se a
função não possui parâmetros a lista é void ou simplesmente vazia
Definições de funções
• Há três maneiras de retornar o controle para o ponto no qual a função foi chamada
– return; //para funções void
– Se a função não retorna nenhum valor o “}” indica – Se a função não retorna nenhum valor o “}” indica
fim da função então é retornado
– return expressao; // quando a função retorna algum valor como resultado
Protótipos de Funções
• Diz ao compilador o nome da função, o tipo dos dados retornados pela função, o número de parâmetros que a função espera receber, os tipos dos parâmetros e a ordem na qual os tipos dos parâmetros e a ordem na qual esses parâmetros são esperados
• Ex:
Protótipos de Funções
• Os protótipos permitem o compiladorconverter tipos automaticamente
• A tabela a seguir classifica os tipos do “maior tipo” para “menor tipo”
tipo” para “menor tipo”
Protótipos de Funções
Tipos de Dadoslong double double
float
unsigned long int sinônimo de unsigned long
long int sinônimo de long
unsigned int sinônimo de unsigned
int
unsigned short int sinônimo de unsigned short
short int sinônimo de short
unsigned char char
Arquivos de cabeçalho
• Cada biblioteca padrão tem um arquivo de cabeçalho correspondente contendo os
protótipos de todas as funções daquela biblioteca e definições dos vários tipos de biblioteca e definições dos vários tipos de dados e constantes necessários por elas
• Os arquivos de cabeçalho terminam com .h • Os arquivos de cabeçalho definidos pelo
programador deve terminar com .h
Principais arquivos de cabeçalho
Arquivo de cab. Explicação<cassert> Contém macros e informações para adicionar diagnósticos que ajudam o programador a realizar depuração. Ver. antiga <assert.h> <cctype> Contém protótipos para funções que examinam caracteres em
busca de determinadas propriedades dos caracteres e para funções que podem ser usadas para converter letras maiúsculas em
minúsculas e vice-versa. Ver. antiga <ctype.h>
<cfloat> Contém limites do sistema para o tamanho dos números de ponto <cfloat> Contém limites do sistema para o tamanho dos números de ponto
flutuante. Ver. antiga <float.h>
<climits> Contém os limites do sistema para os tamanhos dos números inteiros. Ver. antiga <limits.h>
<cmath> Contém protótipos de funções da biblioteca matemática. Ver. antiga <math.h>
<cstdio> Contém proptótipos de funções de entrada/saída e as informações utilizadas por elas. Ver. antiga <stdio.h>
<cstdlib> Protótipos de funções para conversão de números em texto e texto em números, alocação de memória, números aleatórios e outras funções
Principais arquivos de cabeçalho
Arquivo de cab. Explicação<cstring> Protótipos de funções para processamento de strings. Ver. antiga <string.h>
<ctime> Funções para manipular horários e datas. Ver. antiga <time.h> <iostream> Funções padrão de entrada e saída. Ver. antiga <iostream.h> <iomanip> Funções para os manipuladores de stream que permitem a
formatação de dados. Ver. antiga <iomanip.h> formatação de dados. Ver. antiga <iomanip.h>
<fstream> Funções que executam operações de entrada e saída de arquivos em disco. Ver. antiga <fstream.h>
<utility> Contém classes e funções que são usadas por muitos arquivos de cabeçalho da biblioteca padrão
<vector>, <list>, <deque>, queue>, <stack>, <zmap>, <set>, <bitset>
Contém classes que implementam contêineres, usados para armazenar dados durante a execução de um programa.
Principais arquivos de cabeçalho
Arquivo de cab. Explicação<functional> Contém classes e funções usadas por algoritmos da biblioteca padrão
<memory> Contém classes e funções usadas para alocar memória para os contêineres da biblioteca padrão
<iterator> Contém classes para acessar dados nos contêineres da biblioteca padrão
<algorthm> Contém funções para manipular dados nos contêineres <exception>
<stdexcept>
Estes arquivos contêm classes que são usadas para tratamento de exceções (erros)
<string> Contém a definição da classe string
<sstream> Funções que realizam operações de entrada e saída para strings na memória
Geração de números aleatórios
• Considere o seguinte comando
i = rand();
• A função rand() gera um inteiro entre 0 e
RAND_MAX (constante definida em <cstdlib>) • Quando a função rand() é chamada, todos os
números entre 0 e RAND_MAX terão a mesma probabilidade
• Para produzir inteiros no intervalo de 0 a 5 usamos o operador módulo (%) junto com rand()
rand() % 6
Geração de números aleatórios
• Isso é chamado ajuste de escala e o 6 o fator de escala
• Ex: Simular 20 lançamentos de um dado de 6 faces
#include <iostream.h> #include <iostream.h> #include <iomanip.h> #include <cstdlib.h> int main(){
for ( int i = 1; i <= 20; i++ ) {
cout << setw( 10 ) << ( 1 + rand() % 6 ); if ( i % 5 == 0 )
cout << endl; }
return 0; }
Geração de números aleatórios
• A função rand() gera números pseudo-aleatórios• A função srand da biblioteca padrão utiliza um argumento como semente da função rand de forma a produzir uma
seqüência diferentes de números aleatórios a cada execução do programa
do programa
• O protótipo de srand é encontrado em<cstdlib>
• Se desejássemos randomizar sem necessidade de fornecer uma semente cada vez, poderíamos usar srand( time (0) ); Isso faz com que o computador leia seu relógio para obter automaticamente o valor da semente.
• A função time retorna a “hora de calendário” atual e está na biblioteca <ctime>
Enum
• Cria um tipo definido pelo usuário chamado de enumeração
enum nome_novo_tipo {valor1, valor2, valor3};
• Os valores são constantes inteiras • Os valores são constantes inteiras
representados pelos idetificadores (valor1,...) • Ex:
enum Meses {JAN = 1, FEV, MAR, ABR, MAI, JUN, JUL, AGO, SET, OUT, NOV, DEZ};
Regras de Escopo
• A parte do programa na qual um identificador tem significado é conhecida como seu escopo • Escopo de arquivo
– Identificadores declarados fora de qualquer – Identificadores declarados fora de qualquer
função. Eles são conhecidos por todas as funções (variáveis globais, definições e protótipos de
funções)
• Escopo de bloco
– Identificadores declarados entre {} (variáveis locais, vistas só dentro do bloco)
Regras de Escopo
• Escopo de função– Identificadores declarados dentro de funções
• Escopo de protótipo de função
– Se identificadores forem usados no protótipo de – Se identificadores forem usados no protótipo de
uma função (lista de parâmetros), será ignorado pelo compilador. O protótipo de função necessita apenas dos tipos dos parâmetros.
Recursão
• Função recursiva é uma função que chama a si mesma, direta ou indiretamente
• Quando uma função chama a si mesma, essa nova chamada pode chamar uma terceira e nova chamada pode chamar uma terceira e assim por diante
• Quando a última cópia da função retorna o
resultado (através de return), para aquela que chamou. E assim por diante até a primeira
chamada
Fatorial iterativo (não recursivo)
• Fatorial de um inteiro não-negativo n (n!) én * (n-1) * (n-2) * ... * 1
• Com 1! e 0! Igual a 1, por definição
• O fatorial de number pode ser calculado como • O fatorial de number pode ser calculado como
• Chega-se a definição recursiva n! = n*n(n-1)!
fatorial = 1;
for(int counter = number; counter >= 1; counter-- ){ fatorial *= counter;
Fatorial recursivo
• Função recursiva do fatorialunsigned long factorial ( unsigned long number){
if (number <= 1) //caso base
return 1;
else
28
return number * factorial(number -1);
Fatorial recursivo
• Calculo recursivo de 5! 5! 5 * 4! 5! 5 * 4! 5! = 5*4*3*2*1=120 é o valor retornado 120 é o valor final 5 * 4! 4 * 3! 3 * 2! 2 * 1! 1 5 * 4! 4 * 3! 3 * 2! 2 * 1! 1 1 é o valor retornado 2! = 2*1 é o valor retornado 3! = 3*2*1=6 é o valor retornado 4! = 4*3*2*1=24 é o valor retornadoReferência
• DEITEL, H. M.; DEITEL, P. J. C++ como
programar. 3 ed. Porto Alegre: Bookman, 2001.