O Computador deve ser encarado como uma ferramenta de auxílio a resolução de problemas, porém devemos ter em mente que o computador nada sabe fazer, apenas executa as nossas ordens com bastante eficiência e rapidez. Teoricamente o computador pode ser definido como uma máquina que recebe dados, processa-os e devolve informações. Para que o computador possa entender o que queremos que ele faça, possa saber de que maneira deve processar os dados, devemos dar-lhe as ordens de maneira lógica. Lógica, segundo o dicionário Aurélio, significa "coerência de raciocínio, de idéias. Modo de raciocinar peculiar a alguém, ou a um grupo. Seqüência coerente, regular e necessária de acontecimentos, de coisas." Como já vimos que o computador não raciocina, podemos até defini-lo como o burro mais rápido do planeta, pois temos que fazer o "trabalho mental", e deixar para ele apenas o "trabalho braçal", ou seja, nós temos que pensar, resolver o problema e ensinar ao computador todos os passos que devem ser dados para que encontremos a resposta desejada. Ao conjunto destes passos, ou instruções, chamamos de programa. Programa é então um conjunto de comandos com uma determinada seqüência lógica, permitindo o processamento de dados. É por seu intermédio que o computador é capaz de entender a tarefa a ser executada, ou seja, age como interface entre homem e máquina. Um programa de computador pode ser escrito em uma das muitas linguagens de programação existentes, como por exemplo Delphi, Visual Basic, Pascal, Clipper, etc... Uma linguagem de programação é um conjunto de instruções, símbolos e operadores, rigidamente controlados, cheio de regras que devem ser seguidos ao pé da letra. A linguagem de programação funciona como um intermediário entre o homem e a máquina. Um programa escrito numa linguagem de programação, que geralmente é muito parecida com a linguagem humana, tem que ser compilado, ou traduzido, para ser executado pelo computador. A compilação transforma o programa fonte em programa objeto, que é a linguagem que o computador realmente entende. Neste material você aprenderá conceitos básicos de programação e poderá exercitá-los através da linguagem PascaL, que é uma implementação quase completa de um compilador Pascal no Logo. No entanto, os conceitos básicos aprendidos podem ser utilizados na maioria das linguagens, apenas a sintaxe é diferente. Além de outros recursos do Pascal, o que o PascaL tem de especial é a facilidade para a produção de figuras a partir de comandos. Ele usa um “robô triangular” que aparece na tela, como metáfora para um robô real, que pode ser utilizado para desenhar figuras na tela. Programar um computador pode às vezes ser uma tarefa árdua. Já existem inúmeros programas e pacotes de programas no mercado com utilidades diversas. Uma questão que pode então surgir é: por que aprender conceitos de programação? No entanto, pode ser que não exista no mercado um programa com as características que você deseja, e contratar alguém para implementar um programa para você pode não ser fácil ou ter um preço acessível. Além disso, se você precisa de um programa, o fato de implementá-lo pode fazer com que você obtenha mais conhecimentos relativos ao seu problema. Possuindo noções básicas de programação você poderá também utilizar de forma melhor os pacotes prontos.
Nesta seção você verá alguns exemplos de programas em PascaL para resolver problemas simples.
Suponha que você precise desenvolver um programa para desenhar um retângulo com o lado maior de tamanho 100 e o lado menor de tamanho 50. Para isso primeiramente você precisa fazer um algoritmo com os passos a serem seguidos para se desenhar tal retângulo. Como o computador não possui inteligência própria, você deve fazer uma espécie de receita de bolo com todos os passos que devem ser seguidos para se obter o resultado que você deseja. Um diagrama de Nassi com o algoritmo para se desenhar um retângulo com a especificação pedida pode ser visto na figura abaixo. O diagrama de Nassi mostrado representa a execução seqüencial dos comandos. O computador só executa um comando após ter finalizado a execução do comando na linha anterior. Na figura abaixo é apresentado um programa que implementa este algoritmo na linguagem de programação PascaL. Neste programa os comandos também são executados seqüencialmente. Este programa utiliza comandos PascaL para produzir um retângulo. Na figura abaixo você pode visualizar a figura produzida no ambiente de programação de PascaL. Algumas áreas de interesse deste ambiente estão destacadas na figura abaixo. O programa para desenhar um retângulo exibido neste exercício é bastante simples, pois um retângulo é um desenho simples. Basta desenhar um traço de tamanho 50 para cima (utilizando o comando pfrente(50)), virar o robô 90o à direita (através do comando pdireita(90)), desenhar um traço de tamanho 100 (através do comando pfrente(100)) e assim sucessivamente, até que o desenho esteja completo. O comando clrscr utilizado no programa limpa a área de comandos do PascaL. O comando ul (Use Lápis), faz com que o robô deixe um rastro ao se mover. Se você quiser mover a posição do robô sem que ele desenhe um traço você deve utilizar o comando un (Use Nada). O último comando utilizado no programa foi o dr (Desapareça Robô). Este comando faz com que o robô não seja exibido na tela. A utilização deste comando não é necessária, mas faz com que o robô não atrapalhe a visualização da figura. Se você quiser visualizar a figura novamente, utilize o comando ar (Apareça Robô). Uma linguagem de programação é uma espécie de idioma intermediário entre um programador e o computador. Um programa em uma linguagem de programação qualquer deve ser primeiramente "traduzido" para a linguagem da máquina (apenas 0's e 1's), para que o computador possa executá-lo. Esta "tradução" no PascaL é realizada através do botão Compilar da barra de operações. Para que o programa seja efetivamente executado e produza a figura desejada, você deve utilizar o botão Rodar da barra de operações.
Suponha agora que o tamanho dos lados do retângulo deva ser variável, mas que o lado maior seja sempre o dobro do tamanho do menor. Um esquema que representa este programa pode ser visto na figura abaixo. Suponha que seu programa executando é uma caixa preta, que recebe como entrada o tamanho do lado menor e produz como saída o desenho de um retângulo. O diagrama de Nassi com um algoritmo para resolver este problema encontra-se na figura abaixo. Neste diagrama você pode identificar os passos utilizados para se desenhar o retângulo. O diagrama é semelhante ao do problema anterior, exceto pelo comando de leitura do tamanho do lado menor, que é um comando para entrada dos dados. Ao executar um comando de entrada de dado, representado no diagrama de Nassi pela frase Ler o tamanho do lado menor, o computador espera que o usuário digite o dado pedido para então continuar a execução dos outros comandos do programa. Na figura abaixo é apresentado um programa PascaL que implementa o algoritmo acima. Este programa, a partir do tamanho do lado menor digitado pelo usuário, desenha um retângulo. Todo programa pode ser dividido em duas seções: o cabeçalho e o corpo do programa. No cabeçalho encontram-se as declarações de variáveis e no corpo do programa encontram-se os comandos propriamente ditos. Variáveis são utilizadas para se armazenar valores durante a execução do programa. Em PascaL as variáveis devem ser declaradas antes de serem utilizadas. A declaração da variável consiste na especificação de seu tipo. No caso do programa acima, o tipo das variáveis é integer, o que significa que estas só poderão armazenar valores numéricos inteiros. Se precisássemos armazenar valores como 3,14, ou 1,5, poderíamos declarar uma variável do tipo real. Frases devem ser armazenadas em variáveis do tipo String. Os comandos são executados seqüencialmente, a não ser que haja um desvio de fluxo e são utilizados para "dizer" ao computador o que ele deve fazer. Por exemplo, o comando clrscr é utilizado para que os desenhos existentes na tela do computador sejam apagados. Para obter do usuário o tamanho do lado menor, este programa utiliza os comandos de entrada e saída readln e writeln. O comando writeln faz com que a mensagem entre parênteses seja exibida na área de histórico do ambiente PascaL. É uma forma do programa interagir com o usuário, requisitando dados ou fornecendo resultados. O comando readln é utilizado para que o usuário possa fornecer valores para o programa. Neste caso o programa precisa do tamanho do lado menor para poder desenhar o retângulo. O valor digitado pelo usuário é armazenado na variável entre parênteses.
Suponha agora que, além de desenhar um retângulo com o tamanho do lado variável, você precise calcular sua área e seu perímetro. Um diagrama de Nassi contendo um algoritmo para resolver este problema encontra-se na figura abaixo: Como você pode perceber, o algoritmo é o mesmo mostrado anteriormente para desenhar o retângulo. Apenas os passos de calcular a área e o perímetro e a impressão destes dados é acrescentada. Uma implementação em PascaL deste algoritmo pode ser vista na figura abaixo: Neste programa você pode notar que para a impressão dos resultados é utilizado o comando writeln. Este comando imprime na área de histórico do PascaL o texto e o valor da variável que se encontram entre os parênteses. Por exemplo, se o usuário entrar com o tamanho do lado menor 10 (ladoMenor = 10), o tamanho do lado maior será 20 e valor armazenado na variável área será 200 (=20 x 10). Desta forma, o comando writeln('A área do retângulo é: ', area); fará com que seja impressa a seguinte frase: A área do retângulo é: 200. Ao final da execução do programa, um retângulo será exibido na área de desenho e na área de históricos serão impressos os seguintes resultados:
Seu problema pode então ser descrito assim:
Na figura abaixo pode ser visto o diagrama de Nassi para este problema. Este diagrama possui uma estrutura que representa decisão (marcado em azul na figura). Se o tipo da figura, indicado pelo usuário, for um quadrado, o lado maior deve ser igual ao lado menor. Caso contrário, o lado maior deve ser o dobro do lado menor. Esta decisão é representada pelo triângulo exibido na figura. Caso o tipo seja quadrado, os comandos da esquerda são executados (em nosso caso há apenas um comando), caso contrário, os comandos da esquerda são executados. Uma outra coisa que pode ser percebida neste diagrama é que uma parte do código se repete. As linhas grifadas delimitadas pelo círculo em vermelho são uma repetição das quatro linhas anteriores. Para evitar a replicação do código podemos utilizar um comando de repetição. Desta forma, o diagrama de Nassi ficaria como mostrado na figura abaixo: Neste diagrama estão destacados os comandos dentro da repetição. A variável auxiliar i é utilizada para controlar o fim da repetição. Primeiramente esta variável é inicializada com 1. Enquanto i for menor ou igual a dois, os comandos dentro da repetição são executados. São exatamente aqueles comandos que estavam repetidos no diagrama de Nassi anterior. O comando de incrementar a variável auxiliar i ( i := i + 1) é muito importante. Se este comando não fosse utilizado, o valor de i nunca seria maior que 2 e o programa continuaria executando os comandos indefinidamente, é o que chamamos de loop infinito. Desta forma, os comandos dentro para desenhar meio quadrilátero são repetidos duas vezes (um para i = 1 e outra para i = 2), completando a figura.
Na figura abaixo você pode visualizar o código do programa PascaL que implementa o algoritmo mostrado acima. No PascaL a estrutura de decisão é representada pelo comando if, como podemos ver no quadro abaixo.
A estrutura de repetição é implementada no PascaL através do comando while. A semântica deste comando pode ser vista no quadro abaixo.
Seu problema agora pode ser descrito assim:
Um diagrama de Nassi para resolver este problema pode ser visto na figura abaixo: Para resolver este problema devemos ler os dados para cada livro enquanto não for digitado um código de livro menor que zero. Isso foi feito pois assumimos que o FLAG para encerrar a leitura dos dados é a utilização de um código de livro negativo. O FLAG é utilizado para que o usuário possa entrar com dados de um número indeterminado de livros. Quando ele quiser encerrar a leitura dos dados, basta utilizar o FLAG. Para que possamos utilizar o FLAG para interromper a leitura dos dados, antes de iniciar a repetição devemos ler o código do livro. Se o código for menor que zero, nada é feito. Como nenhum livro foi lido, não faz sentido calcular a média de dias de atraso, até porque este calculo resultaria em uma divisão por 0, o que é um erro. Desta forma, o cálculo da média só é realizado caso o número de livros seja maior que zero. Para cada código de livro, devem ser lidos o número de dias de atraso e um número indicando se o livro está reservado ou não. Para efeito de implementação assumimos que se o usuário entrar com o número 1, indica que o número está reservado, qualquer outro valor indica que o livro não está reservado. O valor da multa é o número de dias multiplicado pelo valor da multa diária. Caso o livro esteja reservado, o valor da multa diária é R$ 2,00, caso contrário é R$ 1,00. Se o número de dias de atraso for maior que 15, o valor da multa deve ser acrescido de 10%. Isto é feito no diagrama de Nassi através do comando multa¬ multa * 1.1. O valor final da multa é então somado ao total das multas, o número de livros é incrementado e o número de dias de atraso é somado ao total de dias de atraso. Repare que estes totais são preenchidos inicialmente com 0 antes de entrar na repetição, para que a soma seja correta. Após a realização dos cálculos e a impressão da multa para o livro, os dados de um novo livro devem ser lidos. Lê-se então o código do livro. Se não for o FLAG continua-se a ler os dados. Caso o código lido seja um FLAG (menor ou igual a zero), a leitura é interrompida. Após o fim da leitura de dados, o total das multas deve ser impresso na tela. A média do número de dias de atraso por livro deve ser calculada e impressa na tela, caso o número de livros lidos seja maior que zero.
Veja na figura abaixo um programa PascaL que implementa o algoritmo mostrado no diagrama de Nassi anterior. No código PascaL é necessário declarar todas as variáveis antes de utilizar. Repare que o número de dias, o código do livro e a variável estaReservado foram declaradas como integer, ou seja, só aceitam valores inteiros. O valor da multa, no entanto, foi declarado como real. Isto ocorre pois, se o número de dias for maior que 15, somamos 10% ao valor da multa e isto pode resultar em um valor fracionário. Uma outra variável definida como real é a média do número de dias de atraso. Isto ocorre pois a média é obtida através de uma divisão, e portanto, pode ser fracionária. Se desejássemos que a média fosse um valor inteiro poderíamos utilizar o operador div ao invés da barra (/). Neste programa é utilizado o comando write. Este comando imprime o conteúdo entre parênteses na tela mas não cria uma nova linha, ao contrário do comando writeln. Desta forma, o próximo texto ficará na mesma linha. Veja na coluna da direita da figura abaixo o resultado dos comandos da coluna da esquerda caso o valor de codLivro for 123 e o valor da multa for 4.
Seu problema agora pode ser descrito assim:
Para resolver este problema podemos utilizar parte do código utilizado no problema anterior. Veja no entanto que o cálculo do valor da multa terá de ser realizado 20 vezes, 10 para livros reservados e 10 para livros não reservados. Para evitar a necessidade de replicar todo o código de cálculo do valor da multa podemos utilizar um módulo que realize este cálculo. Um módulo é um grupo de comandos, constituindo um trecho de algoritmo com uma função bem definida e o mais independente possível em relação ao resto do algoritmo. Desta forma, ao elaborar um algoritmo para calcular a tabela de multas, devemos desenvolver um módulo que calcule o valor da multa. Este módulo tem que saber apenas o número de dias de atraso e se o livro está reservado ou não. Dizemos que os dados que o módulo recebe para sua execução são parâmetros. Existem basicamente dois tipo de módulos, procedimentos e funções. A diferença básica entre estes dois tipos é que a função retorna um valor associado ao seu nome no fim de sua execução, e o procedimento não. Para resolver nosso problema devemos então desenvolver uma função com a seguinte estrutura:
Veja na figura abaixo o diagrama de Nassi do programa que utiliza esta função: E na figura abaixo veja o diagrama de Nassi para a função calculaValorMulta:
Na figura abaixo você pode visualizar a implementação do algoritmo para fazer a tabela de multas. Repare na implementação da função calculaValorMulta. O formato geral de uma função é o seguinte:
Para utilizar a função basta realizar uma chamada passando como parâmetros os valores desejados, conforme o exemplo abaixo.
O resultado da execução deste programa no PascaL pode ser visto na figura abaixo:
Seu problema agora pode ser descrito assim:
Como você pode notar, a figura a ser desenhada neste problema é constituída apenas de quadrados e retângulos. Desta forma, podemos utilizar parte do código do programa para desenhar quadrados ou retângulos visto no cenário 1. Para que não seja necessário repetir todo o código para desenhar um quadrilátero, podemos implementar um procedimento que desenhe um quadrado ou um retângulo com um tamanho de lado menor variável. Para isso, faremos um procedimento desenhaQuadrilatero, que recebe como parâmetros o tamanho do lado menor do quadrilátero e o tipo de desenho (1 para quadrado e 2 para retângulo). O diagrama de Nassi para o procedimento desenhaQuadrilatero encontra-se na figura abaixo: Tendo este procedimento, precisamos também de um código que posicione o robô na tela e execute o procedimento com os parâmetros corretos. Na figura abaixo você pode ver um diagrama de Nassi para o programa principal:
Veja na figura abaixo o código do programa que implementa os diagramas de Nassi mostrados anteriormente. Este código utiliza um procedimento (desenhaQuadrilatero) para executar uma parte do código que é repetida várias vezes. A estrutura geral de um procedimento é apresentada abaixo:
Para se executar o procedimento basta inserir uma chamada no bloco de comandos do programa. Um exemplo de chamada a procedimento pode ser visto abaixo:
Os parâmetros dos procedimentos, assim como das funções, devem ser colocados entre parênteses, separados por virgulas, na ordem em que aparecem na declaração do procedimento. No exemplo acima, o primeiro parâmetro é o tamanho do lado menor e o segundo é o tipo do quadrilátero (quadrado ou retângulo).
|