Introdução a Lógica de Programação

– O uso correto da lógica é fundamental na programação de computadores.  O estudo da Lógica, é o estudo dos métodos e princípios usados para distinguir o raciocínio correto do incorreto. Portanto  o uso correto da lógica é fundamental na programação de computadores.

– O computador só entende a linguagem de máquina. Não seria mais fácil se ele entendesse diretamente a linguagem dos seres humanos?   Uma linguagem de programação é um meio de se comunicar com um computador. Do mesmo modo que as pessoas necessitam de um código para comunicarem entre si, também é necessário algum código que permita a comunicação de pessoas (seres humanos) com o computador (máquina), Os códigos que os seres humanos utilizam para a comunicação entre si obedecem a determinadas regras que uniformizam o modo como o código deve ser utilizado, como devem ser combinados os elementos básicos desse código (que são as palavras) para formar elementos mais complexos (frases) que são capazes de exprimir maior quantidade de informação do que apenas palavras soltas. Estas regras são a gramática da língua utilizada para a comunicação. Isto é, uma língua utilizada para a comunicação entre seres humanos é um conjunto de elementos simples (palavras) que exprimem alguma informação mas que, de um modo geral, por si só não contém informação suficiente para que se possa estabelecer uma comunicação proveitosa; e um conjunto de regras gramaticais que indicam como podem ser combinadas as palavras de modo a formar frases. Analogamente, uma linguagem de programação, já que é um meio de comunicação, é um conjunto de palavras e um conjunto de regras gramaticais. As palavras são as instruções que a linguagem reconhece e as regras gramaticais definem o modo como se escrevem as diferentes instruções e como é permitido combinar as diferentes instruções Note-se que as regras gramaticais a que obedecem as línguas utilizadas pelos humanos entre si podem ser “ligeiramente” violadas sem que por isso se chegue a uma situação de incomunicabilidade. Isto porque os seres humanos têm a capacidade de adaptar situações parecidas com as corretas de modo a torná-las inteligíveis. Um computador não tem essa capacidade, pois é uma máquina e, como tal, não tem capacidade de raciocínio. O computador reconhece alguma coisa que lhe seja comunicado seguindo as regras gramaticais estabelecidas e utilizando as palavras que ele reconhece corretamente escritas. E não reconhece mais nada para além disto.

Os seres humanos utilizam várias línguas para comunicarem entre si. A existência de várias linguagens deve-se a condicionalismos geográficos e a interesses de população em determinados tipos de acontecimentos que produzem um desenvolvimento da língua em determinado aspecto. Do mesmo modo, para comunicar com um computador podem-se utilizar várias linguagens. As várias linguagens existentes foram desenvolvidas para satisfazer preferencialmente determinadas situações, isto é, as linguagens de programação são desenhadas para facilitar ao máximo um certo tipo de ações, Deste modo, existem linguagens mais viradas para aplicação ao cálculo científico, linguagens para tratamento gráfico ou outras.

Um computador só entende instruções que sejam sequências dos símbolos 0 e 1 que lhe indicam se em determinado circuito deve ou não passar corrente, Ora programar desse modo é impraticável. Por isso existem as linguagens de programação como um conjunto de regras gramaticais que são mais facilmente utilizáveis por pessoas. Mas o computador não entende por si só os programas escritos em qualquer destas linguagens. É necessário traduzir esses programas para sequências de O e 1 para que o computador possa perceber aquilo que se pretende que ele execute. É a dita compilação do programa. Todas as linguagens necessitam de ser compiladas para que o programa possa ser executado.

Quando se utiliza o computador sabemos normalmente que tipo de programas vamos construir, isto é, se necessitamos de grande poder de cálculo, de aspectos gráficos desenvolvidos, de fácil tratamento de ficheiros ou outro qualquer aspecto e escolher uma linguagem adequada às necessidades de modo a que a programação que se seque não necessite de resolver dificuldades desnecessariamente.

A diferença entre o português estruturado e a língua portuguesa.

Português estruturado são utilizados para descrever o problema com suas soluções, também chamado de fluxograma. E a língua portuguesa é a língua que usamos para nos comunicar entre si. Linguagem são códigos que os seres humanos utilizam para a comunicação entre si obedecem a determinadas regras que uniformizam o modo como o código deve ser utilizado, como devem ser combinados os elementos básicos desse código (que são as palavras) para formar elementos mais complexos (frases) que são capazes de exprimir maior quantidade de informação do que apenas palavras soltas. Estas regras são a gramática da língua utilizada para a comunicação. Isto é, uma língua utilizada para a comunicação entre seres humanos é um conjunto de elementos simples.

–  As estruturas de decisão são fundamentais para a solução de vários problemas. Imaginando como seriam os programas de computadores sem a utilização dessas estruturas. Sistemas de apoio à decisão é uma classe de Sistemas de Informação ou Sistemas baseados em Conhecimento. Refere-se simplesmente a um modelo genérico de tomada de decisão que analisa um grande número de variáveis para que seja possível o posicionamento a uma determinada questão.

Decisão é uma escolha entre as alternativas existentes através de estimativas dos pesos destas alternativas. Apoio à decisão significa auxiliar nesta escolha gerando estas estimativas, a evolução ou comparação e escolha. O termo sistema de apoio à decisão tem sido utilizado de diferentes formas (após a década de 80) e tem recebido diferentes definições de acordo com o ponto de vista de cada autor. Finlay (1994) e outros autores definem o SAD de um modo geral como “um sistema computacional que auxilia o processo de tomada de decisão”. Turban (1995) define mais especificamente como “um interativo, flexível e adaptável sistema de informação, especialmente desenvolvido para apoiar a solução de um problema gerencial não estruturado para aperfeiçoar a tomada de decisão. Utiliza dados, provê uma interface amigável e permite ao tomador de decisão ter sua própria percepção”. Portanto não seria possivel se fazer programação sem as estruturas de decisão.

–  Qual o motivo de existirem vários tipos de laço de repetição. Em uma linguagem de programação como Pascal, as funções podem ter argumentos de tipos diferentes. Argumentos podem ser de tipos escalares simples, como integer, longint, real, char e boolean, e podem ser também de tipos estruturados, como vetores, strings, matrizes e registros (records), esse último tipo ainda por ser estudado.

Por outro lado, o resultado da função tem maiores limitações: o tipo do resultado de uma função só pode ser um tipo escalar simples, com a exceção do tipo string, que também pode ser um resultado. Portanto, vetores comuns não podem ser resultado de funções, Veremos mais adiante que, para contornar essa limitação, podemos usar procedimentos para obter resultados de sub-programas que sejam tipos estruturados. Mas, para isso, teremos que usar parâmetros de referência, outro assunto que será visto mais adiante.

Os exemplos a seguir mostram várias funções com tipos diferentes de argumentos e de resultados.

Neste exemplo,  a função maiuscula(c) é usada para obter a letra maiúscula correspondente ao caractere c, se este for uma letra minúscula, caso contrário o valor retornado é o próprio caractere original:

program ex6_3;

var

frase:string;

i: integer;

function maiuscula(c:char):char;

{essa funcao converte letras minusculas em maiusculas}

begin

case c of

‘a’..’z’: maiuscula:= chr(ord(‘A’) + ord(c)-ord(‘a’));

else maiuscula:= c;

end;

end;

begin

writeln(‘Digite uma frase. Ela sera” re-escrita em letras maiusculas: ‘);

readln (frase);

for i:=1 to length(frase) do frase[i] := maiuscula(frase[i]);

writeln(frase);

end.

Note que a função foi aplicada a um argumento do tipo char, e que o valor resultante também é do tipo char. Para alterar as letras da string frase, foi necessário usar um laço de repetição para aplicar a função sucessivamente a cada caractere da frase.

No próximo exemplo, a função será aplicada a toda a frase de uma vez (o argumento é do tipo string) e o resultado também será do tipo string, isto é, a função retorna a frase inteira alterada:

program ex6_4;

var

frase:string;

i: integer;

function maiusc_str(s:string):string;

{essa funcao retorna uma string com todas as letras maiusculas}

var i: integer;

begin

for i:= 1 to length(s) do

case s[i] of

‘a’..’z’: s[i]:= chr(ord(‘A’) + ord(s[i])-ord(‘a’));

end;

maiusc_str:= s;

end;

begin

writeln(‘Digite uma frase. Ela sera” re-escrita em letras maiusculas: ‘);

readln (frase);

writeln(maiusc_str(frase));

end.

Uma observação importante: a função não altera a string frase. Ela retorna outra string, com as letras alteradas, que substituirá a expressão maiusc_str(frase). É essa string retornada que será impressa. O valor original da string frase não foi alterado.

No exemplo seguinte, a função cripto(c,n) onde c é um caractere, e n é um inteiro, positivo, tem o seguinte valor:

–          –         se c for uma letra (maiúscula ou minúscula), cripto(c,n) retorna a letra n posições adiante no alfabeto, considerado circular (depois do ‘z’ vem o ‘a’, depois do ‘Z’ vem o ‘A’).    Ex: cripto(‘Z’, 3) retorna  ‘C’

–          –         se c for um dígito, cripto(c,n) retorna o dígito n posições adiante, também circular (depois do ‘9’ vem o ‘0’)

Ex: cripto(‘3’, 11) retorna ‘4’.

–          –         para qualquer outro caractere, a função retorna o próprio caractere sem alteração.

Esse exemplo é mais complexo, e é interessante para ressaltar a importância de se separar as tarefas em sub-programas separados. Dessa forma, o programa que usa a função fica muito mais compreensível, e também a função pode ser testada e aperfeiçoada independentemente dos programas que a usarão. O programa que usa a função é bem simples, e toda a complexidade da criptografia fica encapsulada na definição da função.

Exemplo 6-5:

program ex6_5;

var

frase: string;

i,n: integer;

function cripto(c: char; n: integer): char;

var pos,d:integer;

begin

n:= n mod 26;  {reduz logo o n }

pos:= ord(c) + n; {posicao na tabela de caracteres n casas adiante de c}

case c of

‘a’..’z’: begin

d:= pos -ord(‘z’);  {d e’ quanto pos passou de z}

if d<=0 then cripto:= chr(pos)

else cripto:= chr(ord(‘a’) + d-1 )

end;

‘A’..’Z’: begin

d:= pos -ord(‘Z’);  {d e’ quanto pos passou de Z}

if d<=0 then cripto:= chr(pos)

else cripto:= chr(ord(‘A’) + d-1 )

end;

‘0’..’9′: begin

d:= pos -ord(‘9′);  {d e’ quanto pos passou de 9}

if d<=0 then cripto:= chr(pos)

else cripto:= chr(ord(‘0’) + d-1 )

end;

else cripto:= c; {se for outro caractere, nao altera}

end;

end;

begin

writeln(‘Digite uma frase: ‘);

readln(frase);

writeln(‘Escolha o valor de n para a criptografia: ‘);

readln(n);

for i:=1 to length(frase) do write(cripto(frase[i], n));

readln;

end.

– Por que os laços de repetição diminuem o risco de ocorrência de erros na execução de programas. Elas têm o objetivo de poupar trabalho de digitação, proporcionar um código mais legível e elegante, além de ser mais eficiente.

Em muitos casos, haverá necessidade de passar por uma ou mais linhas (blocos) de comando(s) várias vezes durante a execução de um programa.

Se tivermos que escrever um programa que leia as temperaturas dos últimos trinta dias, calcule e retorne a média das temperaturas digitadas.

Sem a utilização de uma estrutura de repetição , também conhecida como laço de repetição ou looping, você terá que repetir por trinta vezes as seguintes linhas:

1ª vez

{inicialização da varável acct que irá acumular o valor das temperaturas}

Acct ? 0;

Escreva(‘Digite a temperatura”);

Leia (temp);

{acct recebe o seu próprio valor mais o valor digitado em tem}

Acct ? acct + temp;

 

2ª vez

Escreva(‘Digite a temperatura”);

Leia (temp);

Acct ? acct + temp;

 

3ª vez

Escreva(‘Digite a temperatura”);

Leia (temp);

Acct ? acct + temp;

.

.

.

N vez

.

.

E quanto menos repetição, menor o risco de erros.

– Pense em como ficaria a leitura, a escrita e outras operações sobre um número muito grande de dados sem a utilização das estruturas do tipo vetores e matrizes. Estruturas de dados são o “coração” de qualquer programa mais sofisticado. A seleção de um tipo correto de estrutura de dados fará enorme diferença na complexidade da implementação resultante. A escolha da representação dos dados correta facilitará em muito a construção de um programa, enquanto que a escolha de uma representação errada custará um tempo enorme de codificação, além de aumentar a complexidade de compreenssão do código. Portanto ficaria errada!

– A organização dos dados em estruturas do tipo vetores e matrizes podem ajudar no que diz respeito a manipulação dos dados. A organização dos dados é bem mais rápida se for utilizada estruturas tipo vetores e matrizes, portanto ajuda muito.