Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Funções - C/C++, Notas de estudo de Engenharia de Telecomunicações

Programação I - Funções

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 23/09/2010

thiagothigs1
thiagothigs1 🇬🇧

5

(3)

10 documentos

1 / 13

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Funções
Em C/C++, diferentemente de outras linguagens como Pascal, todas as ações ocorrem
dentro de funções. Nas linguagems C/C++ não há conceito de um programa principal, o que
existe é uma função chamada main que é sempre a primeira a ser executada.
A forma geral de uma função em C/C++ é a seguinte:
tipo nome (tipo nome1, tipo nome2, ..., tipo nomeN )
{
//declaração das variáveis
//corpo da função
}
O tipo na definição da função especifica o tipo do resultado que será devolvido ao final da
execução da função. Caso nenhum tipo seja especificado o compilador assume que um tipo
inteiro é retornado. O tipo void pode ser usado para declarar funções que não retornam
valor algum.
duas maneiras básicas de terminar a execução de uma função. Normalmente usa-se o
comando return para retornar o resultado da função. Portanto, quando o comando:
return expressão;
for executado, o valor da expressão é devolvido para a função que chamou. Quando não
valor para retornar o comando return não precisa ser usado e a função termina quando a
chave que indica o término do corpo da função é atingido.
O nome da função é qualquer identificador válido. A lista de parâmetros é uma lista,
separada por vírgulas, de variáveis com seus tipos associados. É possível que existam
funções que não tenham lista de parâmetros, mas ainda assim é necessário que os
parênteses sejam usados.
Os parâmetros são valores que a função recebe para realizar as tarefas para as quais foi
programada. Por exemplo, uma função que calcule a raiz quadrada de um número do tipo
float, deve declarar como parâmetro uma variável deste tipo para receber o valor.
É importante notar que diferentemente de declarações de variáveis onde podemos associar
vários nomes de variáveis a uma declaração como em:
int a, dia, mes, i;
na lista de parâmetros é necessário associar um tipo a cada variável como no exemplo
abaixo:
float media(float n1, float n2, float n3);
Uma função que deseje usar a função media , cujo protótipo foi definido acima, para
calcular a média de três valores, nota1, nota2 e nota3, deve escrever no local onde
quer que a média seja calculada o seguinte comando:
pf3
pf4
pf5
pf8
pf9
pfa
pfd

Pré-visualização parcial do texto

Baixe Funções - C/C++ e outras Notas de estudo em PDF para Engenharia de Telecomunicações, somente na Docsity!

Funções

Em C/C++, diferentemente de outras linguagens como Pascal, todas as ações ocorrem

dentro de funções. Nas linguagems C/C++ não há conceito de um programa principal, o que

existe é uma função chamada main que é sempre a primeira a ser executada.

A forma geral de uma função em C/C++ é a seguinte:

tipo nome (tipo nome1, tipo nome2, ..., tipo nomeN ) { //declaração das variáveis //corpo da função }

O tipo na definição da função especifica o tipo do resultado que será devolvido ao final da

execução da função. Caso nenhum tipo seja especificado o compilador assume que um tipo

inteiro é retornado. O tipo void pode ser usado para declarar funções que não retornam

valor algum.

Há duas maneiras básicas de terminar a execução de uma função. Normalmente usa-se o

comando return para retornar o resultado da função. Portanto, quando o comando:

return expressão ;

for executado, o valor da expressão é devolvido para a função que chamou. Quando não há

valor para retornar o comando return não precisa ser usado e a função termina quando a

chave que indica o término do corpo da função é atingido.

O nome da função é qualquer identificador válido. A lista de parâmetros é uma lista,

separada por vírgulas, de variáveis com seus tipos associados. É possível que existam

funções que não tenham lista de parâmetros, mas ainda assim é necessário que os

parênteses sejam usados.

Os parâmetros são valores que a função recebe para realizar as tarefas para as quais foi

programada. Por exemplo, uma função que calcule a raiz quadrada de um número do tipo

float , deve declarar como parâmetro uma variável deste tipo para receber o valor.

É importante notar que diferentemente de declarações de variáveis onde podemos associar

vários nomes de variáveis a uma declaração como em:

int a, dia, mes, i;

na lista de parâmetros é necessário associar um tipo a cada variável como no exemplo

abaixo:

float media( float n1, float n2, float n3);

Uma função que deseje usar a função media , cujo protótipo foi definido acima, para

calcular a média de três valores, nota1, nota2 e nota3, deve escrever no local onde

quer que a média seja calculada o seguinte comando:

resultado = media(nota1, nota2, nota3);

onde resultado é a variável que vai receber a média calculada.

É importante notar que os tipos e o número de parâmetros que aparecem na declaração da

função e na sua chamada devem estar na mesma ordem e ter tipos equivalentes. Se os tipos

são incompatíveis, o compilador não gera um erro, mas podem ser gerados avisos na

compilação e resultados estranhos.

Protótipos de Funções

O padrão ANSI estendeu a declaração da função para permitir que o compilador faça uma

verificação mais rígida da compatibilidade entre os tipos que a função espera receber e

àqueles que são fornecidos.

Protótipos de funções ajudam a detectar erros antes que eles ocorram, impedindo que

funções sejam chamadas com argumentos inconsistentes.

A forma geral de definição de um protótipo é a seguinte:

tipo nome (tipo nome1, tipo nome2, ..., tipo nomeN);

O exemplo exfun.c mostra a declaração de uma função e seu protótipo.

#include #include

using namespace std;

/* Prototipo da funcao */ int soma ( int , int );

/* Funcao Principal */ int main() { int a=5, b=9; cout<<soma(a,b); system(“PAUSE”); return 0; }

/* Definicao da funcao */ int soma( int a, int b) { return (a+b); }

cin>>potencia; cout<<numero<<" elevado a "<<potencia; cout<<" e igual a "<<eleva(numero, potencia)<<endl; cout<<"Continua? [S]im ou [N]ao? "; cin>>continua; } while (paraMaiuscula(continua) == 'S'); }

float eleva( float a, int b) { float res = 1.0; for ( ; b>0; b--) res *= a; return res; }

char paraMaiuscula ( char c ) { if ('a' <= c && c <= 'z') c = c - 'a' + 'A'; return c; }

Um bloco de comandos se inicia em um "{" e termina em um "}". O bloco de comandos

mais usado para definir uma variável é a função. Todas as variáveis que serão usadas dentro

de um bloco de comandos precisam ser declaradas antes do primeiro comando do bloco.

Declarações de variáveis, incluindo sua inicialização, podem vir logo após o abre chaves

que inícia um bloco de comandos, não somente o que começa uma função. O exemplo

(c7exdec.c) abaixo ilustra este tipo de declaração:

#include #include

using namespace std;

int main() { int i; for (i=0; i<10; i++) { int t; cin>>t; cout<<i*t; } }

Existem algumas vantagens em se declarar variáveis dentro de blocos.

1. Como as variáveis somente passam a existir quando o bloco passa a ser executado,

o programa ocupa menos espaço de memória. Isto porque se a execução do bloco

for condicional a variável pode nem ser alocada.

2. Outra vantagem é que como a variável somente existe dentro do bloco pode-se

controlar melhor o uso da variável, evitando erros de uso indevido da variável.

Variáveis Globais

As variáveis globais são definidas fora de qualquer função e são, portanto, disponíveis para

qualquer função. Este tipo de variável pode servir como um canal de comunicação entre

funções, uma maneira de transferir valores entre elas.

Por exemplo, se duas funções tem de partilhar dados mais uma não chama a outra, uma

variável global tem de ser usada.

OBS : É desaconselhável o uso indiscriminado de variáveis globais!

Parâmetros Formais

As variáveis que aparecem na lista de parâmetros da função são chamadas de parâmetros

formais da função. Eles são criados no início da execução da função e destruídos no final.

Parâmetros são valores que as funções recebem da função que a chamou. Portanto, os

parâmetros permitem que uma função passe valores para outra. Normalmente os parâmetros

são inicializados durante a chamada da função, pois para isto que foram criados. No

entanto, as variáveis que atuam como parâmetros são iguais a todas as outras e podem ser

modificadas, operadas, etc, sem nenhuma restrição.

Passagem de Parâmetros por Valor

Parâmetros podem ser passados para funções de duas maneiras: passagem por valor ou

passagem por referência.

Na passagem por valor uma cópia do valor do argumento é passada para a função. Neste

caso, a função que recebe não pode alterar o valor original que existe somente na função

que a chamou.

Ex: A função eleva apresentada anteriormente, recebe dois parâmetros por valor.

float eleva( float a, int b) { float res = 1.0;

for ( ; b>0; b--) res *= a; return res; }

2º Exemplo de passagem de parâmetro por referência utilizando os operadores de ponteiros

(* e &) :

#include #include

using namespace std;

/* Programa que realiza a troca do conteúdo das variáveis se a primeira é maior que a segunda utilizando o operador conteúdo () e o operador endereço (&)/

void troca2( int *, int *);

int main() { int x,y;

cout<<"Entre com o primeiro valor: "; cin>>x;

cout<<"Entre com o segundo valor: "; cin>>y;

if (x>y) troca2(&x, &y);

cout<<"Os valores ordenados sao: "<<x<<" "<<y<<endl;

system("Pause"); return 0; }

//Realiza a troca de conteudo das variaveis void troca2( int *a, int *b) { int temp;

temp = *a; *a = *b; *b = temp; }

Passagem de Vetores e Matrizes como parâmentros

O nome de um vetor corresponde ao endereço do primeiro elemento do array, Quando um

vetor é passado como parâmetro, apenas o endereço do primeiro elemento é passado.

Existem basicamente três maneiras de declarar um vetor como um parâmetro de uma

função. Na primeira ele é declarado como tem sido apresentado em todos os exemplos até

agora. O exemplo c7exvet.c mostrado abaixo mostra um programa que usa uma função para

descobrir quantas vezes um caractere ocorre em um vetor. A função c_str() retorna um

vetor de caracteres com terminação ´\0´.

#include #include

using namespace std;

int conta ( const char v[30], char c);

int main() { char linha[30]; char c; int maiusculas[26], minusculas[26];

cout<<"Entre com uma linha: "; gets(linha); for (c='a'; c<='z'; c++) minusculas[c-'a'] = conta(linha, c); for (c='A'; c<='Z'; c++) maiusculas[c-'A'] = conta(linha, c); for (c='a'; c<='z'; c++) if (minusculas[c-'a']) cout<<c<<" apareceu "<<minusculas[c-'a']<<" vezes\n"; for (c='A'; c<='Z'; c++) if (maiusculas[c-'A']) cout<<c<<" apareceu "<<maiusculas[c-'A']<<" vezes\n";

system("PAUSE"); return 0; }

int conta ( const char v[30], char c) { int i=0, vezes=0; while (v[i] != '\0') if (v[i++] == c) vezes++; return vezes; }

Uma outra maneira, leva em conta que apenas o endereço do vetor é passado. Neste modo o

parâmetro é declarado como um vetor sem dimensão. Isto é perfeitamente possível porque a

função somente precisa receber o endereço onde se encontra o vetor. Além disso, C/C++

não confere limites de vetores e, portanto, a função precisa do endereço inicial do vetor e

uma maneira de descobrir o final do vetor. Esta maneira pode ser, por exemplo, uma

constante, ou o caracter '\0' em um vetor de caracteres.

O exemplo c7exinv.c mostra este modo de passar vetores com um programa que inverte o

conteúdo de um vetor.

void inverte_vetor ( int *v, int tam) { int temp;

for ( int i=0; i<tam/2; i++) { temp = v[i]; v[i] = v[tam-i-1]; v[tam-i-1] = temp; } }

A terceira maneira implica no uso de ponteiros, que discutir em breve.

O Comando return

O comando return é usado para retornar o valor calculado para a função que chamou.

Qualquer expressão pode aparecer no comando, que tem a seguinte forma geral:

return expressão;

A função que chamou é livre para ignorar o valor retornado. Além disso, a função pode não

conter o comando e portanto nenhum valor é retornado e neste caso a função termina

quando o último comando da função é executado. Quando o comando return não existe o

valor de retorno é considerado indefinido. As funções que não retornam valores devem ser

declaradas como do tipo void.

É importante observar que funções que são declaradas com um tipo válido podem ser

incluídas em qualquer expressão válidas em C/C++.

Recursividade

Funções em C/C++ podem ser usadas recursivamente, isto é uma função pode chamar a si

mesmo. É como se procurássemos no dicionário a definição da palavra recursão e

encontrássemos o seguinte texto:

recursão: s.f. Veja a definição em recursão

Um exemplo simples função que pode ser usada com chamadas recursivas é o fatorial de

um número inteiro. O fatorial de um número pode ser defindo como o produto deste

número pelo fatorial de seu predecessor, ou seja:

n! = n * (n-1)!

A função fatorial implementada sem recursão está ilustrada em c5fat.c.

A alternativa é uma função recursiva em que cada chamada da função que calcula o fatorial

chama a própria função fatorial. O exemplo c7fatr.c ilustrado abaixo mostra como a função

pode ser escrita recursivamente.

#include #include

using namespace std;

/* Programa para calculo do fatorial de um numero positivo */

unsigned int fat( unsigned int num);

int main() {

unsigned int numero;

cout<<"\nEntre com um numero positivo: "; cin>>numero; cout<<"O fatorial de "<<numero<<" vale "<<fat(numero)<<endl;

system("Pause"); return 0; }

/* Funcao que calcula recursivamente o fatorial de um numero positivo*/

unsigned int fat( unsigned int num) { unsigned int fato;

if (num == 1) return 1;

fato = num * fat(num-1); return fato; }

Quando a função fatorial recursiva é chamada, primeiro é verificado se o número recebido

como parâmetro vale 1. Neste caso a função retorna o valor 1, caso contrário ela devolve o

valor da expressão num * fat(num-1), ou seja o produto do número pelo valor do

fatorial do número predecessor. Portanto, quando se inicia o processo: a função é chamada

com o valor do número num, caso esse numero seja diferente de 1, a função fat é chamada

novamente para num – 1. Quando o processo se reverte e as chamadas começam a ser

respondidas.

Um ponto importante é que toda função recursiva deve prever cuidadosamente quando o

processo de recursão deve ser interrompido. Caso contrário, pode-se gerar loops recursivos

infinitos. No caso da função fat o processo é interrompido quando o valor do número vale

cout<<"Para rodar: "<<argv[0]<<" num1 num2 ... .\n\n"; system("Pause"); exit(0); } for ( i=1; i<argc; i++) { numero = (unsigned long int) (atoi(argv[i])); fatorial = fat(numero); cout<<"O fatorial de "<<numero<<" vale "<<fatorial<<"\n"; }

system("Pause"); return 0; }

/*Funcao que calcula recursivamente o fatorial de um numero positivo */ unsigned long int fat( unsigned long int num) { unsigned long int fato;

if (num == 1) return 1;

fato = num * fat(num-1); return fato; }

Os nomes argc e argv são comumente usados, mas o programador é livre para escolher os

nomes mais apropriados