.NET - Números Perfeitos ( VB .NET, C# e VB6)
O que é um número perfeito ?
Em Matemática, um número perfeito é um número inteiro para o qual a soma de todos os seus divisores positivos próprios (excluindo ele mesmo) é igual ao próprio número.
Por exemplo 6 é um número perfeito, pois 1 + 2 + 3 = 6
O número 28 também é um número perfeito pois temos que seus divisores : 1 + 2 + 4 + 7 + 14 = 28
O número 496 é outro número perfeito visto que: 1 + 2 + 4 + 8 + 16 + 31 + 62 + 124 + 248 = 496
Euclides descobriu que os quatro primeiros números perfeitos são gerados pela fórmula: 2n-1(2n - 1):
O quinto número perfeito é o número 33.550.336 => 212(213 - 1)
E o sexto número perfeito é : 8.589.869.056. Ufa...
Mas o que tem a ver número perfeito com linguagem de programação VB .NET ou C# ?
É porque eu quero aproveitar o assunto para introduzir o conceito de algoritmo.
Mas o que é um algoritmo ?
Um algoritmo nada mais é do que uma receita que mostra passo a passo os procedimentos necessários para a resolução de uma tarefa.
Pense em uma receita de bolo que primeiro define os ingredientes e depois o modo de preparar o bolo. Podemos considerar uma receita de bolo como um exemplo de um algoritmo bem simples.
Em termos mais técnicos podemos dizer que um algoritmo é uma sequência lógica, finita e definida de instruções que devem ser seguidas para resolver um problema ou executar uma tarefa.
Um algoritmo pode ser muito simples ou bem complexo envolvendo repetições de passos (iterações), toma de decisões com comparações ou lógica para que a tarefa seja concluída.
Um programa de computador é essencialmente um algoritmo que diz ao computador os passos específicos e em qual ordem eles devem ser executados, como por exemplo, os passos a serem tomados para calcular as notas que serão impressas nos boletins dos alunos de uma escola.
Logo, o algoritmo pode ser considerado uma sequência de operações que podem ser depois implementadas em qualquer linguagem de computador. Um algoritmo é assim independente de qualquer linguagem de programação.
Exemplo de um algoritmo bem simples:
Algoritmo de domingo. Acordar. Escovar os dentes. Tomar o café. Se estiver sol vou passear senão leio o jornal. Almoçar. Ir ao cinema. Fazer uma refeição. Ir dormir. Final do domingo. |
Vamos partir do conceito de número perfeito para propor o seguinte problema :
Elabore um algoritmo para determinar se um dado número n é um número perfeito.
Para resolver um problema no computador é preciso que seja primeiramente encontrada uma maneira de descrever este problema de uma forma clara e precisa.
É preciso encontrar uma seqüência de passos que permita resolver o problema de maneira automática e repetitiva.
Além disto é preciso definir como os dados processados serão armazenados no computador.
Portanto, a solução de um problema por computador é baseada em dois pontos:
Isso nada mais é que um Algoritmo.
Vejamos alguns exemplos de algoritmos propostos para resolver o problema:
algoritmo "numero_perfeito" var i,n,soma: inteiro inicio leia (n) soma <- 0 para i de 1 ate n-1 faca se n % i = 0 entao soma <- soma + i fimse fimpara se soma=n entao escreva ("Numero Perfeito") senao escreva ("Nao e um numero perfeito") fimse fimalgoritmo |
inicio inteiro: i, j, numero, somaDivisores ; para i <- 1 ate 10 faca leia (numero) ; somaDivisores <- 0 ; para j <- 1 ate numero faca se (numero mod j = 0) entao somaDivisores <- somaDivisores + j ; fimse fimpara se (somaDivisores = numero) entao imprimir("PERFEITO") senao imprimir("NÃO É PERFEITO") fimse fimpara fim |
algoritmo "NumeroPerfeito" // Seção de Declarações var n, perf, cont: inteiro inicio escreva("Informe um numero") leia(n) para cont de 1 ate n - 1 faca se (n mod cont = 0 ) entao perf <- perf + cont fimse fimpara se (perf = n) entao escreval (n, " é perfeito ") senao se (perf <> n) entao escreval(n, "Nao é perfeito") fimse fimse fimalgoritmo |
Podemos notar que não usamos uma linguagem de programação em nenhum dos algoritmos propostos visto que o algoritmo tem que ser representado de forma que qualquer pessoa possa entendê-lo.
No nosso exemplo usamos uma linguagem chamada Pseudo-linguagem que é uma linguagem intermediária entre a linguagem natural e uma linguagem de programação de computadores.
Podemos representar um algoritmo usando formas geométricas através de um fluxograma.
Um fluxograma é um diagrama que tem como finalidade representar processos ou fluxos de materiais e operações (diagramação lógica, ou de fluxo)
O fluxograma sempre possui um início, um sentido de leitura, ou fluxo, e um fim.
Obs: Não confunda fluxograma com organograma que representa a estrutura hierárquica e funcional de uma organização.
Abaixo temos as principais formas geométricas usadas nos fluxogramas:
Geralmente, usa-se um círculo alongado para indicar o início e o fim do fluxo; - A seta é usada para indicar o sentido do fluxo; - No retângulo são inseridas as ações(processamento); - O losango representa questões/alternativas; - O losango sempre terá duas saídas; - As linhas ou setas nunca devem cruzar umas sobre as outras; - O texto deve ser sempre claro e sucinto; - Recomenda-se iniciar as ações sempre com um verbo no infinitivo (fazer, dizer ); |
A seguir vemos um diagrama de blocos que representa os passos lógicos de um processo chamado "Chupar Bala":
Abaixo temos um exemplo de um fluxograma representando um algoritmo para somar dois números reais:
fonte: http://www.prof2000.pt/users/famaral/ig/tlp/fluxogramas.htm (acessado em dezembro de 2012) |
implementando o algoritmo para encontrar números perfeitos em VB .NET , C# e Visual Basic 6
Após definir o algoritmo vou mostrar como implementá-lo usando as linguagens VB .NET , C# e Visual Basic 6.
Eu vou usar as seguintes ferramentas:
1- implementação VB .NET
Crie um novo projeto no do tipo Visual Basic 2010 Express Edition Console Application com o nome VBNET_NumerosPerfeitos:
A seguir defina o código abaixo no modulo Module1:
Module Module1 Dim maximo As Integer = 0 Dim numeroMinimo As Integer = 1 'MINIMO Dim calulaTotal As Integer = 0 Dim numero As Integer = 0 Dim numeroTratado As Integer = 0 Dim modulo As Integer = 0 Dim numeroDivisor As Integer = 0 Dim valorMaximoInformado As String Dim valorMaximo As Integer Sub Main() Console.WriteLine("+++++++++++++++++++++++++++++++++++++") Console.WriteLine(" PROCURANDO NÚMEROS PERFEITOS") Console.WriteLine(" ") Console.WriteLine("+++++++++++++++++++++++++++++++++++++") Console.WriteLine(" ") Console.WriteLine(" ") Console.WriteLine(" Este programa vai encontrar números perfeitos entre 1 e o número informado") Console.WriteLine(" Informe o valor máximo : ") valorMaximoInformado = Console.ReadLine() Console.WriteLine(" ") valorMaximo = Convert.ToInt32(valorMaximoInformado) maximo = valorMaximo While numeroMinimo <= maximo If numeroMinimo = 1 Then numeroTratado = numeroMinimo numeroDivisor = numero - 1 If numeroDivisor <> 0 Then modulo = numeroTratado Mod numeroDivisor End If If modulo = 0 Then 'acumula totais calulaTotal += numeroDivisor End If Else For numero = numeroMinimo To 1 Step -1 numeroTratado = numeroMinimo numeroDivisor = numero - 1 If numeroDivisor <> 0 Then modulo = numeroTratado Mod numeroDivisor End If If modulo = 0 Then 'acumula total calulaTotal += numeroDivisor End If Next If calulaTotal = numeroTratado Then Console.WriteLine(" Número perfeito encontrado entre 1 até {0} é : {1} ", maximo, numeroTratado) End If numeroTratado = 0 numeroDivisor = 0 calulaTotal = 0 End If numeroMinimo += 1 End While Console.WriteLine(" ") Console.WriteLine(" Cálculo dos números perfeitos concluído !!!") Console.ReadLine() 'pausa End Sub End Module |
2- implementação C#
Crie um novo projeto no do tipo Visual C# 2010 Express Edition Console Application com o nome CSharp_NumerosPerfeitos:
using System; public class PerfectNumbers { public static void Main() { int maximo = 0; int numeroMinimo = 1; //MINIMO int calulaTotal = 0; int numero = 0; int numeroTratado = 0; int modulo = 0; int numeroDivisor = 0; string valorMaximoInformado = null; int valorMaximo = 0; Console.WriteLine("+++++++++++++++++++++++++++++++++++++"); Console.WriteLine(" PROCURANDO NÚMEROS PERFEITOS - C# "); Console.WriteLine(" "); Console.WriteLine("+++++++++++++++++++++++++++++++++++++"); Console.WriteLine(" "); Console.WriteLine(" "); Console.WriteLine(" Este programa vai encontrar números perfeitos entre 1 e o número informado"); Console.WriteLine(" Informe o valor máximo : "); valorMaximoInformado = Console.ReadLine(); Console.WriteLine(" "); valorMaximo = Convert.ToInt32(valorMaximoInformado); maximo = valorMaximo; Console.WriteLine(" "); valorMaximo = Convert.ToInt32(valorMaximoInformado); maximo = valorMaximo; while (numeroMinimo <= maximo) { if (numeroMinimo == 1) { numeroTratado = numeroMinimo; numeroDivisor = numero - 1; if (numeroDivisor != 0) { modulo = numeroTratado % numeroDivisor; } if (modulo == 0) { //acumula totais calulaTotal += numeroDivisor; } } else { for (numero = numeroMinimo; numero >= 1; numero += -1) { numeroTratado = numeroMinimo; numeroDivisor = numero - 1; if (numeroDivisor != 0) { modulo = numeroTratado % numeroDivisor; } if (modulo == 0) { //acumula total calulaTotal += numeroDivisor; } } if (calulaTotal == numeroTratado) { Console.WriteLine(" Número perfeito encontrado entre 1 até {0} é : {1} ", maximo, numeroTratado); } numeroTratado = 0; numeroDivisor = 0; calulaTotal = 0; } numeroMinimo += 1; } Console.WriteLine(" "); Console.WriteLine(" Cálculo dos números perfeitos concluído !!!"); Console.ReadLine(); //pausa } } |
3 - implementação no Visual Basic 6
Private Sub Form_Load() s: Dim k As Integer Dim per As Boolean Dim n As Integer per = False n = 1 k = InputBox("Informe um número : ", "Número") 'informa um numero For i = 2 To k ' checa o algoritmo For r = 2 To k o = i * r If o = k Then n = n + i End If Next r Next i If n = k Then ' se o número é iguala soma dos divisoers entã conclui per = True End If If per = True Then MsgBox "Número Perfeito", , "Este número é um número Perfeito" Else MsgBox "Não Perfeito", , "Este Número é Não Perfeito" End If d = MsgBox("Deseja Continuar ", vbYesNo, "Continuar") If d = vbYes Then GoTo s Else End End If End Sub |
Pegue os projetos completos aqui:
João 10:7
Tornou, pois, Jesus a dizer-lhes: Em verdade, em verdade vos digo: eu sou a porta das ovelhas.João 10:8
Todos quantos vieram antes de mim são ladrões e salteadores; mas as ovelhas não os ouviram.Referências: