Buscar

Introdução às Funções em C++

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

ECT1203 Linguagem de Programação
2012.1
Prof. Diego Rodrigues de Carvalho
Profa. Idalmis Milián Sardina
Prof. Luiz Eduardo Cunha Leite
Prof. Marconi Câmara Rodrigues
Prof. Marcelo Henrique Ramalho Nobre
Aula 10 – Funções
Universidade Federal do Rio Grande do Norte
Escola de Ciências e Tecnologia
Hora de silenciar o celular
Manter o celular sempre desligado/silencioso quando estiver em sala de aula
Nunca atender o celular em sala de aula
Revisão da aula passada
Strings: É um vetor de caracteres
char nome[50];
Principal diferença para os vetores numéricos: usa o ‘\0’ para marcar o final do espaço utilizado.
 Leitura e escrita em strings.
Leitura: gets(nome);
Escrita: puts(nome);
Comandos de manipulação de strings
Copiar: strcpy(nome,”joao”);
Concatenar: strcat(nome,sobrenome);
Tamanho utilizado: strlen(nome);
Comparação: strcmp(nome1,nome2);
Objetivo da Aula
Introduzir o conceito de funções em C++
Motivar o uso de funções
Esses são os objetivos da aula
Uma função em C++ é ...
Um conjunto de comandos agrupados em um bloco, destinado a realizar uma tarefa particular, que recebe um nome e através deste pode ser ativado.
Será que isso é tão novo assim?
Exemplos de funções
sqrt(valor)
pow(x,2)
rand()
cos(ang)
gets(nome)
strcat(nome,sobrenome)
OBS: cin e cout são objetos, a compreensão de objetos está fora do escopo da nossa disciplina.
Curiosidade: Alguém sabe como o computador calcula o cosseno de um ângulo? ex: cos(68) 
Resposta: Polinômio de Mclaurin
Pergunta: eu preciso conhecer o polinômio de Mclaurin para usar a função cos() nos meus programas?
Para que servem as funções?
Para dividir um problemas maior em vários menores, simplificando e organizando o código;
Reduzir o tamanho do programa; 
Para permitir reaproveitamento de código; 
Para permitir a alteração de um trecho de código de uma forma mais rápida;
Para que os blocos do programa não fiquem grandes demais e mais difíceis de entender; 
Para separar o programa em partes(blocos) que possam ser logicamente compreendidos de forma isolada;
Etc.
A função pow()
Como será o algoritmo da função pow?
pow(2,3) = 23 = 2*2*2
pow(5,4) = 54 = 5*5*5*5
pow(x,2) = x2 = x*x
pow(a,b) = ab = a multiplicado por ele mesmo, uma quantidade b de vezes
Como será esse algoritmo?
pow(x,y)
int prod =1,i;
for(i=0;i<y;i++){
		prod *=x;
} 
Como o compilador faz para executar o algoritmo acima quando encontra pow(x,y) no código?? 
Como o compilador raciocina
pow? não conheço esse comando... Depois dele tem algo entre parênteses, então é uma função!!
Como o compilador raciocina
Será uma função criada pelo usuário?? Não é.
Como o compilador raciocina
Será que está na biblioteca* iostream?.
*Biblioteca = Conjunto de funções.
Como o compilador raciocina
Será que está na biblioteca math.h? Se não estiver lá não tem em canto nenhum e esse programa tem um erro.
Como o compilador raciocina
?????
Como o compilador raciocina
Modelo de processamento. Quem são as entradas? E as saídas?
Processamento
Entrada
Saída
Como o compilador raciocina
No algoritmo, que é base, expoente e exponencial?
Processamento
Base
Exponencial
Expoente
Como o compilador raciocina
Quem são eles no programa?
Processamento
Base(x)
Exponencial(prod)
Expoente(y)
Como o compilador raciocina
Quem são eles no programa?
Processamento
Base(x)
Exponencial(prod)
Expoente(y)
Como o compilador raciocina
Quem é x,y? onde devo armazenar prod?
Como o compilador raciocina
x é a
y é b
prod é result
Definindo uma função
A primeira linha é o cabeçalho da definição da função.
tipo_da_função é o tipo do valor retornado por meio do comando return.
tipo_da_função nome_da_função (lista de parâmetros)
{
	corpo da função
}
Definindo uma função
A lista de parâmetros, também chamada de lista de argumentos, é opcional. A função pode não ter entrada (void).
tipo_da_função nome_da_função (lista de parâmetros)
{
	corpo da função
}
O comando return
Sintaxe de um comando return:
A instrução return expressão; tem os seguintes efeitos:
avaliação da expressão
conversão automática do resultado da expressão para o tipo da função
retorno do resultado
término da execução da função e retorno do controle para a instrução seguinte do código de chamada
return;
return expressão;
return (expressão);
O comando return
No exemplo anterior, temos a definição das funções:
Função com um comando return
Função com mais de um comando return
O comando return
Funções do tipo void podem ter um comando return sem expressão, servindo para terminar a execução da função
Em funções do tipo void, o comando return não é obrigatório
Uma função sem comando return termina quando encontra a chave de fechamento
O valor de retorno é obtido 
	através de uma chamada à
	 função, como no exemplo:
Funções definidas pelo usuário
Declaração e definição de funções
Em geral, o nome de uma função aparece em três lugares em um programa:
na declaração (protótipo/assinatura)
na definição
na chamada
Exemplo
Declaração de funções (protótipos)
Chamadas de funções
Definição de funções
#include <iostream>
using namespace std;
int le_numero(void);
int max(int n1, int n2);
	
int main(void) {
	int x,y;
	x = le_numero();
	y = le_numero();
	cout << "\nO maximo e:" << max(x,y);
	return 0;
}
int le_numero(void) {
	int numero;
	cout << "\nDigite um numero inteiro: ";
	cin >> numero;
	return numero;
}
int max(int n1, int n2) {
	if(n1 > n2) 
	 return n1;
	else 
	 return n2;
}
30
Uma função não pode ser chamada sem antes ter sido declarada
No exemplo, temos a declaração das funções:
Declaração de uma função
A declaração de uma função, dita protótipo da função, é uma instrução, geralmente colocada no início do programa, que estabelece o tipo da função e os argumentos que ela recebe.
a função de nome le_numero() é do tipo int e não recebe argumentos 
a função de nome max() é do tipo int e recebe como argumento dois valores do tipo int
Observações
No protótipo de uma função, o seu tipo, o número e o tipo dos parâmetros devem corresponder àqueles do cabeçalho da definição.
O nome dos parâmetros podem ser omitidos na declaração.
Se uma função não tem parâmetros, pode-se declarar a lista de parâmetros como (void) ou simplesmente ()
Outras observações
Se uma função é definida antes da sua primeira chamada, esta não precisa ser declarada.
O comando return pode retornar somente um único valor.
Se uma função não tem valor de retorno, deve-se indicar o tipo de retorno como void
Não se pode definir funções dentro de uma outra função.
Escopo de variáveis
As variáveis podem ser declaradas em três lugares:
dentro de funções variáveis locais
como parâmetros de funções	parâmetros formais
fora de todas as funções	 variáveis globais
O escopo de uma variável é o bloco de código onde esta variável é válida
Variáveis locais
void funcao1(void)
{
		int x;
		x = -10;
}
void funcao2(void)
{
		int x, y;
		x = 2;
		y = 18;
}
São visíveis apenas dentro de seu próprio bloco de código.
	 nota: Um bloco de código é delimitado por { }.
O espaço de memória usado pela variável é liberado na saída do bloco de código.
exemplo
Em alguns compiladores, programas com variáveis locais declaradas em outras partes do bloco de código não são compilados. No entanto, esse não é o caso no Dev C++.
Mostrar exemplos de outros blocos de código usando o Dev C++.
35
Variáveis globais
exemplo:
São visíveis no programa inteiro.
O espaço de memória fica reservado durante toda a execução do programa.
#include <iostream>
using namespace std;
int lado;
int area(void);
int main(void) {
	
	cout << "\nDigite o lado do quadrado: ";
	cin >> lado;
	cout << "\nArea = " << area();
	return 0;
}
int area(void) {
	return lado*lado;
}
36
Variáveis globais
	São úteis quando o mesmo dado é usado em muitas funções
	Ocupam espaço de memória mesmo quando desnecessárias
 	Podem levar a erros no programa
37
Variáveis globais x locais
Qual a diferença entre as funções?
int produto(int x, int y)
{
		return (x * y);
}
int x, y;
int produto(void)
{
		return (x * y);
}
38
Variáveis globais x locais
geral
int
produto(int x, int y)
{
		return (x * y);
}
int x, y;
int produto(void)
{
		return (x * y);
}
Qual a diferença entre as funções?
específica
* Usar o Dev C++ para mostrar como o escopo de variáveis locais prevalece sobre o de globais de mesmo nome.
39
Parâmetros de uma função
São visíveis apenas dentro da função: são criadas na entrada e destruídas na saída da função
No momento da chamada de uma função, o número e o tipo dos parâmetros devem corresponder à declaração da função 
Os parâmetros são convertidos automaticamente para os tipos da declaração antes de serem passados à função
Variáveis locais que são inicializadas pelos valores passados na chamada da função.
Passagem de parâmetros
Em geral, pode-se passar parâmetros para funções de duas maneiras:
Por valor: o valor do argumento é copiado para o parâmetro e as alterações feitas no parâmetro não tem efeito sobre a variável usada na chamada da função
Por referência: o endereço de uma variável copiado para o parâmetro, assim as mudanças feitas no parâmetro afetam a variável usada na chamada da função
Passagem de parâmetros por valor
o valor de n é copiado para o parâmetro x da função quadrado()
na atribuição, apenas a variável local x é modificada
a variável n, usada para chamar quadrado(), ainda tem o valor 10
#include <iostream>
using namespace std;
int quadrado(int);
int main(void) {
	int n = 10;
	cout << quadrado(n) << "\n";
	cout << n << "\n"; 
	return 0;
}
int quadrado(int x) {
	x = x * x;
	return x;
}
42
Passagem de parâmetros por referência
A referencia de n é passado para o parâmetro x da função quadrado()
na atribuição, a variável referenciada por x é modificada
a variável n, usada para chamar quadrado(), teve seu valor modificado
Operador unário de referência &
#include <iostream>
using namespace std;
int quadrado(int);
int main(void) {
	int n = 10;
	cout << quadrado(n) << "\n";
	cout << n << "\n"; 
	return 0;
}
int quadrado(int x) {
	x = x * x;
	return x;
}
43
Passagem de parâmetros por valor
Considere o seguinte programa:
Qual é o problema?
#include <iostream>
using namespace std;
void troca(int, int);
int main(void){
	int a=3, b = 5;
	cout << "\na = "<<a<< " b = "<<b;
	troca(a,b);
	cout << "\na = "<<a<<" b = "<<b;
 return 0; 
}
void troca(int a, int b) {
	int temp = a;
	a = b;
	b = temp;
}
44
Exercício
Faça um programa que calcula as raízes de uma equação do segundo grau , onde a, b e c são números reais fornecidos pelo usuário. 
Observação: use funções para calcular e imprimir o resultado.
#include <iostream>
#include <cmath>
using namespace std;
void resolve_equacao(float, float, float);
int main(void){
 float a, b, c;
 cout << "Este programa resolve equacoes do tipo ax^2 + bx + c = 0\n";
 cout << "Digite os valores de a, b e c: ";
 cin >> a >> b >> c;
 
 resolve_equacao(a,b,c);
 
 return 0; 
}
void resolve_equacao(float a, float b, float c){
 float delta, x1, x2;
 
 if (a != 0) {
 delta = pow(b,2) - 4*a*c;
 cout << "DELTA: " << delta << "\n";
 if(delta >= 0) {
 x1 = (-b+sqrt(delta))/(2*a); 
 x2 = (-b-sqrt(delta))/(2*a);
 cout << "x1 = "<< x1 << " e x2 = "<< x2 << "\n";
 } else
 cout << "Nao foi posssivel encontrar as raizes pois sao imaginarias";
 } else if(b != 0){
 x1 = -c/b;
 cout << "x = " << x1 << "\n"; 
 } else
 cout << "Esta equacao nao tem solucao!\n";
}
46

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Outros materiais