Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
2 Portugol
É uma linguagem de expressão de algoritmos. É considerada uma pseudolinguagem, cuja função é fornecer a
notação para a criação de algoritmos.
A notação usada para expressões é basicamente uma forma linear comumente usada na matemática, que pode
conter operadores:
ARITMÉTICOS: +, -, /, *, raiz( ), **, sen( ), cos( ), mod, div,...
LÓGICOS: e, ou, não ( Λ, V, . )
RELACIONAIS: =, ≠, >, ≥ (ou >=), <, ≤ (ou <=)
É importante observar que o resultado da expressão (do lado direito do comando de atribuição) deve ser
coerente com o tipo declarado para a variável (do lado esquerdo).
Quando a ação a ser executada depender de uma inspeção (teste), teremos uma alternativa, ou estrutura
condicional, simples ou composta.
Exemplo de uma estrutura condicional simples:
Nos comandos apresentados, < condição > é qualquer expressão cujo resultado seja falso ou verdadeiro.
Uma estrutura de repetição é quando um conjunto de ações é executado repetidamente enquanto uma
determinada condição permanece válida (ou seja, quando o resultado de da expressão é um valor lógico
verdadeiro).
Exemplo de uma estrutura de repetição:
Enquanto o valor da < condição > for verdadeiro, as ações dos comandos são executadas e quando se tornar
falso, o comando é abandonado. Se já da primeira vez o resultado é falso, os comandos não são executados.
Até agora todos os valores calculados pelos algoritmos foram gerados e permaneceram na memória. Para obter
ou para fornecer dados ao ambiente exterior ao algoritmo, por exemplo do teclado e para o vídeo, é preciso
utilizar comandos de entrada e saída. O comando de entrada é leia e o comando de saída é imprima, e suas
sintaxes são apresentadas a seguir.
Na estrutura enquanto o teste é realizado antes da execução do primeiro loop, ou seja, pode ser que os
comandos não sejam realizados sequer uma vez, caso a condição seja falsa já na primeira vez em que foi
testada. Já na repita os comandos sempre serão executados pelo menos uma vez, até que a condição seja
testada, no final da estrutura.
A estrutura de repetição para difere das estruturas enquanto e repita, pois utiliza uma variável de controle, que
atua como um contador de repetições.
Observando o exemplo, percebe-se que foi utilizada uma variável do tipo inteiro (I), que deve ter sido declarada
anteriormente. Esta estrutura irá executar os comandos 10 vezes, pois possui I variando automaticamente de 1
em 1 (passo 1) até 10, ou seja, não é necessário fazer o incremento deste dentro da estrutura de repetição.
O comando abandone só tem sentido dentro de um comando de repetição (enquanto, repita e para). Além
disso, estará sempre associado ao teste de uma condição com comando se.
Sintaxe: abandone;
A semântica do comando é a seguinte: quando o abandone é encontrado, o próximo comando a ser executado é
o primeiro logo após o fim do comando de repetição mais interno onde este aparece.
Exemplo:
Cada elemento de um vetor é tratado como se fosse uma variável simples. Para referência a um elemento do
vetor utiliza-se o nome do vetor e a identificação do elemento (índice) entre colchetes ([ ]).
Por exemplo, se quisermos atribuir o valor de uma 45 a nota do 6o aluno (que é identificado pelo índice 6 do
vetor de notas): NOTAS[6] <- 45;
Prof. Christiano Colen Venancio 7
UNIPAC Ipatinga - 2007
Exemplo: O que será impresso no algoritmo abaixo?
Exercício: Um professor de uma turma com 30 alunos quer armazenar as notas de seus alunos em um vetor e
depois calcular a média geral da turma. Escreva um algoritmo que solucione este problema usando uma
estrutura de vetor.
Os valores atribuídos à variável frase devem estar entre aspas duplas, tal como “Entre com o seu nome:”.
Quando a variável nome é inicializada pela instrução Leia, automaticamente é inserido o caracter 0 no final da
cadeia. Lembremos que “a” e ‘a’ são valores pertencentes a tipos distintos. No primeiro caso, temos uma cadeia
de tamanho 1 que contém apenas a letra a; no segundo, temos a letra a, que é um valor válido para tipo de dado
caracter.
A idéia é comparar os elementos dois a dois e ir jogando os elementos maiores para as últimas posições do
vetor até obter o vetor classificado. Uma vez que o maior elemento tenha atingido a mais alta posição é
reduzido o tamanho do vetor a ser classificado, como se pode ver pelos passos no esquema que se segue:
3 Matrizes
Uma matriz é uma estrutura de dados homogênea, ou seja, todos os elementos de uma matriz são do mesmo
tipo. Um vetor é uma matriz unidimensional, a partir de agora serão apresentadas matrizes com mais de uma
dimensão.
3.1 Matrizes Bidimensionais
A forma mais comum de trabalhar com matrizes é utilizando duas dimensões, apesar de que em alguns casos
possa ser necessário trabalhar com mais de duas. Uma matriz bidimensional é composta por linhas e colunas.
As linhas podem ser consideradas como a primeira dimensão e as colunas a segunda dimensão. É preciso
definir o tamanho de cada uma dessas dimensões, ou seja, o número de linhas e o número de colunas que esta
matriz deverá possuir.
Exemplo: Definição de uma matriz com 8 linhas e 5 colunas.
Exercício: Escreva um algoritmo que receba as notas referentes a três avaliações realizadas por 25 alunos, e as
armazene numa matriz, juntamente com a média total obtida pelo aluno. Sabendo que: as duas primeiras
avaliações têm peso de 35 cada uma e a terceira tem peso de 30 pontos. Além disso, para cada média total deve
4 Modularização
No fim da década de 60, alguns problemas no desenvolvimento de sistemas de programação levaram os países
desenvolvidos a um evento chamado “crise de software”. Os custos das atividades de programação mostravam
a cada ano uma clara tendência a se elevarem muito em relação aos custos dos equipamentos, e isto era devido
ao avanço tecnológico na fabricação dos equipamentos de computação e a lenta evolução de técnicas aplicadas
ao desenvolvimento de software.
A ausência de uma metodologia para a construção de programas conduzia a programas geralmente cheios de
erros e com altos custos de desenvolvimento que, conseqüentemente, exigiam custos elevados para a sua
correção e manutenção futuras. A programação estruturada foi o resultado de uma série de estudos e
propostas de metodologias para desenvolvimento de software. Uma das técnicas aplicadas na programação
estruturada, a modularização de programas é uma ferramenta para a elaboração de programas visando, os
aspectos de confiabilidade, legibilidade, manutenibilidade e flexibilidade, dentre outros.
A modularização é um processo que aborda os aspectos da decomposição de algoritmos em módulos. Módulo é
um grupo de comandos, constituindo um trecho do algoritmo, com uma função bem definida e o mais
independente possível em relação ao resto do algoritmo.
Há dois tipos de módulos:
• Função: sempre retorna um e apenas um valor ao algoritmo que lhe chamou. Cada função tem associada ao
seu valor de retorno um tipo explícito. Da mesma maneira com que os parâmetros são fixos para todas as
chamada o retorno também é fixo. Ela pode ser vista como uma expressão que é avaliada para um único
valor, sua saída, assim como uma função em Matemática.
Procedimento: é um tipo de módulo usado para várias tarefas, não produzindo valores de saída, ou seja, nunca
retornam valores. Em algumas linguagens não existem explicitamente.
Exemplo – Seja um algoritmo para calcular o salário líquido de um empregado, com as seguintes etapas:
As funções têm a característica de retornar ao algoritmo que as chamou um valor associado ao nome da função.
Devemos observar que os parâmetros passados por referência devem ser obrigatoriamente variáveis, uma vez
que não faz sentido modificar o valor de uma constante ou de uma expressão.
Em que:
Exemplo: Suponha que desejemos construir um procedimento para apresentar informações do algoritmo.
Uma função é recursiva quando no corpo dessa função existe uma chamada a si própria, podendo utilizar os
mesmos parâmetros de entrada (correndo riscos de provocar um ciclo infinito) ou outros.
São dados três suportes (a, b e c) e n discos de tamanhos diferentes. Os discos estão empilhados num dos
suportes por ordem crescente de tamanhos. Pretende-se mover os discos para outro suporte de modo que:
em cada passo exatamente um disco seja movido de um suporte para o outro um disco não pode nunca estar por
cima de um menor o terceiro suporte pode ser usado como auxiliar
6 Apontadores
É na memória RAM que são carregados os nossos programas e também onde são armazenadas as variáveis que
fazem parte dos programas. A memória RAM pode ser vista como um enorme vetor de Bytes consecutivos,
cada um ocupando uma posição bem determinada, que é identificada por um número único que varia entre 0 e a
totalidade de Bytes.
Para os programadores, é muito mais simples referenciar uma variável pelo seu nome do que referenciá-la pela
posição que essa variável ocupa em memória. O compilador associa a cada nome de variável uma posição única
em memória, capaz de suportar os dados do tipo dessa variável.
Sempre que num programa se faz referência a uma variável, na realidade é o endereço ou conjunto de
endereços que essa variável ocupa, que está sendo referenciado.
Prof. Christiano Colen Venancio 26
UNIPAC Ipatinga - 2007
O apontador é um mecanismo particularmente flexível de manipulação de dados, pois permite manipular
diretamente dados contidos em endereços específicos de memória. Supondo que exista um apontador
denominado ptr, que como qualquer variável ocupa uma posição em memória. Como ptr é um apontador,
deverá conter o endereço de memória de outra variável (notar que o endereço de uma variável não é mais do
que o número da casa que ocupa em memória). A Figura abaixo mostra este exemplo.
A primeira estrutura, nome, armazena os nomes dos 5 alunos e a estrutura notas as suas respectivas notas
bimestrais. Nesse caso, seria mais fácil agruparmos os dois tipos de dados em uma mesma estrutura. É
exatamente isto que se consegue fazer como a utilização de registros.
7.2 Registros
Os tipos registros devem ser declarados ou atribuídos antes das variáveis, pois pode ocorrer a necessidade de
declarar uma variável com o tipo registro anteriormente declarado. A declaração de um registro é realizada
conforme a seguir:
Defina Tipo
REGISTRO
< tipo do campo1 > < campo1 >,
< tipo do campo2 > < campo2 >,
...
< tipo do campon > < campon >
FIM-REGISTRO nome do tipo
Em que:
• < nome do tipo> é o nome do registro cuja estrutura está sendo criada,
• < campon> é o nome do n-ésimo campo do registro e
• <tipo do campon> é o tipo do n-ésimo campo do registro.
A lista de campos é uma relação de variáveis, com o seu respectivo tipo, podendo ser REAL, INTEIRO,
LÓGICO, CARACTER ou outro tipo estruturado definido previamente. Como exemplo, vamos criar um
registro para representar o nome de um aluno e suas notas bimestrais e sua média:
Defina Tipo
REGISTRO
caracter nome= vetor [40],
real nota1,
real nota2,
real media
FIM-REGISTRO NOTAS_ALUNOS
Variáveis
NOTAS_ALUNOS aluno
Prof. Christiano Colen Venancio 27
UNIPAC Ipatinga - 2007
Nesse exemplo foi criado um tipo registro NOTAS_ALUNOS, o qual é um conjunto de dados heterogêneos
(um campo tipo VETOR de caracter e cinco campos do tipo REAL). Desta forma é possível guardar em uma
mesma estrutura vários tipos diferentes de dados. Uma vez que um tipo de dado registro tenha sido definido,
podemos criar tantas variáveis daquele tipo desejarmos, assim como fazemos com qualquer outro tipo de dado.
Por exemplo, para criarmos três registros do tipo NOTAS_ALUNOS:
Variáveis
NOTAS_ALUNOS aluno1, aluno2, aluno3
Cada uma dessas três variáveis é um registro do tipo NOTAS_ALUNOS ,e, portanto, cada uma delas possui
seis campos de dado: nome, nota1, nota2 e media. Assim como variáveis do tipo de vetores e matrizes,
variáveis do tipo registros são manipuladas através de suas partes constituintes, os campos.
Em particular, uma variável registro é manipulada através de seus campos. Então, se desejarmos atribuir um
valor a uma variável registro, temos de efetuar a atribuição de valores para seus campos constituintes.
Por exemplo, a leitura de um registro é efetuada com a instrução LEIA seguido do nome da variável registro e
seu campo correspondente separado por um caractere “.” ponto. Uma leitura de registros também poderá ser
feita como:
LEIA aluno
Nesse caso, está sendo feita uma leitura em todos os campos do registro. A atribuição de um campo em um
registro é realizada de forma análoga a atribuição a uma variável. O processo de impressão é feito com
instrução IMPRIMA, semelhante a leitura, podendo também imprimir todo o registro:
IMPRIMA aluno
Note que a estrutura registro apresentada permite somente a leitura e escrita de um único conjunto de campos
para um registro. Mais adiante será apresentado como fazer para conseguir ler e escrever mais de um registro.
Para manipular um registro individual do vetor alunos, utilizamos o nome da variável vetor e o índice do
elemento correspondente ao registro que queremos acessar, como fazemos com um vetor de qualquer outro
tipo. Daí, em diante, faremos como aprendemos anteriormente. Por exemplo, se quisermos atribuir o conjunto
de valores “Sicrano de Tal”, 10.0, 7.0 ao primeiro registro de alunos, faremos da seguinte forma:
Para demonstrar a utilização de problemas com tabelas de dados heterogêneos, considere o seguinte problema:
Exemplo: Efetuar a leitura de 2 notas bimestrais de n alunos, calcule a média de cada aluno e no final
apresentar os dados, nome e média, classificados por nome. Considere n ≤20.