Buscar

Funcoes1

Prévia do material em texto

Prof. Leticia Winkler 1 
Estrutura de Dados 
Aula 1 
Funções 
 
prof Leticia Winkler 
leticia@estacio.br 
1. Definição de estrutura de dados, com a identificação de estruturas lineares 
e não lineares. 
2. Criação de funções, passagem de parâmetros (por valor e por referência) 
e escopo de variáveis (local e global). 
3. Listas lineares: definição e tipos com relação às formas de 
armazenamento. 
4. Listas lineares sequenciais (lista, pilha e fila) e suas operações básicas. 
5. Ordenação e pesquisa em listas lineares seqüenciais. 
6. Agregado de dados heterogêneos: structs. 
7. Ponteiros e alocação dinâmica de memória. 
8. Listas lineares encadeadas (lista, pilha e fila) e suas operações básicas. 
Prof. Leticia Winkler 2 
Ementa 
 SZWARCFITER, Jayme Luiz; MARKENZON, Lilian 
 Estruturas de dados e seus algoritmos 
 3ª. ed. – Rio de Janeiro – LTC – 2010 
 Koffman, Elliot B. ; Wolfgang, Paul A.T. 
 Objetos, Abstração, Estrutura de dados e Projeto usando C++ 
 1ª. ed. – Rio de Janeiro – LTC – 2008 
 EDELWEISS,N.; GALANTE,R.M. 
 Estrutura de Dados 
 Volume 18 – Série Livros Didáticos Informática UFRGS 
 1ª. ed. – RS – Bookman – 2009 
Prof. Leticia Winkler 3 
Bibliografia Básica 
 Unidade 1. Introdução 
1.1. Definição e objetivo de estrutura de dados 
1.2. Estruturas de dados lineares e não lineares (exemplos 
de lista, pilha, fila, árvore e grafo) 
1.3. Listas lineares 
Prof. Leticia Winkler 4 
Conteúdo 
 Unidade 2. Funções 
2.1. Motivação 
2.2. Definição 
2.3. Passagem de parâmetros (por valor e por referência) 
2.4. Escopo de variáveis (local e global) 
2.5. Retorno de valores 
Prof. Leticia Winkler 5 
Conteúdo 
 Unidade 3. Listas Lineares Sequenciais 
3.1. Definição e representação 
3.2. Operações básicas com listas seqüenciais 
3.3. Aplicações com listas sequenciais 
3.4. Pilha 
3.5. Fila 
3.6. Ordenação (BubbleSort, Inserção, Seleção) 
3.7. Pesquisa 
3.8. Agregado Heterogêneo 
Prof. Leticia Winkler 6 
Conteúdo 
 Unidade 4. Ponteiros e Alocação Dinâmica 
4.1. Definição de ponteiro 
4.2. Operador de endereço, operador de indireção e 
operador seta 
4.3. Alocação e desalocação de memória 
Prof. Leticia Winkler 7 
Conteúdo 
 Unidade 5. Listas Lineares Encadeadas 
5.1. Motivação 
5.2. Listas Simplesmente Encadeadas 
5.3. Pilha 
5.4. Fila 
5.5. Listas Circulares Simplesmente Encadeadas 
5.6. Listas Duplamente Encadeadas 
Prof. Leticia Winkler 8 
Conteúdo 
 Composta de três etapas: 
 Avaliação 1 (AV1) 
 Avaliação 2 (AV2) 
 Avaliação 3 (AV3). 
 A AV1 contemplará o conteúdo da disciplina até a sua 
realização, incluindo o conteúdo das atividades 
estruturadas. 
 A AV2 e a AV3 abrangerão todo o conteúdo da 
disciplina, incluindo o conteúdo das atividades 
estruturadas. 
Prof. Leticia Winkler 9 
Avaliação 
 Para aprovação na disciplina o aluno deverá: 
1. Atingir resultado igual ou superior a 6,0, calculado a partir da 
média aritmética entre os graus das avaliações, sendo 
consideradas apenas as duas maiores notas obtidas dentre as 
três etapas de avaliação (AV1, AV2 e AV3). A média aritmética 
obtida será o grau final do aluno na disciplina. 
2. Obter grau igual ou superior a 4,0 em, pelo menos, duas das 
três avaliações. 
3. Frequentar, no mínimo, 75% das aulas ministradas. 
Prof. Leticia Winkler 10 
Aprovação 
Função 
Prof. Leticia Winkler 11 
 Fazer um programa que leia um número inteiro e 
informe se o número é par ou não é par 
Exercício 
#include <iostream> 
using namespace std; 
int main () { 
 int num; 
 cout << ”Numero? ”; 
 cin >> num; 
 if (num % 2 == 0) 
 cout << num << ” - PAR\n”; 
 else 
 cout << num << ” - IMPAR\n”; 
 return 0; 
} 
 
Resposta Possível 
E se fossem dois números? 
#include <iostream> 
using namespace std; 
 
int main () { 
 int num1, num2; 
 cout << ”Primeiro numero? ”; 
 cin >> num1; 
 cout << ”Segundo numero? ”; 
 cin >> num2; 
 if (num1 % 2 == 0) 
 cout << num1 << ”: PAR\n”; 
 else 
 cout << num1 << ”: IMPAR\n”; 
 if (num2 % 2 == 0) 
 cout << num2 << ”: PAR\n”; 
 else 
 cout << num2 << ”: IMPAR\n”; 
 
 return 0; 
} 
Solução: 
 
USAR FUNÇÃO 
E se fossem três, dez, etc...? 
 É uma estrutura que permite ao programador separar 
seus programas em blocos. 
 A idéia é dividir programas grandes e complexos em um 
programa formado de pequenos blocos (que são as 
funções) 
 menor complexidade 
 maior facilidade de manutenção. 
Prof. Leticia Winkler 16 
Função 
Prof. Leticia Winkler 17 
Forma Geral de uma Função 
 Forma Geral em C/C++: 
 tipo_de_retorno nome_da_função (declaração_de_parâmetros) 
{ 
 corpo_da_função 
} 
 tipo_de_retorno é o tipo de dados que a função retorna. 
 nome_da_função é o nome pelo qual será possível chamar a função, 
para que a mesma seja executada. 
 declaração_de_parâmetros - permite a passagem de dados para a 
função quando é ela chamada. 
Exemplo #1 
#include <iostream> 
using namespace std; 
 
int main () { 
 int num; 
 cout << ”Numero? ”; 
 cin >> num; 
 if (num % 2 == 0) 
 cout << num << ”: PAR\n”; 
 else 
 cout << num << ”: IMPAR\n”; 
 return 0; 
} 
#include <iostream> 
using namespace std; 
 
void parImpar (int n) { 
 if (n % 2 == 0) 
 cout << n << ”: PAR\n”; 
 else 
 cout << n << ”: IMPAR\n”; 
} 
 
int main () { 
 int num; 
 cout << ”Numero? ”; 
 cin >> num; 
 parImpar(num); 
 return 0; 
} 
Com 
função 
Exemplo #2 
#include <iostream> 
using namespace std; 
 
int main () { 
 int num1, num2; 
 cout << ”Primeiro numero? ”; 
 cin >> num1; 
 cout << ”Segundo numero? ”; 
 cin >> num2; 
 if (num1 % 2 == 0) 
 cout << num1 << ”: PAR\n”; 
 else 
 cout << num1 << ”: IMPAR\n”; 
 if (num2 % 2 == 0) 
 cout << num2 << ”: PAR\n”; 
 else 
 cout << num2 << ”: IMPAR\n”; 
 return 0; 
} 
#include <iostream> 
using namespace std; 
 
void parImpar (int n) { 
 if (n % 2 == 0) 
 cout << n << ”: PAR\n”; 
 else 
 cout << n << ”: IMPAR\n”; 
} 
 
int main () { 
 int num1, num2; 
 cout << ”Primeiro numero? ”; 
 cin >> num1; 
 cout << ”Segundo numero? ”; 
 cin >> num2; 
 parImpar(num1); 
 parImpar(num2); 
 return 0; 
} 
 
Com 
função 
void mensagem () { 
 cout << ”Alo turma!!!\n”; 
} 
 O void indica que não há valor. 
 A função mensagem não retorna valor algum para função 
chamadora. 
Prof. Leticia Winkler 20 
Tipo void 
 O return numa função tipo void irá fazer com que a função 
termine sua execução voltando para a função chamadora. 
Prof. Leticia Winkler 21 
Função que não retorna valor 
void divide (float a, float b) { 
if (b == 0) { 
 cout << ”Erro: divisão por zero\n”; 
 return; 
} 
cout << ”Resultado: ” << a/b << 
endl; 
} 
void mensagem () { 
 cout << ”Alo turma!!!\n”; 
} 
Prof. Leticia Winkler 22 
Função que retorna valor 
 O return abandona a função devolvendo um valor, resultado da 
tarefa realizada pela função. 
float somaFloat (float x, float y) { 
 return (x + y); 
} 
bool ehPar (int n) { 
if (n % 2 == 0) 
return true; 
else 
return false; 
} 
 Uma função que retorna parâmetro pode ser usada dentro 
de uma expressão: 
 
... 
if (ehPar (num)) 
... 
 ehPar retorna um valor booleano (verdadeiro o falso) 
 O if está testando se a resposta (valor retornado) da 
função é verdadeiro ou falso 
Observação 
void mensagem () { 
 cout << ”Alo turma!!!\n”; 
} 
Realiza sua tarefa sem necessidade de uma informação de entrada 
 
Ou, poderia ser escrito: 
 
void mensagem (void) { 
 cout << ”Alo turma!!!\n”; 
} 
Prof. Leticia Winkler 24 
Função que não recebe parâmetro 
void mensagem(int cod) { 
 switch (cod) { 
 case 1: 
 cout << ”Bom Dia, Turma!!!\n”; 
 break; 
 case 2: 
 cout << ”Boa Tarde, Turma!!!\n”; 
 break; 
 case 3: 
 cout << ”Boa Noite, Turma!!!\n”; 
 break; 
 default: 
 cout << ”Alo turma!!!\n”; 
} 
 
 Necessita de uma informação para realizar sua tarefa (neste exemplo). 
Prof. Leticia Winkler 25 
Função que recebe parâmetro 
Prof. Leticia Winkler 26 
Função que recebe mais de um 
parâmetro 
float somaFloat (float x, float y) { 
 return (x + y); 
} 
 Necessita de duas informações para realizar sua tarefa (no exemplo). 
 A função chamadora deve informar os valores. 
 
... 
somaFloat (7.5, 9) 
... 
Chamada de uma função – 2 
parâmetros 
Prof. Leticia Winkler 27 
#include <iostream> 
using namespace std; 
 
float somaFloat (float x, float y){ 
 return (x + y); 
} 
 
int main (){ 
 float num1, num2, num3; 
 cout << "Primeiro valor? "; 
 cin >> num1; 
 cout << "Segundo valor? "; 
 cin >> num2; 
 
 num3 = somaFloat (num1, num2); 
 
 cout << ”Resultado: ” << num3 << endl; 
 return 0; 
} 
 Resultado da Execução: 
supondo que foram digitados os 
valores 5 e 6 quando solicitado 
 
Primeiro valor? 5 
Segundo valor? 6 
Resultado: 11 
 
 
Chamada de uma função – 1 
parâmetro 
Prof. Leticia Winkler 28 
 Resultado da Execução: 
supondo que foi digitado 5 
quando solicitado 
 
Número? 5 
5 é ímpar 
 
#include <iostream> 
using namespace std; 
 
bool ehPar (int n) { 
if (n % 2 == 0) 
return true; 
else 
return false; 
} 
int main (){ 
float num; 
cout << "Número? "; 
cin >> num; 
if (ehPar(num)) 
 cout << num << ” é par\n”; 
else 
 cout << num << ” é ímpar\n”; 
 
return 0; 
} 
Chamada de uma função – sem 
parâmetro 
Prof. Leticia Winkler 29 
#include <iostream> 
using namespace std; 
 
void mensagem () { 
 cout << ”Alo turma!!!\n”; 
} 
 
int main (){ 
cout << "Início\n"; 
 
mensagem(); 
 
cout << ”Fim\n”; 
 
return 0; 
} 
 Resultado da Execução: 
 
Início 
Alo turma!!! 
Fim 
 
Usando o valor retornado pela função dentro de uma expressão: 
#include <iostream> 
using namespace std; 
 
float somaFloat (float x, float y){ 
return (x + y); 
} 
 
int main (){ 
float num1, num2; 
 
cout << "Primeiro valor? "; 
cin >> num1; 
cout << "Segundo valor? "; 
cin >> num2; 
 
cout << ”Resultado: ” << somaFloat (num1, num2) << endl; 
 
return 0; 
} 
Prof. Leticia Winkler 30 
Observação 
Exemplos 
Prof. Leticia Winkler 31 
#include <iostream> 
using namespace std; 
 
float somaFloat (float x, float y){ 
return (x + y); 
} 
 
int main (){ 
 float num1, num2; 
 
 cout << "Primeiro valor? "; 
 cin >> num1; 
 cout << "Segundo valor? "; 
 cin >> num2; 
 
 cout << ”Resultado: ” << somaFloat (num1, num2) << endl; 
 
 return 0; 
} 
#include <iostream> 
using namespace std; 
 
void somaFloat (float x, float y){ 
cout << ”Resultado: ” << (x + y); 
} 
 
int main (){ 
float num1, num2; 
 
cout << "Primeiro valor? "; 
cin >> num1; 
cout << "Segundo valor? "; 
cin >> num2; 
 
somaFloat (num1, num2); 
 
return 0; 
} 
Escopo de uma Variável 
Variável Local 
Prof. Leticia Winkler 32 
#include <iostream> 
using namespace std; 
 
bool ehPar (int n) { 
if (n % 2 == 0) 
return true; 
else 
return false; 
} 
 
int main () { 
int num; 
 
cout << "Numero? "; 
cin >> num; 
 
if (ehPar(num)) 
 cout << "\nO numero e par.\n"; 
else 
 cout << "\nO numero e impar.\n"; 
 
return 0; 
} 
 A variável num é local a 
função main; 
 A variável n está sendo 
declarada dentro da função 
ehPar – local a função ehPar 
 num não é vista dentro da 
função ehPar; 
 n não é vista dentro da main; 
 O valor de num é atribuido a 
variável n – passagem de 
parâmetros por valor. 
Escopo de uma Variável 
Variável Global 
Prof. Leticia Winkler 33 
#include <iostream> 
using namespace std; 
int x; 
void func1() { 
 cout << ”X – func1: ” << x << endl; 
} 
void func2() { 
 cout << ”X – func2: ” << x << endl; 
 x = 20; 
 cout << ”X – func2: ” << x << endl; 
} 
int main () { 
 x = 10; 
 cout << ”X – main: ” << x << endl; 
 func1(); 
 cout << ”X – após a chamada de func1: ” << x << endl; 
 func2(); 
 cout << ”X – após a chamada de func2: ” << x << endl; 
} 
 X é uma variável global 
 É vista por todas as funções dentro do 
programa 
 Pode ser manipulada e alterada 
por qualquer função 
 Resultado da Execução: 
X – main: 10 
X – func1: 10 
X – após a chamada de func1: 10 
X – func2: 10 
X – func2: 20 
X – após a chamada de func2: 10 
 
 
Escopo de uma Variável 
Prof. Leticia Winkler 34 
 
 
 Resultado: 
1 - main => 10 
1 - func => 10 
2 - func => 20 
2 - main => 10 
 
Na passagem de parâmetros por valor, a variável passada 
como parâmetro não pode ser alterada na função chamada 
#include <iostream> 
using namespace std; 
void func(int x) { 
 cout << "1 - func => " << x << endl; 
 x = 20; 
 cout << "2 - func => " << x << endl; 
} 
 
int main () { 
 int n = 10; 
 cout << "1 - main => " << n << endl; 
 func(n); 
 cout << "2 - main => " << n << endl; 
 return 0; 
} 
 É uma forma alternativa de acessar uma variável; 
 Uma referência é como se fosse um apelido dado a uma variável 
 Declaração: 
 tipo var, &refVar = var; 
 Exemplo: 
 int jose, &ze = jose; 
 Para indicar que é uma referência, utiliza-se o operador & 
 Toda referência deve ser inicializada quando declarada 
 Pode-se manipular a variável através de sua referência 
 Tudo que se faz com a variável pode ser feito através de sua referência. 
Prof. Leticia Winkler 35 
Referência 
Exemplo de Referência 
Prof. Leticia Winkler 36 
#include <iostream> 
using namespace std; 
 
int main () { 
 int jose = 10, &ze = jose; 
 
 cout << "Jose => " << jose << endl; 
 cout << "Ze => " << ze << endl; 
 ze = 5; 
 cout << "Jose => " << jose << endl; 
 cout << "Ze => " << ze << endl; 
 
 return 0; 
} 
 Resultado: 
Jose => 10 
Ze => 10 
Jose => 5 
Ze => 5 
 
Passagem de parâmetros por 
referência 
Prof. Leticia Winkler 37 
 Exemplo: 
#include <iostream> 
using namespace std; 
 
void func(int &x) { 
 cout << "1 - func => " << x << endl; 
 x = 20; 
 cout << "2 - func => " << x << endl; 
} 
 
int main () { 
 int n = 10; 
 cout << "1 - main => " << n << endl; 
 func(n); 
 cout << "2 - main => " << n << endl; 
 return 0; 
} 
 Resultado: 
1 - main => 10 
1 - func => 10 
2 - func => 20 
2 - main => 20 
 
 O uso de referência é interessante na passagem de parâmetros 
 Calcular informações sobre um circulo. Crie duas 
funções: 
 Uma para calcular a área do círculo, que recebe como 
parâmetro de entrada o raio e retorna a área (S = πR2) 
 A segunda função deve calcular o perímetro do círculo, 
que recebe como parâmetro de entrada o raio e retorna o 
perímetro (P = 2πR). 
Crie a função main, para testar seu programa, que utiliza as 
funções acima e apresenta o resultado do cálculo do 
perímetro e da área. 
Prof. Leticia Winkler 38 
Exercício #1 
#include <iostream> 
#include <cmath> 
using namespace std; 
 
float calcPerCirc (float r) { 
 return (2 * M_PI * r); 
} 
 
float calcAreaCirc (float r) { 
 return (M_PI * pow(r,2)); 
} 
 
int main() { 
 float raio; 
 
 cout << "Raio? "; 
 cin >> raio; 
 
 cout << "Perimetro do circulo de raio " << raio << ": " << calcPerCirc(raio) << endl; 
 cout << "Area do circulo de raio " << raio << ": " << calcAreaCirc(raio) << endl; 
 
 return 0; 
} 
Prof. Leticia Winkler 39 
Resposta do Exercício #1 
 Converter uma temperatura de graus Celsius para graus Farenheit 
e vice-versa. Crie duas funções: 
 A primeira recebe como parâmetro de entrada a temperaturaem 
°C e retorna o resultado em °F. 
 A segunda recebe como parâmetro de entrada a temperatura em 
°F e retorna o resultado em °C. 
 Crie a função main, para testar seu programa, que: 
A) lê um menu com as opções: 
1. Converte de °C para °F 
2. Converte de °F para °C 
B) lê a temperatura, e 
C) utiliza uma das funções acima para apresentar a temperatura 
conforme solicitado. 
Prof. Leticia Winkler 40 
Exercício #2 
𝐶
5
=
𝐹 − 32
9
 
Resposta do Exercício #2 
Prof. Leticia Winkler 41 
#include <iostream> 
#include <cmath> 
using namespace std; 
 
float celsiusParaFarenheit (float c) { 
 return (9 * c / 5 + 32); 
} 
 
float farenheitParaCelsius (float f) { 
 return (5 * (f - 32) / 9); 
} 
int main() { 
float temp; 
int op; 
 
do { 
 cout << "\n\n***Conversor de 
Temperatura ***\n\n"; 
 cout << "1 - Celsius para Farenheit\n"; 
 cout << "2 - Farenheit para Celsius\n"; 
 cout << "3 - Sair\n"; 
 cout << "\nOpcao? "; 
 cin >> op; 
switch (op) { 
 case 1: 
 cout << "Temperatura em C? "; 
 cin >> temp; 
 cout<< celsiusParaFarenheit(temp) << " o.F " << endl; 
 break; 
 case 2: 
cout << "Temperatura em F? "; 
cin >> temp; 
cout<< farenheitParaCelsius(temp) << " o.C " << endl; 
break; 
 case 3: 
cout << "\nFIM!!!!\n\n"; 
exit(0); 
 default: 
cout << "opcao invalida\n\n"; 
} 
} while (op !=3); 
 return 0; 
}

Continue navegando

Outros materiais