segunda-feira, 7 de fevereiro de 2011

O que é Algoritmo? Para que serve?

Nos dias atuais e com a evolução galopante da tecnologia, dificilmente encontramos pessoas que nunca tenham utilizado um computador. Os propósitos podem variar bastante, seja para edição de textos, jogos ou atividades mais complexas. Já é difícil de imaginar nossas vidas sem o uso desta ferramenta.

Nesta atividade tão comum ao nosso cotidiano, você algum dia deve ter parado para pensar como os programas funcionam. Como é que o computador faz todas as tarefas exatamente da forma com a qual você pede? A resposta para esta pergunta é mais simples do que parece: ele segue as instruções que você passa.

Mas para que ele consiga entender o que você fala, ele precisa de uma linguagem mais específica. Para fazer esta interpretação entre homem e máquina, foram desenvolvidas as linguagens de programação. Mas mesmo estas linguagens utilizam uma lógica para serem escritas e é aí que entram os algoritmos.


Embora você não perceba, utiliza algoritmos de forma intuitiva e automática diariamente quando executa tarefas comuns. Como estas atividades são simples e dispensam ficar pensando nas instruções necessárias para fazê-las, o algoritmo presente nelas acaba passando despercebido. Por exemplo, quando precisa trocar uma lâmpada, você:


 Início
   Verifica se o interruptor está desligado;
   Procura uma lâmpada nova;
   Pega uma escada;
   Leva a escada até o local;
   Posiciona a escada;
   Sobe os degraus;
   Para na altura apropriada;
   Retira a lâmpada queimada;
   Coloca a lâmpada nova;
   Desce da escada;
   Aciona o interruptor;
     Se a lâmpada não acender, então:
         Retira a lâmpada queimada;
         Coloca outra lâmpada nova
     Senão
         Tarefa terminada;
   Joga a lâmpada queimada no lixo;
  Guarda a escada;
 Fim

Formas de escrever um algoritmo
Os algoritmos são muito utilizados na área de programação, descrevendo as etapas que precisam ser efetuadas para que um programa execute as tarefas que lhe são designadas. Existem diversas formas de escrever um algoritmo, podendo ser citadas o pseudocódigo (ou português estruturado), fluxograma, diagrama de Chapin e descrição narrativa.

A sequência escrita no exemplo da troca da lâmpada estava em descrição narrativa, por exemplo. Esta forma não é muito utilizada em informática porque pode ser ambígua e dar margem a interpretações erradas.
Os dois tipos mais comuns são o pseudocódigo que utiliza uma forma mais estruturada, assemelhando-se àquelas utilizadas pelas linguagens de programação e o fluxograma que emprega figuras geométricas para ilustrar os passos a serem seguidos.

O Diagrama de Chapin, Diagrama Nassi-Shneiderman ou Diagrama N-S mostra a solução por meio de quadros organizados hierárquica e estruturadamente. Este tipo não é muito utilizado, pois vários procedimentos tornam-se difíceis de serem mostrados por meio deste diagrama.

Um algoritmo é algo que você já utilizava o tempo todo e nem percebia. Uma forma bem interessante de exercitar a lógica seria algum dia parar para pensar em sua rotina ao acordar, por exemplo. Você perceberia o quanto ela é mais complexa do que parece, se fosse para colocar no papel e como a execução disto é automática.
Fonte: www.baixaki.com.br



Tipos de Dados

  1. Dados Numéricos
    1. Dados Numéricos Inteiros
    2. Dados Numéricos Reais
  2. Dados Literais
    1. Constantes Caracter
    2. Cadeias de Caracteres
  3. Dados Lógicos
  4. Ponteiros

  • Dados numéricos
  • Dados literais ou alfa-numérico
  • Dados lógicos
  • Ponteiros
Existem 4 tipos de Dados:

Cada um destes tipos de dados será detalhado nas próximas seções.


1 - Dados Numéricos

O conjunto de dados mais comuns é o de números naturais, que é representado por N. Este conjunto é definido como
N = {0,1,2,3,...}
Este conjunto de números é usado quando queremos falar sobre o número de amigos que temos ou quantos CDs musicais temos na nossa coleção. Embora seja fácil imaginar que um pastor de ovelhas há 3000 anos pudesse usar este conjunto com facilidade, é bom lembrar que o conceito do número zero é difícil de ser entendido. O conjunto dos números naturais usado pelos primeiros seres humanos não incluía o zero. Os pastores sabiam que se 20 ovelhas tinham ido para os campos, eles tinha de esperar pelas mesma 20 ovelhas na volta à noite. Agora se não havia ovelhas para que precisassem contar, somar ou subtrair? A natureza tem horror ao vácuo e o nada é um conceito complicado para os seres humanos. O número zero é uma invenção dos matemáticos hindus e é recente, sendo introduzido em XXXX aproximadamente.
O conjunto dos números naturais é subconjunto dos conjunto dos números inteiros que é definido como
Z = {...,-3,-2,-1,0,+1,+2,+3,...}
Aqui estamos falando de conceitos mais complicados que hoje em dia já fazem parte do nosso dia a dia. Estamos no domínio dos números relativos, que incluem os números positivos, o zero e os números negativos. A mente humana teve de atingir graus de abstração maiores para imaginar operações que incluíam números negativos. Hoje em dia não é necessário ser um matemático pós-graduado para trabalhar facilmente com este tipo de números. Todos nós somos capazes de perceber que uma temperatura de -3 graus centígrados e mais fria do que +3 graus. Quem não fica preocupado quando sabe que sua conta corrente no banco está com saldo de -300 reais. Rapidamente iremos tentar transformar este número negativo em número positivo, e o que mais importante sabemos que precisamos de pelo menos 300 reais para sair do vermelho.
O próximo conjunto na nossa curta viagem pelos domínios dos números é o conjunto dos números fracionários, que é representado por Q. Este conjunto é composto por todos os números que podem ser escritos como uma fração da forma p/q onde p e q pertencem ao conjunto dos números inteiros. Este conjunto pode ser definido como:
Q = {p/q | p, q pertencem a Z}
Continuando nesta excursão vamos para o conjunto dos números reais (R) que é a união do conjunto dos números fracionários e o dos números irracionais. Números irracionais não são os números que não conseguem pensar, mas sim aqueles que não podem ser expressos por uma fração p/q. Um exemplo muito conhecido de número irracional é o PI que é igual a 3.14159...
O último conjunto é o dos números complexos. Neste conjunto os números são representados da seguinte maneira
n = a + ib
Os números a e b são números reais e i representa a raiz quadrada do número inteiro -1. Quando b é igual a 0 o número é um número pertencente ao conjunto dos reais. Como pode-se ver, a medida que fomos passando de um conjunto para outro, aumentou o nível de abstração das quantidades que os números pertencentes aos conjuntos representam.
A Figura a seguir é uma representação das relações de pertinência entre os conjuntos de números que analisamos até aqui. 

Os dados numéricos que os algoritmos que iremos criar e que a maioria dos computadores manipulam são de dois tipos:
  • Dados inteiros
  • Dados reais
Neste ponto é importante assinalar dois fatos importantes. Primeiro computadores trabalham com uma base diferente da base que usamos todos dias que é a base 10. Computadores usam a base 2, e no processo de conversão entre bases podem ocorrer problemas de perda de dígitos significativos. Por exemplo, o número real 0.6 ao ser convertido para a base dois gera uma dízima periódica.
Outro fato importante é que a largura das palavras de memória do computador é limitada e portanto o número de dígitos binários que podem ser armazenados é função deste tamanho. Isto é similar ao que aconteceria se tivéssemos que limitar o número o dígitos decimais que usamos para representar os números de nossas contas no banco. Por exemplo, assuma que só podemos armazenar quantias com 6 dígitos inteiros e dois decimais, deste modo se ganhássemos na loteria R$ 1.000.000,00 não seria possível representar este valor no extrato do banco. Portanto no processo de conversão e desconversão entre bases pode haver perda de informação.

Dados Numéricos Inteiros


O conjunto dos dados inteiros pode ser definido como

Z={...,-3,-2,0,1,2,...}.
As linguagens usadas para programar computadores são muito exigentes com a maneira com que os dados são representados. Por esta razão vamos passar a definir como deveremos representar os dados nos algoritmos. Os dados inteiros tem a seguinte forma:
NúmeroInteiro = [+,-]algarismo{algarismo}
Neste texto iremos usar uma notação especial para definir como iremos representar os elementos da linguagem. A medida que formos apresentando os elementos a notação será também explicada. No caso da definição dos dados inteiros temos os seguintes elementos. O elemento básico é o algarismo que é um dos seguintes caracteres:
algarismo = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Os elementos entre colchetes são opcionais. Portanto, o sinal de + e - entre colchetes significa que um número inteiro pode ou não ter sínal. Em seguida temos um algarismo que é obrigatório. Isto é dados inteiros tem de ter pelo menos um algarismo. A seguir temos a palavra algarismo entre chaves, o que significa que um número inteiro deve ter pelo menos um algarismo e pode ser seguido por uma sequência de algarismos. Deste modo elementos que aparecem entre chaves são elementos que podem ser repetidos.
São portanto exemplos de números inteiros:
a)
+3
b)
3
c)
-324
Como exemplos de formas erradas de representação de números inteiros, temos:
a)
+3.0
Não é possível usar ponto decimal
b)
+ 123
Espaços em branco não são permitidos


Dados Numéricos Reais


Os dados reais tem a seguinte forma:
[+,-]algarismo{algarismo}.algarismo{algarismo}.
Ou seja um número real pode ou não ter sinal, em seguida um conjunto de pelo menos um algarismo, um ponto decimal e depois um conjunto de pelo menos um algarismo. É importante notar que o separador entre a parte inteira e a fracionário é o ponto e não a vírgula.
São exemplos de números reais:
a)
0.5
a)
+0.5
a)
-3.1415
Abaixo mostramos exemplos de formas erradas de representação de números reais, temos:
a)
+3,0
Vírgula não pode ser separador entre as partes real e inteira
b)
0.333...
Não é possível usar representação de dízimas



2 - Dados Literais


Dados literais servem para tratamento de textos. Por exemplo, um algoritmo pode necessitar de imprimir um aviso para os usuários, ou um comentário junto com um resultado numérico. Outra possibilidade é a necessidade de ler dados tais como nomes, letras, etc.
Este tipo de dados pode ser composto por um único caracter ou por um conjunto de pelo menos um destes elementos. Conjuntos são conhecidos como cadeias de caracteres, tradução da expressão em inglês, "character string".
Um ponto importante que deve ser abordado agora é o que se entende por caractere. Caracteres são basicamente as letras minúsculas, maiúsculas, algarismos, sinais de pontuação, etc. Em computação caracteres são representados por códigos binários e o mais disseminado de todos é o código ASCII. Este padrão foi definido nos Estados Unidos e é empregado pela quase totalidade dos fabricantes de computadores e programas. O apêndice mostra a tabela ASCII com estes códigos.
Os caracteres que normalmente são empregados nos algoritmos são os seguintes:
Letras maiúsculas:
A | B | C | D | E | F | G | H | I | J | K | L | M | N | O | P | Q | R | S | T | U | V | W | X | Y | Z
Letras minúsculas:
a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
Algarismos:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Caracteres de pontuação:
; | : | ! | ? | * | ( | ) | \ | / | + | - | = | < | >


Constantes Caracter


Caracteres podem aparecer sozinhos, e neste caso são chamados de constante caracter e são representados entre o caracter '. Abaixo mostramos exemplos de constantes caracter:
  • 'a'
  • 'A'
  • ';'
  • '+'
Cadeias de Caracter
Cadeias de caracteres são conjuntos de um ou mais caracteres e são cercados pelo caracter ". Por exemplo:
  • "Linguagem de programação"
  • "Qual é o seu nome?"
  • "12345"


3 - Dados Lógicos


Este tipo de dados é intensamente aplicado durante o processo de tomada de decisões que o computador freqüentemente é obrigado a fazer. Em muitos textos este tipo de dados também é chamado de dados booleanos, devido a George Boole, 
matemático que deu ao nome à álgebra (álgebra booleana) que manipula este tipo de dados. Os dados deste tipo somente podem assumir dois valores: verdadeiro e falso.
Computadores tomam decisões, durante o processamento de um algoritmo, baseados nestes dois valores. Por exemplo, considere a sentença a seguir que é um caso típico de decisão que o computador é capaz de tomar sem intervenção humana.
Se está chovendo então procurar guarda-chuva.
Nesta sentença temos a questão lógica "Se está chovendo". Esta expressão somente pode ter como resultado um de dois valores: verdade ou falso. Nos nossos algoritmos estes valores serão representados por verdade e falso. Mais adiante ficará claro como este tipo de dados será empregado nos algoritmos.


4 - Ponteiros


Antes de pensarmos em ponteiros, é importante nos lembrarmos 
de alguns aspectos referentes à variáveis. Dependendo do seu conhecimento de programação, você deve saber que variáveis possuem nomes que as identificam durante a execução do programa. Você deve saber também que uma variável armazena um valor (que pode ser fixo, no caso de uma constante, ou pode mudar durante a execução de seus códigos).

O que poucos programadores se lembram é que uma variável possui um endereço, e que o nome da variável não é nada mais que um apelido para a localização deste endereço. Desta forma, um ponteiro não é nada mais que um tipo especial de variável que armazena o endereço de outra. Veja um exemplo:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
  // variável do tipo int
  int valor = 10;
  // ponteiro para uma variável do tipo int
  int *p = &valor;
  // exibe o valor da variável "valor", apontada
  // pelo ponteiro p
  printf("%d", *p);
  printf("\n\n");

  system("PAUSE");
  return 0;
}
Neste código nós temos a declaração e definição de duas variáveis:
int valor = 10;
int *p = &valor;
A primeira variável é uma variável do tipo int e a segunda é um ponteiro para uma variável do tipo int. Veja que devemos sempre usar "*" antes do nome de um ponteiro em sua declaração. O símbolo "&" serve para indicar que estamos acessando o endereço de uma variável e não o seu conteúdo. O resultado destas duas linhas é que agora temos um ponteiro que nos permite acessar e manipular a variável valor.
Observe a linha:
printf("%d", *p);
Aqui nós estamos acessando o valor da variável apontada por p. Veja o uso do símbolo "*" para acessar o valor da variável. Isso é chamado de desreferenciamento de ponteiros. Pareceu complicado? Veja uma linha de código que altera indiretamente o valor da variável valor para 30:
*p = 30;
Ponteiros são ferramentas muito importantes na programação em C. No entanto, é preciso ter muito cuidado ao lidar com eles. A primeira coisa a ter em mente é que um ponteiro não está apontando para nenhum lugar até que atribuímos a ele o endereço de outra variável. E é aí que mora o perigo. Um programa entra em colapso absoluto se tentarmos acessar um ponteiro que aponta para um local de memória que já foi
liberado novamente ao sistema. No caso menos grave, estaremos tentando acessar locais de memória inválidos ou reservados a outros programas ou tarefas do sistema operacional. Isso nos lembra os velhos tempos da tela azul de morte.

Nenhum comentário:

Postar um comentário