ALGORITMOS EM PROGRAMAÇÃO ESTRUTURADA



ALGORITMOS EM PROGRAMAÇÃO ESTRUTURADA

PEDRO KANTEK com adaptação Patricia Rücker de Bassi

2000

ÍNDICE

INTRODUÇÃO 3

ALGORITMOS 4

LÓGICA 5

O PORTUGOL 10

IDENTIFICADOR 10

VARIÁVEIS 11

ATRIBUIÇÃO 12

OPERADORES 13

QUALIDADES DE UM BOM ALGORITMO 19

BLOCOS 20

SEQUÊNCIA SIMPLES 20

COMANDOS DE ENTRADA E SAÍDA 21

ALTERNATIVA SIMPLES 25

ALTERNATIVA COMPOSTA 26

ANINHAMENTO 27

MULTIPLA ESCOLHA 30

COMANDOS DE REPETIÇÃO 37

ENQUANTO 37

REPITA 39

PARA 45

NOVOS TIPOS DE DADOS 54

VETORES 54

CLASSIFICAÇÃO DE VETORES 59

PESQUISA EM VETORES 61

MATRIZ 63

MODULARIZAÇÃO 70

PROCEDIMENTO 73

FUNÇÃO 74

RECURSIVIDADE 78

ARQUIVOS 81

INTRODUÇÃO

A arte e ciência de programar computadores é algo fascinante. Uma das melhores definições desta atividade pode ser considerada - “programar é emprestar um pouco de nossa inteligência ao computador”. Quando o mesmo trabalha, é como se a inteligência emprestada do programador estivesse trabalhando.

A tecnologia de fabricação de computadores tem evoluído de maneira muito rápida nos últimos tempos. A programação de computadores nem tanto, embora também tenha tido alguns progressos importantes.

Existem razões para esta diferença. A construção de hardware (equipamento) é engenharia. Tudo pode ser matematicamente provado, produzido em série, rejeitado por amostragem, e, a partir de um original, sua cópia pode ser vendida aos milhões. Com o software é quase tudo ao contrário. É mais arte do que engenharia, até hoje não se pode comprovar matematicamente a correção de código, cada necessidade demanda a construção de modelos específicos, que só se aplicam naquele momento (no espaço e no tempo). Para nós, seres humanos, é uma vantagem. Pois, enquanto a produção de hardware é (ou pode ser) em grande parte robotizada, a produção de software ainda exige um bom cérebro por trás.

As restrições que ainda existem sobre o hardware impedem a programação dos computadores em linguagem natural, embora existam estudos nesta área. Hoje ainda não é possível dialogar com um computador como se fala com uma pessoa medianamente inteligente. Os computadores ainda não conseguem tal proeza.

Para programar computadores, portanto, precisamos aprender uma linguagem de programação. Estas linguagens são chamadas artificiais justamente por terem sido inventadas para esta finalidade, ao contrário das naturais que surgiram para comunicação de seres humanos. Como se destinam a serem entendidas por máquinas, tais linguagens são bastante pobres em termos de expressões, quantidade de termos e facilidades de construção de frases.

Entretanto, quando os primeiros computadores foram construídos a única linguagem entendida por eles era a binária. Sequências intermináveis de uns e zeros, algo assim como

00000000001010101111110011111000101010100001111010100011. Chamou-se a isto, mais tarde, linguagem de primeira geração.

A seguir, o primeiro melhoramento: o assembler ou montador, que era um programa capaz de entender instruções escritas em uma linguagem um pouco mais humana, e traduzir cada uma destas instruções em sua expressão binária correspondente. Junto com este programa criou-se a primeira linguagem: o assembler, até hoje utilizado, ainda que muito raramente e que simboliza a segunda geração de linguagens. Programar em assembler exige muito conhecimento e paciência, a máquina precisa ser conhecida em inúmeros detalhes de construção, os programas são longos e difíceis, principalmente sua manutenção. Mas esta é a linguagem mais eficiente do ponto de vista dos consumos dos recursos de máquina, isto é, ela gera programas velozes e pequenos.

Depois, vieram as linguagens de terceira geração: a primeira foi o FORTRAN, depois COBOL, PL/I, ALGOL, PASCAL, C e outras menos votadas: BASIC, ADA, APL. Há um distanciamento do programador em relação à máquina, e uma aproximação do mesmo em relação ao problema a resolver. Estas linguagens são mais fáceis de aprender e embora gerem programas maiores e mais lentos, aumentam em muito a produtividade humana de escrever código de programação.

As linguagens de quarta geração tem as seguintes características: facilidade para criar e gerir banco de dados; são implementadas de forma interpretada, são consideradas amigáveis (user friendly), geram relatórios e entrada de dados de forma automática e tem facilidade de pesquisas. Um exemplo é a ferramenta ACCESS. Existem, também, as linguagens voltadas para objetos como VISUAL BASIC, VISUAL C entre outras. E a evolução continua...

Antes de iniciar o estudo de programação, é necessário considerar que um computador nada mais é do que uma ferramenta utilizada para solucionar problemas que envolvam a manipulação de informações, sendo que estas informações classificam-se a grosso modo em dois tipos básicos: dados e instruções (ou comandos).

Os dados são representados pelas informações a serem tratadas ou processadas por um computador As instruções ou comandos são representadas pelo conjunto de palavras-chave (ou vocabulário) de uma determinada linguagem de programação, que tem por finalidade comandar em um computador o seu funcionamento e a forma como os dados armazenados deverão ser tratados.

Para se criar um programa que seja executável dentro de um computador, deve-se ter em mente três pontos de trabalho: a entrada de dados, o seu processamento e a saída dos mesmos. Sendo assim, todo programa estará trabalhando com estes três conceitos. Se os dados forem entrados de forma errada, serão processados de forma errada e consequentemente, resultarão em respostas erradas. Desta forma, dizer a alguém que foi erro do computador é ser um tanto “medíocre”, se houve algum erro, é porque foi causado por falha humana. Realmente é impossível um computador errar por vontade própria, pois vontade é uma coisa que os computadores não tem.

ALGORITMOS

Segundo mestre Aurélio, algoritmo é “processo de cálculo, ou de resolução de um grupo de problemas semelhantes, em que se estipula, com generalidade e sem restrições, regras formais para a obtenção do resultado ou da solução do problema”.

Do ponto de vista da informática, algoritmos é a regra de solução de um problema, isto é, surgida uma necessidade buscar-se-á uma solução, ou construir-se-á um algoritmo capaz de solucionar o problema.

Já um programa de computador, segundo Wirth, “é um formulação concreta de algoritmos abstratos, baseados em representações e estruturas específicas de dados”. Isto é:

PROGRAMA = ALGORITMOS + ESTRUTURAS DE DADOS

Outra definição de algoritmos, esta dos autores Angelo Guimarães e Newton Lages: “algoritmo é a descrição de um padrão de comportamento, expressado em termos de um repertório bem definido e finito de ações primitivas, das quais damos por certo que elas podem ser executadas.”

O conceito de algoritmo deve ser entendido, para sua correta compreensão, em seus dois aspectos, a quem chamaremos estático e temporal. Na visão estática, um algoritmo é um conjunto de ordens, condições, testes e verificações. No seu aspecto temporal, o algoritmo passa a ser vivo, pois atual sobre um conjunto de dados de entrada, para gerar os correspondentes dados de saída.

Tais características não podem ser separadas, elas estão intrinsecamente ligadas. A dificuldade em fazer bons algoritmos é ter em mente, enquanto se escreve o algoritmo (aspecto estático) o que ele vai fazer com seus dados (aspecto temporal).

LÓGICA

Lógica é definida basicamente como sendo o estudo das leis do raciocínio e do modo de aplicá-las corretamente na demonstração da verdade. Chamamos de algoritmo lógico aquele algoritmo cujas instruções estão dispostas ordenadamente e de maneira compreensível por qualquer pessoa que possua conhecimento básico sobre o assunto. Isto é, um algoritmo deve ser facilmente entendido, sem que seja necessária uma grande perda de tempo para a tradução da idéia contida no mesmo. Um algoritmo lógico deve ser, também, formado apenas pelo número mínimo de instruções necessárias para a resolução do problema referido.

Cada pessoa analisa um problema de uma forma diferente, há uma certa tendência em complicar a sua solução. Sendo assim, deve-se pensar muito na solução desejada, analisando todas as possibilidades, ao invés de utilizar a primeira solução que vier à cabeça, sob pena de complicar o algoritmo de tal modo, que quando for necessária uma modificação, gastar-se-á mais tempo tentando entendê-lo do que criando-o novamente com as alterações desejadas. Porém, o problema da complexidade não está presente apenas na elaboração do algoritmo, mas também na sua codificação em uma determinada linguagem de programação.

PROGRAMAÇÃO ESTRUTURADA

O termo programação estruturada nasceu nos fins da década de 60, quando Edsger Dijkstra escreveu um artigo publicado pela Communications of the ACM, cujo título é “O comando GOTO é prejudicial”. Dijkstra observou que a qualidade dos programadores decai em função do número de GOTO’s usados em seus programas. Segundo ele, “comandos GOTO’s tendem a criar caminhos de lógica confusos e programas pouco claros”. A sua recomendação foi de que o comando em questão fosse excluído das linguagens de programação de alto nível.

Nessa época também, (1966) dois professores italianos G. Jacopini e C. Bohm, provaram matematicamente que qualquer lógica de programação poderia ser derivada de três tipos básicos de procedimentos, como se vê na figura a seguir.

AS 3 FERRAMENTAS DA PROGRAMAÇÃO ESTRUTURADA

SEQUÊNCIA SIMPLES IF-THEN-ELSE DO-WHILE

A importância desta descoberta para o software teve tanto impacto quanto a de que qualquer forma lógica de hardware pode ser construída pelas combinações das portas AND, OR e NOT.

A programação estruturada pode ser definida basicamente como sendo uma técnica de programação, na qual a construção de um programa é feita com base nas estruturas simples de controle definidas acima. A rigidez imposta por estas estruturas é um fator importante para a compreensão do programa, pois uma vez que não existem comandos de desvios (GOTO), o programador é obrigado a utilizar uma lógica coerente que se adapte às estruturas. Desse modo o programa torna-se inteligente, já que não é possível criar códigos que abram margem para uma falta de ordenação na lógica, códigos absurdos, programas poluídos e de difícil compreensão.

Com a utilização da programação estruturada um programa tem, obrigatoriamente, início, meio e fim, pois não existem desvios, as estruturas devem ser dispostas numa ordem tal que, chegando ao final do código, um processamento completo tenha sido executado. Como se fosse uma caixa preta, com somente uma entrada e uma saída.

PORQUE O PORTUGOL ?

Portugol é uma técnica narrativa denominada pseudo-código, também conhecida como português estruturado. Esta técnica de algoritmização é baseada em uma PDL – Program Design Language (Linguagem de Projeto de Programação). A forma original de escrita é conhecida como inglês estruturado, muito parecida com a notação da linguagem Pascal. A PDL é usada como referência genérica para uma linguagem de projeto de programação, tendo como finalidade mostrar uma notação para elaborações de algoritmos, os quais serão utilizados na definição, criação e desenvolvimento de uma linguagem computacional (Pascal, C, Delphi, Visual-Objects, Clipper) e sua documentação. A diferença entre uma linguagem de programação de alto nível utilizada em computação e uma PDL, é que esta não pode ser compilada em um computador.

Existem inúmeras versões de Portugol, cada professor tem a sua, assim como cada empresa pode definir um pseudo-código. É importante salientar que a sintaxe e a semântica da construção de Portugol são arbitrados por alguém, segundo seus critérios, mas UMA VEZ ESTABELECIDO UM PADRÃO, ELE PRECISA SER RELIGIOSAMENTE SEGUIDO.

Esta restrição tem duas vertentes: - há que haver um mínimo de concordância para que outras pessoas possam ler e entender o que escrevermos.

- uma das principais características de um bom programador é a disciplina intelectual.

O português, como qualquer outra linguagem natural, tem inúmeras desvantagens. Não é entendido pela máquina, sua tradução é bastante complexa, é ambíguo podendo gerar interpretações errôneas, e é muito extenso. Logo, não é um linguajar adequado para expressarmos algoritmos. Devemos lembrar sempre que a margem de interpretação do computador é sempre ZERO.

Já um linguagem de programação, mesmo que de alto nível, como o Pascal ou o C, exigem um conhecimento da máquina que ainda não temos. Também é importante salientar que idealmente falando, não é uma boa política enfrentar dois problemas interligados ao mesmo tempo. Isto é, não convém misturar dificuldades lógicas com dificuldades da linguagem de programação. Já dizia Dijkstra “(devemos) reconhecer que temos uma cabeça pequena, e que é melhor tratar de conviver com ela e respeitar suas limitações” e que “a regra áurea da programação estruturada é DIVIDIR PARA REINAR.”

Nossos programas em Portugol vão deixar de lado inúmeras tarefas que são imprescindíveis para o programa rodar em um computador, tais como: instruções de ambientação na compilação de programas, descrições de operações de entrada/saída complexas, pouca ou nenhuma preparação de contadores e chaves, etc.

Para tanto, existe uma disciplina anexa a esta, onde vai se aprender a linguagem de programação. Neste momento, então, a preocupação passa a ser a máquina e não mais a lógica do algoritmo que já deve estar consolidado.

OUTRAS FERRAMENTAS DE REPRESENTAÇÃO DE ALGORITMOS

Além do Portugol existem outras formas de representar algoritmos, podendo-se citar duas outras linguagens: fluxogramas e diagramas de Chapin.

Os fluxogramas tem importância histórica em processamento de dados, pois foi a primeira representação de programas. Ela foi desenvolvida pelos profissionais de análise de sistemas e por alguns profissionais de Organização, Sistemas e Métodos. Tem como finalidade descrever fluxos, manual ou mecânico, especificando os suportes usados para os dados e as informações. Usa símbolos convencionais, permitindo poucas variações. Esta ferramenta perdeu sua condição de única ferramenta em uso, entre outras razões, pelas seguintes:

- permite a construção de algoritmos não estruturados, logo não servem para o contexto da programação estruturada;

- exigem capricho, demandando muito trabalho para serem feitos e mantidos;

- como só se escreve dentro dos quadrinhos, é necessário muito papel para definir um algoritmo completo, além de dificultar o manuseio;

- mesmo com o advento de programas para trabalhar fluxograma, como Flowchart, Autoflow e outros, eles não são muito práticos para este trabalho.

Outra possibilidade de representação é através dos diagramas de Chapin ou estructogramas que foram desenvolvidos por Nassi e Schneiderman e ampliado por Ned Chapin, os quais resolveram substituir o fluxograma tradicional por um diagrama de quadros que permite apresentar uma visão hierárquica e estruturada da lógica do programa. A grande vantagem de usar este tipo de diagrama é a representação das estruturas que tem um ponto de entrada e um ponto de saída e portanto, são compostos pelas estruturas básicas de controle da programação estruturada. Enquanto é difícil mostrar o embutimento e a recursividade com o fluxograma tradicional, torna-se mais simples mostrá-los com o diagrama de Chapin, bem como, codificá-los em qualquer linguagem de programação estruturada. Porém, alguns autores consideram esta ferramenta um pseudo-código como o Portugol, apenas escrito de maneira diferente, assim, não será tratada esta representação aqui.

Para representar as estruturas de comando de forma completa, elas serão apresentadas no formato Portugol e Fluxograma.

Exemplo: Definir um algoritmo que leia dois valores A e B e imprimia o produto entre eles se A for par e imprima o somatório deles se A for impar.

|FLUXOGRAMA |DIAGRAMA DE CHAPIN |PORTUGOL |

| | | | | |

| | | | | |

| | | | |inicio |

| | | | |A,B,C : inteiro; |

| | | | |leia (A); |

| | | | |leia (B); |

| | | | |se A mod 2 = 0 |

| | | | |então C ( A * B; |

| | | | |senão C ( A + B; |

| | | | |fimse; |

| | | | |imprima ( C ); |

| | | | |fim. |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | | | | |

| | |leia A | | |

| | |leia B | | |

| | |A é par ? | | |

| | | | | |

| | |C = A * B |C = A + B | | |

| | |imprima C | | |

| | | | | |

| | | |

O PORTUGOL

A seguir as principais regras de sintaxe e de construção da linguagem Portugol:

IDENTIFICADOR

O elemento básico da linguagem é o identificador. Sua construção é dada pelo diagrama a seguir:

Considerando-se:

Letra - 26 letras do alfabeto maiúsculas

Dígitos - 0 a 9

Deve-se atentar que o branco não faz parte do rol de caracteres válidos, o que faz com que o identificador não possa ser constituído de mais de uma palavra. Pode-se utilizar, neste caso, o separador “_ “ , chamado sublinha ou underscore.

Exemplos válidos : NOME

SOMA_TERMOS

RAIZ1

X234

SALDO01

Exemplos não válidos : SALDO DEVEDOR

123SALDO

Regras de bom senso para batizar o identificador:

1. cada identificador deve ter seu nome o mais próximo possível de sua função;

2. o identificador não deve ser tão pequeno que fique impossível identificá-lo pelo nome, nem tão longo que seja cansativo de escrevê-lo

3. padronizar os identificadores, em algoritmos, sempre em letras maiúsculas para facilitar a análise do mesmo. Ainda que as linguagens de programação façam diferenciação entre letras maiúsculas e minúsculas.

VARIÁVEIS

Variável é algo que pode ser alterado, isto é, não é constante. Variáveis de memória são endereços da memória RAM (Randomic Access Memory) do computador, onde são armazenados temporariamente os dados utilizados por um programa durante seu processamento, e que, como diz o próprio nome, podem ter seus conteúdos alterados durante o processamento do programa.

Para se utilizar o conceito de variável, imagine que a memória de um computador é um grande arquivo com várias gavetas, onde cada gaveta pode apenas armazenar um único valor por vez , seja ele inteiro, real, caracter ou lógico. Se é um grande arquivo com várias gavetas há que se concordar que é necessário identificar com um nome a gaveta que se pretende utilizar. O nome de uma variável é utilizado para sua identificação e posterior uso dentro de um programa, desse modo não é necessário saber a posição de cada byte (informação) dentro da memória do computador

Quando é feita a definição de variáveis no algoritmo, necessita-se indicar o nome que será dado a variável (identificador) e qual o tipo de informação que ela irá conter. Dependendo do tipo de informação será designado um espaço maior ou menor de memória onde ocorrerá o armazenamento.

TIPOS DE VARIÁVEIS

Existem quatro tipos básicos de variáveis em Portugol: INTEIRO, REAL, CARACTER E LÓGICO. Estes tipos também são conhecidos como tipos primitivos de dados.

O tipo de dado INTEIRO é uma variável numérica que pode conter números inteiros, positivos ou negativos.

O tipo de dado REAL é outra variável numérica que pode conter qualquer número real, isto é, inteiro, fracionário, positivo ou negativo.

Tipo de dado CARACTER é uma variável que pode armazenar em seu conteúdo todas as letras do alfabeto, todos os algarismos e todos os caracteres especiais (& # @ ? *, etc). Uma variável do tipo caracter não pode ser utilizada em expressões aritméticas, mesmo que contenha apenas algarismos.

São caracterizados como tipos LÓGICOS os dados com valores VERDADEIRO e FALSO sendo que este tipo de dado poderá representar apenas um dos dois valores por vez. Ele é chamado por alguns de tipo booleano, devido à contribuição do filósofo e matemático George Boole na área da lógica matemática.

O tipo caracter traz consigo uma pequena dificuldade, que é a necessidade de estabelecer qual o seu tamanho máximo, em número de caracteres. Esta atitude é necessária para informar a quem lê o algoritmo quanto de espaço reservar para conter esta variável. Os outros tipos de variáveis tem tamanho pré-determinados e fixos.

Uma variável quando é definida ganha um tipo de dado, e posterior referências de valor a esta variável deverão respeitar seu tipo de dado original.

A forma de definir variáveis dentro de um algoritmo é:

ATRIBUIÇÃO

O comando de atribuição é aquele que permite colocar valores nas variáveis ou alterar seu conteúdo, obedecendo o tipo de dado definido para ela. Para tanto usaremos o símbolo ( . Sua sintaxe é:

O novo valor atribuído à variável é feito durante o processamento do programa utilizado e pode ser uma constante, o resultado de uma expressão ou o valor de outra variável.

Exemplo:

A ( 1

B ( 1 + 2

É importante notar que:

- a expressão que se encontra do lado direito da atribuição deve ser compatível com o tipo de dado definido para a variável;

- na atribuição de variável inteira, a expressão deverá ser uma expressão inteira, isto é, sem parte fracionária;

- na atribuição de variáveis do tipo real, a expressão deverá ser numérica, sem nenhuma outra restrição;

- na atribuição de variáveis caracter o valor deverá estar envolvido por aspas “. Ele nunca poderá ter um tamanho maior do que aquele estabelecido para a variável. Se isto acontecer, o valor será truncado.

- na atribuição de variáveis lógicas deveremos usar as palavras VERDADEIRO e FALSO, ou quando não houver risco de confusão, podemos usar as abreviaturas V e F.

Exemplo:

A ( “1 “ ; inteiro ou caracter

B ( “V” ; caracter ou lógico

OPERADORES

Operadores são símbolos utilizados em expressões que contêm variáveis, constantes e funções. De acordo com os tipos de dados das variáveis e o resultado da operação, os operadores dividem-se em três tipos:

- aritméticos

- relacionais

- lógicos

ARITMÉTICOS

São aqueles que atuam apenas sobre constantes, variáveis e funções numéricas, gerando um resultado numérico em uma expressão. São eles:

|+ |adição |

|- |subtração binária |

|* |multiplicação |

|/ |divisão |

|** |exponenciação |

|- |menos unário |

Pode-se também utilizar as funções matemáticas usuais e as conhecidas da linguagem de programação, como:

sen(x), cos(x), abs(x), int(x), frac(x), log(x), sqrt(x)

RELACIONAIS

São aqueles que realizam uma comparação entre duas expressões e geram resultados lógicos, isto é Verdadeiro ou Falso, são eles:

|= |igual |

| ou ( |diferente |

|> |maior que |

|< |menor que |

|>= ou ( |maior ou igual |

| Maior |

| |E : V somente quando ambos os operandos são V |< Menor |

|Comando de atribuição | |= Igual |

| |V E V é V |( Maior ou igual |

|ident ( expressão; |V E F é F |( Menor ou igual |

| |F E V é F | Diferente |

|Expressão pode ser somente valor. |F E F é F |8. Operadores lógicos |

|Deve ser compatível com o tipo da variável. | |E |

|Se tipo for caracter deve ser entre aspas e com tamanho | |OU |

|compatível. | |NÃO |

|Se for tipo lógico somente V ou F. | |9. Operações de mesma prioridade são resolvidas da direita |

| | |para a esquerda. |

EXERCÍCIOS

1. Informe o valor esperado para a variável VAR1

VAR1 ( (1 + (2 * (3 + 1) / 2 )) - 2

VAR1 ( 3 ** 3

VAR1 ( 2 * int(1,999)

VAR1 ( abs( - (3 - 4))

VAR1 ( int (1,5) - frac(1,.5)

VAR1 ( 2 / (2 * 3)

2. Quanto é 400 MOD 51

a. 30 MOD 7

b. (5 MOD 4) + (22 DIV 10) + (3 MOD 2)

c. 4376 MOD 10

d. 4376 MOD 100

e. 4376 MOD 1000

f. 4376 MOD 10000

3. Informe qual o valor da variável VAR2

VAR2 ( VERDADEIRO

VAR2 ( NAO FALSO

VAR2 ( NAO NAO VERDADEIRO

VAR2 ( FALSO OU FALSO

VAR2 ( VERDADEIRO E (NAO VERDADEIRO)

VAR2 ( (NAO FALSO) OU (NAO VERDADEIRO)

VAR2 ( (FALSO OU VERDADEIRO) E (NAO VERDADEIRO)

VAR2 ( FALSO E FALSO

VAR2 ( VERDADEIRO E VERDADEIRO

4. Informe qual o valor final para VAR3

VAR3 ( (3 ( 2) OU (1 = 3)

VAR3 ( (1 + 1) = (3 - 1)

VAR3 ( (int (1,5 * 4) > 6) E (1 2)

5. Informe qual o valor para VAR4

VAR4 ( ( frac(0,999) - 1) > 0

VAR4 ( 1 = 2

VAR4 ( 1 + 2 = 2

VAR4 ( 0.5 ( 2.5 - int(2,900)

VAR4 ( 3 > 1 + 1

VAR4 ( 1 + 3 * 4

VAR4 ( 2 ** 3 * 2 + 1

VAR4 ( 1 * 2 * 3 * 4 * 0 + 1

VAR4 ( 33 > (32 + int(2,45) - frac(0,5))

VAR4 ( (4 ** (2 / 2 ** 2) ( 3,5) E ( 1 = 3 ** 0)

6. Assinalar com um X os identificadores válidos:

|( ) VALOR |( ) NOMEMP |( ) MARIA |

|( ) "NOTA" |( ) SALA215 |( ) B248 |

|( ) X2 |( ) AH! |( ) KM/H |

| |( ) M{A} |( ) XYZ |

|( ) SAL_LIQ |( ) A1B2C3 |( ) NOTA*DO*ALUNO |

|( ) 3 X 4 |( ) "NOME" | |

| | | |

7. Considerando P = 3; Q = 4; R = 12 e S = 45; NOME = "MIRIAM"; PROFISSAO = "MEDICO", qual o valor de RESP em cada uma das expressões abaixo:

a. RESP ( 100 * (Q div P ) + R

b. RESP ( (P + 1 >= SQRT(Q)) e NOME "ANA" e PROFISSAO = "MEDICO"

c. RESP ( P * ( R mod 5) - Q / 2

d. RESP ( (S mod (P + 1)) - Q * R

e. RESP ( PROFISSAO = "MEDICO" ou (Q mod P) = 0

8. Sendo: SOMA, NUM, X variáveis numéricas

NOME, COR, DIA variáveis caracter e

TESTE, COD, TUDO variáveis lógicas,

assinalar os comandos considerados inválidos:

| ( ) NOME ( 5; | ( ) X ( NOME >= COD; |

|( ) SOMA ( NUM + 2 * X; |( ) SOMA + 2 ( X ** 2 - SQRT( NUM); |

|( ) TESTE ( COD ou X ** 2 SOMA; |( ) DIA ( "SEGUNDA"; |

|( ) TUDO ( SOMA; |( ) NUM ( "*ABC*"; |

|( ) COR ( "PRETO" - SQRT(X) |( ) X ( X + 1 |

9. Considerando: A = 3; B = 16, NOME = "ANA", PROFISSAO = "ADVOGADO", TESTE= F

avaliar as expressões abaixo e dar sua resposta:

a. SOL ( A + 1 >= SQRT(B) ou NOME "ANA";

b. SOL ( não TESTE = V e (A + 5 = B) ou não PROFISSAO = "MEDICO";

c. SOL ( PROFISSAO = "MEDICO" ou TESTE = F;

d. SOL ( A mod 2 + 25 div B;

e. SOL ( A + B * 2 > 10

10. Informar o valor da variável R, em cada item, após a execução da seguinte sequência de operações:

a) R ( 3,0 * 6;

b) X ( 2,0;

Y ( 3,0;

R ( X ** Y – X;

c) R ( 4;

X ( 2;

R ( R * X;

|RESPOSTA |a) |b) |c) |

11. Informar o valor da variável R, em cada item, após a execução da seguinte sequência de operações:

a) R ( 1 * 1,78 / 3;

b) B ( 2;

A ( 40 – B ** 2;

R ( int (3,1416) + A * 5;

c) R ( 9 – 18;

R ( abs ( -6 + int(3,4)) – R;

QUALIDADES DE UM BOM ALGORITMO

1. Clareza – o algoritmo é uma ferramenta de entendimento e solução de um problema, deve portanto, ser o mais claro possível. O autor deve preocupar-se constantemente se o que está pensando está visível no que está escrevendo;

2. Impessoalidade - não usar macetes, regras pessoais e nomes que só tem sentido para o autor, muitas vezes quem vai examinar, depurar, corrigir, alterar o algoritmo não é seu próprio autor. Neste ponto os CPD’s bem organizados definem um conjunto de normas de codificação e de elaboração de algoritmos;

3. Simplicidade – o algoritmo deve ter por princípio a simplicidade, logo transformar algo complicado em soluções simples, parece ser a diferença entre programadores comuns e grandes programadores;

4. Não reinvenção da roda – fazer uso do conceito de biblioteca de algoritmos. O programador não deve esquecer de que um algoritmo novo custa caro para ser feito, e muito mais caro ainda para ser depurado, então, caso exista um pronto este deve ser utilizado;

5. Capricho – a principal função de um algoritmo é transmitir a solução de um problema para outra pessoa. Desta forma a letra clara, uso de endentação, nomes bem atribuídos, papel limpo e sem borrões deve ser de uso constante;

6. Documentação – nem sempre o Portugol é bastante claro, além do que ele informa o que é feito e não porque é feito. Assim deve-se lançar mão de comentários sempre que necessário. O símbolo de comentário em algoritmo é { }, isto é, tudo que estiver entre as chaves é um comentário.

BLOCOS

Um bloco é um conjunto completo de comandos para resolver um determinado problema. Graficamente falando um bloco sempre começa pela palavra INICIO e termina pela palavra FIM. Entre estes dois limites existem duas partes:

definição de variáveis – que serve para definir as variáveis que serão utilizadas no bloco;

comandos – que define quais os comandos que fazem parte deste bloco.

|FLUXOGRAMA |PORTUGOL |

| | |

| | |

| | |

| | |

| | |

| |INICIO |

| |; |

| |; |

| |FIM. |

| | |

Exemplo:

calcular a área de um retângulo

inicio

A, B, AREA : real;

AREA ( A * B;

fim.

SEQUÊNCIA SIMPLES

Trata-se de um conjunto de comandos simples, que seguem um ao outro e que são executados na ordem em que aparecem. Exemplo:

A ( 10;

B ( A + 5;

X ( 1 + 2;

Cada comando simples é escrito em uma linha e sempre termina por um ponto e vírgula ( ; ), o que é considerado uma instrução sequencial. Dentro de uma sequência simples de comandos a entrada é sempre pelo primeiro comando e a saída sempre pelo último comando.

|FLUXOGRAMA |PORTUGOL |

| | |

| |..... |

| | |

| |< comando 1 >; |

| | |

| |< comando 2 >; |

| | |

| |........ |

| | |

| |< comando n >; |

| | |

| | |

| |.... |

Exemplo:

calcular a área de um triângulo:

inicio

B, H, AREA : real;

leia (B); {base}

leia (H); {altura}

AREA ( ( B * H ) /2; {calcula a área}

imprima (AREA);

fim.

COMANDOS DE ENTRADA E SAÍDA

A maioria dos algoritmos que escrevemos necessita receber dados externos, e em algum momento necessitará comunicar respostas, para tanto usamos os comandos de entrada e saída. Para resolver estes dois problemas existem os chamados comandos de entrada/saída (E/S).

Desprezando as complexidades inerentes a um processo de transferência de dados em um computador real, uma vez que cada linguagem trata os dispositivos de E/S de forma diferenciada e o algoritmo deve ser capaz de ser traduzido para qualquer linguagem de programação, os comandos que serão usados são dois: leia e imprima.

O comando LEIA significa uma entrada de dados, realizada através de um dispositivo externos de entrada de dados, para o algoritmo, isto é, o valor não é gerado por um comando ou expressão do algoritmo utilizado. O dispositivo de entrada utilizado, isto é, se os dados entrarão via teclado, mouse, leitura de disco ou linha telefônica, não irá interferir no algoritmo.

Da mesma forma, para a saída dos dados usaremos o comando IMPRIMA, e também não importa, à nível de algoritmo, para qual dispositivo externo de saída de dados os mesmos serão enviados: terminal de vídeo, impressora, plotter, gravado em disco ou linha telefônica. A saída de dados consiste na exibição do conteúdo de uma variável ou constante, do resultado de uma expressão ou de uma mensagem.

A sintaxe destes comandos é:

Entrada de dados:

leia (, , ..., ) ;

Saída de dados:

imprima (, , ..., );

{conteúdo do identificador}

imprima (); {resultado da expressão numérica}

imprima( “cadeia de caracteres”); {caracteres existentes entre os aspas}

Obs: - em geral, dados que serão lidos não precisam ser inicializados;

- os valores a serem impressos devem ser inicializados e/ou calculados antes da impressão.

Exemplo:

inicio

VALOR1, VALOR2 : inteiro;

leia (VALOR1);

VALOR2 ( VALOR1 * 2;

imprima (“o valor primeiro é “, VALOR1);

imprima (“o valor segundo é”, VALOR2);

imprima (“a soma dos dois é “, VALOR1 + VALOR2);

fim.

|FLUXOGRAMA |PORTUGOL |

| | |

| | |

| | |

| |LEIA (var 1, ..., var n); |

| | |

| | |

| | |

| |IMPRIMA (var 1, ... , var n); |

| | |

| |ou |

| | |

| |IMPRIMA (“mensagem”, var ); |

EXERCÍCIOS

1. Fazer um algoritmo que calcule o volume de uma esfera em função do raio R.

V = 4 /3 ( R**3

2. Criar algoritmos em Portugol para fazer as seguintes conversões:

a) Ler uma temperatura dada na escala Celsius e imprimir a equivalente em Fahrenheit

(F = 9/5 * C + 32)

b) Ler uma quantidade de chuva em polegadas e imprimir a equivalente em milímetros

(25,4 mm = 1 polegada)

c) Ler um valor referente ao resultado de salto em altura, relatado em metros, e converter para pés e polegadas (1 pé = 12 polegadas e 1 metro = 39,37 polegadas)

d) Ler um tempo para uma corrida de 100 metros e calcular seu tempo para 100 jardas, supor que o atleta corra a uma velocidade constante ( jarda = 0,9144 metros)

3. O custo ao consumidor de um carro novo é a soma do custo de fábrica com a percentagem do distribuidor e dos impostos (aplicados ao custo da fábrica). Supondo que a percentagem do distribuidor seja de 12% e os impostos de 45%, preparar um algoritmo portugol para ler o custo de fábrica do carro e imprimir o custo ao consumidor.

4. O cardápio de uma casa de hamburger é dado abaixo. Preparar um algoritmo portugol para ler a quantidade de cada item comprado e calcular a conta ao final.

Mona’s Burgers

Hamburger (R$ 2,50)

Cheeseburger (R$ 3,30)

Batata Frita (R$ 1,50)

Refrigerante (R$ 0,60)

Milkshake (R$ 1,70)

O algoritmo deve ter uma variável para cada item para ler a quantidade e multiplicar pelo preço do respectivo item, somando tudo ao final, incluindo, também, os 10% dos serviços.

5. Preparar um algoritmo portugol para ler o comprimento dos 3 lados de um triângulo (S1, S2 e S3) e calcular a área do triângulo de acordo com a fórmula.

3

Area = ( T ( T - S1) ( T - S2) ( T - S3)

onde T = ( S1 + S2 + S3) / 2

6. Preparar um algoritmo que leia os valores referentes aos 2 catetos de um triângulo retângulo e calcular o valor de sua hipotenusa.

7. Preparar um algoritmo que leia o tempo e distância percorridos por um veículo e calcule sua velocidade média.

8. Preparar um algoritmo que leia as 4 notas bimestrais de um aluno e calcule sua média anual.

9. Preparar um algoritmo que leia o mês e ano de nascimento de um indivíduo e calcule sua idade em meses com base na data atual.

10. Preparar um algoritmo que leia a hora e minuto de início de uma aula e imprima a hora e minuto de término desta aula, sabendo que a aula é de 50 minutos.

11. Preparar um algoritmo que leia 5 valores e imprima a média aritmética entre eles.

12. Dado um número inteiro de 3 algarismos, inverter a ordem de seus algarismos. Os três algarismos do número dado são diferentes de zero.

13. Dado um número de 3 algarismos construir outro número de 4 algarismos de acordo com a seguinte regra:

a) os 3 primeiros algarismo, contados da esquerda para a direita são iguais aos do número dado;

b) o quarto algarismo é um dígito de controle calculado da seguinte forma: primeiro algarismo + segundo algarismo * 3 + terceiro algarismo * 5; o dígito de controle é igual ao resto da divisão dessa soma por 7.

14. Dadas duas frações ordinárias a/b e c/d, determinar a sua soma e o seu produto.

15. Dado um número inteiro que representa um número binário de cinco dígitos, determinar o seu equivalente decimal.

16. Dados o primeiro termo e a razão de uma progressão aritmética, determinar a soma de seus primeiros cinco termos.

17. Dado um número inteiro de segundos determinar o seu valor equivalente em graus, minutos e segundos. Se a quantidade de segundos for insuficiente para dar o valor em graus, o valor em graus deve ser zero. A mesma observação continua válida em relação a minutos e segundos. Por exemplo: 3600 segundos = 1 grau, 0 minutos, 0 segundos; 3500 segundos = 0 graus, 58 minutos, 20 segundos.

18. Fazer um algoritmo que leia a hora e o minuto de início de uma aula e imprima a hora e o minuta de término desta aula, sabendo que a aula é de 50 minutos.

ALTERNATIVA SIMPLES

Existem oportunidades em que determinados comandos dentro de um algoritmo devem ser executados caso certas condições o permitirem, em outras condições nada se executa. Por exemplo: na solução de uma equação do segundo grau, no momento de extrair a raiz quadrada de Delta, só pode-se fazer caso Delta seja positivo. Se Delta for menor do que zero, a raiz não pode ser extraída, e convém executar outros comandos.

O comando Portugol que identifica uma ação condicional é o Se, que tem a seguinte sintaxe:

Se

então ;

fimse;

A condição é uma expressão cujo resultado final é do tipo lógico (V ou F).

A ação pode ser um comando simples ou uma sequência de comandos.

Semântica - se o resultado da condição que acompanha o SE for V, os comandos internos ao ENTÃO devem ser executados;

caso contrário, se o resultado da condição que acompanha o SE for F, todos os comandos internos ao ENTÃO devem ser desprezados até encontrar o FIMSE correspondente.

Exemplo:

se DELTA < 0

então imprima (“não é possível extrair a raíz”);

fimse;

Para facilitar a compreensão e a visualização do início e do final de cada estrutura, utiliza-se o artifício de deslocá-las à direita, de forma que uma estrutura fique dentro da outra, também conhecida como endentação. Costuma-se endentar os comandos subordinados a uma condição SE, isto é, comandos internos ao ENTÃO. E a margem deve ser trazida ao que era antes do comando SE, apenas quando for escrita a palavra FIMSE correspondente.

|FLUXOGRAMA |PORTUGOL |

| | |

| | |

| | |

| | |

| |SE |

| | |

| |ENTÃO < comando 1>; |

| |< comando 2>; |

| |..... |

| |; |

| | |

| |FIMSE; |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

Cada SE deve ter um FIMSE correspondente. Ao percorrer o fluxo de controle do algoritmo, encontrando-se um FIMSE este sempre refere-se ao último SE aberto.

ALTERNATIVA COMPOSTA

É uma extensão da alternativa simples, neste caso temos determinar o que fazer se a condição for verdadeira, e o que fazer se a condição for falsa. O formato deste comando é:

Sintaxe: Se

então ;

senão ;

fimse;

Semântica: se a condição contida no comando SE for verdadeira são executados os comandos internos ao ENTÃO, e os comandos internos ao SENÃO são desprezados até encontrar o FIMSE correspondente;

caso contrário, se a condição contida no comando SE for falsa, os comandos internos ao ENTÃO são desprezados e os comandos internos ao SENÃO são executados até encontrar o FIMSE correspondente.

Neste caso a endentação também é importante, os comandos SE e FIMSE começam na margem corrente, os comandos internos ao ENTÃO e ao SENÃO ficam endentados.

Exemplo:

DELTA ( 4 * A * C - B ** 2;

se DELTA < 0

então imprima (“raízes imaginárias”);

senão X ( DELTA ** 0.5;

fimse;

|FLUXOGRAMA |PORTUGOL |

| | |

| | |

| | |

| | |

| |SE |

| | |

| |ENTÃO < comando 1>; |

| |< comando 2>; |

| |..... |

| |; |

| | |

| |SENÃO < comando 11>; |

| |< comando 22>; |

| |..... |

| |< comando nn>; |

| | |

| |FIMSE; |

| | |

| | |

| | |

| | |

| | |

| | |

ANINHAMENTO

Os algoritmos podem ser formados por diversas estruturas, cada uma com uma função específica. Existem casos em que uma estrutura poderá estar dentro de outra, e a isto dá-se o nome de aninhamento. Nada impede que exista uma condição dentro de outra, e isto também poderá ocorrer com as próximas estruturas de comando.

Não existe um limite para o número de estruturas que podem ser colocadas dentro de uma outra estrutura qualquer, mas se o número for muito grande, a compreensão e a visualização serão prejudicadas. Para facilitar a compreensão e a visualização do início e do final de cada estrutura, utiliza-se o artifício da endentação.

Nos casos em que são necessárias muitas estruturas internas, a solução é a utilização do processo de modularização do algoritmo, assunto que será tratado mais para frente.

Exemplo:

|SEM IDENTAÇÃO |COM IDENTAÇÃO |

|Se A 0 |Se A 0 |

|então B ( 0; |então B ( 0; |

|se C 0 |se C 0 |

|então D ( 0; |então D ( 0; |

|F ( 3; |F ( 3; |

|fimse; |fimse; |

|G ( 77; |G ( 77; |

|fimse; |fimse; |

Uma regra importante que deve ser sempre seguida, é a de que o início e o final da estrutura mais interna devem ser sempre dentro da estrutura imediata que a contém.

|VÁLIDO |INVÁLIDO |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

NEGAÇÃO DOS OPERADORES

Relembrando as operações lógicas, elas tem como operadores os valores Verdadeiro e Falso e as operações E, OU e NÃO. Usando tais operações em conjunto com os comandos SE simples ou composto, além dos operadores relacionais, pode-se criar trechos de algoritmos muito ricos.

Exemplos:

a) Definir se um valor esta compreendido entre 10 e 35:

se VALOR > 9 e VALOR < 3

então imprima (“Valor OK”);

senão imprima (“Valor errado”);

fimse;

b) Definir se um valor numérico representativo de um mês está correto

se MÊS > 0 e MÊS < 13

então imprima (“mês correto”);

senão imprima (“mês incorreto”);

fimse;

c) Um certo código pode assumir os seguintes valores: 10, 15, 17, 18 e 30. Testar se ele está ou não correto

se COD = 10 ou COD = 15 ou COD = 17 ou COD = 18 ou COD = 30

então imprima (“código correto”);

senão imprima (“código incorreto’);

fimse;

Muitas vezes é mais fácil organizar a saída correta da condição através do SENÃO e não através do ENTÃO, o que inverte o comando.

d) Um indicador estará errado se assumir os valores: 1, 4, 5, 6, 7 ou 9. Organizar o comando:

|CONDIÇÃO PELO ENTÃO |CONDIÇÃO PELO SENÃO - INVERTIDA |

|se IND = 1 ou IND = 4 ou IND =5 ou IND =6 ou IND =7 ou IND = 9 |se IND 1 e IND 4 e IND 5 e IND 6 e IND 7 e IND 9 |

|então imprima (“indicador ERRADO”); |então imprima (“identificador CORRETO”): |

|senão imprima (“indicador CORRETO”); |senão imprima (“identificador ERRADO”); |

|fimse; |fimse; |

outra maneira de representar a mesma condição:

|CONDIÇÃO PELO ENTÃO |CONDIÇÃO PELO SENÃO - INVERTIDA |

|se IND = 1 ou ( IND > 3 e IND < 8 ) ou IND = 9 |se IND 1 e ( IND = 8 ) e IND 9 |

|então imprima (“indicador ERRADO”); |então imprima (“identificador CORRETO”): |

|senão imprima (“indicador CORRETO”); |senão imprima (“identificador ERRADO”); |

|fimse; |fimse; |

Quando não se deseja inverter as saídas necessitamos negar as condições, abaixo segue um resumo da negação dos comandos:

|RESUMO |RELAÇÀO |NEGAÇÃO |

| |= | ou ( |

| | ou ( |= |

| |> |= ou ( |

| |>= ou ( |< |

| | |

| |E |OU |

| |OU |E |

MULTIPLA ESCOLHA

Nos casos em que há múltiplas saídas para um determinado teste, pode-se fazer uso das estruturas de alternativa simples e composta devidamente encadeadas. Tal uso, conforme os professores italianos em 1966, sempre é suficiente para a solução de qualquer problema. Entretanto para simplificar a solução inúmeras linguagens tem o comando teste múltiplo. Seu formato em Portugol é:

Sintaxe:

caso

valor1 : ;

valor 2 :< comando2>;

...

valor n : ;

senão: ;

fimcaso;

onde o comando do lado direito do dois pontos ( : ) pode ser um comando simples ou um conjunto de comandos.

Semântica: a expressão do CASO é avaliada, e deve gerar um resultado determinado;

este resultado é comparado com os valores indicados colocados do lado esquerdo do dois pontos ( : );

quando um valor igual for encontrado, o comando colocado ao lado direito do dois pontos ( : ) será executado, retornando ao FIMCASO correspondente, sem executar mais nenhuma comparação, onde prossegue o fluxo normal do algoritmo;

caso nenhum valor seja igual ao resultado obtido na expressão do CASO o comando existente do lado direito do dois pontos ( : ) do SENÃO será executado, retornando ao FIMCASO onde prossegue o fluxo normal do algoritmo.

Exemplo:

Resolver o seguinte problema usando o comando CASO. Numa organização, o número de dependentes limita a quantidade de dias que um funcionário pode faltar anualmente. Assim, empregados com menos de 3 dependentes podem faltar 5 dias quem tem 4, 5 ou 6 dependentes pode faltar 8 dias, quem tem mais de 6 dependentes pode faltar 11 dias Escrever um alg que leia o número de dependentes e imprima a quantidade de dias que podem ser fruídos anualmente para cada caso.

|RESUMO |

|BLOCO | | |

|-Conjunto de descrição | |ALTERNATIVA SIMPLES |

|de variáveis e | |-Comandos executados |

|comandos para realizar uma |ENTRADA |somente se a condição for verdadeira. |

|determinada tarefa |Transfere dados externos para o | |

| |algoritmo |SE < condição > ENTÃO |

|INÍCIO | |comando 1; |

|definição de variáveis |LEIA (var1, … var n); |… |

|comandos | |comando n; |

|FIM | |FIMSE; |

| | | |

|SEQÜÊNCIA SIMPLES |SAÍDA | |

|-Comandos simples |Transfere dados do |ALTERNATIVA COMPOSTA |

|seguidos |algoritmo para o meio | |

|-Começa no primeiro e |externo |- Existem dois caminhos; |

|termina no último | |a condição determina |

|-Separados por “;” |IMPRIMA (var1, … var n); |qual deve ser seguido. |

| | | |

|comando 1; | |SE < condição > ENTÃO |

|comando 2; | |comando 1; |

|comando n; | |… |

| | |comando n; |

| | |SENÃO |

| | |comando 11, |

| | |… |

| | |comando nn, |

| | |FIMSE; |

EXERCÍCIOS

1. Considerando A, B e C variáveis numéricas, contendo os valores, 1, 4.5 e 8 respectivamente; NOME e COR variáveis literais contendo “Tania” e “Branco” e TESTE variável lógica contendo o valor V, determinar os resultados obtidos da avaliação das seguintes expressões lógicas:

a. A = 1 e TESTE

b. NOME = “PEDRO” ou COR “Branco”

c. não TESTE ou B mod 2 = 0.5

d. C < 10 ou TESTE e COR = “preto”

e. A**2 + sqrt(C) = 3 e (A + trunc(B + C) > 13 ou NOME = “Ana”

f. TESTE e não TESTE

2. Determinar os resultados que estarão em cada uma das variáveis definidas nos algoritmos abaixo:

a. inicio

NUM, D1, D2, D3, D4 : inteiro;

NUM ( 1352;

D4 ( NUM mod 10;

D3 ( (NUM div 10) mod 10;

D2 ( (NUM div 100) mod 10;

D1 ( (NUM div 1000) mod 10;

fim.

b. inicio

QUALE: caracter [15];

NUM: inteiro;

NUM ( 10:

se NUM > 0

então QUALE ( “numero positivo”;

senão se NUM < 0

então QUALE ( “numero negativo”;

senão QUALE ( “zero”;

fimse;

fimse;

fim.

c. executar o algoritmo B trocando 10 por 0 e depois por -4

d. inicio

A, B, C: logico;

X, Y: real;

V, L: inteiro;

A ( F;

B ( V;

C ( F;

X ( 1.5;

Y ( 3.2;

X ( X + 1;

se C ou (( X + Y > 5) ou ( não A e B))

então L ( 0;

senão L ( 1;

fimse;

fim.

3. O que está errado no algoritmo abaixo:

inicio

N, PAR, X : inteiro;

leia (N);

X ( N mod 2;

se X=0

então PAR ( V;

senão PAR ( F;

fimse;

fim.

4. Um código está correto se for maior que 100, ou igual a 50. Escrever um algoritmo portugol que teste este valor e some 1 no código se ele estiver errado.

5. Uma data vem acompanhada de um campo chamado DIASEM, cujo valor é 1-domingo,2-segunda,....Escrever um algoritmo portugol que verifique se o DIASEM é um dia útil - semana inglesa.

6. Escrever um algoritmo que teste 3 valores numéricos e devolva a informação “OK” se:

(A deve ser maior do que 10 e menor do que 100) ou (B deve ser diferente de C e C deve ser maior do que 50)

7. Criar algoritmos para solucionar os itens abaixo:

a) fazer um algoritmo portugol que leia um número e determine se o valor é par ou impar.

b) fazer um algoritmo portugol que leia um valor referente ao ano e verifique se ele é bissexto ou não.

8. Uma agência de casamento possuí um cadastro contendo os seguintes dados de pessoas inscritas:

nome, sexo, cor de olhos, altura, cor de cabelo e ano de nascimento.

a. um americano contatou a agência e pediu uma moça de até 25 anos com 1.60 de altura, loura ou ruiva de olhos azuis;

b. uma alemã pretende jantar esta noite com um senhor de mais de 50 anos, com altura entre 1.75 e 1.80, moreno de olhos pretos

Criar um algoritmo portugol que leia os dados das pessoas inscritas e imprima o nome das pessoas que atendem ao item a e b.

9. Dados 3 valores X, Y, Z verificar se eles podem ser os comprimentos dos lados de um triângulo e, se forem, verificar se é triângulo equilátero, isósceles ou escaleno.

Propriedades - o comprimento de cada lado de um triângulo é menor do que a soma dos outros 2 lados

Equilátero - 3 lados iguais

Isósceles - 2 lados iguais

Escaleno - 3 lados diferentes

10. Criar um algoritmo portugol que calcule a média final das notas de um aluno. O algoritmo deve ler:

o nome do aluno,

nota do 1o bimestre,

nota do 2o bimestre,

nota do 3o bimestre e

nota do 4o bimestre.

Calcular a média aritmética das notas e imprimir o nome do aluno e a mensagem:

‘aprovado’ - média de 100 até 70;

‘exame final’ - média abaixo de 70 até 40;

‘reprovado’ - média abaixo de 40.

11. Criar um algoritmo portugol que verifique se uma data está correta ou não - utilizar valores lógicos:

Mês - entre 1 e 12

Dia - 1 a 28 - mês 2 e ano não bissexto

1 a 29 - mês 2 e ano bissexto

1 a 30 - meses 4, 6, 9, 11

1 a 31 - meses restantes

12. O Depto de Meio Ambiente mantém 3 listas de indústrias conhecidas por serem altamente poluentes da atmosfera. Os resultados de várias medidas são combinados para formar o que é chamado de índice de poluição. Isto é controlado regularmente. Normalmente os valores caem entre 0.05 e 0.25. Se o valor atingir 0.30 as indústrias da lista A serão chamadas a suspender as operações até os valores retornarem ao intervalo normal. Se o índice atingir 0.40 as indústrias da lista B serão notificadas também. Se o índice exceder 0.50 indústrias de todas as 3 listas serão avisadas. Preparar um algoritmo portugol para ler o índice de poluição e indicar as notações apropriadas.

13. Criar um algoritmo portugol que leia o nome, sexo e idade de candidatos a seleção brasileira de voleibol. Caso o participante seja do sexo feminino com idade entre 7 e 10 anos imprimir o nome e a frase "seleção feminina juvenil", caso seja do sexo masculino com idade entre 8 e 12 anos imprimir o nome e a frase "seleção masculina juvenil".

14. Criar um algoritmo em portugol que leia o nome, idade e altura de moças pretendentes a manequim profissional e imprimir o nome da pretendente e a frase “aprovada”, caso ela tenha idade entre 15 e 20 anos inclusive, e tenha altura de 1.70 a 1.80 inclusive. Em qualquer outro caso, imprimir o nome e a frase "reprovada".

15. Criar um algoritmo portugol que leia o CÓDIGO DO PRODUTO, DESCRIÇÃO DO PRODUTO, QUANTIDADE EM ESTOQUE e QUANTIDADE MÍNIMA, caso a quantidade em estoque seja menor ou igual a quantidade mínima imprimir a descrição do produto e a mensagem “estoque baixo”; caso a quantidade em estoque seja maior do que a quantidade mínima imprimir o código do produto e a diferença entre o estoque e a quantidade mínima em estoque.

16. Criar um algoritmo em portugol que leia o NOME DO PRODUTO, QUANTIDADE EM ESTOQUE, PREÇO UNITÁRIO, caso o preço unitário seja menor ou igual a R$ 1,99 imprimir o nome do produto e o valor a ser acrescido ao preço unitário para chegar em R$ 1,99; caso o preço seja maior do que R$ 1,99 imprimir o nome do produto e a mensagem “preço maior”.

17. Escreva um algoritmo Portugol que leia a idade de um nadador e classifique-o:

|IDADE |CLASSIFICAÇÃO |

|( 6 |pré-mirim |

|7 a 10 |mirim |

|11 a 14 |infantil |

|15 a 18 |juvenil |

|( 19 |adulto |

imprimindo ao final a idade e sua classificação

18. Criar um algoritmo Portugol que leia a altura e o sexo de uma pessoa, calcule e imprima seu peso ideal. Utilizando as seguintes fórmulas:

- para homens : 72,7 * h – 58

- para mulheres : 62,1 * h – 44,7

19. Escreva um algoritmo em Portugol que leia 4 números e imprima o maior deles.

20. Exercícios de teste de mesa:

|inicio |inicio |

|a, b, x, y : real; |a, b, i, m : real; |

|leia (a, b); |leia (m); |

|se a=b |se m 0 |

|então x ( 1,5; |então i ( trunc (m/12); |

|y ( 2,5; |a ( m / 12; |

|senão x ( -1,5; |b ( round (m/12); |

|y ( - 2,5; |se m mod 12 >= 6 |

|fimse; |então i ( i + 1; |

|imprima (x, y); |fimse; |

|fim. |imprima (a, b, i); |

| |fimse; |

| |fim. |

| |Quais valores serão impressos se forem lidos 30; 19; 27; 60 e 0? |

|inicio |inicio |

|aux, l, m, n : real; |X, Y, Z : inteiro; |

|leia (l, m, n); |X ( 2; |

|se l > m ou l > n |Y ( 5; |

|então se m < n |Z ( 3; |

|então aux ( l; |se X < Y |

|l ( m; |então X ( X + 2 + Y * 4; |

|m ( aux; |imprima ( X ); |

|senão aux ( l; |senão Y ( Y + 5; |

|l ( n; |Z ( Z + Y; |

|n ( aux; |imprima ( Y, Z); |

|fimse; |fimse; |

|fimse; |imprima (Y, Z); |

|se m > n |fim. |

|então aux ( m; | |

|m ( n; | |

|n ( aux; | |

|fimse; | |

|imprima (l, m, n); | |

|fim. | |

|inicio |

|A, B, C : inteiro; |

|A ( 4; |

|B ( -5; |

|C ( 3; |

|se C < B |

|então A ( A + 6 + B * 5; |

|imprima ( A ); |

|senão B ( B + 10; |

|C ( C + B; |

|imprima ( B, C); |

|fimse; |

|imprima (B, C); |

|fim. |

21. Em uma classe são feitos 5 exames (A, B, C, D e E). Fazer um algoritmo que leia as notas destes exames e imprima a classificação do aluno, sabendo que a média é 70. Classificação: A – passou em todos os exames;

B – passou em A, B e D, mas não em C ou E;

C – passou em A e B, C ou D, mas não em E.

22. Uma Cia de pulverização utiliza avião para pulverizar lavouras. Os custos de pulverização dependem do tipo de praga e da área a ser contratada conforme a tabela:

Tipo 1 – ervas daninhas R$ 50,00 por acre;

Tipo 2 – gafanhotos R$ 100,00 por acre;

Tipo 3 – broca R$ 150,00 por acre;

Tipo 4 – todos acima R$ 250,00 por acre.

Se a área a ser pulverizada for superior a 1000 acres, o fazendeiro tem um desconto de 5%. Em adição, qualquer fazendeiro cujo custo for maior do que R$ 750,00 tem um desconto de 10% sobre o valor que ultrapassar os R$ 750,00. Caso ambos os descontos se aplicam o da área é calculado antes. Fazer um algoritmo que leia: nome do fazendeiro, tipo de pulverização (1 a 4) e área a ser pulverizada; e imprima o nome do fazendeiro e o valor a ser pago.

23. Muitos times de esportes profissionais utilizam o computador para auxiliar na análise de seus jogadores. Suponha que um time de Hockey tenha um sistema deste tipo. Para cada jogador existem os seguintes dados: nome do jogador, idade, altura, peso, gols no último campeonato, presenças no último campeonato, penalidades em minutos no último campeonato, fator da confederação.

Fazer um algoritmo que leia os dados do jogador e imprima sua avaliação utilizando a fórmula: (gols + presença + (penalidades /4) + (altura + peso)/5 – idade) * fator.

24. A Cia Pascoalina Ltda decidiu dar a seus funcionários uma gratificação de Páscoa. A gratificação é baseada em dois critérios: o número de horas extras trabalhadas e o número de horas que o empregado faltou ao trabalho. Para todos os funcionários coletou-se os dados: nome do funcionário, nº de horas extra e nº de horas de faltas. A empresa decidiu utilizar a seguinte fórmula para calcular o prêmio: subtrair dois terços das horas que ele faltou de suas horas extras, e distribuir o prêmio de acordo com a tabela:

|RESULTADO DA FÓRMULA |VALOR DO PRÊMIO |

|> 40 horas |R$ 500,00 |

|> 30 mas 20 mas 10 mas ;

...

< comando N>;

até ;

Semântica : os comandos internos ao REPITA são executados até encontrar a condição contida no ATÉ correspondente;

a condição contida no ATÉ correspondente é testada e sendo falsa existe um desvio para o comando REPITA correspondente, e os comandos internos a ele são novamente executados reiniciando o processo;

caso contrário, quando a condição contida no ATË for verdadeira o processo de repetição pára e prossegue o fluxo normal do algoritmo

Exemplo:

Somar os 100 primeiros números inteiros positivos.

inicio

NUM, SOMA: inteiro;

NUM ( 1;

SOMA ( 0;

repita

SOMA ( SOMA + NUM;

NUM ( NUM + 1;

ate NUM > 100;

imprima (SOMA);

fim.

|FLUXOGRAMA |PORTUGOL |

| | |

| | |

| | |

| | |

| |REPITA |

| | |

| |< comando 1>; |

| |< comando 2>; |

| |..... |

| |; |

| | |

| |ATÉ ; |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

| | |

UMA COMPARAÇÃO ENTRE OS COMANDOS ENQUANTO E REPITA

|ENQUANTO |REPITA |

|1. os comandos internos ao enquanto podem nunca serem executados; |1. os comandos internos ao repita são executados pelo menos uma vez; |

|2. o laço do enquanto é executado quando a condição for verdadeira; |2. o laço do repita é realizado quando a condição for falsa; |

|3. a estrutura enquanto testa e faz. |3. a estrutura repita faz e testa. |

Em geral tudo o que se fizer com um dos comandos, pode-se fazer com outro. A vantagem é que para determinadas situações um ou outro pode ser mais indicado, isto é, pode solucionar o problema com menos lógica adicional (overhead), tais como contadores, chaves, testes, inicializações, etc.

EXERCÍCIOS

1. Fazer um algoritmo que leia uma lista de números terminada pelo número 0 e mostre cada número lido (não imprimir o 0).

2. Faça um algoritmo que leia um número N, e a seguir solicite N números e mostre a soma dos N números.

3. Escreva um algoritmo que leia um número inteiro positivo N. Calcule e mostre o maior quadrado menor ou igual a N. Por exemplo, se N for igual a 38, o menor quadrado é 36 (quadrado de 6).

4. Escreva um algoritmo que leia um número N, calcule e mostre os N primeiros termos da sequência (1, 3, 6, 10, 15, ...)

5. Escreva um algoritmo que leia um número N em base 10 e imprima o número base 2 correspondente.

6. Faça um algoritmo que leia um número e, a seguir, leia uma lista de número até encontrar um igual ao primeiro número lido. Mostre todos os números lidos.

7. Escreva um algoritmo que leia um número N, some todos os números inteiros entre 1 e N e mostre o resultado obtido.

8. Faça um algoritmo que leia uma lista de números terminada pelo número 0 e mostre cada número lido. Ao final, o algoritmo deve mostrar a média aritmética de todos os números da lista.

9. Escreva um algoritmo que leia um número N, calcule seu fatorial e mostre o resultado obtido.

10. Escreva um algoritmo que leia um número N, calcule todos os números primos no intervalo entre 0 e N e mostre o resultado obtido.

11. Escreva um algoritmo que leia um número, calcule uma relação de seus divisores e mostre o resultado obtido.

12. Escreva um algoritmo que leia uma lista de números terminada pelo número 0 e que, para cada número lido, mostre o próprio número e uma relação de seus divisores.

13. Faça um algoritmo que leia dois valores (limite inferior e limite superior) e mostre todos os números pares entre os dois limites lidos.

14. Faça um algoritmo que leia três valores (N, limite inferior, limite superior) e mostre todos os números inteiros múltiplos de N entre os dois limites lidos.

15. Trocar os comandos enquanto por repita:

| A ( 0; | Z ( 10; | K ( 5; |

|enqto ( A 3) faca |enqto Z > 0 faca |enqto K < 10 faca |

|A ( A +1; |Z ( Z -3; |K ( K + 1.5; |

|imprima (A); |imprima (Z); |imprima (K): |

|fimeqto; |fimenqto; |fimenqto; |

16. Transforme repita em enquanto:

| A (10; | GH ( 5; | T ( 0; |

|repita |repita |repita |

|A ( A + 1; |imprima (ABC); |T ( T + 0.5; |

|ate A >10; |ate GH 5; |imprima ( T * 2); |

| | |ate T > 10; |

17. Quais valores serão impressos executando o algoritmo abaixo:

inicio

A, Q, TERMO: real;

A ( 1;

Q ( 3;

TERMO ( A;

repita

imprima (TERMO);

TERMO ( TERMOS * Q;

até TERMO >= 2000;

FIM.

18. Dado o algoritmo abaixo, que valores seriam impressos se fossem lidos os valores 30; 19; 27; 60 e 0.

Inicio

A, B, I , M : inteiro;

leia (M);

se M 0

então I ( trunc (M/12);

A ( M /12;

B ( arred (M/12);

se M mod 12 >= 6

então I ( I +1;

fimse;

imprima (A, B, I);

fimse;

FIM.

19. Dado o algoritmo abaixo, informar o valor impresso caso sejam lidos os valores 3; 6; 8; 1.

Inicio

FAT, N, MULT : real;

leia (N);

FAT ( 1;

MULT ( N;

repita

FAT ( FAT * MULT;

MULT ( MULT - 1;

até MULT < 1;

imprima (FAT);

FIM.

20. Fazer um algoritmo que leia dois valores (X e Y) e imprima XY, sem utilizar o operador de potência (**).

21. Calcular a soma dos 100 primeiros números pares.

22. Totalize um conjunto de valores lidos, sendo todos positivos. O fim dos dados será indicado por um número negativo que não deve ser somado.

23. Ler um conjunto de números inteiros, caso ele seja par deve ser somado, caso seja impar deve ser multiplicado. O conjunto termina quando for lido 0.

24. Criar um algoritmo portugol que leia: matrícula, nome, nota 1o bimestre, nota 2o bimestre, nota 3o bimestre e nota 4o bimestre. O algoritmo deve calcular a média aritmética final do aluno e imprimir o nome do aluno e a mensagem: “aprovado”- média entre 100 até 70

“exame final “- média abaixo de 70 até 40

“reprovado”- média abaixo de 40

25. Fazer um algoritmo para calcular e imprimir a soma dos cubos dos números pares compreendidos entre B e A . Suponha que os valores de B e A (B > A) sejam lidos no início do algoritmo.

26. Fazer um algoritmo que leia 100 números inteiros positivos, calcule e imprima os que são números perfeitos. Número perfeito é aquele cuja soma de seus divisores, exceto ele próprio, é igual ao número. Exemplo: 6 é perfeito porque 1 + 2 + 3 = 6.

27. Tem-se uma estrada ligando várias cidades. Cada cidade tem seu marco quilométrico. Fazer um algoritmo que:

a) leia vários pares de dados, contendo cada par os valores dos marcos quilométricos em ordem crescente, de duas cidades. O último par contém estes dois valores iguais;

b) calcule o tempo decorrido para percorrer a distância entre estas duas cidades, com as seguintes velocidades: 40, 60 e 80 km/h, sabendo-se que:

T = D / V, onde T = tempo; D = distância e V = velocidade.

28. Executando o algoritmo abaixo, que valores serão impressos?

|Inicio |Os valores lidos são: CAPITAL = 50,00; TAXA = 0,10; X = 1 |

|N, QUAD : inteiro; |inicio |

|N ( 5; |CAPITAL, MONTANTE, N, TAXA, RENDIMENTO, |

|enquanto N > 1 faça |TRIMESTRE, X: real; |

|QUAD ( N ** 2; |leia (CAPITAL, TAXA, X); |

|se QUAD mod 2 = 0 |MONTANTE ( CAPITAL; |

|então imprima (QUAD); |TRIMESTRE ( 1; |

|senão imprima (N); |N ( 4 * X; |

|fimse; |enquanto TRIMESTRE N faça |

|N ( N - 1; |RENDIMENTO ( TAXA * MONTANTE; |

|fimenquanto; |MONTANTE ( CAPITAL * (( 1 + TAXA) ** TRIMESTRE); |

|fim. |Imprima ( RENDIMENTO, MONTANTE); |

| |TRIMESTRE ( TRIMESTRE + 1; |

| |fimenquanto; |

| |fim. |

29. O depto pessoal de uma empresa solicitou o desenvolvimento de um programa de computador capaz de calcular o desconto devido para o INSS. Assim, escreva um algoritmo capaz de calcular este desconto:

. inicialmente deve ser lido o valor do salário de referencia;

. depois deve-se ler uma série de dados compostos de: Rg e salário bruto;

. a série termina quando for lido Rg 0;

. tabela de desconto:

salário bruto % desconto

até 10 SR 8

de 10,01 a 20 SR 9

acima de 20 SR 10

. imprimir para cada funcionário o RG, salário bruto e desconto.

30. Definir um algoritmo portugol que receba uma série de pares de números, e para cada par calcule a média aritmética, imprimindo o resultado. A série termina quando for lido o par 0,0.

31. Melancias custam R$ 4,50 cada, se compradas até 5 unidades inclusive. R$ 4,20 se compradas até 20 unidades inclusive e R$ 4,00 se compradas até 100 unidades. Além deste valor, deve ser dado um desconto de 10% no valor total da compra.

Escrever um algoritmo portugol que receba o número de melancias compradas e devolva a quantidade de reais a pagar. O programa deve rodar até receber o número zero melancias, que indica fim.

32. Uma empresa decidiu fazer um levantamento em relação aos candidatos que se apresentaram para preenchimento de vagas no seu quadro de funcionários. Fazer um algoritmo portugol que:

leia um conjunto de dados contendo:

. número de inscrição do candidato;

. idade;

. sexo (F/M);

. experiência no serviço (S/N);

. o último cartão contém o número de inscrição = 0.

calcule:

. o número de candidatos femininos;

. o número de candidatos masculinos;

. idade média dos homens que já tem experiência no serviço;

. porcentagem dos homens com mais de 45 anos entre total de homens;

. número de mulheres que tem idade inferior a 35 anos e com experiência no serviço.

imprima

. o que foi calculado.

33. Defina um algoritmo capaz de somar os primeiros 50 números múltiplos de 4, começando no 4 ( 4, 8, 12, ..., 400). O algoritmo deve imprimir o resultado ao final.

34. Dada uma série indeterminada de números, escrever um algoritmo portugol que calcule e imprima:

a. quantos números foram fornecidos;

b. quantos eram maiores que 100;

c. quantos eram pares;

d. quantos eram positivos;

e. qual o maior valor.

A série termina quando for digitado o valor 0, utilizar o comando de repetição repita.

35. Numa fábrica trabalham homens e mulheres divididos em 3 classes:

A - os que fazem até 30 peças por mês;

B - os que fazem de 31 a 35 peças por mês;

C - os que fazem mais de 35 peças por mês.

A classe A recebe salário mínimo. A classe B recebe salário mínimo e mais 3% do salário mínimo por peça acima das 30 iniciais. A classe C recebe salário mínimo e mais 5% do salário mínimo por peça acima das 30 iniciais.

Fazer um algoritmo que:

a. leia um conjunto de dados contendo cada um: número do operário, número de peças fabricadas no mês e sexo;

b. calcule e imprima:

. salário de cada operário;

. total da folha mensal de pagamento;

. número total de peças fabricadas no mês;

. média das peças fabricadas pelos homens em cada classe;

. média de pecas fabricadas pelas mulheres em cada classe;

. número do operário ou operária de maior salário ( não existe empate).

O último dado a ser lido terá número de operário = 0.

36. Foi feita uma pesquisa de audiência de canal de TV em várias casas de uma certa cidade, num determinado dia. Para cada casa visitada foi criado um conjunto de dados contendo: número do canal (4, 5, 7,12) e o número de pessoas que estavam assistindo naquela casa. Se a televisão estivesse desligada nada seria digitado. Fazer um algoritmo que:

. leia um número indeterminado de dados, sendo que o final seria canal =0;

. calcule e imprima a percentagem de audiência para cada emissora e o respectivo canal.

37. O governo das Ilhas Oba Oba instituiu um controle de preços e salários logo após sua eleição. O Primeiro Ministro recebeu de seus conselheiros econômicos uma previsão, baseada nas tendências atuais, de que os salários continuarão a aumentar anualmente de 5%, o custo de vida e de serviços de 10%, e os impostos de 15%. Seus conselheiros políticos informam que, se os impostos mais o custo de vida e de serviços consumirem mais do que 75% do salário anual para um número significativo de cidadãos, ele terá problemas nas próximas eleições e que, se isto atingir 80%, ele se verá realmente em apuros. O Primeiro Ministro tem coletados os seguintes dados: salário anual, os impostos e o custo de vida e serviços para uma amostra tomada de seus eleitores. Preparar um algoritmo para determinar o número e a percentagem dos cidadãos estudados que caem nas categorias de 75% e 80% já descritas. O número de pessoas da amostra é desconhecido. O número de entrevistados termina quando for lido o salário anual 0.

PARA

O próximo comando disponível para controlar “loops” atende pelo nome de PARA, também conhecido como estrutura de repetição finita. O comando PARA permite que várias instruções sejam executadas repetidamente um número predeterminado de vezes, mediante o uso de uma variável de controle que irá controlar o início e o final da repetição, servindo como acumulador.

Sintaxe: para de até passo faça

;

< comando 2>;

...

< comando n>:

fimpara;

onde o identificador é a variável de controle do laço.

Semântica:

1. antes de começar o trecho incluído no PARA, o identificador de controle é inicializado pelo valor de inicio;

2. se o valor do identificador de controle for menor ou igual ao valor final o trecho interno ao PARA é executado,

caso contrário, se o valor do identificador de controle for maior do que o valor final o processo de repetição termina e o algoritmo prossegue seu curso no comando imediatamente após o FIMPARA correspondente;

3. ao chegar ao FIMPARA correspondente o identificador de controle é incrementado do valor do incremento;

4. há um desvio para a linha do comando PARA, e o processo reinicia a partir do passo 2 acima, com idênticas saídas.

Observações sobre o comando:

- dentro dos comandos internos ao PARA o identificador de controle do laço não pode ser alterado;

- os valores de inicio, final e incremento podem ser números, variáveis ou expressões, as quais também não podem ser alteradas pelos comandos internos ao PARA;

- quando o valor do incremento for 1, este pode ser omitido;

- o valor do incremento pode ser negativo, neste caso o valor inicio do identificador de controle deve ser maior do que seu valor final.

|FLUXOGRAMA |PORTUGOL |

| | |

| | |

| | |

| |PARA DE ATÉ PASSO |

| | FAÇA |

| | |

| |; |

| |< comando 2>; |

| |... |

| |< comando n>; |

| | |

| |FIMPARA; |

| | |

Exemplo:

|USANDO O COMANDO PARA |USANDO O COMANDO ENQUANTO |

|para I de 1 até 10 passo 2 faça |I ( 1; |

|imprima (I); |enquanto I FAÇA |… |FIMPARA; |

|comando 1; |comando n | |

|comando n; |ATÉ ; | |

|FIMENQUANTO; | | |

EXERCÍCIOS

1. Escreva um algoritmo Portugol que leia uma série de números inteiros e positivos e ao final do processamento imprima qual o maior deles. O processamento se encerra quando for lido qualquer número negativo que não deve ser considerado para efeito de comparação.

2. Existe um conjunto de muitos números inteiros e positivos, agrupados 3 a 3. Deve-se escrever um algoritmo portugol capaz de:

a. ler os 3 números;

b. identificar o maior deles, e rejeitá-lo;

c. calcular a média entre os 2 números restantes;

d. imprimir os 2 números e a média.

A pesquisa termina quando o primeiro número dos 3 lidos for negativo.

3. Escrever um algoritmo portugol que receba conjuntos de 2 números inteiros e positivos, e para cada par calcule o MDC ( máximo divisor comum) de acordo com o Algoritmo Euclidiano para o MDC, cuja descrição é:

1. entram 2 valores N1 e N2;

2. N1 recebe o valor absoluto de N1 e N2 recebe o valor absoluto de N2;

3. calcula-se X que é N1 menos ( N2 vezes ( inteiro de N1/N2));

4. se X for zero, o MDC é N2;

5. se não for, N1 recebe N2 e N2 recebe X, voltando-se ao passo 2.

O programa termina quando for lido o par 0,0, que não deve ser processado.

4. A comissão organizadora de um rallye automobilístico decidiu apurar os resultados da competição através de um processo informatizado. Um dos algoritmos necessários para a classificação das equipes concorrentes é o que emite uma listagem geral do desempenho das equipes, atribuindo pontos segundo determinadas normas.

O algoritmo deverá:

. ler : a. um campo contendo os tempos padrão (em minutos decimais) para as 3 fases de competição;

b. um conjunto de dados contendo cada um o número de inscrição da equipe e os tempos (em minutos decimais) que as mesmas despenderam ao cumprir as 3 diferentes etapas. O último dado do conjunto contém o número 9999 como número de inscrição.

. calcular: a. os pontos de cada equipe em cada uma das etapas, seguindo o seguinte critério:

seja ( o valor absoluto da diferença entre o tempo padrão e o tempo despendido pela

equipe numa etapa:

( < 3 minutos - atribuir 100 pontos a etapa

3 0 |

|1, se h(x) k; |

|até abs(t) < 0,0001; |imprima (soma); |

|imprima (a, seno, n); |fim. |

|a ( a + 0,1; |Qual valor será impresso quando for lido 30? |

|até a > 1,6; | |

|fim. | |

|inicio | |

|a, q, termo : real; | |

|a ( 1; | |

|q ( 3; | |

|termo ( a; | |

|repita | |

|imprima (termo); | |

|termo ( termo * q; | |

|até termo >= 2000; | |

|fim. | |

NOVOS TIPOS DE DADOS

Criar um algoritmo portugol que leia a nota de 10 alunos, calcule a média destas notas e imprima o número de alunos com nota abaixo da média, na média e acima da média.

Para solucionar o exercício acima necessita-se criar 10 variáveis de nota, sendo uma para cada aluno, uma variável soma e uma variável média. Não é nada exagerado, porém caso necessite-se realizar a mesma tarefa acima para uma turma de 120 alunos, o processo fica complicado à nível de definição de variáveis.

No caso acima fica claro que os tipos de dados primitivos (inteiro, real, caracter e lógico) não é suficiente para representar toda e qualquer informação que possa surgir. Portanto, em muitas situações necessita-se “construir novos tipos de dados” a partir da composição de tipos primitivos.

Estes novos tipos tem um formato denominado Estrutura de Dados, que define como os tipos primitivos de dados estão organizados. Voltando à comparação da memória com um armário de gavetas, em um primeiro momento uma gaveta poderia comportar apenas uma informação e, segundo esse novo conceito, uma gaveta pode comportar um conjunto de informações primitivas, desde que devidamente organizadas. Estes novos tipos são estranhos ao algoritmo logo devem ser declarados em cada detalhe de sua estrutura.

Desta forma, assim como na Teoria dos Conjuntos, uma variável pode ser interpretada como um elemento e uma Estrutura de Dados como um conjunto. Quando uma determinada Estrutura de Dados for composta de variáveis com o mesmo tipo primitivo, temos um conjunto homogêneo de dados, porém, caso os elementos do conjunto não sejam do mesmo tipo primitivo de dados, então diz-se um conjunto heterogêneo de dados.

Os novos tipos de dados podem ser classificados da seguinte forma:

tipos de dados homogêneos unidimensionais – vetores

multi-dimensionais – matrizes

tipos de dados heterogêneos – registros.

A utilização deste tipo de estrutura de dados recebe diversos nomes como: variáveis indexadas, variáveis compostas, variáveis subscritas, arranjos, vetores, matrizes, tabelas em memória ou array. Neste contexto utilizaremos os nomes: vetores, matrizes e registros.

VETORES

Vetores são estruturas de dados homogêneas unidimensionais e sua utilização mais comum está vinculada à criação de tabelas. Este novo tipo de dado permite a criação de muitas variáveis de mesmo tipo de dado, que atenderão pelo mesmo nome, e que serão acessadas pelo deslocamento dentro do vetor (índices).

Para entender variáveis compostas unidimensionais, imagina-se um edifício com um número finito de andares, representando uma estrutura de dados, e seus andares, partições desta estrutura. Visto que os andares são uma segmentação direta do prédio, estes compõem então o que é chamado de estrutura unidimensional, isto é, uma só dimensão.

Criação de Vetores

A declaração de vetores em algoritmos dá-se em duas etapas:

1º. devemos definir um novo tipo de dado que virá a se juntar aos já existentes (inteiro, real ,caracter e lógico), e que vigorará dentro deste bloco de programa.

TIPO = VETOR [ lim inf : lim sup] ;

Onde: lim inf – limite inferior do vetor;

lim sup – limite superior do vetor.

2º. devemos informar ao algoritmo quais variáveis poderão conter este novo tipo de dado.

, , ... , : ;

O número de elementos de um vetor será dado por Lim Sup – Lim Inf + 1. Isto significa que as posições do vetor são identificadas a partir de Lim Inf, com incrementos unitários até Lim Sup.

Exemplo:

1. Definir um vetor para conter as taxas inflacionárias dos 12 últimos meses:

TIPO VETINF = VETOR [ 1: 12] real;

INFLACAO : VETINF;

2. Definir um vetor para conter os nomes de 60 alunos:

TIPO VET1 = VETOR [ 1: 60] caracter[50];

NOME : VET1;

Acesso aos Dados

Ao imaginar um elevador de um prédio sabe-se que este é capaz de acessar qualquer um de seus andares. Entretanto, não basta saber que andar desejamos atingir se não soubermos o nome do edifício. Logo, necessita-se ter conhecimento do nome do edifício para então procurar o andar desejado.

O mesmo acontece com os vetores, visto que são compostos por diversas variáveis. Torna-se, então, necessário definir o nome do vetor que contém os dados desejados e depois especificar em qual posição a informação se encontra.

Após isolar um único elemento do vetor, pode-se manipula-lo através de qualquer operação de entrada, saída ou atribuição. O acesso aos dados pode ser feito das seguintes maneiras:

Genericamente - considera-se um único valor para todas as ocorrências do vetor:

VETVEN ( 0;

Conjuntamente - utiliza-se um conjunto de mesmo número de elementos na referencia ao vetor:

Tipo V = VETOR [ 1 : 5] inteiro;

VETVEN : V;

VETVEN ( ( 1 2 3 4 5);

Individualmente - pressupõem a existência de um comando para cada elemento do vetor

Tipo VET = VETOR [ 1: 5] inteiro;

V1: VET;

V1[1] ( 2;

V1[2] ( 5;

V1[3] ( 6;

V1[4] ( 9;

V1[5] ( 23;

Pode-se observar neste exemplo que o nome (V1) é um só, o que muda é a informação indicada dentro dos colchetes (1 até 5). Este valor é o índice que indica o endereço onde o elemento está armazenado. É necessário salientar a diferença entre o conteúdo do vetor ( 2, 5, 6, 9, e 23) e seu endereço, que é representado pelo índice.

Estas 3 maneiras de acesso ao vetor aplicam-se á inicialização do vetor, isto é, podem ser utilizados pelos comandos de atribuição ( ( ) e entrada de dados ( leia ). Também podemos utilizar esta sintaxe no caso de saída de dados, isto é, o comando imprima.

Exemplo: Definir um algoritmo que leia um vetor de 120 elementos inteiros e imprima o somatório de seus elementos e os elementos.

inicio

Tipo VET = VETOR [1:120] inteiro;

V : VET;

I, SOMA: inteiro;

leia (VET);

SOMA ( 0;

Para I de 1 ate 120 faca

SOMA ( SOMA + V[I];

fimpara;

imprima (SOMA);

imprima (V):

fim.

EXERCÍCIOS

1. Criar um vetor para conter a nota dos 120 alunos da turma.

2. Criar um vetor para conter o PNB do Brasil dos últimos 8 anos (87 a 94).

3. Criar um algoritmo que defina um vetor de 500 posições e calcule a soma dos conteúdos impares.

4. Criar um algoritmo que defina um vetor para conter 1050 nomes de candidatos e imprima os nomes das posições impares.

5. Criar um algoritmo que defina um vetor de 600 posições e imprima o produto dos valores das posições pares.

6. Escrever um algoritmo que defina um vetor com 12 elementos lógicos e inicialize os primeiros 6 com Verdadeiro e os outros 6 com Falso.

7. Escrever um algoritmo que leia de uma só vez um vetor de 100 elementos numéricos inteiros e imprima aqueles que forem maiores do que o valor 150.

8. Escreva um algoritmo que leia 200 valores (um a um), crie um vetor com tais valores e informe, a seguir, qual a média dos valores positivos e qual a média dos valores negativos.

9. Fazer um algoritmo, usando vetores, que leia 100 valores numéricos, e verifique se existem elementos compondo o vetor maiores que 4,0 e menores que 7,0 e quantos são.

10. Escrever um algoritmo que seja capaz de ler um conjunto de 10 valores ( de uma só vez), calcular a média, e imprimir: todos os valores do conjunto, a média e a diferença entre cada valor individual e a média calculada.

11. Construir um algoritmo Portugol para fazer a soma, posição a posição, de dois vetores de 10 elementos cada e armazenar o somatório de cada posição em um terceiro vetor, também de 10 elementos.

12. Ler 15 elementos de um vetor A e construir um vetor B de mesmo tipo, onde: “todo elemento de B deverá ser o quadrado do elemento de A correspondente”.

13. Ler dois vetores A com 20 elementos e B com 15 elementos. Construir um vetor C, sendo este a junção dos dois vetores anteriores. Desta forma C deverá ter capacidade para armazenar 35 elementos.

14. Ler dois vetores A e B com 20 elementos cada, construir um vetor C, onde cada elemento de C é a subtração do elemento correspondente de A com B.

15. Ler um vetor A com 15 elementos, construir um vetor B de mesmo tipo, sendo que cada elemento de B seja o fatorial do elemento correspondente em A.

16. Imagine um algoritmo capaz de ler uma entrada formada por até 60 caracteres, que correspondem a uma frase. Esta frase termina quando for encontrado um ponto. O algoritmo deve ser capaz de responder:

a. qual o tamanho da frase;

b. quantas palavras existem na frase;

c. quantas vezes a dupla “ma” apareceu na frase.

17. Desejamos analisar o mapa de uso de um disquete. Como sabemos um disquete dupla-dupla de 5 1/4 tem 2 faces, 40 trilhas e 9 setores por trilha, o que dá um total de 720 setores. Definir um algoritmo que leia 20 vetores ( de uma só vez), que correspondem cada vetor a um disco diferente, e determine qual o percentual de setores livres em cada um dos discos, imprimindo tal resultado. O vetor é de inteiros, e se existe um valor zero, isto significa que o setor está livre. Qualquer valor diferente de zero, implica em que o setor não está livre.

18. Existe um livro de 370 páginas que foi recentemente impresso. A editora deseja fazer um estudo sobre possíveis erros de impressão. Desta forma, um especialista foi convidado a levantar quantos erros existem em cada página. Cada valor foi digitado na forma de um vetor, formando um conjunto de 370 valores. Definir um algoritmo portugol que leia este conjunto de dados, e responda:

a. qual a página que tem mais erros? (suponha que só existe uma e ela é única)

b. quantas páginas tem zero erros?

c. quantas páginas tem mais de 10 erros?

19. Uma grande empresa tem seus preços armazenados na forma de três vetores de 650 ocorrências cada. No primeiro, a quem chamaremos COD estão os códigos dos produtos - inteiros. No outro vetor, chamado PRE, estão os preços de cada produto, na mesma ordem de aparecimento de COD. No último, chamado QTD, estão a quantidade em estoque do produto, também na mesma ordem de COD. Escrever um algoritmo que leia os vetores contendo código, preço e quantidade e imprima o código e o valor em estoque de cada produto armazenado e o valor total do estoque da empresa.

VALOR = PRE[I] * QTD [I]

20. Escreva um algoritmo Portugol que leia uma linha de até 80 caracteres e informe nesta linha, quantos caracteres diferentes foram usados. Exemplo, se a linha digitada for

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa, a resposta será 1; se a linha for

abcdefghijklmnopqrstuvwxyz, a resposta será 26.

21. Em uma cidade do interior, sabe-se que, de janeiro a abril de 1993 (121 dias), não ocorreu temperatura inferior a 15(C nem superior a 40(C. As temperaturas verificadas em cada dia estão dispostas em uma unidade de entrada de dados. Fazer um algoritmo Portugol que calcule e imprima:

. a menor temperatura ocorrida;

. a maior temperatura ocorrida;

. a temperatura média;

. o número de dias nos quais a temperatura foi inferior a temperatura média.

22. Criar um algoritmo Portugol que imprima todas as combinações de apostas possíveis para o jogo da Sena, onde: podemos escolher para cada aposta 6 números entre 01 e 50.

CLASSIFICAÇÃO DE VETORES

É a técnica utilizada para ordenar o conteúdo de um vetor em ordem crescente ou decrescente, numérica ou alfabética. Existem diversos algoritmos prontos e comprovados para realizar tal tarefa, serão apresentados três:

método bolha, seleção simples e inserção.

Os métodos de ordenação apresentados podem ser utilizados para ordenar vetores numéricos ou alfabéticos. Uma vez que cada letra possuí um valor diferente da outra. A letra “A” tem valor menor do que a letra “B”, e assim por diante. Se a letra “A” for comparada com a letra “a” também terão valores diferentes. Cada caracter (numérico, alfabético ou caracter especial) é guardado dentro da memória de um computador segundo o valor de um código. Este código recebe o nome de ASCII ( American Standard Code for Information Interchange – Código Americano Padrão para Troca de Informações). E é com base nesta tabela que o processo de ordenação trabalha, pois cada caracter tem um peso, um valor previamente determinado, segundo este padrão.

MÉTODO BOLHA

Semântica: uma vez comparados 2 valores adjacentes no vetor, se eles estiverem em ordem são matidos em seus lugares, e se não estiverem são invertidos. A execução sucessiva deste processo faz com que os menores valores comecem a subir aos poucos ( ordem ascendente) e consequentemente os maiores começam a descer, daí a analogia com uma bolha de sabão.

Sintaxe:

inicio {método bolha}

tipo VET = VETOR [ 1:5 ] inteiro;

V: VET;

I, AUX, LIM : inteiro;

LIM ( 5; {tamanho do vetor}

leia (V);

enquanto LIM ( 2 faça

I ( 2; {posiciona no segundo elemento do vetor}

enquanto I ( LIM faça

se V[I] < V[I-1] {compara o elemento anterior com o elemento posterior do vetor}

então AUX ( V[I-1]; {troca os elementos}

V[I-1] ( V [I];

V[I] ( AUX;

fimse;

I ( I +1;

fimenquanto;

LIM ( LIM -1;

fimenquanto;

imprima (V);

fim.

Demonstrar ordem crescente e decrescente através de teste de mesa.

Exercício: escrever o algoritmo acima utilizando o comando Para.

MÉTODO SELEÇÃO SIMPLES

Semântica: pesquisa-se no vetor qual o maior (menor) valor, selecionando-o. Deve-se colocá-lo no fim (inicio) e refazer o processo desconsiderando o elemento que foi alterado por último.

Sintaxe:

inicio {seleção simples}

tipo VET = Vetor [1:5] inteiro;

V:VET;

LIM, INDCUR, I, J: inteiro;

CORR: inteiro;

LIM ( 5; {tamanho do vetor}

I ( 1; {posiciona no primeiro elemento do vetor}

enquanto I < LIM faça

CORR ( V[I];

INDCUR ( I;

J ( I + 1;

enquanto J ( LIM faça {pesquisa o menor valor}

se V[J] < CORR

então CORR ( V[J];

INDCUR ( J;

fimse;

J ( J + 1;

fimenquanto;

AUX ( V[I]; {troca o menor valor pela primeira posição do vetor}

V[I] ( V[INDCUR];

V[INDCUR] ( AUX;

I ( I + 1; {posiciona para comparar a próxima posição do vetor}

fimenquanto;

fim.

Demonstrar ordem crescente e decrescente através do teste de mesa.

Exercício: escrever o algoritmo acima utilizando o comando Para.

MÉTODO DE INSERÇÃO

Semântica: o ciclo inicia no segundo elemento, o elemento é retirado do conjunto de dados, fazendo uso de uma posição auxiliar do vetor, e inserido em seu lugar definitivo, através da pesquisa de sua localização correta e do deslocamento dos outros elementos do conjunto.

Sintaxe:

inicio {método de inserção}

tipo VET = Vetor [0:5] inteiro; {posição 0 do vetor é a posição auxiliar}

V:VET;

LIM, I, J: inteiro;

LIM ( 5; {tamanho do vetor}

para I de 2 até LIM faça

V[0] ( V[I]; {retira o elemento do conjunto de dados}

J ( I - 1;

enquanto V[J] < V[0] faça {pesquisa a localização correta deslocando os outros elementos}

V[J+1] < V[J];

J ( J - 1;

fimenquanto;

V[J + 1] ( V[0]; {insere o elemento retirado na posição correta}

fimpara;

fim.

Demonstrar ordem crescente e decrescente através do teste de mesa.

PESQUISA EM VETORES

Quando se trabalha com vetores, estes poderão gerar grandes tabelas, onde ficaria difícil a localização de um determinado elemento de forma rápida, mesmo que o vetor esteja classificado. Para solucionar este tipo de problema pode-se fazer uso de pesquisas em matrizes através de programas específicos. Serão apresentados dois métodos para efetuar pesquisa em vetores: método sequêncial e método binário.

MÉTODO DE PESQUISA SEQUÊNCIAL

Semântica: este método consiste em efetuar a busca da informação desejada a partir do primeiro elemento sequencialmente até o último. Localizando a informação no caminho, a mesma é apresentada. Este método de pesquisa é lento, porém eficiente nos casos em que um vetor encontra-se com seus elementos desordenados.

Sintaxe:

inicio

tipo VET = vetor [1:100] inteiro;

V : VET;

CHAVE, I, OK : inteiro;

leia (V);

leia (CHAVE); {valor a ser pesquisado}

OK ( 0; {flag determinando que o valor não foi encontrado}

I ( 1;

enquanto I ( 100 e OK = 0 faça

se V[I] = CHAVE

então OK ( 1; {flag determinado que o valor foi encontrado}

fimse;

I ( I + 1;

fimenquanto;

se OK = 1

então imprima (“chave encontrada”);

senão imprima (“chave não encontrada”);

fimse;

fim.

MÉTODO DE PESQUISA BINÁRIA

Semântica: o método é, em média, mais rápido do que o anterior porém, exige que o vetor esteja previamente classificado. Este método divide a tabela em duas partes e procura saber se a informação desejada está acima ou abaixo da linha de divisão. Se estiver acima, por exemplo, toda a metade abaixo é desprezada. Em seguida, se a informação não foi encontrada, é novamente dividida em duas partes, e pergunta se aquela informação está acima ou abaixo e assim irá sendo executada até encontrar ou não a informação pesquisada.

Pelo fato de ir dividindo sempre em duas partes o volume de dados é que o método recebe a denominação de pesquisa binária.

Sintaxe:

inicio

tipo VET = vetor [1:100] inteiro;

V : VET;

CHAVE, INIC, METADE, FINAL : inteiro;

leia (V);

leia (CHAVE); {valor a ser pesquisado}

INIC ( 1; { indica inicio do vetor}

FINAL ( 100; {indica final do vetor}

repita

METADE ( int (INIC + FINAL) / 2; {indica posição da divisão do vetor}

se CHAVE < V[METADE]

então FINAL ( METADE - 1; {pega a primeira parte do vetor}

senão INIC ( METADE + 1; {pega a segunda parte do vetor}

fimse;

até V[METADE] = CHAVE ou INIC > FINAL;

se V[METADE] = CHAVE

então imprima (“chave encontrada”);

senão imprima (“chave não encontrada”);

fimse;

fim.

EXERCÍCIOS

1. Ler 8 elementos em um vetor A . Construir um vetor B de mesma dimensão com os elementos do vetor A multiplicados por 5. Apresentar o vetor B na ordem crescente.

2. Ler um vetor A com 15 elementos. Construir um vetor B de mesmo tipo, sendo que cada elemento de B seja o fatorial do elemento correspondente do vetor A . Apresentar o vetor B ordenado de forma decrescente. Montar uma rotina de pesquisa binária em B para encontrar os valores de A.

3. Ler dois vetores sendo A com 20 elementos e B com 30 elementos. Construir um vetor C, sendo este a junção dos outros dois vetores. Desta forma, C deverá ter capacidade de armazenar 50 elementos. Apresentar os elementos de C em ordem decrescente. Mostrar uma rotina de pesquisa sequêcial em C para encontrar os elementos de A.

4. Criar um algoritmo portugol que calcule o salário mensal dos vendedores de uma concessionária de carros importados. O salário fixo de cada vendedor é de R$ 500,00, a comissão é de 7,5% sobre o valor vendido no mês. Para tanto existe um vetor contendo os nomes dos vendedores e um vetor contendo o valor vendido pelo vendedor no mês, a relação é feita pelo índice dos vetores. O algoritmo deve criar um terceiro vetor contendo o valor do salário mensal de cada vendedor e imprimir ao final o nome do vendedor que teve o maior salário e a média salarial do mês.

5. Utilizando o exercício acima, classifique os três vetores com base no vetor de salário mensal e imprima qual o nome do vendedor de maior venda e o de menor venda.

MATRIZ

Pelas mesmas razões que foi criado o conceito de vetor, necessita-se tratar de outro tipo de organização de dados: as matrizes. As estruturas de dados vetores são variáveis indexadas com apenas uma dimensão, isto é, uma coluna e várias linhas, a partir de agora serão apresentadas tabelas com mais colunas, sendo assim, haverão variáveis no sentido horizontal e vertical. As mais comum são as matrizes de duas dimensões por se relacionar diretamente com a utilização de tabelas. Matrizes com mais de duas dimensões são utilizadas com menos frequência, mas poderão ocorrer momentos em que se necessite trabalhar com um número maior de dimensões. As linguagens computacionais são privilegiadas neste aspecto, o APL permite até 256 dimensões em algumas aplicações e até 64 em outras.

No caso de matriz bidimensional necessita-se de 2 índices para referenciar um determinado elemento: linha e coluna. Para uma matriz tridimensional usa-se 3 índices: plano, linha e coluna. Da mesma forma que a manipulação de um vetor necessita de uma instrução de looping (enquanto, repita ou para), no caso de matrizes deverá ser utilizado o número de loopings relativos ao número de dimensões da matriz. Sendo assim, uma matriz de duas dimensões deverá ser controlada por dois loopings, uma de três dimensões fará uso de 3 loopings e assim por diante.

Para definir uma matriz passa-se por duas etapas, como nos vetores:

1. definição do tipo de dado:

Tipo = Matriz [li1:ls1,li2:ls2,...,lsN:liN] ;

Onde: li1, li2, liN – limite inferior da primeira, da segunda e da eNésima dimensão respectivamente;

ls1, ls2, lsN – limite superior da primeira, da segunda e da eNésima dimensão respectivamente.

2. definição das variáveis que poderão conter este novo tipo de dado:

, ,... : ;

Exemplo:

1. Criar uma matriz 8 x 12 devidamente zerada.

inicio

tipo M = matriz [1:8, 1:12] inteiro;

MAT:M;

I,J: inteiro;

para I de 1 ate 8 faca

para J de 1 ate 12 faca

MAT[I,J] ( 0;

fimpara;

fimpara;

imprima (MAT);

fim.

2. Criar uma matriz de 3 dimensões 8 x 12 x 5 e ler valores para ela.

inicio

tipo M1 = matriz [1:8,1:12, 1:5] real;

MAT1:M1;

I, J, K: inteiro

para I de 1 ate 8 faça

para J de 1 ate 12 faça

para K de 1 até 5 faça

leia (MAT1[I, J,K]);

fimpara;

fimpara;

fimpara;

fim.

EXERCÍCIOS

1. Definir um algoritmo portugol que leia os elementos de uma matriz 14 x 30 um a um, preenchendo a matriz a seguir.

2. Dada uma matriz 7 x 13 devidamente preenchida, o algoritmo deve encontrar sua matriz transposta.

3. Definir um algoritmo que some duas matrizes A e B, de 7 linhas e 8 colunas cada uma, gerando uma matriz C, também 7 x 8, onde cada elemento de C é a soma dos 2 elementos correspondentes em A e B.

4. Definir algoritmo portugol onde dada uma matriz M1 de 6 x 9, devemos totalizá-la na vertical gerando um vetor de 9 elementos. Imprimir este vetor e a seguir, encontrar e imprimir a média destes 9 valores.

5. Ler dois vetores A e B, cada um com 7 elementos e construir uma matriz C de mesma dimensão onde a primeira coluna deverá ser formada pelos elementos de A e a segunda coluna pelos elementos de B.

6. Ler um vetor A de 10 elementos e construir uma matriz C de duas dimensões com 3 colunas, onde a primeira coluna é formada pelos elementos de A somados com o valor 5, a segunda coluna é formada pelo valor de cálculo de fatorial de cada elemento correspondente no vetor A, e a terceira coluna deverá ser formada pelos quadrados dos elementos correspondentes de A .

7. Definir algoritmo portugol capaz de ler uma matriz quadrada de ordem 23 e totalizar os elementos colocados abaixo da diagonal principal (exclusive esta), imprimindo o total ao final.

8. Defina um algoritmo portugol capaz de ler 2 matrizes de dimensões 4 x 9 e 9 x 7. Após lidas, as matrizes devem ser multiplicadas matricialmente gerando uma saída de dimensões 4 x 7. A matriz resultado deve ser impressa ao final. Lembre-se de que existe uma lei matemática que rege a multiplicação de matrizes. Esta lei estabelece que uma multiplicação entre matrizes poderá ocorrer quando o número de colunas da primeira matriz é igual ao número de linhas da segunda matriz, e que o valor resultante da terceira matriz é o somatório da multiplicação de cada elemento da coluna da primeira matriz com cada elemento da linha da segunda matriz.

9. Definir algoritmo portugol que leia duas matrizes (A e B) de dimensões 7 x 13 e gere uma terceira matriz, onde cada elemento é o maior entre os elementos correspondentes em A e B.

10. Escrever um algoritmo que leia uma matriz de 23 linhas por 10 colunas. Esta matriz representa a população dos 10 maiores municípios de cada estado brasileiro. Em cada linha, as colunas estão em ordem decrescente , com exceção da primeira coluna, que sempre representa a capital. O algoritmo deve imprimir:

✓ qual o número do estado de capital mais populosa;

✓ qual a média das populações das capitais do Brasil;

✓ quais os números dos estados e dos municípios que tem população maior que a capital.

11. Definir um algoritmo que trabalhe com uma matriz de 129 linhas por 5 colunas, onde cada linha contém os dados de um aluno da escola e cada coluna: coluna 1 - número do aluno, coluna 2 - nota do aluno no 1o. bimestre, coluna 3 - nota do aluno no 2o. bimestre, coluna 4 - nota do aluno no 3o. bimestre, coluna 5 - nota do aluno no 4o. bimestre. Após ler o conjunto de dados o algoritmo deve imprimir:

✓ qual a média anual de cada aluno;

✓ qual a média da turma em cada bimestre;

✓ número do aluno e em qual bimestre ocorreu sua maior nota;

✓ qual o bimestre em que ocorreu mais 0.

12. Fazer um algoritmo para corrigir provas de múltipla escolha. Cada prova tem 10 questões, cada questão valendo um ponto. O primeiro conjunto de dados a ser lido será o gabarito para a correção da prova. Os outros dados serão os números dos alunos e suas respectivas respostas e o último número, do aluno fictício, será 9999.

O algoritmo deve calcular e imprimir:

a) para cada aluno, o seu número e sua nota;

b) a porcentagem de aprovação, sabendo-se que a nota mínima de aprovação é 6;

c) a nota que teve maior frequência absoluta, ou seja, a nota que apareceu maior número de vezes (supondo a inexistência de empates).

13. Dado um tabuleiro de xadrez TAB onde, para facilitar a indicação das pedras, vamos convencionar:

1 - peão 2 - cavalos 3 - torres

4 - bispos 5 - reis 6 - rainhas

0 - ausência de pedra

Ler os dados e contar a quantidade de cada tipo de peça no tabuleiro em um certo momento do jogo. Tamanho do tabuleiro 8 x 8.

14. Um biblioteca possuí 8 departamentos. Cada departamento contém 40 estantes capazes de conter, cada uma, 150 livros. Supondo que cada livro-padrão tenha 200 páginas de 35 linhas por 60 caracteres, declarar uma variável composta capaz de conter todos os caracteres presentes nos livros da biblioteca.

15. O Museu de Carros Antigos de Curitiba está conduzindo um levantamento dos carros antigos do Estado. Para cada carro, deve ser lida os seguintes dados: código do fabricante ( 0 a 30); ano do carro ( de 1900 a 1950); condições do carro ( 1 a 4). Para permitir a execução de várias análises nos dados, estes são armazenados em um conjunto tridimensional. O valor armazenado é o número de carros encontrados com aquelas características.

O algoritmo deve:

• criar esta estrutura e fazer a leitura dos dados para formar o conjunto de informações;

• calcular e imprimir:

✓ o número de carros feitos em 1910 cujas condições são classificadas como boas ou excelentes - código 4;

✓ o fabricante mais popular;

✓ identificar o fabricante cujos carros parecem estar em melhores condições - código 4.

16. Um grupo de 100 pessoas respondeu a um questionário composto de 10 perguntas. Cada pergunta contém somente uma entre três respostas: Sim, Não e vazio.

Criar um algoritmo Portugol que leia um conjunto de dados contendo as respostas de cada pessoa para as 10 perguntas e armazene em uma matriz 100 x 10. O algoritmo deve imprimir ao final:

✓ quantas respostas foram vazio;

✓ qual a pergunta com mais respostas Não - utilizar um vetor ;

✓ quantos Sim ocorreram na pergunta 7.

REGISTROS

Para a definição de estruturas complexas de dados, o Portugol oferece a ferramenta chamada registro, que são considerados tipos de dados heterogêneos por permitirem armazenar vários dados de tipos diferentes em uma mesma estrutura. Trata-se de um aglomerado de dados que pode ser acessado no todo, ou a cada um de seus elementos individualmente. Como cada elemento individual pode ser tratado separadamente e possuí tipo de dado especifico, leva o nome de campo. Logo, um registro pode ser considerado um conjunto de dados logicamente relacionados, mas de tipos de dados diferentes. .

Os tipos registros devem ser declarados antes das variáveis, pois poderá ocorrer a necessidade de se declarar uma variável com o tipo registro anteriormente atribuído. Para se declarar um tipo registro em Portugol o procedimento é semelhante ao de vetores e matrizes:

1. definição do tipo de dado:

Tipo = REGISTRO

, , ... , : ;

: ;

.....

: ;

fimregistro;

Onde: campo são identificadores de variáveis.

2. definição das variáveis que poderão conter este novo tipo de dado:

, ,... : ;

Quando necessário, é possível definir um campo de um registro como tendo um conteúdo vetor ou matriz. Outro conceito interessante é a definição de um vetor com conteúdo um registro, esta estrutura é bastante útil para a definição de organização de dados.

ACESSO AOS DADOS

Para fazer acesso a um campo contido em um registro precisa-se indicar todo o caminho necessário para encontrar a informação, separando-os por um ponto ( . ):

. < nome do campo>

Desta forma pode-se atribuir um valor a um campo do registro, imprimir tal valor e utilizar o valor em expressões.

Exemplo: declarar um registro para armazenar um cadastro de pessoal

Tipo REG1 = registro NOME : caracter [40];

END : ENDEREÇO;

DTNASC : DATA;

CPF, RG : inteiro;

SAL : V;

fimREG1;

Tipo ENDEREÇO = registro RUA: caracter[20];

NUM : inteiro;

CIDADE : caracter [15];

ESTADO : caracter [2];

CEP : inteiro;

fimENDEREÇO;

Tipo DATA = registro D, M, A : inteiro;

fimDATA;

Tipo V = vetor [0:11] real;

CAD : REG1;

leia (CAD); {acesso ao registro com todos os seus campos}

se CAD.DTNASC.D = 29 e CAD.DTNASC.M = 10

então imprima (CAD.END); {todos os campos do registro ENDEREÇO}

fimse;

para I de 0 até 11 faça

imprima ( CAD.SAL[I]); {salário dos 12 últimos meses}

fimpara;

EXERCÍCIO

1. Declarar um registro com os dados:

nome, data de nascimento (dia, mês e ano), tem dependentes (S/N), sexo ,cpf, endereço (rua, número, cep, cidade, estado).

2. Declarar um registro com os dados:

nome, cpf, identidade, horas trabalhadas no ano (mês a mês), salário, fgts.

3. Declarar um registro com os dados:

código do material, nome do material, número de peças em estoque, preço unitário.

4. Uma escola cadastrou as notas bimestrais de seus alunos em registros no formato:

matrícula : inteiro;

nome : caracter[40];

nota do trabalho 1, nota do trabalho 2 , nota da prova : real;

Fazer um algoritmo que leia os registros acima até que seja lida matrícula = 0 e calcule a média de cada aluno, pela fórmula:

media = (( trabalho 1 * 2) + trabalho 2 + (prova * 7)) / 10

Ao final deve ser impresso: o nome do aluno, sua média e a mensagem:

“Parabéns” se media for maior ou igual a 70 e “Precisamos estuda mais” se média for abaixo de 70.

5. Um universidade realizará seu concurso vestibular em duas 3 unidades, a instituição deseja saber qual unidade está mais próxima da residência do candidato. Para tanto cada candidato preencheu um registro no formato:

matrícula: inteiro;

distância para unidade 1, distância para unidade 2, distância para unidade 3 : real;

O algoritmo deve gerar, para cada candidato, outro registro no formato:

matrícula: inteiro;

número da unidade mais próxima : inteiro;

distância desta unidade : real;

Os dados terminam quando for lida matrícula = 0.

6. Uma organização tem um conjunto de registros de vendas de um ano. Tais registros tem o formato:

REG dia, mês : inteiro;

valor : real;

Criar um algoritmo portugol capaz de ler os dados e imprimir os totais mensais de venda. O processamento termina quando for lido um dia igual a 0. Utilizar um vetor de 12 posições indexado pelo campo mês do registro.

19. Uma companhia aérea possui 6 tipos de aviões: 747, 737-200, 737-300, 727, A300 e Bandeirantes. Cada viagem realizada por cada avião gera um registro no formato:

tipo do avião : caracter [11];

número de passageiros : inteiro;

distância percorrida : real;

Fazer um algoritmo que leia tais registros até que seja lido tipo do avião igual a branco. O algoritmo deve totalizar por tipo de avião o número de passageiros e total da distância percorrida no período. Ao final deve ser impresso um relatório informando a produtividade de cada tipo de avião, isto é, número total de passageiros divido pela distância total.

20. Uma seguradora possui um cadastro de seus segurados contendo registros com os campos:

matrícula : inteiro;

nome : caracter[40];

data de nascimento : dia, mês e ano;

sexo : caracter[1];

Fazer um algoritmo que leia tais registros até que seja lido uma matrícula = 0, este algoritmo deve conter uma função para calcular a idade de segurado, com base na data atual, em dias. Ao final devem ser gerados os seguintes registros:

HOMENS nome : caracter[40]

idade : inteiro

MULHERES nome: caracter [40];

idade : inteiro;

MODULARIZAÇÃO

A Programação Estruturada é hoje o resultado de uma série de estudos e propostas de disciplinas e metodologias para o desenvolvimento de software. Conceitos associados como técnica de refinamentos sucessivos e modularização de programas integram o ferramental para elaboração de programas visando, principalmente, os aspectos de confiabilidade, legibilidade, manutenibilidade e flexibilidade.

A metodologia de refinamentos sucessivos parte do princípio de que resolver um problema complexo é mais fácil se não precisarmos considerar todos os aspectos do problema simultaneamente, isto é, a decomposição de um problema grande numa série de subproblemas mais simples.

Quando no processo de desenvolvimento do algoritmo faz-se a opção por divisão do algoritmo, este procedimento conduz a modularização da solução do problema.

Um módulo é então um grupo de comandos, constituindo um trecho de algoritmo, com uma função bem definida. Esta divisão da atividade de programação permite que, a cada instante, toda a atenção do programador esteja concentrada na solução de cada problema específico e bem definido. Da mesma forma, pode-se verificar a correção do algoritmo por etapas analisando-se a correção de cada módulo.

A decisão pela divisão do algoritmo em módulos traz benefícios como:

a. maior flexibilidade e facilidade de manutenção, já que o módulo pode esconder dos outros módulos detalhes que só interessam a ele;

b. permite a divisão de tarefa em uma equipe, onde cada módulo pode ser desenvolvido por um programador diferente;

c. facilita o teste, porque cada módulo pode ser testado individualmente, e depois ser incorporado ao conjunto;

d. facilita o projeto, na medida em que permite a abstração.

A experiência recomenda que os módulos constituintes de um programa devem ter no máximo o tamanho de uma página de listagem. Módulos maiores são difíceis de ser compreendidos e em geral são multifuncionais.

Um outro aspecto importante que envolve a modularização, em particular a modularização de dados, é a possibilidade de cada módulo poder definir as suas estruturas de dados próprias, suficientes e necessárias apenas para atingir o objetivo final do módulo. Estre aspecto disciplina e impõem restrições a utilização das estruturas de dados do algoritmo. Toda a comunicação entre módulos deverá ser bem definida através de vínculos entre os mesmos.

Um bom algoritmo deve procurar reduzir a interação entre módulos (acoplamento) e aumentar o relacionamento dos elementos de um mesmo módulo (coesão).

As ferramentas de modularização apresentadas são: funções e procedimentos.

Vantagens:

1. partes comuns a vários programas ou que se repetem dentro de um mesmo programa, quando modularizadas em um procedimento, são programadas (e testadas) uma só vez, mesmo que tenham que ser executadas com variáveis diferentes;

2. podem-se constituir bibliotecas de programas, isto é, uma coleção de módulos que podem ser utilizados em diferentes programas sem alteração e mesmo por outros programadores.

3. a modularização dos programas permite preservar na sua implementação os refinamentos obtidos durante o desenvolvimento dos algoritmos.

4. economia no armazenamento, uma vez que o módulo é armazenado uma única vez mesmo que utilizado em diferentes partes do programa. Permite, também, que, em um determinado instante da execução do programa, estejam na memória principal apenas o módulo ou os módulos necessários a execução deste trecho de programa - paginação.

Desvantagens:

1. existe um acréscimo de tempo na execução de programa constituídos de módulos, devido ao trabalho adicional de ativação do módulo.

BLOCO

O nosso conhecimento de bloco até agora, está limitado a colocar as palavras INICIO e FIM, respectivamente, para definir o algoritmo. Entretanto, o conceito de BLOCO tem uma amplitude maior, pois podemos ter diversos BLOCOS (uns dentro de outros) dentro de um algoritmo.

Um bloco era formado por:

inicio

;

;

fim.

Agora, de acordo com o que vimos, podemos ter blocos dentro de blocos:

inicio

;

inicio {segundo bloco}

; {segundo}

; {segundo}

fim; {segundo}

;

fim.

Uma das vantagens é a possibilidade de definir variáveis fora do seu lugar original, principalmente, quando se conhece a variável no meio do algoritmo.

Exemplo: inverter a ordem de um vetor.

inicio

N: inteiro;

leia (N);

inicio {procedimento inverte}

tipo V=VETOR [1:N] inteiro;

VET : V;

leia (VET);

{inverta VET}

imprima (VET);

fim; {procedimento inverte}

fim.

Uma variável começa quando o bloco, onde ela está contida, inicia e termina quando este bloco termina (FIM.) - variáveis locais ao bloco.

Quando existe um bloco dentro de outro, as variáveis do bloco externo são locais para ele e globais para o bloco internos. Já as variáveis do bloco interno são locais a ele e são desconhecidas pelo bloco externo.

Quando existe conflito de nomes (duas variáveis com mesmo nome, sendo uma local e outra global), vale a definição local, e a global deixa de poder ser acessada (embora continua existindo normalmente).

Exemplo:

inicio

I,J:inteiro;

NOME: caracter[40];

inicio {procedimento 1}

K,L,M:real;

NOME: caracter[60];

SOMA:inteiro;

leia (NOME);

K =B e A>=C

entao imprima (A);

fimse;

se B>A e B>=C

entao imprima (B);

fimse;

se C>A e C>B

entao imprima (C);

fimse;

fim; {ACHA}

leia (N1,N2.N3);

ACHA (N1,N2,N3);

leia (N1,N2,N3);

ACHA(n1,N2,N3):

leia (N1,N2,N3);

ACHA (N1,N2,N3);

fim.

No cabeçalho do procedimento, temos uma série de variáveis, que podem ser de entrada e de saída. Chamamos estas variáveis de Parâmetros FORMAIS. Já as variáveis usadas quando o procedimento é efetivamente chamado são denominadas Parâmetros EFETIVOS.

Os parâmetros Efetivos de entrada podem ser variáveis, constantes ou expressões. Já os parâmetros Efetivos de saída tem que ser variáveis.

Um procedimento pode chamar outros dentro dele - procedimentos aninhados.

FUNÇÃO

Uma função é um bloco que tem um nome e que devolve um resultado. Em outras palavras, quando não houver retorno de um resultado temos um procedimento, e quando houver temos uma função.

Sintaxe:

Função : ;

;

inicio

;

;

( < resultado>;

fim;

Toda função usada dentro de um programa deve ter sido definida antes de ser chamada.

Sintaxe:

( ;

Exemplo: seja uma função que calcule o teorema de pitágoras.

inicio

W1,W2,RESP:real;

Funcao PITAG (A,B) : real;

A,B:real;

inicio

X:real;

X ( (A ** 2 ) + (B ** 2);

PITAG ( X ** 0.5;

fim; {PITAG}

leia (W!,W2):

RESP ( PITAG (W1,W2);

imprima (RESP);

fim.

EXERCÍCIOS

1. Fazer a função sen(x) que recebe o valor de x e calcula o seno através da seguinte série:

               x        x3      x5      x7

sen(x) = ---- - ---- + ---- - ---- + ....

               1        3!      5!      7!

A função retorna o valor do seno de x. Obs.: Utilize a soma dos 30 primeiros termos da série acima

2. Fazer um algoritmo que calcule a área e o perímetro de um quadrado a partir do tamanho do lado. Lado é dado de entrada e os valores de área e perímetro são retornados por funções.

3. Fazer um algoritmo para achar o maior valor dentre 3. A função maiorde3 recebe como argumento os 3 valores e retorna o maior.

4. Escrever um algoritmo para gerar os N primeiros termos da série de Fibonacci: 1, 1, 2, 3, 5, 8, 13, 21,.... A função FIB tem N como parâmetro, calcula e imprime os termos da série.

5. Escrever um algoritmo que calcule e imprima o valor de S. Faça uma função que receba o valor de N e devolva o valor de S. N é dado de entrada e deve ser lido na função principal.

       1        2        3             N-1    N

S = ---- + ---- + ---- + ... + ---- + ----

       N      N-1   N-2            2        1

6. Fazer um algoritmo para ler um inteiro N >= 0 e calcular seu fatorial. A função FAT recebe o valor de N e devolve seu fatorial.

7. Fazer um algoritmo para ler um inteiro N > 0 e calcular o seguinte somatório:

R = 1 + 22 + 32 + .... + N2. A função deve receber o valor de N e devolver o valor de R.

8. Fazer um algoritmo para ler um inteiro N > 0 e calcular o seguinte somatório:

S = N + N-1 + N-2 + N-3 + ... + 0. A função deve receber o valor de N e devolver o valor de S.

9. As notas de uma turma de N alunos são lidas e armazenadas em um vetor. N também é lido. Fazer um algoritmo contendo funções para:

a) receber o valor de N, ler as N notas, armazenando-as em um vetor (este deve ser variável global).

b) receber o valor de N, calcular a média da turma, devolvendo seu valor à função principal.

c) receber o valor de N, achar a maior nota, devolvendo seu valor à função principal.

10. Um numero primo é qualquer numero inteiro positivo que é divisível apenas por si próprio e por 1. Escreva uma função que recebe um numero inteiro positivo e, se este número for primo, retorna 1, caso contrario, retorna 0.

11. Fazer um algoritmo, contendo uma função que receba uma temperatura dada em graus Fahrenheit e devolva a temperatura convertida para graus Celsius. (C = 5/9*(F-32)).

12. Fazer um algoritmo que calcule o volume e a área de uma esfera. O raio é dado de entrada, e os valores de volume e a área são retornados por funções que recebem o raio como argumento.

V = 4/3*pi*R3 e A = 4*pi*R2, onde R = raio da esfera.

13. Um cofrinho contém os seguintes itens: n1 moedas de 1 real , n2 moedas de 50 centavos , n3 moedas de 25 centavos, n4 moedas de 10 centavos , n5 moedas de 5 centavos, n6 moedas de 1 centavo. Fazer uma função que receba os valores acima e devolva o total em Reais

14. Seja um vetor contendo N inteiros e de tamanho máximo TAM (n 0

Então fatorial ( FATORIAL (n –1);

Senão fatorial ( 1;

Fimse;

Fim.

2. Calculo do MDC entre M (dividendo) e N (divisor)

Função MDC (m,n) : inteiro;

m, n : inteiro;

Inicio

Se n > m

Então mdc ( MDC (n,m);

Senão se n = 0

Então mdc ( m;

Senão mdc ( MDC (n, (m mod n));

Fimse;

Fimse;

Fim.

3. SÉRIE DE FIBONACCI

função FIB (N): inteiro;

N: inteiro;

inicio

I, ANT, PEN, ULT: inteiro;

ANT ( 0;

PEN ( 1;

FIB ( 0;

para I de 1 até N faça

ULT ( ANT + PEN;

FIB ( FIB + ULT;

ANT ( PEN;

PEN ( ULT;

fimpara;

fim;

SÉRIE DE FIBONACCI - RECURSIVIDADE

função FIB (N) : inteiro;

N: inteiro;

inicio

se N = ARQUIVO < tipo de organização> DE < nome do registro> ;

Onde, tipo de organização pode ser sequencial, direta ou indexada e irá definir a forma de acesso aos registros do arquivo.

ABRIR UM ARQUIVO – como dito anteriormente, não se pode obter informação contida em um arquivo sem antes abri-lo, em algoritmos isto será feito pelo comando:

ABRIR ( );

Caso o arquivo tenha formato de organização sequencial deve-se indicar se ele será aberto para leitura ou gravação. Indicando assim o posicionamento do mesmo, respectivamente, no início ou final do arquivo:

ABRIR ( , );

FECHAR UM ARQUIVO – não devemos manter o arquivo aberto depois de usá-lo, pois isso deixaria seu conteúdo exposto a agentes externos que poderiam danificar sua integridade. Por isso, convém sempre fechar os arquivos após sua utilização, utilizando o comando:

FECHAR ( < nome do arquivo> );

Neste caso não importa a forma de organização do arquivo, tão pouco a razão de sua abertura.

COPIAR UM REGISTRO – um arquivo não deve ter seus registros consumidos e sim consultados e, para tal, precisa-se copiar o conteúdo que interessa em algum lugar para então fazer sua utilização. O local mais apropriado para esta cópia é o próprio registro que compõem o arquivo, pois terá o mesmo formato de campos. Neste caso copiam-se as informações da posição corrente do arquivo para o registro especificado, onde todos os campos do registro do arquivo são copiados para os respectivos campos do registro estabelecido no comando.

COPIAR ( , < nome do registro >);

GRAVANDO UM REGISTRO – sempre que alguma nova informação deva ser gravada no arquivo esta deve ser feita em forma do registro que compõem o referido arquivo. Assim, deve-se preencher todos os campos do registro para então, gravá-lo no arquivo. Esta gravação ocorrerá na posição atual do arquivo. O comando será:

GRAVAR ( , );

Para percorrer todos os registros de um arquivo, a partir do primeiro, até encontrar seu fim. Este comando posiciona o arquivo na posição consecutiva, ou seja, no próximo registro, e é definido como:

AVANÇAR (< nome do arquivo>);

Outra instrução bastante importante é a que identifica o final do arquivo. Esta função retorna verdadeiro quando a posição corrente é o fim do arquivo, e falso em caso contrário. Sua sintaxe é:

EOF () ou FDA (< nome do arquivo>);

onde EOF simboliza, End Of File e FDA simboliza, Final De Arquivo.

Quando tem-se um arquivo com organização direta pode-se atingir o registro desejado fazendo uso do campo chave, para tanto utiliza-se o comando Posicionar, onde a posição corrente do arquivo passa a ser a indicada pela chave, da seguinte forma:

POSICIONAR ( , );

A forma de acesso ao arquivo independe de sua organização, pode-se igualmente acessar um arquivo de organização direta de forma sequencial. Assim como um arquivo sequencial poderá ser acessado de forma direta desde que seja gerado um arquivo indexado associando um campo do registro deste arquivo, denominado como chave, ao seu número de registro no arquivo sequencial.

EXERCÍCIOS SOBRE ARQUIVOS

1. Supondo um arquivo com os registros com os campos: matrícula, nome, endereço, situação, título de eleitor, cpf, rg, conta bancária, estado civil, cargo, salário.

Imprimir os funcionários com: situação = afastado, cargo = instrutor e salário acima de R$ 400,00.

2. Dado o arquivo Cadastro com registros com campos: nome, sexo, cor-de-olhos, altura, peso e data de nascimento. Criar um arquivo Homens cujo sexo =1 e um arquivo Mulheres cujo sexo = 2. Estes dois novos arquivos tem registros com campos nome, peso e data de nascimento.

3. Uma distribuidora de bebidas abastece o mercado de Coca-cola. A empresa, no momento, está preparando o iminente lançamento da Coca Light Plus. Assim, resolveu fazer uma pesquisa de opinião na cidade para determinar qual a melhor estratégia a seguir. Os dados da pesquisa estão em um arquivo com o lay-out:

• identificação do quarteirão da cidade,

• quantidade de crianças no quarteirão,

• quantidade de adolescentes no quarteirão,

• quantidade de obesos no quarteirão,

• quantidade de diabéticos no quarteirão,

• total de pessoas no quarteirão.

Deve-se criar um algoritmo que leia e processe os dados, informando:

a) quantos quarteirões tem mais de 100 obesos;

b) qual a percentagem média (= média das percentagens) de crianças por quarteirão sobre

o total de pessoas no quarteirão;

c) quantos quarteirões tem mais adolescentes do que crianças;

d) quantos quarteirões tem mais de 5% de diabéticos.

4. Uma revenda de automóveis quer fazer uma pesquisa para determinar se há correlação entre renda familiar e cor do automóvel adquirido. Para tanto, cada venda realizada no mês passado, gerou um registro magnético contendo: renda familiar, cor do carro adquirido.

As cores possíveis são: amarelo, azul, branco, cinza, marrom, preto e vermelho. Já as classes de renda são 3: de 0 a 50 sal mínimos,

de 50,01 a 150 sal mínimos,

acima de 150 sal min.

Ler o valor do sal mínimo no inicio do algoritmo e imprimir a quantidade de carros vendidos por cor em cada classe de renda.

5.Existe um arquivo de funcionários com registros com o lay-out:

nome, carteira profissional, endereço, bairro, telefone, CEP, CPF, título de eleitor, número de dependentes, cargo, salário base, data de admissão (dia, mês, ano), data de demissão (dia, mês, ano).

A partir deste arquivo, deseja-se:

a) aumentar o salário em 10% dos funcionários casados e admitidos até 30/09/97;

b) relação dos funcionários não solteiros;

c) relação dos funcionários por faixa salarial:

1 a 2 salários mínimos

2 a 4 salários mínimos

4 a 7 salários mínimos

acima de 7 salários mínimos,

o valor do salário mínimo deve ser lido no início do procedimento;

d) relação dos funcionários com telefone que estão demitidos.

Utilizar função ou procedimento para cada um dos itens acima.

6. Criar um algoritmo portugol que faça o calculo do valor do salário líquido de um funcionário. O arquivo de func. contém registros com os campos: matrícula, nome, endereço, CPF, RG, titulo eleitor, estado civil, sexo, data nascimento, conta corrente, salário mensal (220 horas), num horas extras, num de dias faltados, vale transporte (S/N), vale refeição (S/N), num dependentes - para cada dependente: grau de parentesco (filho, esposa), data nascimento

Descontos:

Tabela de desconto de INSS sobre todos os proventos:

de 0 a 10 SM - 9%

de 10 a 25 SM - 15%

acima de 25 SM - 25%

Desconto do FGTS equivale a 8% do valor bruto de proventos.

Para cada dia faltado diminuir 8 horas de trabalho.

Vale refeição - 20% do SM.

Vale transporte - 6% do salário bruto.

Tabela de desconto de auxilio saúde - todos os funcionários possuem

titular - 1,5% do salário bruto.

dependentes - esposa - 3% do salário bruto

filhos até 14 anos - 2% do salário bruto

filhos acima de 14 anos - 3% do salário bruto.

Proventos:

Valor do salário família: R$ 120,00 por filho com menos de 14 anos.

Para cada hora extra o valor da hora é 50% mais que a hora normal.

Salário Líquido : proventos = salário bruto + salário família + hora extra

desconto = (proventos * % do INSS) + vale refeição + vale transporte + auxilio saúde + valor faltas

liquido = proventos - descontos

Ler no inicio o valor do SM.

Utilizar procedimentos e funções.

Imprimir ao final:

matricula, nome, conta corrente, salário a ser pago,

total do INSS, total do FGTS e total líquido da folha de pagamento.

EXERCÍCIOS DIVERSOS

1. Dado um conjunto de datas do ano de 1996, no formato dia e mês, determinar qual o número relativo deste dia no ano, considerando o dia 1º de janeiro como dia número 1, e o dia 31 de dezembro como dia número 365. O algoritmo deve prosseguir lendo e calculando até que um dia igual a zero seja lido.

2. Dada uma matriz de dimensões 8 X 15, obter uma outra também 8 X 15, onde cada linha foi dividida pelo menor elemento da linha correspondente na matriz original.

3. Dada uma matriz de dimensões 9 X 12, obter uma outra também de 9 X 12, onde cada linha foi dividida pela somatória dos elementos da linha correspondente da matriz original.

4. Definir um algoritmo Portugol capaz de receber uma série de datas, sempre referentes ao ano de 1996, e no formato dia e mês. Para cada uma delas, o algoritmo deve calcular uma nova data, no mesmo formato, e que corresponda ao período de 180 dias posterior a data original. A série de datas se encerra quando for lido um dia igual a zero.

5. Dada uma matriz 7 X 12, definir um algoritmo que leia a matriz, e a seguir, classifique as linhas da matriz em ordem crescente. A matriz resultado deve ser impressa ao final.

6. Criar um algoritmo que leia um vetor de 500 elementos inteiros. A seguir o algoritmo deve determinar qual o valor que mais aparece neste vetor e quantas vezes ele aparece. Estas duas informações devem ser impressas ao final.

7. Dados dois horários no formato hora e minuto:

□ hora variando de 0 até 11;

□ minutos variando de 0 até 59;

□ definir um algoritmo que leia um par de horários, sempre referentes a um mesmo dia, e informe qual a diferença entre os dois. O algoritmo termina quando a primeira hora for igual a 99. Por definição, o segundo horário nunca é menor que o primeiro, e a diferença entre os dois deve ser informada no mesmo formato: hora e minuto.

8. Uma partida de rolamentos é composta de quantidades variáveis de rolamentos tipos 1, 2 e especial. Ela é aceita no TODO quando:

• pelo menos 97% de rolamentos tipo 1 não tem defeito E

• pelo menos 95% de rolamentos tipo 2 não tem defeito E

• menos de 1000 rolamentos tipo especial tem defeito.

Os dados referentes a cada partida estão no formato:

Número da partida; Tipo do rolamento; Quantidade de rolamentos; Quantidade de rolamentos c/defeito.

Deve-se definir uma algoritmo que leia todos os dados do arquivo e, para cada partida, deve-se imprimir seu número e a identificação: ACEITA ou REJEITADA.

9. Os números romanos são ainda utilizados em muitas indicações. Conhecendo seus símbolos, que são:

I = 1; V=5; X=10; L=50; C=100, D=500 e M=1000, escreva um algoritmo que leia o número inteiro e gere, para cada número lido, o equivalente em números romanos, imprimindo ao final.

10. Um fabricante de margarina deseja homenagear sua mãe no lançamento de um novo produto no próximo ano. A nova margarina deverá ter um nome formado por alguma combinação das letras M E R T A, que é o nome da mãe do fabricante. O algoritmo deve imprimir as 120 combinações possíveis, assim o fabricante escolherá o nome que quiser.

11. Uma fazenda resolveu automatizar o processo de tomada de decisão para escolha de sementes de trigo. Assim, a área de plantio foi dividida em 8600 lotes distintos, que devidamente semeados, tiveram a cultura de 95/96 observada. A partir dos dados levantados no campo, foi criado um arquivo contendo o seguinte lay-out:

Identificação do lote; Tipo de semente; Área do lote plantado; Quantidade de trigo colhido no lote em kg; Qualidade do produto.

• Existem 22 tipos de sementes , numeradas de 1 até 22.

• A qualidade do produto é um número que significa: 1= excelente; 2=razoável; 3=inferior.

• Supõem-se que o custo de todos os tipos de semente é o mesmo.

Deve-se definir um algoritmo que leia o arquivo, determine e imprima qual o tipo de semente mais produtiva, seguindo o critério:

Se o trigo produzido for excelente, a produtividade do lote deve ser aumentada de 20%.

Se o trigo for inferior, a produtividade deve ser diminuída em 15%.

Para cada tipo de semente, devem ser totalizadas as informações de área e peso do produto produzido. A semente mais produtiva é aquela que tiver maior coeficiente peso/área.

-----------------------

[pic]

F

V

fim

imprima C

C= A + B

C = A* B

F

V

A é par

leia A

leia B

inicio

identificador

letra(

letra

dígito

,

identificador

;

:

inteiro

real

caracter

lógico

;

identificador

expressão

((

inicio

fim

comandos

variáveis

comando n

comando2

comando 1

imprima var 1, ... var n

leia var1, ..., var n

F

V

condição

comando n

comando 1

V

F

comando nn

comando 11

condição

comando n

comando 1

2

3

4

1

1

3

4

2

F

V

condição

comando n

comando 1

V

F

comando n

comando 1

condição

para de até passo

comando n

comando 1

................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download

To fulfill the demand for quickly locating and searching documents.

It is intelligent file search solution for home and business.

Literature Lottery