Algoritmos, Parte II – Primeiros códigos
Fala pessoal!
Idéia
Neste artigo continuaremos a série sobre Algoritmos! No primeiro artigo resolvemos 3 problemas bem simples, utilizando a idéia de pseudocódigo, onde podemos visualizar melhor os passos para a resolução de um problema e não precisamos conhecer nenhuma linguagem de programação nesta etapa.
Neste segundo artigo vamos resolver o primeiro problema apresentado anteriormente, já utilizando Java e C.
Pra você que está iniciando os estudos e não conhece muito bem a sintaxe das linguagens não se preocupe pois a idéia desta série é mostrar os passos para a resolução de um problema e vamos usar essas linguagens só para os problemas não ficarem tão vagos!
Vamos lá!
Quebrando em pequenos pedaços
Conforme havia dito no artigo anterior, podemos dividir um problema em passos para chegar na sua resolução final. A idéia de divisão de um problema em problemas menores já é antiga e facilita muito a nossa vida, pois podemos pensar na resolução de “mini-problemas”, deixando de lado a visão macro do problema. Após a resolução dos pequenos problemas, o problema maior é resolvido através da união destes.
Primeira resolução
Para o nosso primeiro código, vamos atacar o problema 1 do artigo anterior. Vamos lembrá-lo:
“Problema: Fazer a divisão de um número por outro. Se o resultado for positivo, imprimir o número encontrado pela divisão, caso seja negativo, imprimir zero. Caso o divisor seja zero, imprimir o valor -1.”
No artigo anterior também vimos a resolução deste problema através de um fluxograma e também criamos um pseudocódigo com a intenção de fazer qualquer pessoa entender o objetivo que gostaríamos de atingir, que é a resolução do problema acima.
Ambiente
Com o problema em mãos, vamos fazer o passo a passo da resolução já utilizando as duas linguagens citadas, pra que possamos visualizar o fluxo em um nível mais baixo.
Para o Java, utilizarei o Eclipse e para o C utilizarei o DevC++. Particularmente não gosto do DevC++ e uso o GCC do Ubuntu, mas o DevC++ é bem utilizado pelos que estão começando. O Eclipse talvez não seja o mais usado pelos iniciantes (o comum é usarem editores simples) , mas ele é muito conhecido. Fique à vontade para desenvolver no NetBeans, JCreator, JBuilder, etc.
Relembrando
Esqueça a sintaxe do código abaixo caso você não a entenda agora. O ponto forte aqui pra você que está começando é entender o conceito, a lógica, a idéia. Pense na situação simples: Pra você pedir um cafezinho, você segue alguns passos, como encontrar um local, chamar o garçom, escolher o café, ver o preço e pedir. E você vai fazer exatamente a mesma coisa se estiver no Brasil, Japão ou na África e só vai mudar o idioma, a “sintaxe”!
Portanto, entender os passos neste momento é muito mais útil e fundamental que entender a sintaxe, a linguagem.
Primeiro código em Java
Vamos criar o nosso primeiro código em Java. Para isso, vamos criar uma classe com o nome de “DivisaoDeNumeros“. Esta é a classe que irá conter a nossa lógica para a resolução do problema. Com a classe criada, vamos criar o método “main” para podermos executar a aplicação, ou seja, imprimir os dados.
//Classe que trata das divisões de números public class DivisaoDeNumeros { public static void main(String[] args) { } }
Agora com a classe e o método principal criados, vamos fazer o passo a passo do artigo anterior, porém escrevendo em código! Pra não ficar uma leitura muita cansativa e demorada fazendo cada passo, escrevi o código inteiro e comentei cada passo no próprio código.
public class DivisaoDeNumeros { public static void main(String[] args) { //Criamos um objeto Scanner para capturar o que foi digitado Scanner input = new Scanner(System.in); //Imprime mensagem para a inserção do primeiro valor System.out.println("Insira o valor do dividendo: "); //Guarda o valor digitado pelo usuário na variável dividendo int dividendo = input.nextInt(); //Imprime mensagem para a inserção do segundo valor System.out.println("Insira o valor do divisor: "); //Guarda o valor digitado pelo usuário na variável divisor int divisor = input.nextInt(); //Verifica se o valor do divisor é igual a zero if (divisor == 0) { //Imprime o valor -1 caso o divisor seja zero System.out.println("-1"); } //Verifica se o valor do cálculo da divisão é negativo else if ((dividendo / divisor < 0)) { //Imprime o valor 0 caso o resultdo da divisão seja negativo System.out.println("Valor encontrado: 0"); } else { //Como o divisor não é zero e o cálculo não é negativo, imprime o resultado da divisão System.out.println("Valor calculado: " + dividendo / divisor); } } }
Você pode perceber que a execução está bem simples! Pelos comentários, podemos ver que passamos pelo “passo a passo” do artigo anterior, mas desta vez não escrevemos um pseudocódigo e sim um código em Java que podemos executar. Se você não está acostumado com a sintaxe, perceba que não foi difícil de entender o conceito, a idéia por de trás do código.
Esta é uma possível solução do problema, e não única. Podemos ter outros passos pra resolução! Mas será que se só trocarmos as condições (if’s / else if’s) teremos o mesmo resultado? Que tal tentar dar uma olhada no código abaixo e ver qual o problema?
import java.util.Scanner; public class DivisaoDeNumeros { public static void main(String[] args) { //Criamos um objeto Scanner para capturar o que foi digitado Scanner input = new Scanner(System.in); //Imprime mensagem para a inserção do primeiro valor System.out.println("Insira o valor do dividendo: "); //Guarda o valor digitado pelo usuário na variável dividendo int dividendo = input.nextInt(); //Imprime mensagem para a inserção do segundo valor System.out.println("Insira o valor do divisor: "); //Guarda o valor digitado pelo usuário na variável divisor int divisor = input.nextInt(); //Verifica se o valor do cálculo da divisão é negativo if ((dividendo / divisor < 0)) { //Imprime o valor 0 caso o resultdo da divisão seja negativo System.out.println("Valor encontrado: 0"); } //Verifica se o cálculo é positivo else if (dividendo / divisor > 0) { //Imprime o resultado do cálculo caso o resultado seja positivo System.out.println("Valor calculado: " + dividendo / divisor); } //Como o resultado não é positivo e nem negativo, podemos supor que o divisor é zero else { //Imprime o valor -1 pois o divisor é zero System.out.println("-1"); } } }
Erro! Veja como não precisamos entender a linguagem/sintaxe pra saber que este código terá problemas. Se olharmos com mais “carinho” vamos perceber que o código, na primeira condição, já tenta calcular a expressão. Se você inserir o valor zero para o divisor, teremos um erro no caso do Java que é o “java.lang.ArithmeticException: / by zero”, ou seja, não existe divisão por zero matematicamente falando e claro que na execução o Java vai reclamar.
Perceba que na resolução não basta simplesmente trocarmos as condições. Os passos para a resolução de um problema devem ser bem definidos e bem pensados para que nenhuma regra seja violada.
Código em C
Abaixo temos o código em C, que é muito usado nos cursos de introdução à computação.
#include<stdio.h> #include<stdlib.h> int main() { //Declaração das variáveis para guardar os valores int dividendo; int divisor; //Imprime mensagem para a inserção do primeiro valor printf("Digite o valor do dividendo:"); //Guarda o valor digitado pelo usuário na variável dividendo scanf("%d", ÷ndo); //Imprime mensagem para a inserção do segundo valor printf("\nDigite o valor do divisor:"); //Guarda o valor digitado pelo usuário na variável divisor scanf("%d", &divisor); //Verifica se o valor do divisor é igual a zero if (divisor == 0) { //Imprime o valor -1 caso o divisor seja zero printf("-1\n"); } //Verifica se o valor do cálculo da divisão é negativo else if ((dividendo / divisor < 0)) { //Imprime o valor 0 caso o resultdo da divisão seja negativo printf("Valor encontrado: 0\n"); } else { //Como o divisor não é zero e o cálculo não é negativo, imprime o resultado da divisão printf("Valor calculado: %d \n", (dividendo / divisor)); } //Pausa a execução system("PAUSE"); }
Entendimento do conceito x Sintaxe da linguagem
Volto a lembrar que não foi preciso entender 100% a sintaxe para entender o que está acontecendo. Nos comentários do código vimos o “passo a passo” para a resolução do algoritmos e basicamente traduzimos logo em seguida para a sintaxe utilizada no Java e no C.
Devemos lembrar também que não existe somente um passo para a resolução do problema e você pode ficar à vontade pra modificar os códigos acima, criando outros passos!
Finalizando
Neste artigo vimos a resolução de um problema usando Java e C e a idéia principal é entender o conceito! Entendido o problema e os passos para a resolução dele, traduzí-lo para a linguagem é o “mais fácil”. Podemos entender muito de uma linguagem, mas se não conseguirmos resolver um problema com passos bem definidos, não conseguimos fazer nada.
Nos próximos artigos desta série vamos resolver alguns problemas mais complicados (este foi bem simples, apenas para a introdução) e em breve vou falar sobre assuntos mais específicos, como Pilhas, Filas, Tempo de Algoritmo, etc.
Estes códigos você também pode encontrar em:
Código em Java
Código em C
Abraços!!!