Você está na página 1de 50

Alusio Eustquio da Silva

FUNES E PROCEDIMENTOS EM LINGUAGEM C SHARP













Notas de aulas, utilizadas em disciplinas de Algoritmos e
Programao de Computadores, como apoio didtico e
complementao da bibliografia bsica.






















Betim
ABRIL / 2012

FUNES E PROCEDIMENTOS EM C# 2





SUMRIO
FUNES E PROCEDIMENTOS EM LINGUAGEM C SHARP ............................................................................................. 1
Notas de aula, utilizadas em disciplinas de Algoritmos e Programao de Computadores, como apoio didtico e
complementao da bibliografia bsica. ..................................................................................................................................... 1
MODULARIZAO ....................................................................................................................................................................... 1
OBJETIVOS...................................................................................................................................................................................... 1
Na sequncia deste texto abordaremos os conceitos bsicos de funes e procedimentos em C#. Usaremos o
termo funo seja para uma funo propriamente dita, ou para um procedimento (funo com retorno void). ...... 4
NOTAO ................................................................................................................................................................. 4
EXEMPLO 1 ............................................................................................................................................................... 8
EXEMPLO 2 ............................................................................................................................................................. 10
EXEMPLO 5 ............................................................................................................................................................. 13
EXEMPLO 6 ............................................................................................................................................................. 14
EXEMPLO 7 ............................................................................................................................................................. 15
EXEMPLO 7 ............................................................................................................................................................. 16
EXEMPLO 8 ............................................................................................................................................................. 17
EXEMPLO 10 ........................................................................................................................................................... 21
EXEMPLO 11 .......................................................................................................................................................... 24
EXEMPLO 12 ........................................................................................................................................................................... 25
EXEMPLO 13 ........................................................................................................................................................................... 27
PROCEDIMENTO SEM PARMETROS .................................................................................................................................. 28
EXEMPLO 14 ........................................................................................................................................................................... 28
PARMETROS POR REFERNCIA ......................................................................................................................................... 29
EXEMPLO 15 ........................................................................................................................................................................... 30
EXEMPLO 16 ........................................................................................................................................................................... 32
EXEMPLO 17 ........................................................................................................................................................................... 33
EXEMPLO 18 ........................................................................................................................................................................... 36
FUNES RECURSIVAS ............................................................................................................................................................ 38
EXEMPLO 19 ........................................................................................................................................................................... 39
EXEMPLO 20 ........................................................................................................................................................................... 40
EXEMPLO 21 ........................................................................................................................................................................... 41
EXEMPLO 22 ........................................................................................................................................................................... 42
EXERCCIOS PROPOSTOS.................................................................................................................................................... 43
BIBLIOGRAFIA ............................................................................................................................................................................ 48


FUNES E PROCEDIMENTOS EM C# 1




MODULARIZAO

OBJETIVOS

Resumir o contedo desenvolvido na bibliografia bsica para facilitar o estudo inicial de
funes em C#.
Desenvolver programas simples com diversos tipos de funes e procedimentos para
preparar o aluno para o desenvolvimento de classes e programao orientada a objetos.
Mostrar os diversos tipos de parmetros e os processos de passagem de valores para a
funo ou da funo para outras rotinas.
Apresentar lista de exerccios .

INTRODUO
Modularizao uma tcnica de programao que se caracteriza pela diviso de um
programa em sub-programas, com funes bem definidas, organizados em grupos de
comandos prprios, que atuam sobre um conjunto de objetos.
A modularizao tem como objetivos principais:
- Permitir o domnio da complexidade, seja pela diviso de uma rotina longa em
sub-rotinas menores, seja pela diviso de um programa complexo em sub-rotinas
mais simples.
- Aumentar a legibilidade e compreenso de um programa pela diviso do mesmo
em sub-rotinas com poucas instrues.
- Aumentar a produtividade pela diviso de tarefas especficas (sub-rotinas) entre
equipes diferentes.
- Facilitar a manuteno, a correo de erros, a portabilidade e o compartilhamento
com outros programas ou sistemas. Um programa modularizado facilita as
operaes de incluso, excluso e alterao de rotinas.
- Agrupar instrues repetidas em vrios locais de um programa em uma nica
rotina que poder ser acessada diversas vezes com dados sendo transferidos
para ou da rotina.
- Compilar rotinas separadamente para reutilizao em programas diversos.
FUNES E PROCEDIMENTOS EM C# 2




Dentre as vrias formas de modularizao, definiremos o tipo funo e o tipo
procedimento, que na linguagem C#, definido como uma funo com retorno do tipo
void (vazio ou nulo)
A linguagem C# dotada de diversas bibliotecas, j prontas, para os mais variados fins,
com funes e procedimentos pr-definidos para serem usados em qualquer sistema.
Este texto apresentar o processo de criao, pelo programador, de rotinas para diversos
fins.
Como vamos nos ater principalmente aos aspectos didticos, que o objetivo maior deste
textos, muitos problemas poderiam ser resolvidos de forma mais elegante, compacta, ou
mais eficiente.



FUNES E PROCEDIMENTOS EM C# 3




FUNES
Matematicamente funo a relao, entre dois conjuntos, que associa a todo elemento de
um conjunto A um nico elemento de um conjunto B.
As funes, em matemtica, tm como objetos (domnio e imagem) os conjuntos numricos.
Exemplos:
1. 4 ) (
2
+ = x x f
uma funo cujo domnio o conjunto dos nmeros reais e cuja imagem o
conjunto do nmeros reais maiores ou iguais a 4.
2.

<
>
=
0 x se
0 x se
) (
x
x
x f
uma funo cujo domnio o conjunto dos nmeros reais e cuja imagem o
conjunto do nmeros reais maiores ou iguais a 0 (funo modular ou funo valor
absoluto).
3.

>
< s
=
2 n se ) 1 (
2 n 0 se 1
) (
n f n
n f
Esta funo denominada Funo Fatorial, e definida de forma recursiva (faz
referncia a si prpria) para nmeros inteiros no negativos (funo discreta). Usa-
se o sinal de exclamao (!) como notao desta funo.









FUNES E PROCEDIMENTOS EM C# 4





4.

>
s
=
a t se 1
a t se 0
) ( a t u
Esta funo denominada Funo Unitria de Heaviside, sendo a um nmero
real.
Seja a = 1, ento

>
s
=
1 t se 1
1 t se 0
) 1 (t u
5.

>
s s
=
a t se 0
a t 0 se / 1
) (
a
t F
Esta funo denominada Funo Delta de Dirac, sendo a um nmero real
positivo.
Na linguagem C#, definiremos funo como uma rotina (ou sub-rotina), com objetos prprios
(variveis, constantes, arquivos...), que realiza uma tarefa especfica, "retornando" um
nico valor (numrico, literal, lgico, endereo, etc.).
Uma sub-rotina que no "retorna" nenhum valor (retorno nulo) chamada, em algumas
linguagens, de procedimento, e na linguagem C#, em particular, de funo com retorno
do tipo void.
Uma sub-rotina pode "retornar" diversos valores atravs de parmetros (ou argumentos)
apropriados.
Na sequncia deste texto abordaremos os conceitos bsicos de funes e procedimentos
em C#. Usaremos o termo funo seja para uma funo propriamente dita, ou para um
procedimento (funo com retorno void).
Na programao orientada a objetos as funes so denominadas MTODOS.

NOTAO
static tipo_de_retorno Identificao (declarao de parmetros)
{
declarao dos objetos locais
bloco de comandos
return valor_de_retorno
}
FUNES E PROCEDIMENTOS EM C# 5





static um modificador que permite que a funo seja chamada por outra funo sem estar
ligada a uma classe.
tipo_de_retorno o valor que a funo devolve rotina que a chamou (neste texto: char,
bool, int, long int, float, double, long double).
Identificao o nome pelo qual a funo ser identifica e chamada por outras funes do
programa.
parmetros so variveis que recebero informaes enviadas a uma funo. Os parmetros
servem para passar valores para a funo ou para retornar (retirar) valores da funo.
return valor_de_retorno tem tripla funo: encerrar a funo, devolver um valor e o fluxo do
processamento funo chamadora.
Uma funo retorna um nico valor e este valor do mesmo tipo do valor declarado no
cabealho da funo (em tipo_de_retorno).
Observaes:
Para facilitar a legibilidade e clareza dos programas convencionaremos:
- Escrever a identificao das funes com a primeira letra maiscula e as outras
minsculas.
- A identificao de uma funo deve ter um significado de acordo com a tarefa por ela
executada. Geralmente um verbo no imperativo.
Exemplos: Calculo, Converte, Desconto, Maximo, Troca, Ordena, Mdc, Retangulo, etc .
- Se a funo for identificada com uma nica letra esta poder ser maiscula ou
minscula.
Exemplos: a, A, f, F, u, U, W, w, etc.
- As funes com nomes compostos tero cada nome iniciado em letra maiscula e um
travesso entre elas.
Exemplos: Grava_Valor, Calcula_Maximo, Determina_MMC, Le_Texto, Verifica_CPF,
Acha_Placa, etc.
- As estruturas sero alinhadas (endentao) de acordo com os blocos de comandos
relacionados.
- As funes sero definidas antes do programa principal.
FUNES E PROCEDIMENTOS EM C# 6




- Uma funo s poder ser usada aps sua definio.
- Comentrios so textos explicativos de parte de um programa (varivel, comando,
funo etc.). Podem ser escritos entre os smbolos /* e */ ou, nos chamados
comentrios de linha, direita dos smbolos //
Exemplos de comentrios
Comentrio 1
/*
Programa para determinar os dgitos verificadores de um nmero de CPF
Betim, 02 de agosto de 2011
*/

Comentrio 2
//Programa para verificar se um nmero primo ou no.
Comentrio 3
//Nmero primo um nmero maior que 1, que possui apenas dois divisores
//diferentes ele prprio e a unidade.

Neste texto os programas apresentaro o seguinte formato:
/*
cabealho com:
Objetivos do programa
Programador: nome
Data de elaborao do programa:
*/

arquivos de incluso (bibliotecas) padro do C#
//sub-rotinas (funes e procedimentos)
funo 1
{
bloco de comandos da funo
}//fim da funo 1

funo 2
{
bloco de comandos da funo
} //fim da funo 2

funo n
{
bloco de comandos da funo
} // fim da funo n
FUNES E PROCEDIMENTOS EM C# 7





//programa principal
static void Main(string[] args)
{
Declarao de variveis
Bloco de comandos
Console.ReadKey(); //Congelar resultados na tela
} //Fim do programa principal


FUNES E PROCEDIMENTOS EM C# 8




EXEMPLO 1
Programa para calcular o cubo dos nmeros inteiros de 0 a 10.
A funo denominada Cubo, possui um parmetro inteiro Valor, que uma varivel que
recebe informao enviada funo. Este parmetro pode ser usado livremente no corpo da
funo.
A varivel Resultado, da funo Cubo, denominada varivel local e seu domnio de
validade (escopo) est restrito ao interior da funo. Nenhuma outra funo a conhece
nem consegue acess-la.


















/*--------------------------------------------------------------------------
EXEMPLO 1




















O ltimo comando de uma funo ser sempre return valor/expresso/varivel, e
valor/expresso/varivel ser sempre do mesmo tipo declarado no cabealho da funo.
Funes simples como as do exemplo acima, podem ser escritas de forma mais compacta. Veja:
/*--------------------------------------------------------------------------
EXEMPLO 1
Programa para calcular o cubo dos inteiros positivos de 1 a 10
---------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Cubo
{
class Cubos
{
//Funcao para calcular o cubo de um inteiro

static int Cubo(int Valor)
{
int Resultado;
Resultado = Valor * Valor * Valor;
return Resultado;
}

static void Main(string[] args)
{
int n;

Console.BackgroundColor = ConsoleColor.Blue; //Cor de fundo
Console.ForegroundColor = ConsoleColor.White; //Cor da fonte (letra)
Console.Clear();

for (n = 1; n <= 10; n++)
{
Console.WriteLine("{0}\t{1}", n, Cubo(n));
}

Console.ReadKey();
}
}
}

FUNES E PROCEDIMENTOS EM C# 9





static int Cubo(int Valor)
{
return Valor * Valor * Valor;
}
Seguem alguns exemplos.


FUNES E PROCEDIMENTOS EM C# 10




EXEMPLO 2

Programa para ler o salrio de vrios funcionrios de uma empresa, calcular e escrever o
novo salrio acrescido de 5%.
Usaremos como flag (condio para desviar o fluxo do processamento) salrio menor ou
igual a zero e uma funo para calcular o novo salrio.
A funo Acrescimo recebe como parmetro um valor numrico, denominado Valor, que
usado para passar valor para a funo. Este parmetro no altera o valor da varivel externa
a ele associada. Ocupa um endereo especifico de memria diferente do endereo da
varivel externa a ele associada , e denominado parmetro por valor.


/*---------------------------------------------------------------------------
EXEMPLO 2
5% de acrscimo de salrio
---------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Porcentagem
{
class Exemplo_02
{
//Funcao para calcular 5% de acrescimo de um valor

static double Acrescimo(double Valor)
{
double ValorAuxiliar;
ValorAuxiliar = Valor * 1.05;
return ValorAuxiliar;
}

static void Main(string[] args)
{
double Salario, NovoSalario;

Console.Title = "PROGRAMA PARA CALCULAR AUMENTO DE 5% DE SALARIO");
Console.BackgroundColor = ConsoleColor.Blue;
Console.ForegroundColor = ConsoleColor.White;
Console.Clear();

Console.WriteLine("Digite salario-para encerrar digite salario = 0 ");
Salario = Double.Parse(Console.ReadLine());

Console.WriteLine("PROGRAMA PARA CALCULAR AUMENTO DE 5% DE
SALARIO\n\n");

while (Salario > 0)
{
NovoSalario = Acrescimo(Salario);

Console.WriteLine("\nSalario = {0:0000.00} ", Salario);
Console.WriteLine("\nNovo salario = {0:0000.00} ", NovoSalario);

Console.WriteLine("Digite salario; para encerrar digite salario = 0 ");
Salario = Double.Parse(Console.ReadLine());
}
}
}
}
FUNES E PROCEDIMENTOS EM C# 11




EXEMPLO 3

Programa para calcular e escrever o fatorial dos nmeros inteiros positivos de 0 a 15.
O fatorial de um nmero inteiro positivo N definido como o produto N*(N-1)*(N-2)*...*3*2*1















/*---------------------------------------------------------------------------
EXEMPLO 3
Fatorial dos inteiros de 0 a 15
---------------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Fatorial
{
class Program
{
//Funcao para calcular o fatorial de n = n.(n-1).(n-2). ... .3.2.1

static int Fatorial(int n)
{
int Fat = 1;
int Cont = n;
while (Cont > 0)
{
Fat = Fat * Cont;
Cont--;
}

return Fat;
}

static void Main(string[] args)
{
int Numero = 0, Resultado;

Console.Title = "FATORIAL DOS INTEIROS DE 0 A 15";

while (Numero <= 15)
{
Resultado = Fatorial(Numero);

Console.WriteLine("\n{0}! = {1}", Numero, Resultado);

Numero++;
}

Console.ReadKey();
return;
}

}
}

FUNES E PROCEDIMENTOS EM C# 12




EXEMPLO 4

Programa para determinar e escrever o maior dentre 3 valores numricos dados pelo usurio.



















/*------------------------------------------------------------
EXEMPLO 4
Programa para determinar o maior dentre 3 nmeros inteiros
--------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Maior_de_3
{
class Program
{
//Funcao para determinar e retornar o maior de dois valores
static int Maximo(int x, int y)
{
int Max;

if (x > y)
Max = x;
else
Max = y;
return Max;
}

static void Main(string[] args)
{
int Numero1, Numero2, Numero3, Maior;

Console.Write ("MAIOR DE TRES VALORES\n\n\n");

Console.Write ("Digite o primeiro numero inteiro: ");
Numero1 = Int16.Parse(Console.ReadLine ());

Console.Write ("Digite o segundo numero inteiro: ");
Numero2 = Int16.Parse(Console.ReadLine ());

Console.Write ("Digite o terceiro numero inteiro: ");
Numero3 = Int16.Parse(Console.ReadLine());

Maior = Maximo(Numero1, Numero2);
Maior = Maximo(Maior, Numero3);

Console.Write ("Maior valor de ({0}, {1}, {2}) = {3}", Numero1,Numero2,
Numero3, Maior);

Console.ReadKey();
return;
}
}
}

FUNES E PROCEDIMENTOS EM C# 13




EXEMPLO 5

Programa para ler do teclado um nmero inteiro no negativo, determinar e escrever se este
nmero par ou mpar.
Um nmero par se o resto de sua diviso por 2 for igual a 0 e impar se o resto de sua
diviso por 2 for igual a 1.

/*----------------------------------------------------------------------
EXEMPLO 5
Programa para ler um numero inteiro e verificar se ele par ou mpar
------------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Par_Impar
{
class Program
{
static bool ParImpar(int x)
{
bool Resultado;

if (x % 2 == 0)
Resultado = true;
else
Resultado = false;
return Resultado;
}

static void Main(string[] args)
{

int Numero;
ConsoleKeyInfo Sair;

Console.Write ("NMERO PAR E MPAR\n\n");

do
{
Console.Write ("\n\nDigite um nmero inteiro ");
Numero = Int32.Parse(Console.ReadLine());

if (ParImpar(Numero))
Console.Write("\nNmero par ");
else
Console.Write("\nnmero mpar");

Console.Write ("\n\nESC termina - outra tecla continua");
Sair = Console.ReadKey();

} while (Sair.Key != ConsoleKey.Escape);

return;
}
}
}


FUNES E PROCEDIMENTOS EM C# 14




EXEMPLO 6

Programa para ler uma data, determinar que dia do ano esta data representa (dias
transcorridos desde 1
o
de janeiro).
necessario usar uma funo para verificar se o ano bissexto ou no.
Um ano bissexto se satisfaz a uma das seguintes condies:

1) Divisvel por 4 e no divisvel por 100
ou
2) Divisvel por 400.

O ano de 2008 bissexto pois satisfaz primeira condio (divisvel por 4 e no divisvel por
100)
O ano de 1900 no bissexto pois no satisfaz a nenhuma das duas condio dadas (
divisvel por 4 mas tambm divisvel por 100 e no divisvel por 400).
O ano de 2000 bissexto pois satisfaz segunda condio: divisvel por 400
O ano de 1950 no bissexto, pois no satisfaz a nenhuma das duas condio (no
divisvel por 4 nem por 400)


FUNES E PROCEDIMENTOS EM C# 15

















EXEMPLO 7
















































/*-----------------------------------------------------------------------------
EXEMPLO 6
Programa para ler uma data, determinar e escrever o nmero ordinal dessa data
em relao a 1 de janeiro (1...366)
-------------------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Bissexto
{
class Program
{
//Funcao que verifica se um ano bissexto
static int Bissexto(int Ano)
{
if (Ano % 4 == 0 && Ano % 100 != 0 || Ano % 400 == 0 )
return 1;
else
return 0;
}

//Funo que determina o dia do ano de uma data
static int Dia_Do_Ano (int Dia, int Mes, int Ano)
{
int Numero_Dia, Numero_Mes;

Numero_Dia = Dia;

for (Numero_Mes = 1; Numero_Mes < Mes; Numero_Mes++)
{
if(Numero_Mes == 1 || Numero_Mes == 3 || Numero_Mes == 5 || Numero_Mes== 7
|| Numero_Mes == 8 || Numero_Mes == 10 || Numero_Mes == 12)
Numero_Dia = Numero_Dia + 31;
else
if (Numero_Mes == 4 || Numero_Mes == 6 || Numero_Mes == 9 || Numero_Mes == 11)
Numero_Dia = Numero_Dia + 30;
else
Numero_Dia = Numero_Dia + 28 + Bissexto(Ano);
}

return Numero_Dia;
}

static void Main(string[] args)
{
int Dia, Mes, Ano;
ConsoleKeyInfo Sair;

Console.Write("\n\nDIA DO ANO DE UMA DATA");
do
{
Console.Write("\nDigite dia: "); Dia = Int16.Parse(Console.ReadLine());
Console.Write("\nDigite ms: "); Mes = Int16.Parse(Console.ReadLine());
Console.Write("\nDigite ano: "); Ano = Int16.Parse(Console.ReadLine());

Console.Write("\n\n{0}/{1}/{2} = {3} dia do ano", Dia, Mes, Ano,
Dia_Do_Ano(Dia, Mes, Ano));
Console.Write( "\n\nESC TERMINA --- OUTRA TECLA CONTINUA");
Sair = Console.ReadKey();
} while ( Sair.Key != ConsoleKey.Escape);
}
}
}

FUNES E PROCEDIMENTOS EM C# 16




EXEMPLO 7

Programa para ler pares de nmeros at que seja lido o par (0, 0).
Determinar e escrever se o primeiro valor menor, maior ou igual ao segundo.
Flag: Numero1 = 0 e Numero2 = 0
Uma funo recebe como parmetros dois valores numricos e retorna uma frase
indicando a relao de igualdade entre eles.
A funo Igualdade retorna um ponteiro para char, que o endereo do primeiro
caractere de uma string, pois a funo retorna uma frase indicando a relao de igualdade
entre os valores numricos.

/*--------------------------------------------------------------------------------------
EXEMPLO 7
Programa para ler dois valores numricos e escrever a relao de igualdade entre eles
----------------------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ordenar_2_Reais
{
class Ordenar_2_Reais
{
//Funcao que verifica a relacao de igualdade entre dois valores
static int Igualdade(double Parametro1, double Parametro2)
{
int Relacao;
if (Parametro1 < Parametro2)
Relacao = -1;
else
if (Parametro1 > Parametro2)
Relacao = 1;
else
Relacao = 0;
return Relacao;
}

static void Main(string[] args)
{
double Numero1, Numero2, Resultado;

Console.Write ("RELACAO DE IGUALDADE ENTRE DOIS NUMEROS\n\n");
Console.Write ("\nDigite um valor "); Numero1 = Double.Parse(Console.ReadLine());
Console.Write ("\nDigite outro valor "); Numero2 = Double.Parse(Console.ReadLine());

while (Numero1 != 0 || Numero2 != 0)
{
Resultado = Igualdade(Numero1, Numero2);
if (Resultado == -1)
Console.Write ("\nO primeiro valor menor que o segundo");
else
if (Resultado == 1)
Console.Write ("\nO primeiro valor maior que o segundo");
else
Console.Write ("\nO primeiro valor igual ao segundo");
Console.Write ("\nDigite um valor "); Numero1 = Double.Parse(Console.ReadLine());
Console.Write ("\nDigite outro valor "); Numero2 = Double.Parse(Console.ReadLine());
}
}//fim Main
} //Fim class Ordenar_2_Reais
}//Fim namespace Ordenar_2_Reais
FUNES E PROCEDIMENTOS EM C# 17







EXEMPLO 8

Programa para ler do teclado as coordenadas dos vrtices de um tringulo, calcular e
escrever sua rea.
Usaremos duas funes. Uma para calcular a distncia entre dois pontos do plano e
outra para calcular a rea do tringulo dadas as medidas dos trs lados, Frmula de
Heron:


tringulo do lados dos medidas as c ,
2
) )( )( (
AB segmento do extremos dos s coordenada as so ) , ( ) , (
) ( ) (
2 2 1 1
2
1 2
2
1 2
e b a Sendo
c b a
p
c p b p a p p A
y x e y x
y y x x d
AB
+ +
=
=
+ =


/*--------------------------------------------------------------------
EXEMPLO 8
Programa para ler as coordenadas dos vrtices de um tringulo,
calcular e escrever a rea do mesmo
--------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Distancia_2_Pontos
{
class Program
{
//Funcao que calcula e retorna a distancia entre dois pontos
static double Distancia(double x1, double y1, double x2, double y2)
{
return Math.Sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
}

//Funo que calcula e retorna a rea de um tringulo dados os trs lados
static double AreaTriangulo(double a, double b, double c)
{
double p;
if (a<b+c && b<a+c && c<a+b)
{
p = (a+b+c)*0.5;
return Math.Sqrt(p*(p-a)*(p-b)*(p-c));
}
else
return 0.0;
}


FUNES E PROCEDIMENTOS EM C# 18









static void Main(string[] args)
{
double x1, y1,
x2, y2,
x3, y3,
Segmento_AB, Segmento_AC, Segmento_BC,
Area;

Console.Write("REA DE TRINGULO DADAS AS COORDENADAS DOS VRTICES\n\n");
do
{
Console.WriteLine("\nDigite as coordenadas do primeiro vrtice ");
Console.Write("x1: ");
x1 = Double.Parse(Console.ReadLine());
Console.Write("y1: ");
y1 = Double.Parse(Console.ReadLine());

Console.WriteLine("Digite as coordenadas do segundo vrtice ");
Console.Write("x2: ");
x2 = Double.Parse(Console.ReadLine());
Console.Write("y2: ");
y2 = Double.Parse(Console.ReadLine());

Console.WriteLine("Digite as coordenadas do terceiro vrtice ");
Console.Write("x3: ");
x3 = Double.Parse(Console.ReadLine());
Console.Write("y3: ");
y3 = Double.Parse(Console.ReadLine());

Segmento_AB = Distancia (x1, y1, x2, y2);
Segmento_AC = Distancia (x1, y1, x3, y3);
Segmento_BC = Distancia (x2, y2, x3, y3);
Area = AreaTriangulo(Segmento_AB, Segmento_AC, Segmento_BC);
Console.Write("rea do tringulo = {0}", Area);
Console.Write("\n\nESC TERMINA ... OUTRA TECLA CONTINUA\n\n");

}while (Console.ReadKey().Key != ConsoleKey.Escape);
}
}
}

FUNES E PROCEDIMENTOS EM C# 19




EXEMPLO 9
Programa para calcular o nmero de jogos de um campeonato de futebol, dado o nmero
de times que participaro da competio.
A quantidade de times ser lida do teclado.
A quantidade de partidas a serem realizadas calculada pelos processos da anlise
combinatria:

! )! (
!
p p n
n
C
p
n

=
! 2 )! 2 (
!
2

=
n
n
C
n

n = nmero de times participantes.
O uso da funo fatorial se faz necessria pela repetio do fatorial em 3 expresses.
O programa principal chama a funo Combinacao, que por sua vez chama 3 vezes a
funo fatorial.
/*--------------------------------------------------------------------
EXEMPLO 9
Programa para calcular o numero de jogos de um campeonato de futebol
-------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Combinacao
{
class Program
{
//Funo para calcular o fatorial de um nmero no negativo
static long Fatorial(int n)
{
long Fat = 1;
int Cont = n;

for (Cont = n; Cont > 0; Cont--)
Fat = Fat * Cont;

return Fat;
}

//Funo para calcular o nmero de combinaes de n elementos p a p
static long Combinacao(int n, int p)
{
return Fatorial(n)/(Fatorial(n-p)*Fatorial(p));
}

static void Main(string[] args)
{
int QuantTimes;
long NumeroJogos;

do
{
Console.Clear();
Console.Write("NMERO DE JOGOS DE UM CAMPEONATO DE FUTEBOL\n\n");

Console.Write("Digite a quantidade de times ");
QuantTimes = Int16.Parse(Console.ReadLine());

NumeroJogos = Combinacao(QuantTimes, 2);
Console.Write("Nmero de jogos = {0}", NumeroJogos);

Console.Write("\n\nESC TERMINA --- OUTRA TECLA TERMINA\n\n");
} while (Console.ReadKey().Key != ConsoleKey.Escape);
}
}
}
FUNES E PROCEDIMENTOS EM C# 20






PROCEDIMENTOS

Uma sub-rotina que no retorna nenhum valor ser denominada procedimento.
Na linguagem C um procedimento tambm uma funo que retorna void.
O tipo void especifica o conjunto vazio.
Portanto, uma funo do tipo void uma funo que no retorna nenhum valor.
Formato de um procedimento em C

void Identificao (declarao dos parmetros)
{
declarao dos objetos locais
bloco de comandos
}
void uma palavra reservada da linguagem C, significando funo com retorno nulo (sem
retorno)
Identificao o nome pelo qual o procedimento ser chamado por outros procedimentos
ou funes
parmetros so variveis do procedimento que importam ou exportam valores para o
mesmo, no momento de sua chamada por outros procedimentos ou funes.
O par de chaves { } delimita o bloco de comandos do procedimento.

Seguem alguns exemplos:



FUNES E PROCEDIMENTOS EM C# 21




EXEMPLO 10

Programa para:
Ler o numerador e denominador de duas fraes
Calcular e escrever a soma e o produto das duas fraes (em forma de frao irredutvel).

Para simplificar uma frao ou transform-la em frao irredutvel e necessrio calcular o
MDC entre o seu numerador e o seu denominador. Usaremos para calcular o MDC de dois
nmeros inteiros positivos o processo das subtraes sucessivas, que constitui em substituir
o maior valor pela diferena entre o maior e o menor valor.

Por exemplo:
Calcular o mximo divisor comum (MDC) entre 48 e 28
a = 48 e b = 28 como a > b, substituir a por a-b, a = 48 28 a = 20 e b = 28
b > a, substituir b por b-a, logo b = 28 20 a = 20 e b = 8
a > b, substituir a por a-b, a = 20 8, a = 12 e b = 8
a > b, substituir a por a-b, a = 12 8 a = 4 e b = 8
b > a, substituir b por b-a, b = 8 4 a = 4 e b = 4 este valor o MDC entre 48
e 28

Exemplo de simplificao de uma frao:
12
7
48
28
4 / 48
4 / 28
/ 48
/ 28
4 ) 48 , 28 (
48
28
= =
= =
m
m
m MDC m



FUNES E PROCEDIMENTOS EM C# 22




/*--------------------------------------------------------------------
EXEMPLO 10
Programa fazer clculos com fraes
--------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace MDC
{
class Program
{
//Funo para determinar o MDC
static int MDC(int x, int y)
{
if (x==0) x=1;
if (y==0) y=1;

x = Math.Abs(x);
y = Math.Abs(y);

while(x!=y)
if (x > y)
x = x - y;
else
y = y - x;
return x;
}

//Procedimento para simplificar frao
static void Simplificar(ref int Num, ref int Den)
{
int Divisor = MDC(Num, Den);

if (Divisor != 1)
{
Num = Num / Divisor;
Den = Den / Divisor;
}
return;
}

//Procedimento para escrever frao
static void EscreveFracao(int Num, int Den, string Operacao)
{

if (Num == 0 || Den == 1)
Console.Write("\n\n{0} = {1} ", Operacao, Num);
else
Console.Write("\n\n{0} = {1} / {2} ", Operacao, Num, Den);

return;
}

//Procedimento para somar fraes
static void SomaFracao(int Num1, int Den1, int Num2, int Den2)
{
int Num, Den;
Num = Num1 * Den2 + Num2 * Den1;
Den = Den1 * Den2;
Simplificar(ref Num, ref Den);
EscreveFracao(Num, Den, "Soma");
}



FUNES E PROCEDIMENTOS EM C# 23




//Procedimento para multiplicar fraes
static void ProdutoFracao(int Num1, int Den1, int Num2, int Den2)
{
int Num, Den;
Num = Num1 * Num2;
Den = Den1 * Den2;
Simplificar(ref Num, ref Den);
EscreveFracao(Num, Den, "Produto");
}

//Procedimento para subtrao fraes
static void DiferencaFracao(int Num1, int Den1, int Num2, int Den2)
{
int Num, Den;
Num = Num1 * Den2 - Num2 * Den1;
Den = Den1 * Den2;
Simplificar(ref Num, ref Den);
EscreveFracao(Num, Den, "Diferena");
}

//Procedimento dividir fraes
static void QuocienteFracao(int Num1, int Den1, int Num2, int Den2)
{
int Num, Den;
Num = Num1 * Den2;
Den = Den1 * Num2;
Simplificar(ref Num, ref Den);
EscreveFracao(Num, Den, "Quociente");
}

//PROGRAMA PRINCIPAL
static void Main(string[] args)
{
int Num1, Den1, Num2, Den2;

Console.BackgroundColor = ConsoleColor.Blue;
Console.ForegroundColor = ConsoleColor.White;

do
{
Console.Clear();
Console.Write( "OPERACOES COM FRACOES\n\n");

Console.Write("\nDigite numerador da primeira fracao ");
Num1 = Int16.Parse(Console.ReadLine());

Console.Write("\nDigite denominador da primeira fracao ");
Den1 = Int16.Parse(Console.ReadLine());

Console.Write("\nDigite numerador da segunda fracao ");
Num2 = Int16.Parse(Console.ReadLine());

Console.Write("\nDigite denominador da segunda fracao ");
Den2 = Int16.Parse(Console.ReadLine());

EscreveFracao(Num1, Den1, "Primeira fracao");
EscreveFracao(Num2, Den2, "Segunda fracao");

SomaFracao(Num1, Den1, Num2, Den2);
ProdutoFracao(Num1, Den1, Num2, Den2);
DiferencaFracao(Num1, Den1, Num2, Den2);
QuocienteFracao(Num1, Den1, Num2, Den2);

Console.Write("\n\n\n\nTecle ESC para terminar ");
Console.Write("\n\nAperte outra tecla para continuar ");
Console.Write("\n\nDigite sua opo: ");
}while (Console.ReadKey().Key != ConsoleKey.Escape);

}
}
}




FUNES E PROCEDIMENTOS EM C# 24




EXEMPLO 11

Programa para fazer a tabela de uma funo
/*--------------------------------------------------------------------
EXEMPLO 11
Programa para tabelar a funo f(u, v) = u.u + u.v + v.v
--------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Tabela
{
class Program
{
//Funcao matematica u.u + u.v + v.v
static double Funcao(double u, double v)
{
return u * u + u * v + v * v;
}

//Tabela da funcao - x varia de 0 a 1, de 0.25 em 0.25
//para cada valor de x, y varia de 0 a 3 de 0.5 em 0.5

static void Tabela()
{
double x = 0.0, y;

//escreve os valores reais sempre com duas casas decimais

while (x <= 1)
{
y = 0.0;
while (y <= 3.0)
{
Console.Write("\n\nf({0:0.00}, {1:0.00}) = {2:0.00}", x, y, Funcao(x, y));
y = y + 0.5;
}

x = x + 0.25;
}
return;
}

//PROGRAMA PRINCIPAL
static void Main(string[] args)
{
Tabela();
do
{
Console.Write("\n\n\n\nTecle ESC para terminar ");
Console.Write("\n\nAperte outra tecla para continuar ");
Console.Write("\n\nDigite sua opo: ");

} while (Console.ReadKey().Key != ConsoleKey.Escape);
}
}
}

FUNES E PROCEDIMENTOS EM C# 25







EXEMPLO 12

Programa para ler um par de valores numricos
Calcular e escrever a soma, a diferena, o produto e o quociente entre o primeiro e o
segundo nmero.
Flag: valores nulos


/*---------------------------------------------------------------------------
EXEMPLO 12
Programa para ler dois valores e calcular a soma, diferenca, produto e
quociente entre eles
Flag: dois valores nulos
---------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Operacoes
{
class Program
{
//Procedimento para calcular adicao, subtracao, multiplicacao e divisao de
//dois valores reais

static void Operacoes(double u, double v)
{

Console.Write("\n{0} + {1} = {2}", u, v, u + v);
Console.Write("\n{0} - {1} = {2}", u, v, u - v);
Console.Write("\n{0} * {1} = {2}", u, v, u * v);

if (v != 0)
Console.Write("\n{0} / {1} = {2}", u, v, u / v);
else
Console.Write("\nImpossivel dividir por ZERO");

return;
}



FUNES E PROCEDIMENTOS EM C# 26




static void Main(string[] args)
{
double x, y;

Console.Write("\nSOMA, DIFERENCA, PRODUTO E QUOCIENTE ENTRE DOIS NUMEROS\n\n");

Console.Write("Digite dois valores nulos para terminar\n\n ");

Console.Write("Digite um numero real: ");
x = Double.Parse(Console.ReadLine());

Console.Write("Digite outro numero real: ");
y = Double.Parse(Console.ReadLine());

while (x != 0 || y != 0)
{
Operacoes(x, y);

Console.Write("\n\nDigite dois valores nulos para terminar\n\n ");

Console.Write("Digite um numero real: ");
x = Double.Parse(Console.ReadLine());

Console.Write("Digite outro numero real: ");
y = Double.Parse(Console.ReadLine());
}
}
}
}

FUNES E PROCEDIMENTOS EM C# 27




EXEMPLO 13

Programa para ler a medida da base e da altura de um retngulo, usando como flag
altura ou base igual a zero e um procedimento para calcular e escrever as medidas do
permetro, da diagonal e da rea do mesmo .
































/*--------------------------------------------------------------------------------------
Programa para calcular rea, permetro e diagonal de um retngulo
---------------------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Retangulo
{
class Program
{
//Procedimento para calcular e escrever a rea, o permetro e a diagonal de um retngulo
static void Retangulo(double x, double y)
{
double Area, Perimetro, Diagonal;
Perimetro = 2 * (x + y);
Area = x * y;
Diagonal = Math.Sqrt (x * x + y * y);
Console.Write("\n\nRetangulo de lados: Base = {0:0.00} e Altura = {1:0.00} ", x, y);
Console.Write("\n\nPerimetro do retangulo = {0:0.00}", Perimetro);
Console.Write("\n\nArea do retangulo = {0:0.00} ", Area);
Console.Write("\n\nDiagonal do retangulo = {0:0.00} ", Diagonal);
return;
}

static void Main(string[] args)
{
double x, y;

Console.Clear();
Console.Write("REA, DIAGONAL E PERMETRO DE UM RETNGULO\n\n");

Console.Write("\nDigite dois valores nulos para terminar\n ");

Console.Write("\nDigite a medida da base de um retangulo: ");
x = Double.Parse(Console.ReadLine());

Console.Write("\nDigite a medida da altura do retangulo: ");
y = Double.Parse(Console.ReadLine());

while (x != 0 && y != 0)
{
Retangulo(x, y);

Console.ReadKey();

Console.Clear();
Console.Write( "\nDigite dois valores nulos para terminar\n ");

Console.Write( "\nDigite a medida da base de um retangulo: ");
x = Double.Parse(Console.ReadLine());

Console.Write( "\nDigite a medida da altura do retangulo: ");
y = Double.Parse(Console.ReadLine());
}
}
}
}

FUNES E PROCEDIMENTOS EM C# 28





PROCEDIMENTO SEM PARMETROS

Os procedimentos e funes usados at o momento usaram parmetros para passar valores
para os mesmos. Uma funo ou procedimento pode no ter parmetros, ficando seu cabealho
no formato:
tipo_de_retorno Identificao ()


EXEMPLO 14

Programas para tabelar a funo
2 2
) , ( y x y x f + =
para os pares ordenados (0, 0), (0.1, 0.2), (0.2, 0.4), (0.3, 0.6), ... (2.0, 4.0)






















/*---------------------------------------------------------------------------
Programa para tabelar uma funo sqrt(u * u + v * v)
---------------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Tabela_Ex_14
{
class Program
{
//Procedimento para tabelar uma funo raiz(u.u+v.v)
static void Tabela()
{
double t, u, v;
u = 0.0;
v = 0.0;

while (u <= 2 && v <= 4)
{
t = Math.Sqrt(u*u + v*v);
Console.Write("\nf({0:0.0}, {1:0.0}) = {2:0.00}", u, v, t);
u = u + 0.1;
v = v + 0.2;
}
return;
}

static void Main(string[] args)
{
Console.Write( "TABELA DA FUNCAO sqrt(u*u + v*v)\n\n");
Tabela();

Console.ReadKey();
}
}
}

FUNES E PROCEDIMENTOS EM C# 29





PARMETROS POR REFERNCIA

Os parmetros usados at este local do texto foram utilizados apenas para levar valores
para as sub-rotinas e so denominados parmetros por valor. Estes parmetros importam
valores para as funes ou procedimentos. Uma alterao em seus valores, nas respectivas sub-
rotinas, no acarreta alterao nas variveis externas a eles associadas, pois ocupam endereos
de memria diferentes daquelas.
H algumas situaes em que necessrio passar parmetros para as sub-rotinas de forma
mais eficiente (economia de memria ou de tempo). Esta forma denominada passagem de
parmetros por referncia. Os parmetros por referncia no ocupam um novo espao de
memria, mas apenas criam um apelido para a varivel associada, e por isso so utilizados
quando grande a quantidade de dados a ser passado para a funo. Este tipo de parmetro
pode ser usado tambm para retornar valores de uma sub-rotina.
A linguagem C#, denota os parmetros por referncia com o termo ref (referncia) antes
da identificao dos tipos de dados.

Exemplos de declarao de sub-rotinas com parmetros por referncia
1. int Calculo(ref float x, ref int n)
2. float Maximo(ref char Status )
3. void Area(ref double a, ref double b, ref double c)
Um parmetro por referncia pode modificar a varivel externa a ele associada.

FUNES E PROCEDIMENTOS EM C# 30




EXEMPLO 15

Programa para ler do teclado dois valores numricos e escrev-los em ordem crescente.
O procedimento Ordena recebe dois valores numricos a e b e retorna outros dois valores
x e y ordenados (o menor em x e o maior em y).

/*---------------------------------------------------------------------------
Programa para ler do teclado trs valores numricos, escrevendo-os em ordem
crescente.
O procedimento Ordena recebe dois valores numricos a e b e retorna outros
dois valores x e y ordenados (o menor em x e o maior em y).
---------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Procedimento_Ordena
{
class Program
{
//Ordena dois valores
static void Ordena(double a, double b, ref double x, ref double y)
{
if (a < b)
{
x = a;
y = b;
}
else
{
x = b;
y = a;
}
return;
}
static void Main(string[] args)
{
double Numero1, Numero2, Numero3 = 1, Numero4 = 1;

Console.Write( "ORDENAR DOIS NUMEROS\n\n");
Console.Write( "\n\nDigite dois numeros (digite 0 0 para parar)\n\n ");
Console.Write("\n\nDigite o primeiro numero: ");
Numero1 = double.Parse(Console.ReadLine());
Console.Write("\n\nDigite o segundo numero: ");
Numero2 = double.Parse(Console.ReadLine());

while (Numero1 != 0 || Numero2 != 0)
{
Console.Clear();
Console.Write("\nORDENAR DOIS NUMEROS\n\n");
Ordena(Numero1, Numero2, ref Numero3, ref Numero4);
Console.Write( "\n\nNumeros digitados: {0} {1} ", Numero1, Numero2 );
Console.Write( "\n\nNumeros ordenados: {0} {1} ", Numero3, Numero4 );


Console.Write("\n\nDigite dois numeros (digite 0 0 para parar)\n\n ");

Console.Write("\n\nDigite o primeiro numero: ");
Numero1 = double.Parse(Console.ReadLine());

Console.Write("\n\nDigite o segundo numero ");
Numero2 = double.Parse(Console.ReadLine());
}
}
}
}

FUNES E PROCEDIMENTOS EM C# 31




Vamos supor a execuo do programa com os valores
Numero1 = 8, Numero2 = 5
Aps a execuo da linha:
Ordena (Numero1, Numero2, Numero3, Numero4) = Ordem (8, 5, Numero3, Numero4)
Numero1 = 8
Numero2 = 5
Numero3= 5
Numero4= 8
Tela: 8, 5, 5, 8

Poderamos escrever a funo acima usando apenas dois parmetros, que neste caso serviriam
tanto para importar quanto para exportar valores.

//Ordena dois valores
static void Ordena(ref double a, ref double b)
{
double x;

if (a > b)
{
x = a;
a = b;
b = x;
}

return;
}
FUNES E PROCEDIMENTOS EM C# 32




EXEMPLO 16

Programa para ordenar dois nmeros, usando uma funo Troca, se o primeiro for maior
que o segundo.
Os dois parmetros da funo servem tanto para importar quanto para exportar valores
/*---------------------------------------------------------------------------
Programa para escrever dois nmeros em ordem crescente
---------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ordenar_2_Numeros
{
class Ordenar_2_Numeros
{
//Funcao para trocar dois valores
static void Troca(ref float x, ref float y)
{
float Temp = x;
x = y;
y = Temp;

return;
}

static void Main(string[] args)
{
float Numero1 = 1, Numero2 = 1;

Console.Write("ORDENAR DOIS NUMEROS:\n\n");
Console.Write("\nDigite dois numeros (digite 0 e 0 para parar): ");

Console.Write("\nDigite o primeiro nmero: ");
Numero1 = float.Parse(Console.ReadLine());

Console.Write("\nDigite o segundo nmero: ");
Numero2 = float.Parse(Console.ReadLine());

while (Numero1 !=0 && Numero2 != 0)
{
Console.Write("\n\nNumeros digitados ({0}, {1}) ", Numero1, Numero2);

if (Numero1 > Numero2)
Troca(ref Numero1, ref Numero2);

Console.Write("\n\nNumeros ordenados ({0}, {1}) ", Numero1, Numero2);

Console.Write("\n\nORDENAR DOIS NUMEROS:\n\n");
Console.Write("\nDigite dois nmeros (digite 0 e 0 para parar): ");

Console.Write("\nDigite o primeiro nmero: ");
Numero1 = float.Parse(Console.ReadLine());

Console.Write("\nDigite o segundo nmero: ");
Numero2 = float.Parse(Console.ReadLine());
}
}
}
}
FUNES E PROCEDIMENTOS EM C# 33




Observa-se que devemos imprimir os valores Numero1 e Numero2 antes de chamar o
procedimento Ordena, pois se Numero1 for maior que Numero2, os valores de Numero1 e
Numero2 sero alterados.





EXEMPLO 17

Programa para ler do teclado trs valores numricos e escrev-los em ordem crescente.
Usa o mesmo procedimento Troca que troca os dois valores numricos recebidos como
parmetros
x recebe y e y recebe x.

FUNES E PROCEDIMENTOS EM C# 34





/* Programa para ler do teclado trs valores numricos e escrev-los em ordem crescente.
Usa o mesmo procedimento Troca, que troca os dois valores numricos recebidos como
parmetros */

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Ordenar_3_Numeros
{
class Program
{
//Funcao para trocar dois valores
static void Troca(ref float x, ref float y)
{
float Temp = x;
x = y;
y = Temp;
return;
}

static void Main(string[] args)
{
float Numero1 = 0, Numero2 = 0, Numero3 = 0;

Console.Write( "\nORDENAO DE TRS NMEROS:\n\n");

Console.Write( "Digite tres numeros (digite 0 e 0 e 0 para parar):\n\n");

Console.Write( "\nPrimeiro valor: ");
Numero1 = float.Parse(Console.ReadLine());

Console.Write( "\nSegundo valor: ");
Numero2 = float.Parse(Console.ReadLine());

Console.Write( "\nTerceiro valor: ");
Numero3 = float.Parse(Console.ReadLine());

while (Numero1 !=0 && Numero2 != 0 && Numero3 != 0)
{
Console.Clear();
Console.Write("\nORDENAO DE TRS NMEROS:\n\n");
Console.Write("\nNmeros digitados ({0}, {1}, {2})", Numero1, Numero2,
Numero3);
if (Numero1 > Numero2)
Troca(ref Numero1, ref Numero2);
if (Numero1 > Numero3)
Troca(ref Numero1, ref Numero3);
if (Numero2 > Numero3)
Troca(ref Numero2, ref Numero3);

Console.Write( "\nNmeros ordenados ({0}, {1}, {2})", Numero1,
Numero2, Numero3);
Console.ReadKey();

Console.Clear();
Console.Write("\nORDENAO DE TRS NMEROS:");

Console.Write( "\n\nDigite trs numeros (digite 0 e 0 e 0 para parar):");
Console.Write( "\n\nPrimeiro valor ");
Numero1 = float.Parse(Console.ReadLine());
Console.Write( "\n\nSegundo valor ");
Numero2 = float.Parse(Console.ReadLine());
Console.Write( "\n\nTerceiro valor ");
Numero3 = float.Parse(Console.ReadLine());
}
}
}
FUNES E PROCEDIMENTOS EM C# 35







Vamos supor a execuo do programa para: Numero1 = 8, Numero2 = 5, Numero3 = 3

Aps a execuo da linha: if (Numero1 > Numero2)
Como (Numero1 > Numero2) Troca(Numero1, Numero2);
Troca (8, 5)
Numero1 = 5 e Numero2 = 8

Aps a execuo da linha: if (Numero1 > Numero3)
Como (Numero1 > Numero3) Troca(Numero1, Numero3);
Troca (5, 3)
Numero1 = 3 e Numero3 = 5

Aps a execuo da linha: if (Numero2 > Numero3)
Como (Numero2 > Numero3) Troca(Numero2, Numero3);
Troca (8, 5)
Numero2 = 5 e Numero3 = 8
Tela: 3 5 8

FUNES E PROCEDIMENTOS EM C# 36




EXEMPLO 18

Programa para calcular o reajuste de preo de mercadorias em 15%
O procedimento Reajuste contm dois parmetros por referncia. O parmetro Preco
recebe o preo de um produto e o devolve com um reajuste de 15% e o parmetro
Aumento devolve o acrscimo de 15% no preo.
/*---------------------------------------------------------------------------
EXEMPLO 18
Programa para calcular o reajuste de 15% em uma mercadoria
---------------------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace exemplo18
{
class Program
{
//Funcao que aumenta um valor em 15%
static void Reajuste(ref double Preco, ref double Aumento)
{
Aumento = Preco * 0.15;
Preco = Preco + Aumento;
return;
}


static void Main(string[] args)
{
double Preco = 0, NovoPreco, Acrescimo = 0;

Console.Write( "15% DE AUMENTO DE UM PRODUTO\n\n");

Console.Write( "Digite o preco de um produto - 0 para parar: ");
Preco = double.Parse(Console.ReadLine());

while (Preco > 0.0)
{
Console.Write( "\n\n\tPreo atual {0}\t", Preco);
Reajuste (ref Preco, ref Acrescimo);
Console.Write( "\n\tPreo com reajuste de 15% = {0}\t Acrcimo = {1}", Preco,
Acrescimo);
NovoPreco = Preco;
Console.Write("\n\tAcrescimo = {0}\tPreo atual = {1}",Acrescimo, NovoPreco);

Console.Write( "\n\nDigite o preco de um produto - 0 para parar: ");
Preco = double.Parse(Console.ReadLine());
}
}//Main
}
}






FUNES E PROCEDIMENTOS EM C# 37




Consideremos a execuo do programa para PrecoAtual = 100.
Ser impresso:
100 PrecoAtual (antes da chamada do procedimento)
15 Reajuste
115 PrecoAtual (aps a chamada do procedimento)
A varivel PrecoAtual (=100) tranfere o seu valor para o parmetro ref double Preo, que
ao termino do procedimento tem o valor 115, alterando a varivel PrecoAtual. Portanto o
parmetro por referncia transfere o seu valor para a varivel associada na chamada do
procedimento.
O parmetro ref double Preo usado pelo procedimento para importar do programa
principal um valor (100) e para exportar para o programa principal um valor (115). J o
parmetro ref double Aumento apenas exporta um valor (15) do procedimento para o
programa principal.
O comando return poderia retornar um dos valores mas no os dois.


FUNES E PROCEDIMENTOS EM C# 38




FUNES RECURSIVAS

So funes que fazem referncia (chamam) a si prprias.
Um exemplo tpico na matemtica o da funo fatorial de um nmero inteiro no
negativo.

>
<
=
2 se )! 1 (
2 se 1
!
n n n
n
n

Seja calcular 5!.

120
1 * 2 * 3 * 4 * 5
! 1 * 2 * 3 * 4 * 5
! 2 * 3 * 4 * 5
! 3 * 4 * 5
! 4 * 5 ! 5
=
=
=
=
=
=


Outro exemplo:

Observemos a sequncia denominada Sequncia de Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21,
34, 55, ...
O primeiro termo e o segundo so iguais a 1.
Cada termo, a partir do terceiro, obtido somando-se os dois termos anteriores.
Pode-se definir qualquer termo desta seqncia, recursivamente, da seguinte forma:

> +
<
=
3 n se ) 2 ( ) 1 (
3 1
) (
n Fib n Fib
n se
n Fib


FUNES E PROCEDIMENTOS EM C# 39




EXEMPLO 19

Programa para calcular o fatorial dos inteiros de 0 a 20, usando funo fatorial recursiva
/*---------------------------------------------------------------------------
Programa para calcular recursivamente o fatorial dos inteiros de 0 a 12
---------------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EXEMPLO19
{
class Program
{
static long Fatorial(long n)
{
long Fat;
if (n < 2)
Fat = 1;
else
Fat = n * Fatorial(n-1);
return Fat;
}

//Funcao recursiva para calcular o fatorial
static void Main(string[] args)
{
long Numero;

Console.Write( "FATORIAL DOS INTEIROS DE 1 A 12\n\n");

for (Numero = 0; Numero < 13; Numero++)
Console.Write("\n{0} ! = {1} ", Numero, Fatorial(Numero));

Console.ReadKey();
}
}
}


A funo Fatorial acima poderia ser escrita de uma forma mais compacta
int Fatorial (int n)
{
if (n < 2)
return 1; { ncora}
else
return n * Fatorial(n-1)); {nova chamada da prpria funo}
}



FUNES E PROCEDIMENTOS EM C# 40




EXEMPLO 20

Programa para calcular e imprimir os 20 primeiros termos da seqncia de Fibonacci: 1, 1,
2, 3, 5, 8, 13, 21, 34, 55, 89, ...
Definio recursiva:

> +
<
=
3 se ) 2 ( ) 1 (
3 se 1
) (
n n Fib n Fib
n
n Fib
/*---------------------------------------------------------------------------
Programa para calcular recursivamente o n-simo termo
da sequencia de Fibonacci
---------------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace exemplo20
{
class Program
{
static long Fibonacci(int n)
{
long Fib;
if (n < 3)
Fib = 1;
else
Fib = Fibonacci(n-1) + Fibonacci(n-2);
return Fib;
}

static void Main(string[] args)
{
int Termo;

do
{
Console.Write( "\n\nDigite o termo desejado da sequencia Fibonacci: ");
Termo = int.Parse(Console.ReadLine());

Console.Write("\n{0} termo da sequencia de Fibonacci: {1} ", Termo,
Fibonacci(Termo));

Console.Write( "\n\nESC PARA TERMINAR E OUTRA TECLA PARA CONTINUAR: ");

}while(Console.ReadKey().Key != ConsoleKey.Escape);


}
}
}

FUNES E PROCEDIMENTOS EM C# 41




EXEMPLO 21

Programa para calcular a soma dos N primeiros nmeros inteiros positivos

S = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + ...
/*-----------------------------------------------------------------------------------------
Programa para calcular recursivamente a soma dos n primeiros nmeros inteiros positivos
------------------------------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace exemplo21
{
class Program
{
//Soma recursiva dos n primeiros numeros inteiros
static int SomaInteiros(int n)
{
int Soma;
if (n < 2)
Soma = 1;
else
Soma = n + SomaInteiros(n-1);
return Soma;
}

static void Main(string[] args)
{
int QuantidadeTermos;

Console.Write( "SOMA DOS INTEIROS POSITIVOS\n\n");
do
{
Console.Write( "\n\nDigite a quantidade de inteiros que se deseja somar: ");
QuantidadeTermos = int.Parse(Console.ReadLine());

Console.Write("Soma dos {0} primeiros numeros inteiros positivos = {1}",
QuantidadeTermos, SomaInteiros(QuantidadeTermos));

Console.Write( "\n\nESC TERMINA E OUTRA TECLA CONTINUA\n\n");

}while (Console.ReadKey().Key != ConsoleKey.Escape);

}
}
}




FUNES E PROCEDIMENTOS EM C# 42




EXEMPLO 22

Programa para calcular a soma dos N primeiros termos da srie:
+ + + =
12
6 sen
10
5 sen
8
4 sen
6
3 sen
4
2 sen
2
sen x x x x x x
S














LISTA DE EXERCCIOS

















/*---------------------------------------------------------------------------
Programa para calcular recursivamente a soma dos n primeiros termos da sequncia:
(-1)^(n-1)sen (nx)/ (2n)
---------------------------------------------------------------------------*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace exemplo22
{
class Program
{
//Soma dos n primeiros termos da serie: (-1)^(n-1)sen (nx)/ (2n)
static double Serie( float x, int n)
{
double Soma 0.0;

if (n < 1)
Soma = 0.0;
else
if (n % 2 == 1)
Soma = Math.Sin(n * x) / (2 * n) + Serie(x, n - 1);
else
Soma = Math.Sin(n * x) / (2 * n) - Serie(x, n - 1);
return Soma;
}


static void Main(string[] args)
{
int QuantidadeTermos;
float x;

Console.Write( "SERIE (-1)^(n-1)sen (nx)/ (2n)\n\n");

do
{
Console.Write( "\nDigite a quantidade de inteiros que se deseja somar ");
QuantidadeTermos = int.Parse(Console.ReadLine());

Console.Write( "\nDigite o valor de x ");
x = float.Parse(Console.ReadLine());

Console.Write("Soma dos {0} ) primeiros termos = {1}", QuantidadeTermos,
Serie(x, QuantidadeTermos));

Console.Write( "\n\nESC PARA TERMINAR E OUTRA TECLA PARA CONTINUAR");
} while (Console.ReadKey().Key != ConsoleKey.Escape);
} //Soma dos n primeiros termos da serie: (-1)^(n-1)sen (nx)/ (2n)
}
}

FUNES E PROCEDIMENTOS EM C# 43






EXERCCIOS PROPOSTOS

1. Escreva uma funo que receba como parmetro um nmero inteiro e retorne -1, 0 ou 1, se
este nmero for negativo, nulo ou positivo, respectivamente.

Programa teste da funo: ler um nmero indeterminado de valores e imprimir uma frase
indicando se o nmero positivo, negativo ou nulo.
Use um flag adequado.

2. Escreva uma funo que receba como parmetro um nmero inteiro, calcule e retorne a sexta
potncia desse nmero.

Programa teste da funo: imprimir a sexta potncia dos nmeros inteiros de 1 a 15.

3. Escreva uma funo que receba como parmetro um nmero inteiro e positivo e retorne 0 ou
1, se este nmero for par ou mpar, respectivamente.

Programa teste da funo: ler um nmero indeterminado de valores, imprimir se cada valor
par ou mpar.
Use como flag: nmero menor ou igual a zero.

4. Escreva uma funo que calcule e retorne a raiz cbica de um nmero real.

Programa teste da funo: calcular e escrever a raiz cbica de todos os nmeros reais
x = -3.0, -2.5, -2.0, -1.5, ..., 2.0, 2.5, 3.0 .

5. Escreva uma funo que receba como parmetro o nmero de vitrias (3 pontos) e o nmero
de empates (1 ponto) de um time de futebol em um campeonato, calcule e retorne o total de
pontos obtidos por este time.

Programa teste da funo: ler do teclado o nmero de vitrias e de empates de vrios times,
calcular e escrever o nome do time, o total de vitrias, o total de empates e o total de pontos
obtidos por estes times.
Use um flag adequado para encerrar
FUNES E PROCEDIMENTOS EM C# 44





6. Escreva uma funo que receba como parmetros o salrio fixo, e o total de vendas de um
vendedor.
Calcule e retorne o salrio mensal, constitudo do salrio fixo mais 3% de comisso sobre as
vendas.

Programa teste da funo: ler do teclado o salrio fixo e o total de vendas de um nmero
indeterminado de vendedores de uma empresa, calcular e escrever o salrio fixo, o total de
vendas e o salrio final destes vendedores.
Use um flag adequado.

7. Escreva uma funo que calcule e retorne o fatorial de um nmero inteiro positivo.

Programa teste da funo: ler diversos pares de inteiros n e p, calcular e escrever o nmero
de combinaes de n elementos p a p e o nmero de arranjos de n elementos p a p.

8. Escreva uma funo que calcule e retorne o valor da expresso f(x) = x
2
5x + 6.
Escreva uma funo que calcule e retorne o valor da expresso g(x) = 3x
2
- 4

Programa teste das funes: calcular e escrever x, f(g(x)) e g(f(x)) para x=0 at x = 2, de
0,1 em 0,1.

9. Escreva uma funo que receba como parmetro um caractere e retorne 0 se este caractere
uma vogal, 1 se uma consoante e 2 se outro caractere.

Programa teste da funo: ler uma frase com no mximo 80 caracteres.
Escrever a quantidade de caracteres da frase, o nmero de vogais, o nmero de consoantes e
o nmero de outros caracteres (ex.: espao, virgula, ponto, etc).

10. Escreva uma funo que receba como parmetro um caractere (letra) e retorne essa letra em
maiscula.
Programa teste da funo: ler uma frase e escrev-la toda em maiscula.

11. Escreva uma funo que verifique se um nmero primo.

Programa teste da funo: escrever os nmeros primos de 2 a 1000.
FUNES E PROCEDIMENTOS EM C# 45





12. Escreva uma funo que receba como parmetros dois nmeros inteiros decimais (na base
10) a e b
(1< b < 10). Converta a para a base b. Retorne o valor resultante.

Programa teste da funo: ler um nmero inteiro e escrev-lo nas bases 2, 3, 4, ..., 8, 9.

13. Escreva um procedimento para imprimir na tela um "*".

Programa teste da funo: imprimir uma linha com 60 "*".

14. Escreva um procedimento que receba como parmetros um caractere Ch e um inteiro N e
imprima na tela N caracteres Ch.

Programa teste da funo: ler do teclado um inteiro n e um caractere x. Imprimir n
caracteres x. O usurio dever repetir o programa quantas vezes quiser.

15. Escreva um procedimento que receba como parmetro um inteiro N e imprima todos os
divisores de N.

Programa teste da funo: ler do teclado um nmero indeterminado de valores inteiros.
"Flag": valor <= 0. Imprimir os divisores desses valores.

16. Escreva um procedimento que imprima data no formato AAAA/MM/DD sendo Ano, Ms e Dia
parmetros inteiros.
Programa teste da funo: ler um nmero indeterminado de datas (3 inteiros) e escrev-las
no formato especificado na funo. Use como "flag" um dos valores nulo.

17. Escreva um procedimento que imprima data recebida em 3 parmetros inteiros DD/MM/AAAA
na forma DD de Nome do ms de AAAA. Ex.: 20/03/2012 20 de maro de 2012.

Programa teste da funo: ler um nmero indeterminado de datas (3 inteiros) e escrev-las
no formato especificado na funo. Use como "flag" um dos valores nulo.

FUNES E PROCEDIMENTOS EM C# 46





18. Escreva um procedimento que receba como parmetros uma hora no formato HH:MM e
imprima
* Bom dia! * se hora estiver no intervalo 00:00 a 11:59
* Boa tarde! * se hora estiver no intervalo 12:00 a 17:59
* Boa noite! * se hora estiver no intervalo 18:00 a 23:59

Programa teste da funo: ler um nmero indeterminado de horas e escrever a mensagem
adequada, de acordo com a funo.
Use como "flag" um dos valores negativos

19. Escreva um procedimento para trocar os valores de duas variveis, recebidas como
parmetros.
Obs.: o valor da primeira varivel deve passa para a segunda e vice-versa.

Programa teste: ler do teclado 4 nmeros inteiros, usando o procedimento acima, se
necessrio, escrev-los em ordem crescente.

20. Escreva procedimentos para calcular e retornar o permetro e a rea das seguintes figuras
geomtricas:
Retngulo dados os lados
Crculo dado o raio
Tringulo dados os 3 lados

Programa teste: apresentar um menu com as trs opes e outra opo para encerrar o
programa.
Ler as informaes necessrias de acordo com a escolha do usurio.
Calcular e escrever o permetro e a rea da figura escolhida.

21. Escreva funes para fazer as seguintes mudanas de unidades
Polegadas em milmetros
Ps em centmetros
Milhas em quilmetros
Galo em litros
Ona em gramas

FUNES E PROCEDIMENTOS EM C# 47




Programa teste: apresentar um menu com as opes acima e outra opo para encerrar o
programa.
Ler do teclado a unidade desejada.
Fazer a converso de unidades.
Escrever as duas unidades.

22. Escreva um procedimento que receba como parmetros o salrio bruto, o percentual de
descontos de INSS e o percentual de descontos de Imposto de Renda.
Calcule e retorne o valor do desconto de INSS, o valor do desconto de Imposto de Renda e o
salrio lquido.

Programa teste: ler do teclado um nmero indeterminado de nomes de funcionrios de uma
empresa e para cada funcionrio o salrio bruto, o percentual de desconto de INSS e de
Imposto de Renda.
Calcular e escrever o nome do funcionrio, o salrio bruto, o desconto de INSS, o desconto de
Imposto de Renda e o salrio lquido.

23. Escreva uma funo recursiva para calcular e retornar a soma dos n primeiros termos da
srie:

...
18
32
15
16
12
8
9
4
6
2
3
1
+ + + + + + = S

Programa teste: ler do teclado um nmero inteiro N, calcular e escrever a soma dos N
primeiros termos da srie acima.

24. Escreva uma funo para validar uma data.

Programa teste: ler do teclado vrias datas e escrever se cada uma valida ou no.
Crie um flag adequado.

25. Escreva uma funo para validar uma hora.

Programa teste: ler do teclado vrias horas e escrever se cada uma valida ou no.
Crie um flag adequado.

FUNES E PROCEDIMENTOS EM C# 48




BIBLIOGRAFIA
1. DEITEL, H.M., DEITEL, P.J. C# - como programar.So Paulo: Pearson Makron
Books, 2003. ISBN 978-85-346-1459-7
2. GALUPPO, Fbio; MATHEUS, Vanclei; SANTOS, Wallace. Desenvolvendo com C#.
Porto Alegre: Editora Bookman, 2004. ISBN 85-363-0346-8
3. LIBERTY, Jesse; XIE, Donald. Programando em C# 3.0. Rio de Janeiro: Editora Alta
Books, 2009. ISBN 978-85-7608-319-1
4. NAGEL, Christian. et al. C# 2005. Indianapolis: Wiley Publishigin Inc, 2006. ISBN 978-
0-7645-7534-1
5. SPHAR, Chuck. DAVIS, Stephen Randy C# for Dummies. Indianapolis: Wiley
Publishigin Inc, 2008. 978-0-470-19109-5
6. STELLMAN, Andrew. GREENE, Jennifer. C#. Coleo Use a Cabea. Rio de Janeiro:
Editora Alta Books, 2008. ISBN 978-85-7608-211-8




OBSERVAO
Texto usado como notas de aula em disciplinas de Algoritmos e Programao de Computadores
Autorizada cpia e reproduo em atividades de ensino.
Correes, sugestes e acrscimos so bem vindos.

Contatos: aluisioeustaquio@gmail.com
Betim abril de 2012

Você também pode gostar