INTRODUÇÃO
A tecnologia atual de computadores está baseada na construção de equipamentos formados por circuitos eletrônicos, cabos e fontes de alimentação que são precisos na identificação distinta entre dois tipos de sinais elétricos, caracterizados pela passagem de corrente elétrica em um sentido, ou no seu sentido inverso. Por isso, os computadores representam dados e operações por meio de dois símbolos, constituindo a linguagem binária, usualmente descrita com 0 e 1 (zero e um).
A sequência descritiva de um conjunto de símbolos (0 e 1) em linguagem binária, também chamada de linguagem de máquina, pode representar dados e/ou operações a serem executadas pelo computador. Cada um dos símbolos existentes neste conjunto é chamado de bit (a menor unidade de armazenamento de dados), onde a junção de oito bits forma o conhecido byte.
Por exemplo:
O conjunto de símbolos representado no exemplo acima pode estar descrevendo, em linguagem de máquina, um simples dado a ser armazenado na memória do computador ou ainda uma operação a ser realizada por este (por exemplo, uma adição entre dois valores numéricos), onde seu resultado será armazenado pelo computador.
A utilização desta linguagem permite ao computador realizar o armazenamento e a manipulação dos dados entre os diversos dispositivos eletrônicos que o compõe. Suponha a necessidade do armazenamento de dois valores numéricos a serem somados (operação aritmética de adição entre eles), para na sequência ser apresentado o resultado desta operação (resultado da adição).
Primeiramente, o computador necessitará armazenar estes dois valores numéricos, quando estes lhe forem informados. Em seguida, ele efetuará a operação de adição entre os valores, armazenando o seu resultado, que posteriormente poderá ser apresentado ao usuário (pessoa que utiliza o computador).
Todas estas ações executadas pelo computador envolvem vários dispositivos eletrônicos, que interconectados formam este importante, e cada vez mais essencial, equipamento eletrônico. Uma representação clássica do computador no processamento de dados pode ser observada no esquema abaixo.
De acordo com a representação simplificada acima, de processamento de dados, seus principais dispositivos eletrônicos são definidos e exemplificados na relação a seguir:
Componente eletrônico que executa a instrução corrente e determina qual a próxima instrução a ser executada, sendo também chamado de CPU (Central Processing Unit) ou UCP (Unidade Central de Processamento);
Dispositivo que consiste em uma sequência finita de unidades de armazenamento identificadas por um endereço único, descrito por um número inteiro não negativo e responsável pelo armazenamento de programas e dados que serão manipulados pelo computador;
Conjunto de componentes que podem ser conectados ao computador para permitir a comunicação com o mundo real para coleta de dados relevantes aos problemas que o mesmo possa estar inserido.Por exemplo: teclado usado para coleta de dados do usuário que sejam necessários ao processamento de dados desejado;
Componentes eletrônicos que podem ser conectados ao computador para permitir a comunicação dele com o mundo real, como por exemplo: vídeo usado para que o computador possa se comunicar com seu usuário.
Todo dispositivo que pode ser conectado a um computador é chamado de periférico, existindo entre estes alguns que realizam operações de entrada e saída, como os discos e fitas magnéticas usadas para guardar dados utilizados pelo computador.
O processamento de dados, realizado pelo computador, consiste na execução de várias operações sobre os dados armazenados, que posteriormente serão mostrados aos seus usuários como conteúdo empregado no auxílio da solução de seus problemas cotidianos. Assim, este recurso eletrônico torna-se útil ao ser humano, principalmente por sua agilidade no processamento de uma quantidade elevada de dados, com um tempo consideravelmente reduzido. Entretanto, este recurso também depende do raciocínio humano para a realização de tarefas corretas, porque os computadores não possuem um "raciocínio" coerente com todas as necessidades presentes no dia-a-dia real.
O adequado aproveitamento de tamanha capacidade computacional é essencial ao uso dos computadores no cotidiano que os envolvem, contudo esta capacidade impossibilita a constante interferência humana no processamento almejado para solução dos mais diversos problemas. Repare, por exemplo, na velocidade de processamento de um computador em nanosegundos (1 milésimo de microsegundo) no processamento de dados, enquanto uma decisão humana que pode levar alguns segundos, minutos, horas, dias, etc.
Toda esta capacidade não adiantaria nada caso tivesse que aguardar "muito tempo" para dar continuidade as ações e operações a serem realizadas no caminho da solução de um problema.
Dessa forma, o automatismo do computador no processamento de dados se torna essencial ao aproveitamento da agilidade do mesmo, sendo relevante o seu prévio planejamento. Neste planejamento deverão ser considerados todos os possíveis acontecimentos relacionados ao processamento desejado, pois assim o computador poderá realizar uma ação coerente com o ocorrido, sem prejudicar o processamento desejado.
No entanto, as operações e instruções a serem efetuadas por um computador devem ser previstas e planejadas pelo raciocínio humano, que posteriormente os implementará, possibilitando ao computador realizar, eficientemente, as operações desejadas por seus usuários e definidas por meio do uso das linguagens de programação.
Os programas de computador consistem em sequências de instruções elaboradas em linguagem de programação com o objetivo de resolver ou auxiliar na solução problemas. Estas linguagens são codificações padronizadas que possibilitam a comunicação entre o ser humano e o computador com o objetivo de se atingir um resultado desejado. Porém, antes dessa comunicação acontecer, o ser humano deve encontrar uma lógica coerente para resolução do problema existente. Por exemplo: como poderá ser resolvido o problema de correção de provas de concurso em um período reduzido de tempo para contratação urgente de novos funcionários?
A primeira preocupação deve se concentrar na aprendizagem de tudo que pode envolver este problema e em como resolvê-lo. Assim, será possível elaborar um raciocínio lógico mais completo sobre o mesmo e, consequentemente, elaborar uma solução mais segura e eficaz para o problema existente. Ao problema proposto anteriormente, de correção de provas de um concurso, seria necessário conhecer um pouco mais seus dados, situações e informações: Seriam as provas muito longas?; Qual a quantidade de candidatos inscritos?; Em que data os candidatos aprovados deverão iniciar suas atividades profissionais? Sem estes dados não é nem possível afirmar que existe realmente um problema, então como poderia ser pensada uma solução para esta situação?
Como um programa de computador precisa especificar, com certo detalhamento, todos os processos e operações a serem executadas pelo computador, é de fundamental importância a tomada de todo o conhecimento que esteja envolvido com seu problema para que possa ser planejada e elaborada posteriormente uma solução coerente com todas as suas possíveis nuanças.
Esse conhecimento detalhado sobre o problema possibilita ao indivíduo responsável pelo planejamento, desenvolvimento e disponibilização do programa um apurado conhecimento sobre as possíveis situações diferentes que este programa possa ser utilizado. Com isso, serão menores as chances do processamento incorreto, ou mesmo incompleto, a ser executado pelo computador através de seu programa. Geralmente, o profissional responsável pelo desenvolvimento de programas é conhecido como programador.
A elaboração de uma lógica coerente e completa exige características relacionadas ao indivíduo que procura encontrá-la, sendo interessante a criatividade, conhecimento, versatilidade, persistência, responsabilidade, ponderação, entre outras características pessoais que formam um "bom programador". Cada programador ainda precisa exercer domínio sobre seu pensamento, de forma a conseguir organizar o seu raciocínio em busca de um objetivo almejado.
Algumas definições são importantes no início do estudo da subárea de Programação Computacional, sendo a concepção de "lógica" proposta por Mazano (2000) voltada mais às características computacionais:
Lógica consiste em "um esquema sistemático que define as interações de sinais no equipamento automático do processamento de dados, ou computador científico com critério e princípios formais de raciocínio e pensamento." (Manzano, 2000, p.3).
Uma definição não tão computacional de "lógica" seria: "a ciência que estuda as leis e critérios de validade que regem o pensamento e a demonstração, ou seja, a ciência de princípios formais do raciocínio" (Manzano, 2000, p.3).
O uso da "lógica" para alguns profissionais é essencial e insere um ponto divisor entre estes indivíduos, principalmente naqueles da subárea de Programação. Observe, por exemplo, a simples constatação lógica proposta no exemplo abaixo:
No exemplo acima os dados conhecidos (fatos) são que hoje é sábado e que não é feriado, além de que todo sábado tem aula, menos nos feriados. Assim, é possível concluir que hoje tem aula.
O estudo na área de Informática, mas especificamente na subárea de Programação, não tem o objetivo de ensinar ninguém a pensar, pois todas as pessoas normais já desenvolveram esta habilidade durante o seu processo de evolução (criança � jovem � adulto � velho). Porém, seu principal objetivo é apresentar, desenvolver e aperfeiçoar o raciocínio lógico possível de ser implementado em computadores e utilizados por seus usuários.
A implementação para área de Informática consiste na codificação do raciocínio humano, que soluciona problemas computacionais, em um programa de computador, sendo este raciocínio descrito em uma linguagem de programação.
No entanto, o programador só poderá descrever uma possível solução depois de encontrar o raciocínio adequado que permita ao computador chegar a uma resolução correta à situação apresentada por seu usuário.
A complexidade do problema também faz diferença ao processamento, pois quanto maior ela for, mais complicada e cuidadosa deverá ser sua solução. Outra consideração importante é a quantidade de profissionais dedicados a construção de um raciocínio lógico coerente com o problema existente, podendo estes profissionais estarem organizados em equipes ou possuírem um único indivíduo com tal responsabilidade.
Estas duas possíveis situações identificam um trabalho árduo a ser desenvolvido, onde técnicas e métodos de representação de raciocínio contribuem, significativamente, na análise, discussão e teste das possíveis soluções encontradas.
Uma destas técnicas é conhecida como algoritmo e possibilita a representação simples, mas com clareza suficiente para a compreensão da lógica racional a ser empregada na solução do problema existente.
A definição conceitual da expressão algoritmo é realizada por vários estudiosos, sendo as mais interessantes ao estudo desta disciplina as relacionadas a seguir:
"Algoritmo são regras formais para a obtenção de um resultado ou da solução de um problema, englobando fórmulas de expressões aritméticas" (MANZANO, 2000, p.6).
"Ação é um acontecimento que, a partir de um estado inicial, após um período de tempo finito, produz um estado final previsível e bem definido. Portanto, um algoritmo é a descrição de um conjunto de comandos que, obedecidos, resultam numa sucessão finita de ações" (FARRER, 1999, 1999, p.14).
"Algoritmo é uma sequência finita de instruções ou operações cuja execução, em tempo finito, resolve um problema computacional, qualquer que seja sua instância" (SALVETTI, 1998, p.5).
Com base nestas definições de algoritmo é constatado que este conceito não é peculiar somente a área de Informática, como pode ser observado no exemplo de criação de um simplório algoritmo empregado na criação de um saboroso sanduíche:
Estes dez passos indicados acima orientam na execução de diversas instruções organizadas de forma sequencial que resultarão em um delicioso sanduíche (estado final). Estes passos são sequenciais e finitos, podendo ser executados sem auxílio nenhum de um computador.
A alteração na sequência destes passos também poderá resultar em um outro gostoso sanduíche, atingindo também o objetivo esperado.
Geralmente, um problema possui algumas alternativas de soluções que chegam ao resultado correto, podendo existir vários algoritmos que solucionem um determinado problema. Entre estas possíveis soluções algumas são mais rápidas, outras mais seguras, mas todos conseguem resolver o problema adequadamente, apesar de suas diferenças existentes no raciocínio lógico proposto como solução.
Diversas são as técnicas e métodos existentes para a construção de algoritmos. No entanto, todas elas possuem um mesmo objetivo, onde as suas variações não passam de pequenos detalhes frente a sua organização geral no atendimento a uma ou outra área mais especificamente. Em uma abordagem, enfocando mais a área de Tecnologia da Informação, é apresentado um método para a construção de algoritmos que possibilite a implementação dos mesmos, posteriormente, em um computador (desenvolvimento de programas computacionais):
A implementação das lógicas, elaboradas e representadas em um algoritmo, é realizada sobre o computador, por meio da transcrição, representada no algoritmo, para uma linguagem de programação, que também possibilitará a compreensão e execução das instruções pelo computador. Essa transcrição também pode ser chamada de tradução, pois somente efetuará mudança na forma de descrever o raciocínio a ser implementado no computador.
O uso da linguagem de programação permite ao programador elaborar programas que instruirão o computador nas operações a serem efetuadas. Para a elaboração de programas, principalmente os mais complexos, é necessária a aplicação de um método sistemático de programação que contribuirá com o desenvolvimento de programas confiáveis, flexíveis e eficientes. Esse tipo de desenvolvimento apresenta uma metodologia organizada em etapas básicas fundamentais, sendo estas descritas a seguir:
Nessa etapa se estuda o problema, buscando sua completa compreensão, onde os dados de entrada, o processamento e os dados de saídas possam ser identificados corretamente;
Nessa etapa aplicam-se métodos e técnicas que possibilitem a descrição necessária do problema com suas possíveis soluções. Ela consiste no projeto do programa, sendo elaborada por meio da construção do algoritmo e da definição correta das estruturas de dados necessárias a tal solução;
Essa etapa consiste na implementação do projeto do programa, ou seja, na tradução do raciocínio, representado no algoritmo, para um programa computacional, escrito na linguagem de programação desejada;
Nessa etapa é finalizado o processo de desenvolvimento do programa, que é classificado como software, sendo também chamado de aplicação. Simulações, testes e verificações dos resultados alcançados pelo programa são analisados, podendo resultar em alterações no código elaborado. Essas alterações procurarão o atendimento eficaz do objetivo desejado pelo programa, que é finalmente liberado aos usuários finais.
O uso destas metodologias possibilitará o desenvolvimento organizado e eficiente do programa desejado. Porém, essas etapas destinadas à elaboração do programa e do algoritmo, devem ser realizadas com a documentação coerente em cada uma delas. Isso permitirá a construção de uma lógica clara e detalhada o suficiente para a compreensão de qualquer outro profissional da área, promovendo alta qualidade nesse desenvolvimento.
A elaboração do algoritmo descreve a necessidade dos dados e as suas manipulações durante a execução da lógica proposta por ele. Essa descrição pode ser feita de diversas formas por meio de técnicas diferentes que representarão a sequência dos passos (ou etapas) a serem realizados pela execução do algoritmo.
Cada técnica possibilita formas de representação diferentes, o que privilegia algumas características na percepção e compreensão dos profissionais envolvidos. Sendo assim, serão apresentadas algumas destas técnicas, com os principais aspectos a serem avaliados na sua escolha para aplicação. Entre as várias técnicas existentes, três delas serão abordadas nesse material, sendo uma a mais relevante durante o aprendizado almejado neste estudo de algoritmo e programação.
O fluxograma utiliza figuras geométricas predefinidas para descrever as ações (ou instruções) a serem realizadas na resolução de um problema. Ele é elaborado após a fase de análise do problema.
As principais figuras usadas na elaboração de um fluxograma estão relacionadas a seguir, sendo importante esclarecer que são várias as figuras geométricas empregadas na construção dos mesmos, porém neste estudo se estará buscando a compreensão da lógica racional proposta por este tipo de representação. As figuras usadas são:
Imagine uma situação onde a idade de uma pessoa deva ser analisada para sua classificação em jovem ou adulto. O algoritmo a seguir é apresentado graficamente por meio do fluxograma coerente com a solução desejada.
Várias análises podem ser feitas sobre as vantagens e desvantagens dessa forma de representação do raciocínio (algoritmo), porém somente a mais relevante vantagem (face sorridente) e desvantagem (face triste) serão apresentadas para sua reflexão.
Essa diagramação foi elaborada por Nassi e Shneiderman e ampliada por Ned Chapin. Ela almeja a substituição da representação tradicional (diagrama de blocos) por uma diagramação com quadros que oferecessem a visão hierárquica e estruturada da lógica proposta para um programa.
Observe na representação acima a mesma situação representada no exemplo anterior por um fluxograma. Agora, o algoritmo está representando o mesmo raciocínio do exemplo anterior, porém sua representação foi elaborada pelos esquemas adotados no Diagrama de Chapin.
Entre os diversos métodos existentes para este tipo de representação, o Diagrama de Chapin é um dos menos utilizados atualmente, principalmente, porque exige bastante atenção do programador na representação do seu raciocínio, ao invés de se concentrar mais sobre o próprio problema a ser analisado e posteriormente solucionado.
Essa forma de representação, também conhecida como portugol ou pseudocódigo, consiste na descrição estruturada, por meio de regras pré-definidas, de passos (ou instruções) a serem realizados para a resolução do problema. O português estruturado utiliza a linguagem natural para representar o raciocínio. No caso brasileiro, a linguagem natural é o português, que será bastante usado na representação dos raciocínios propostos. Para Espanha ou França seriam utilizadas as linguagens espanhola e francesa, respectivamente, como base natural na representação dos raciocínios lógicos elaborados através desta técnica de construção de algoritmos.
Suponha o mesmo exemplo representado nos algoritmos anteriores, por meio do fluxograma e do diagrama de Chapin, observando as diferentes características descritivas existentes no português estruturado, além de sua organização pré-definida.
algoritmo primeiro; // Síntese // Objetivo: analisar a idade de uma pessoa // Entrada: idade // Saída: mensagem de jovem ou velho inicio // Declarações inteiro idade; // Instruções escreva("Informe sua idade: "); leia(idade); se (idade < 25) então escreva("VOCÊ É JOVEM!"); senao escreva("VOCÊ É VELHO!"); fimSe fim fimPrincipal
A linguagem de comunicação natural é imprecisa e muitas vezes prolixa, dificultando a comunicação correta com o computador se usada de forma bem natural. Por isso é necessária à agregação de regras e normas que permitam a representação organizada e eficiente da solução desejada, indicando sempre, com clareza e precisão, o que realmente o computador deve fazer.
Entre essas três formas de representação (fluxograma, Chapin e português estruturado), o português estruturado será o mais utilizado por esta disciplina no desenvolvimento de algoritmos condizentes com os problemas educacionais sugeridos. Por meio desta forma de representação se almeja:
Por meio dessa última representação de raciocínio (português estruturado), alia-se a facilidade de uso da linguagem natural do indivíduo, com a técnica de desenvolvimento estruturado. Apesar disso, essa junção, por si só, ainda não atinge automaticamente os objetivos visados, ela apenas preconiza uma ajuda sistemática para o alcance deste objetivo. Sua aplicação ainda conta com o esforço e a disciplina incessante na busca da simplicidade e da clareza, que fornecerão facilidades inestimáveis à manutenção e modificação evolutiva do algoritmo.
A elaboração de algoritmos pode envolver três estruturas lógicas fundamentais no controle do fluxo de dados e instruções. Essas três estruturas, conhecidas como estruturas de controle de dados, desempenham o papel de controle sobre a sequência de ações (ou tarefas) a serem realizadas (ou executadas) no algoritmo, que posteriormente se tornará um programa computacional, por meio de sua transcrição (ou tradução) para uma linguagem de programação. A principal característica referente ao seu controle na sequência de execução de cada uma destas estruturas é descrita a seguir:
As instruções existentes no algoritmo são executadas uma após a outra, respeitando sempre a sequência linear de cima para baixo;
Exerce o controle sobre a sequência de instruções a serem executadas, por meio do resultado de um teste ou verificação baseada na lógica convencional, sendo também conhecida como condicional;
Por meio de um teste, ou verificação lógica condicional, uma instrução, ou um conjunto de instruções, é executado repetidamente (mais que uma vez), conforme discriminado no raciocínio lógico proposto. Esta estrutura ainda é conhecida como laço ou looping.
Um outro aspecto lógico importante e muito aplicado na elaboração de algoritmos é a modularização, ou seja, a divisão de um raciocínio lógico maior, ou mais complexo, em vários raciocínios menores, ou mais simples, que possibilitem a realização ou atendimento completo do raciocínio lógico maior (mais complexo). Esta organização lógica é conhecida como modularização, pois confere a um conjunto de módulos a capacidade de resolver o mesmo problema, porém de forma mais organizada e flexível. Isso possibilita, entre outras características positivas no desenvolvimento de programas, o re-aproveitamento do código já elaborado, ou seja, o melhor aproveitamento de trechos bem definidos e já elaborados no algoritmo proposto em diversos momentos que sejam necessários no mesmo.
Além das estruturas de controle e da modularização, os algoritmos também permitem a criação e a manipulação de estruturas de dados. Estas estruturas consistem em organizações eficientes sobre os recursos de armazenamento de dados, normalmente disponíveis em um computador. A utilização, logicamente correta, deste tipo de estrutura propicia a otimização no uso dos recursos disponibilizados pelo emprego do computador na realização das mais diversas tarefas, satisfazendo as pretensões do usuário com maior segurança, eficiência e agilidade.
Diante deste estudo, é importante a criação da consciência do estudante na dimensão da responsabilidade do algoritmo frente ao desafio da aprendizagem sobre o problema a ser resolvido por meio de um raciocínio lógico coerente que possa ser transcrito em um programa de computador que auxiliará seu usuário na realização de suas tarefas cotidianas, sejam elas pessoais, profissionais ou até educacionais.
O algoritmo é a parte mais importante no desenvolvimento de um programa, pois é nele que se encontra a representação do raciocínio lógico que solucionará o problema existente.
O algoritmo auxilia o desenvolvimento dos programas, porque nele os programadores representam a solução proposta para ser analisada e testada. Quando um algoritmo está finalizado, ou seja, está pronto, resta apenas transformá-lo em um programa computacional, respeitando toda lógica racional já elaborada e avaliada para solução do problema existente.
Realmente, um bom algoritmo, só necessita ser traduzido para uma linguagem de programação, respeitando suas regras de sintaxe e semântica essenciais na construção de um programa de computador. O período de aprofundamento no conhecimento relacionado ao problema em questão, sua proposta de solução, os testes e a manutenção do mesmo, ocorrem durante os estudos, pesquisas e elaboração do algoritmo, restando, simplesmente, a re-escrita da solução encontrada para uma linguagem de programação computacional, ou seja, após a confecção do algoritmo coerente com o problema o programador só deverá traduzi-lo para uma linguagem de programação para obter um programa computacional.
As linguagens de programação, assim como as de comunicação, possuem regras sintáticas e semânticas que devem ser obedecidas, pois as instruções computacionais não podem oferecer possibilidades de interpretação para o computador, que somente executa o que lhe é solicitado. Existem várias linguagens de programação, mas em todas elas a lógica relacionada à proposta construída no algoritmo poderá ser implementada afim de atender ao objetivo almejado.
Exemplo:
Acompanhe neste exemplo a "tradução" da instrução escreva que será estudada um pouco mais à frente em algoritmo.
escreva("Informe a sua idade:");
Esta instrução (escreva) corresponde a um comando que instrui o computador a realizar algumas ações sobre seus recursos disponíveis. Porém a mesma deve ser traduzida para uma linguagem de programação, possibilitando ao computador sua compreensão. Na tabela abaixo são mostradas algumas possíveis traduções para instrução escreva em 3 linguagens de programação diferentes.
Comando | Linguagem |
writeln | Pascal |
printf | C |
System.out.println | Java |
No intuito de fixar a aprendizagem iniciada por meio deste módulo e verificar como seu entendimento sobre este conteúdo está, estão sendo sugeridos alguns exercícios de fixação para serem resolvidos. Clique no link de exercícios ao lado, pois será por meio dele iniciada a lista de exercícios sobre os conteúdos estudados até este momento nesta disciplina.