instituto superior técnico dep. de engenharia mecânica ... · tipos derivados (fichas) 35 11....

44
Instituto Superior Técnico Dep. de Engenharia Mecânica GCAR, Secção de Sistemas Introdução à Programação (Compilação de enunciados para as aulas práticas) José Borges João Reis 2002/03

Upload: dinhduong

Post on 26-Jan-2019

213 views

Category:

Documents


0 download

TRANSCRIPT

Instituto Superior TécnicoDep. de Engenharia MecânicaGCAR, Secção de Sistemas

Introdução à Programação(Compilação de enunciados para as aulas práticas)

José BorgesJoão Reis

2002/03

i

Índice

1. INTRODUÇÃO AO COMPILADOR FORTRAN POWERSTATION 1

2. INTRODUÇÃO AO FORTRAN 90 8

3. ESTRUTURAS DE SELECÇÃO 12

4. ESTRUTURAS DE REPETIÇÃO 16

5. FUNÇÕES 19

6. SUBROTINAS, FORMATAÇÃO EM OPERAÇÕES DE ENTRADA / SAÍDA 21

7. FORMATAÇÃO EM OPERAÇÕES E/S (CONT.), FICHEIROS, RECURSÃO 24

8. TABELAS UNIDIMENSIONAIS 27

9. TABELAS MULTIDIMENSIONAIS 31

10. TIPOS DERIVADOS (FICHAS) 35

11. PONTEIROS & LISTAS LIGADAS 38

1

1. Introdução ao compilador FORTRAN PowerStation

1.1. IntroduçãoUm compilador é um tipo especial de programa de computador que serve para criaroutros programas de computador.

Um programa executável, também conhecido por aplicação, é essencialmente umasequência de números inteiros que são entendidos pela unidade central de processamentodo computador (ou CPU, acrónimo de Central Processing Unit) como instruções. Devidoà diferença entre as linguagens utilizadas pelos seres humanos (como algunsprogramadores) e as intermináveis sequências de números entendidas pelos circuitoselectrónicos dos computadores, surgiu a necessidade de encontrar processos deprogramar máquinas que fossem mais próximos da linguagem própria dos seres humanos.É neste contexto que surgem as linguagens de programação de alto nível, entre as quaisse encontra o FORTRAN90.

O papel que o compilador tem neste processo é no fundo o de um programa “tradutor”que transforma nas respectivas sequências codificadas de números, directamenteexecutáveis pelo computador, o programa originalmente escrito numa linguagem de altonível.

Hoje em dia, no que respeita a máquinas tipo PC, é cada vez mais raro encontrar umprograma compilador sozinho. Os compiladores surgem normalmente integrados com umconjunto de outras ferramentas auxiliares de programação numa aplicação denominada:ambiente de desenvolvimento integrado (ou IDE, de Integrated DevelopmentEnvironment).

O programa Fortran PowerStation 4.0� (FPS4.0) da Microsoft� é um exemplo de umIDE orientado para a linguagem FORTRAN; em particular é o programa que, por estardisponível no Laboratório de Tecnologias de Informação (L.T.I.), servirá de base a estaaula e aos trabalhos práticos desta cadeira.

1.2. Criação do ficheiro de Código (Source File):Para editar um ficheiro de código FORTRAN a solução mais prática é escolher o editorde texto integrado do FPS4.0, já que este apresenta algumas vantagens em relação aoseditores de texto normais.

Para iniciar o programa FPS4.0 seleccionar as seguintes opções de menu:

Start � Programs � Fortran PowerStation 4.0 � Developer Studio

É possível que em alguns computadores “Developer Studio” seja substituído por“MSDEV” ou “Microsoft Developer Studio”. O MS Developer Studio (MSDEV) é umambiente de desenvolvimento que pode suportar compiladores e ferramentas de diversaslinguagens de programação. Neste texto, para simplificar, não faremos distinção entre oMSDEV e o FPS4.0, sendo feita referência normalmente a um e a outro como FPS4.0.

2

No FPS4.0 começa-se por criar um novo espaço de trabalho fazendo:

File � New � {Project Workspace} � OK

Na janela que surge a seguir (ver fig.) devem ser tomadas as seguintes opções:

Type: Console Application

Name: Proj

Location: C:\Temp\Proj ou D:\Temp\Proj

Create

Neste momento é criado o novo Workspace, sendo automaticamente criada a directoria“C:\Temp\Proj”. Numa janela no canto superior esquerdo, denominada “File View”,surge uma árvore com uma pasta, por enquanto vazia, que irá conter os ficheiros queestão associados ao projecto.

Para lançar o editor integrado do FPS4.0 fazer:

File � New � {Text File} � OK

Pode também utilizar-se o ícone “New Source File” na barra de ferramentas “StandardToolbar”. Uma vez criado o novo projecto e aberto o editor de texto, podemos escrever onosso primeiro programa em FORTRAN90. Na janela do editor introduza o seguintetexto:

3

PROGRAM Ola_Mundo

! O meu primeiro programa em FORTRAN90

IMPLICIT NONE

! Escrever no ecran

PRINT *, "Ola Mundo!"

! Esperar que se pressione ENTER para terminar

READ (*,*)

END PROGRAM Ola_Mundo

Note-se que o editor integrado atribui diferentes cores aos comentários, palavras-chave(instruções) e restante código para facilitar a leitura do programa e detecção de erros. Nocontexto desta cadeira, deve sempre evitar-se a utilização de caracteres especiais (taiscomo letras com acentuação) na edição do código já que a conversão destes caracterespara os caracteres de texto simples, utilizados no MS-DOS, nem sempre é directa.

Após a edição do ficheiro este deve ser guardado na directoria que está a ser utilizada edepois associado ao projecto. Para gravar o ficheiro fazer:

File � Save as… � {proj.f90} � Save

tendo o cuidado de só fazer Save depois de escolher a directoria adequada. No caso de sera mesma do projecto activo (C:\Temp\Proj) esta é a seleccionada por defeito. Paraassociar o ficheiro ao projecto activo procedemos do seguinte modo:

Insert � Files into Project… � {proj.f90} � Add

De seguida, podemos expandir a árvore de directorias na janela “File View”, seleccionadoo “+” que fará aparecer o ramo correspondente ao ficheiro “proj.f90” confirmando osucesso da operação.

1.3. Compilação e criação do ficheiro executávelPara compilar o ficheiro e criar o executável do nosso programa podemos utilizar ocomando “Go” a partir da “Project Toolbar”. Em vez disso podemos utilizar a tecla F5,ou ainda fazer:

Build � Debug � Go

4

Surgirá uma janela informando que o ficheiro executável está por criar e perguntando sedesejamos construí-lo; responder “Yes”. Note-se que durante a compilação e linkagem doprograma, vão surgindo na janela Output do IDE todas as informações relevantes,incluindo os erros e avisos sobre o código. Se por qualquer motivo não estiver aberta estajanela será conveniente abri-la antes de executar fazendo:

View � Output

Caso não tenham sido encontrados erros, o nosso programa será automaticamenteexecutado, aparecendo numa nova janela (temporária) de MS-DOS.

Se foi diagnosticado algum erro no código do programa é aconselhável, no caso destesprimeiros exemplos, uma verificação cuidada do código introduzido.

Depois de correr com sucesso o programa Ola_Mundo tente agora trasformá-lo numasaudação mais pessoal substituindo as instruções:

! Escrever no ecran

PRINT *, "Ola Mundo!"

Pelas seguintes:

CHARACTER(10):: nome

! Ler o nome do utilizador

READ *, nome

! Saudar o utilizador

PRINT *, "Ola ", nome

5

Repita em seguida o procedimento de compilação e criação do ficheiro executável(apenas este, lembre-se que o ficheiro já foi anteriormente associado ao projecto actual).

Se não existirem erros, na janela de MS-DOS aparecerá apenas o cursor intermitente.Introduza o seu nome seguido de ENTER.

1.4. Utilização do debugger integrado no FPS4.0:Para auxiliar na demonstração das capacidades de outra ferramenta integrada no FPS4.0,o Debugger, é conveniente editar um programa um pouco (muito pouco) mais complexo,que ilustra de uma forma simples a utilidade que um computador, conjugado com algunsconhecimentos básicos de programação, pode ter em tarefas de cálculo para um estudantede engenharia.

Antes de passar aos parágrafos seguintes, e após terminar a execução do programaanterior, feche o projecto actual no FPS4.0 seleccionando:

Files � Close Workspace � Yes

De seguida crie um novo projecto chamado Projectil, seguindo os passosanteriormente descritos. Repetindo sempre os procedimentos utilizados no capítulo 2 parao programa Ola_Mundo edite o programa apresentado em anexo a este texto. De seguidatente compilar e criar o ficheiro executável segundo o procedimento do capítulo 3. Casoocorram erros de compilação, corrija-os de forma a poder executar o programa.

O debugger é uma ferramenta que permite fazer a depuração de erros semânticos,também chamados erros de lógica. Este tipo de erros manifesta-se durante a execuçãoquando o programa não faz exactamente aquilo que pretendíamos que fizesse (e.g., oprograma executa um cálculo mas o resultado não é correcto, ou ao seleccionardeterminada opção num menu outra das opções é executada, etc.).Para utilizar as funções do debugger seleccione, depois de ter executado o programa umavez, as opções:

Build � Debug � Step Into

Surgirá uma barra de ferramentas chamada “Debug”. Apenas três das opções disponíveisserão aqui abordadas.

É também aberta uma janela de MS-DOS onde poderemos observar o execução do nossoprograma. No canto inferior esquerdo do FPS4.0, deverá existir uma janela denominada“Locals”, contendo o nome das variáveis e constantes do programa, e o seu valor nomomento actual da execução.

6

Se a janela não estiver presente, poderá ser aberta através da sequência:

View � Variables

Na barra de ferramentas “Debug” seleccionar “Step Into”. A seta amarela que surge najanela que contém o código salta algumas instruções até à primeira instrução WRITE (nocaso do nosso exemplo). Uma nova chamada a “Step Into” fará a seta mover-se para ainstrução seguinte (READ). Esta seta indica a instrução que está a ser executada, ou quevai ser executada de seguida, o que significa que neste momento a instrução WRITE jáfoi executada e o resultado já pode ser observado na janela de MS-DOS.

Uma nova invocação de “Step Into” executa a intrução READ, o que significa que onosso programa estará agora à espera que os dados pedidos sejam introduzidos através dajanela de MS-DOS. Introduzam-se os valores 100 e 90 respectivamente, e observe-se quena janela “Locals” os valores 100 e 90 surgem associados às variáveis VelocidadeIniciale AlturaInicial, respectivamente (a vermelho).

Chamadas sucessivas da função “Step Into” levariam o nosso programa a correr instruçãoa instrução até final. Se for utilizada a opção “Step Out” o programa continuará a serexecutado da forma normal.

A opção “Stop Debug” permite parar o debugger a qualquer momento e voltar ao modode edição do FPS4.0.

1.5. Notas geraisNos computadores do L.T.I. as directorias disponíveis para gravar ficheiros são a Temp ea Users\Default que podem encontrar-se nas drives (C:) ou (D:). Também se podetrabalhar directamente a partir de uma disquete (A:).

Note-se que quando se utiliza o L.T.I. o trabalho deve ser sempre gravado emdisquete no final da sessão e apagada a directoria de trabalho, para evitar a perdade ficheiros (inadvertidamente apagados por outros utilizadores) ou a utilização dotrabalho por parte de terceiros.Lembre-se também que o FPS4.0 reconhece instruções e formatos de programa que nãoos da norma FORTRAN90, mas que podem estar de acordo com normas mais recentesque não são abordadas na cadeira.

O trabalho realizado deve seguir à risca as instruções que forem fornecidas nosrespectivos enunciados (regra geral limitando as instruções que podem ser utilizadasàquelas que são dadas nas aulas), não sendo classificados programas ou trabalhosrealizados segundo outras normas de FORTRAN (como por exemplo oFORTRAN77) ou utilizando outras linguagens de programação.

7

1.6. Listagem do Programa “Projectil”

PROGRAM Projectil

IMPLICIT NONE

REAL :: AlturaInicial, Altura, VelocidadeInicial, Velocidade, &

& Tempo

REAL, PARAMETER :: Aceleracao = -9.80665

! Obter valores para AlturaInicial, VelocidadeInicial e Tempo

PRINT *, "Intruduza a altura (m) e velocidade (m/s) iniciais:"

READ *, AlturaInicial, VelocidadeInicial

PRINT *, "Introduza o instante de tempo (s) em que deseja calcular &

&a altura e velocidade do projectil:"

READ *, Tempo

! Calcular a altura e velocidade

Altura = 0.5 * Aceleracao * Tempo ** 2 &

+ VelocidadeInicial * Tempo + AlturaInicial

Velocidade = Aceleracao * Tempo + VelocidadeInicial

! Apresentar Velocidade e Altura

PRINT *, "No instante de tempo", Tempo, "s"

PRINT *, "a velocidade vertical e", Velocidade, "m/s"

PRINT *, "e a altura e", Altura, "m"

! Esperar que se pressione ENTER para terminar

READ (*,*)

END PROGRAM Projectil

8

2. Introdução ao FORTRAN 901. Enuncie as várias partes de um programa em FORTRAN.

2. Identifique os tipos básicos de dados em FORTRAN.

3. Escreva a declaração de tipo para as variáveis:

3.1. NumeroAluno do tipo inteiro

3.2. NomeProprio, Sobrenome do tipo cadeia de caracteres com comprimentos 15 e20 caracteres, respectivamente

3.3. NotaExame, NotaLaboratorio do tipo real

4. Escreva a declaração das seguintes constantes:

4.1. TaxaJuro com o valor 1.25

4.2. Formula com o valor “CO2” e Composto com o valor “Dioxido de Carbono”

4.3. Tamanho com o valor 10

5. Escreva a declaração de tipo para especificar:

5.1. Nome, Rua e Cidade como variáveis do tipo cadeia de caracteres comcomprimentos de 20, 40 e 15, respectivamente

5.2. Numero e CodigoPostal como variáveis do tipo inteiro

5.3. Pais como uma variável cujo valor inicial é “Portugal”

6. Determine o valor das seguintes expressões:

6.1. Resultado = 9 – 5 – 3

6.2. Total = 2.0 + 6.0 / 3.0

6.3. Parcial = 2 + 3 ** 2

6.4. Tempo = 2 + 3 / 2

6.5. Raiz = 25.0 ** 1 / 2

9

7. Definindo

Dois = 2.0 Tres = 3.0 Quatro = 4.0

IntCinco = 5 IntOito = 8

Determine o valor de cada uma das seguintes expressões:

7.1. Dois + Tres * Tres

7.2. IntCinco / 3

7.3. IntOito / IntCinco * 5.1

7.4. Quatro ** 2 / Dois ** 2

7.5. SQRT( Dois + Tres + Quatro )

8. Escreva expressões em FORTRAN equivalentes às seguintes expressões:

8.1. A variável Total tem o valor de 10 + 5 B – 4 A C

8.2. A variável Resultado resulta da raiz quadrada de A + 3 B2

9. Assuma que foram feitas as seguintes declarações de tipo:

INTEGER :: IntOito = 8, IntCinco = 5, NumeroTarefa

REAL :: Dois = 2.0, Tres = 3.0, Quatro = 4.0, ValorFinal

Determine o valor atribuído em cada uma das seguintes expressões à variável consideradaou justifique, caso a atribuição seja inválida.

9.1. ValorFinal = ( Tres + Quatro / Dois ) ** 2

9.2. NumeroTarefa = IntOito / IntCinco + 5.1

9.3. IntOito = IntOito + 2

9.4. ValorFinal = SQRT ( Tres ** 2 + Quatro ** 2 )

9.5. IntOito = ABS ( Tres – 4.5 )

10. Assuma que foi feita a seguinte declaração de tipo:

CHARACTER (10) :: Alpha, Beta*5, Gamma*1, Delta*4

e que o valor da variável Delta = “Quatro”. Determine o valor atribuído em cada uma dasseguintes expressões à variável considerada ou justifique, caso a atribuição seja inválida.

10

10.1. Gamma = 17

10.2. Gamma = “17”

10.3. Alpha = “Um Dois Tres Quatro”

10.4. Alpha = “1234”

10.5. Beta = ‘don’t’

10.6. Beta = “don’t”

10.7. Alpha = Delta

10.8. Gamma = Delta

11. Considere o programa que se apresenta de seguida:

PROGRAM Demonstracao

IMPLICIT NONE

INTEGER :: I, J

REAL :: X, Y

X = 37

I = INT(X/5)

PRINT *, X, I

READ *, X, I

PRINT *, "X = ", X, " I = ", I

READ *, Y

READ *, J

PRINT *, Y

PRINT *, J

END PROGRAM Demonstracao

Apresente a saída produzida pelo programa assumindo que os valores introduzidos peloutilizador são os seguintes:

11

1.74 29

4.23 10

15

12. Escreva um programa que converte temperaturas em graus Celsius para temperaturasem graus Fahrenheit. A fórmula de conversão é dada pela expressão:

9F C 325

= +

12

3. Estruturas de Selecção

3.1. Expressões Lógicas

1. Assuma que foram feitas as seguintes declarações de variáveis:

INTEGER :: M = -5, N = 8

REAL :: X = -3.56, Y = 0.0, Z = 44.7

Ache o valor lógico das seguintes expressões:

1.1. ( X <= Y ) .AND. ( Y <= Z )

1.2. .NOT. ( ( M <= N ) .OR. .NOT. ( X + Z > Y ) )

1.3. .NOT. ( ( M > N ) .AND. ( X < Z ) ) .NEQV. &

( ( M <= N ) .AND. ( X >= Z ) )

2. Assuma que A, B e C são expressões lógicas, i.e.:

LOGICAL :: A, B, C

Construa tabelas de verdade para mostrar qual o valor das seguintes expressões lógicas,para todas as combinações de valores de A, B e C.

2.1. A .OR. .NOT. B

2.2. A .AND. ( B .OR. C )

3. Escreva uma expressão lógica que exprima as seguintes condições:

3.1. Y encontra-se estritamente entre 2 e 5

3.2. Alfa e Beta têm o mesmo sinal

3.3. X é menor que 3 ou Y é menor que 3, mas não ambas as coisas

13

3.2. Estruturas IF

4. Considere a seguinte estrutura IF

IF ( X * Y >= 0 ) THEN

PRINT *, “Sim”

ELSE

PRINT *, “Nao”

END IF

Diga qual a saída nos seguintes casos

4.1. X = 5 e Y = 6

4.2. X = 5 e Y = -6

4.3. X = -5 e Y = 6

4.4. X = -5 e Y = -6

5. Escreva instruções de Fortran que implementem as estruturas IF especificadas nasalíneas seguintes:

5.1. Se Codigo for igual a 1, então ler X e Y e calcular e mostrar a soma de X com Y

5.2. Atribuir um valor a Custo correspondente ao valor de Distancia segundo aseguinte tabela:

Distancia Custo

0 Km a 100 Km € 5,00

Mais de 100 Km mas não mais de 500 Km € 8,00

Mais de 500 Km mas menos de 1000 Km € 10,00

1000 Km ou mais € 12,00

14

3.3. Estruturas CASE

6. Repita o exercício da alínea anterior com uma estrutura do tipo CASE

7. Escreva uma estrutura CASE que mostre o nome de um mês ou uma mensagem deerro em função da variável inteira Mes

8. Escreva uma estrutura CASE que mostre o número de dias de um mês em função dovalor da variável do tipo cadeia de caracteres Mes

9. Sabendo que foi feita a seguinte declaração de variáveis

REAL :: X

Diga qual a saída produzida pela seguinte construção CASE, ou indique porque razãoocorre erro:

SELECT CASE ( X )

CASE ( 1.0 )

PRINT *, X + 1.0

CASE ( 2.0 )

PRINT *, X + 2.0

END SELECT

3.4. Problemas de Programação

10. Assuma que a companhia de distribuição de gás canalizado Gás Líquido L.da praticauma política de preços diferenciada segundo o consumo, de acordo com a tabela:

Gás consumido Custo

Primeiros 70 m3 (custo mínimo) € 5,00

Próximos 100 m3 5,00 € / m3

Próximos 230 m3 2,50 € / m3

Acima de 400 m3 1,50 € / m3

As leituras no contador de gás são em números de 4 dígitos que representam m3. Escrevaum programa que tem como entradas as leituras do mês anterior e do mês actual,calculando assim o total da despesa a pagar. Tenha em conta que a leitura do mês actual

15

pode ser um valor inferior à do mês anterior devido à dobragem do contador. Porexemplo: LeituraMesAnterior = 9897 e LeituraMesActual = 0103.

11. Escreva um programa que lê o número associado a um canal de televisão e, deseguida, utiliza uma estrutura de selecção do tipo CASE para apresentar a siglacorrespondente a esse canal. No caso de não existir uma sigla associada ao númerolido deve ser apresentada uma mensagem de erro. Considere canais de TV com ascorrespondências número / sigla que se apresentam de seguida:

1: RTP1

2: RTP2

3: SIC

4: TVI

16

4. Estruturas de Repetição

4.1. Variáveis lógicas

1. Assuma que foram feitas as seguintes declarações de variáveis

INTEGER, PARAMETER:: M = –2, N = 5

REAL :: X = -1.99, Y = 5.5, Z = 9.99

LOGICAL:: Ok

Diga qual o valor atribuído a variável lógica Ok, ou explique porque ocorre um erro:

1.1. Ok = M <= N

1.2. Ok = 2 * ABS(M) <= 8

1.3. Ok = X * X < SQRT(Z)

1.4. Ok = NINT(Z) == (6 * N – 3)

1.5. Ok = Ok .AND. (N == 6)

1.6. Ok = .NOT. (X < Y)

1.7. Ok = .NOT. ((M <= N) .AND. (X + Z > Y))

1.8. Ok = .NOT. (M <= N) .OR. .NOT. (X + Z > Y)

1.9. Ok = .NOT. ((M > N) .OR. (X < Z)) .EQV. &

((M <= N) .AND. (X >= Z))

4.2. Estruturas de repetição – Ciclos DO controlados porcontador

2. Assuma que I e J são variáveis inteiras. Descreva a saída produzida pelos seguintessegmentos de programa:

2.1.

DO I = -2, 3

PRINT *, I, " ao quadrado = ", I * I

END DO

17

2.2.

DO I = 1, 5

PRINT *, I

DO J = I, 1, -1

PRINT *, J

END DO

END DO

3. Assuma que I, J e Limite são variáveis inteiras. Descreva a saída produzida pelosseguintes segmentos de programa, ou explique porque ocorre um erro:

3.1.

PRINT *, "Valores:"

DO I = 0, 2

DO J = 1, I

PRINT *, I, J

END DO

END DO

PRINT *, "Fim."

3.2.

Limite = 3

DO I = 1, Limite

I = 1

PRINT *, I, Limite

END DO

4. Escreva instruções para ler um valor para a variável inteira N e escrever os primeirosN inteiros positivos.

4.3. Estruturas de repetição – Ciclos DO com EXIT

5. Escreva um ciclo para mostrar o valor de X e o ir diminuindo de 0,5 enquanto forpositivo.

6. Escreva um ciclo para ler valores para A, B e C e escrever a sua soma, repetindo esteprocedimento enquanto nenhum dos três valores for negativo.

18

4.4. Problemas de programação

7. Pretende-se um programa que leia uma lista de números, os conte e diga qual o maior,o menor, e quais as suas posições na lista. Assuma como critério de paragem aintrodução de um número negativo.

8. Suponha que uma bola é largada duma certa altura, bate no chão e salta novamente.Em cada ressalto atinge uma dada percentagem da altura do ressalto anterior. Isto é,se k for essa percentagem (que se chama coeficiente de ressalto), as alturas sucessivasrelacionam-se por:

n 1 nh h k+=

Pretende-se um programa que calcule as alturas sucessivamente atingidas até a bolaparar, isto é, até a altura atingida ser menor que uma tolerância dada.

19

5. Funções

1. O número de bactérias numa cultura pode ser estimado pela expressão:

N e kt

sendo N a população inicial, k a taxa de crescimento e t o tempo de evolução. Escrevauma função para calcular o número de bactérias existentes num determinado instante,dados N e t.

2. Escreva um programa para determinar a soma, ou o produto, de dois números reais, Xe Y, introduzidos pelo utilizador. A implementação destas operações matemáticas éfeita por duas funções, Soma e Produto, sendo a opção determinada pelo utilizadorna forma:

(1) Soma;

(2) Produto.

Depois do cálculo terminado o programa deve dar ao utilizador a hipótese de repetir umnovo cálculo ou terminar a sua execução.

3. O Máximo Divisor Comum (MDC) de dois números inteiros a e b, com a�0 e b�0,corresponde ao valor do maior divisor inteiro que é comum a esses números. Oalgoritmo que se apresenta de seguida denomina-se por algoritmo Euclidiano epermite resolver o problema da determinação do MDC:

1) Repetir

i. Se b = 0 terminar

ii. a = b q + r

iii. a = b

iv. b = r

2) GCD = a

onde q corresponde ao quociente e r ao resto da divisão. Implemente a função MDC paracalcular o máximo divisor comum DC pelo algoritmo Euclidiano. Integre esta funçãonum programa denominado por Maximo_Divisor_Comum.

4. Um algoritmo numérico normalmente empregue na aproximação do integral defunções é o método trapezoidal (MT). Este algoritmo consiste na divisão do intervalode integração, [A, B], em N subintervalos mais pequenos, de comprimento Delta, e no

20

cálculo das áreas dos trapézios abaixo das curvas da função em cada um destessubintervalos; o integral aproximado da função corresponderá à soma do valor detodas as áreas. Este algoritmo pode ser descrito por:

1) Ler A, B e N

2) CalcularN

AB �

�Delta

3) X = A

4) Soma = 0

5) Repetir, com j a variar entre 1 e N-1

a. Adicionar Delta a X

b. Calcular Y = f(X)

c. Adicionar Y a Soma

6) Calcular ��

���

��

�� SomaDeltaSoma

2)B(F)A(F

7) Apresentar os valores de N e Soma

A variação de corrente, i, num condensador é dada pela expressão:

t 10 i(t) sin (amperes)

onde t representa o tempo em segundos. A queda de tensão aos terminais do condensadorno intervalo [0, t] é dada por:

� ���

t

od)(i

C1)t(v (volts)

sendo C a capacidade do condensador em farads (F). Implemente um programa querecorre ao algoritmo iterativo MT para determinar o valor da queda de tensão aosterminais do condensador num instante genérico T.

21

6. Subrotinas, Formatação em operações de Entrada /Saída

6.1. Introdução

1. Diga qual a saída produzida pelo seguinte programa

PROGRAM Nome_dos_Animais

CHARACTER (3) :: Animal1=”gato”, Animal2=”cao”, Animal3=”alce”

CALL MudaNome(2, Animal1, Animal2, Animal3)

PRINT *, “Animais=”, Animal1, Animal2, Animal3

CONTAINS

SUBROUTINE MudaNome(Numero, A, B, C)

INTEGER, INTENT (IN) :: Numero

CHARACTER (3), INTENT (INOUT):: A, B, C

CHARACTER (3) :: Morcego = “morcego”

IF (numero<3) THEN

A = Morcego

B = Morcego

ELSE

C = Morcego

END IF

END SUBROUTINE MudaNome

END PROGRAM Nome_dos_Animais

6.2. Problema de programação I

2. Considere que a firma Metro L.da lhe encomendou um programa para dispensar otroco nas máquinas de venda automática de bilhetes. Este programa recebe o valor dadespesa a pagar e a quantia entregue pelo cliente, calculando de seguida o número demoedas a devolver a este pela máquina. Os preços dos bilhetes são fixados emmúltiplos de €0.10, de modo que, neste tipo de transacções, sejam válidas asseguintes moedas:

� €2, €1, €0.50, €0.20, €0.10Implemente um programa para resolver o problema enunciado recorrendo a subrotinas.

22

6.3. Formatação em operações de Entrada / Saída

3. Responda às perguntas que se apresentam de seguida com Verdadeiro ou Falso:

3.1. O descritor de formato 3I2 é o mesmo que I2, I2, I2

3.2. No descritor de formato F10.3, 10 refere-se ao número de dígitos à esquerda doponto decimal e 3 refere-se ao número de dígitos à direita do ponto decimal

3.3. Para o descritor de formato I1, se o inteiro a ser descrito ocupa mais do que doisespaços ficará a branco

3.4. O descritor de formatos T é utilizado para truncar valores

3.5. Se houver menos descritores do que valores na lista de saída, então os valoresem excesso serão escritos segundo o último descritor de formato da lista

3.6. Para um descritor F os valores reais são arredondados ao número de casasdecimais especificadas

3.7. O descritor / faz com que a saída passe para a linha seguinte

3.8. Os inteiros são justificados à esquerda nos campos especificados no descritor I

4. Considere a seguinte declaração de variáveis

REAL :: X = 234.56, Y = -1.0

INTEGER :: I = 987, J = -44

CHARACTER (20) :: Form = ‘(1X, I5, F10.1)’

Descreva a saída gerada por cada declaração que se apresenta de seguida, indicandoclaramente o espaçamento dos caracteres em cada linha e entre cada duas linhas:

4.1. PRINT 5, I, X5 FORMAT (1X, “I=”, I3, 2X, “X=”, F8.3, “The End.”)

4.2. PRINT Form, I, X, J, Y

4.3. PRINT (1X, F10.0, / 1X, I3, T11, I5), X, J, Y

23

5. Assuma que foi feita a seguinte declaração de variáveis

REAL :: X, Y

INTEGER :: I, J

CHARACTER (20) :: Form = ‘(2I3, F5.2, F1.0)’

Em cada instrução READ que se apresenta nas perguntas seguintes diga quais os dadosque devem ser inseridos de modo a que X=123.45, Y=6.0, I=99, J=876.

5.1. READ (*,*), I, J, X, Y

5.2. READ ‘(2I3, 2F6.0)’, I, J, X, Y

5.3. READ ‘(I3, F7.0, 2X, I5, T20, F5.0)’, I, J, X, Y

5.4. READ Form, I, J, X, Y

5.5. READ 9, I, X, J, Y9 FORMAT (I2, F5.2 / I3, F2.1)

6.4. Problema de programação IIConstrua uma interface de menu constituída por um menu principal com duas opções, Ae B, e um sub-menu para a opção A com as opções C e D. A implementação destainterface deve recorrer a subrotinas e descritores de formato.

24

7. Formatação em operações de Entrada / Saída (cont.),Ficheiros, Recursão

7.1. Formatação E/S – Processamento de Ficheiros.

1. Na declaração WRITE (10,20) X, Y diga qual o significado atribuído aosvalores 10 e 20.

2. Rescreva a instrução PRINT *, Resposta utilizando a instrução WRITE.

3. A utilização de FILE = “NEW” numa declaração do tipo OPEN indica que oficheiro ainda não existe, sendo então criado pelo programa (Verdade / Falso).

4. Considere um ficheiro já existente denominado por Results com número de unidade15:

4.1. Escreva a declaração de abertura do ficheiro.

4.2. Escreva a declaração de leitura de uma variável do tipo inteiro denominada porPontuacao, que se encontra nas posições 6-8.

5. Diga qual o significado da instrução IOSTAT= InputStatus na declaração deleitura de um ficheiro, referindo explicitamente qual o valor atribuído à variávelInputStatus no caso do fim do ficheiro ser atingido sem que tenham ocorridoerros de entrada.

6. Considere o ficheiro de dados “alunos.dat” cuja informação se encontraarmazenada de acordo com a estrutura:

Implemente umseu conteúdo no

Numero

------

4253

4931

7.2. Recurs

7. Considere a

R

E

Determine o val

número

número

...

nome

nome

...

nota1

nota1

...

nota2

nota2

...

3 dígitos18 caracteres

1

4 dígitos

programa para leitura do ficheiro “alunos.dat ecrã na forma:

Nome Disciplina A Dis

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

Joao Silva 10.3 16.

Manuel Goncalves 13.4 12.

ividade

função recursiva F que se apresenta de seguida

ECURSIVE FUNCTION F(X,N) RESULT(Val

REAL :: Valor

REAL, INTENT (IN) :: X

INTEGER, INTENT (IN) :: N

IF (N==0) THEN

Valor = 0

ELSE

Valor = X + F(X,N-1)

END IF

ND FUNCTION F

or de F(4,5), apresentando a sequência de chamadas

8 26 39

3 dígitos

25

” e apresentação do

ciplina B

---------

9

9

or)

da função F.

26

8. Escreva uma função recursiva que determine o Máximo Divisor Comum de doisnúmeros inteiros. Algoritmo não recursivo para a determinação do MDC:

3) Repetir

i. Se b = 0 terminar

ii. r = resto de a / b

iii. a = b

iv. b = r

4) MDC = a

9. Escreva uma função recursiva que retorne o número de dígitos de um número inteironão negativo.

10. Escreva uma subrotina recursiva que inverta a ordem dos dígitos de um númerointeiro positivo e o apresente no ecrãn.

27

8. Tabelas Unidimensionais

8.1. Introdução

1. Escreva a declaração e expressões necessárias para a construção das seguintes tabelasunidimensionais:

1.1. Tabela cujos índices tomam valores entre -10 e 10, sendo o valor de cadaelemento da tabela o valor do índice correspondente.

1.2. Tabela cujos índices tomam valores entre 1 e 20, sendo o valor de cada elementodado por .TRUE. caso o índice correspondente seja par ou .FALSE. no casocontrário.

1.3. Tabela cujos índices tomam valores entre 0 e 359, sendo o valor de cadaelemento dado pela função seno de cada índices, i.e., sin(k) k = 0�, .. , 259�.

2. Para a resolução dos exercícios seguintes assuma que foi feita a declaração devariáveis:

INTEGER, DIMENSION (10) :: Numero

REAL, DIMENSION (-4:5) :: Ponto

CHARACTER, DIMENSION (10) :: Simbolo

INTEGER :: I

Bem como a definição dos formatos

100 FORMAT (10(1X, I1))

110 FORMAT (10(1X, F1.0))

120 FORMAT (5(A1, 1X))

130 FORMAT (5A1)

200 FORMAT (1X, 5I2)

210 FORMAT (1X, 5F4.0)

220 FORMAT (1X, 5A2)

Assuma ainda que foram introduzidos dados na sequência:

A1B2C3D4E5F6G7H8I9J0

Diga qual a saída produzida ou justifique no caso de ocorrer algum erro:

28

2.1. READ 100, Numero

DO I = 1, 10PRINT 200, Numero(I)

END DO

2.2. READ 100, (Numero(I), I = 1, 10)PRINT 200, (Numero(I), I = 1, 10)

2.3. READ 110, (Ponto(I), I = -4, 5)

DO I = -4, 5PRINT 210, Ponto(I)

END DO

2.4. READ 110, PontoPRINT 210, (Ponto(I-4), I = 0, 9)

2.5. READ 120, SimboloPRINT 220, Simbolo

2.6. READ 130, (Simbolo(I), I = 1, 5)PRINT 220, (Simbolo(I), I = 1, 5)

3. Para a resolução dos exercícios seguintes assuma que foi feita a declaração devariáveis:

INTEGER :: I

REAL, DIMENSION (10) :: &

A = (/ 0.0, 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9/),&

B = (/ ( 2.0**I, I=0, 9) /), &

C

INTEGER, DIMENSION (0:9):: &

D = (/ ( I+5, I = 0, 5), 1, 2, 3, 4 /)

INTEGER :: M = 3, N = 9

REAL, DIMENSION (0:9) :: E

REAL, DIMENSION (-3:6) :: F

REAL, DIMENSION (100:109) :: G

29

Liste os elementos das tabelas indicadas ou justifique no caso de ocorrer algum erro:

3.1. B

3.2. D

3.3. A(3:7)

3.4. A(1:9:2)

3.5. D(M:N:M)

3.6. B(N:M)

3.7. A(D)

3.8. D(A)

3.9. C com C = A + 2*B

3.10. F com F = A + 2*B

3.11. E com E = REAL(D) + 5

3.12. G com G = B(1:10)

3.13. G comWHERE (B>2*A)

G = B

ELSEWHERE

G = 2*A

END WHERE

8.2. Problema de programação

4. Escreva um programa que pede ao utilizador um número inteiro positivo e apresentano ecrã o produto de N por cada um dos números compreendidos entre 1 e 10, i.e.,N*1, N*2, .. , N*10. O cálculo dos sucessivos produtos é feito num subprogramaProduto que aceita o número introduzido pelo utilizador e devolve uma tabela comos valores calculados.

30

5. Um engenheiro de controle de qualidade monitoriza o desempenho de umadeterminada máquina registando num ficheiro o número de peças defeituosas que elaproduz em cada período de funcionamento de 1 hora. Esta informação deve serorganizada segundo uma distribuição de frequências que mostra com que frequênciaocorreu a produção de: 1 peça defeituosa, 2 peças defeituosas, ... , 5 ou mais peçasdefeituosas.

31

9. Tabelas Multidimensionais

9.1. Introdução

1. A declaração da tabela REAL, DIMENSION (5,10) :: X é equivalente àdeclaração REAL, DIMENSION (1:5, 1:10) :: X (Verdade/Falso).

2. O processamento de tabelas bidimensionais no FORTRAN é feito por linhas(Verdade/Falso).

3. Assuma a declaração de variáveis INTEGER, DIMENSION (2,2,2) :: T.Considere que em resposta à instrução READ *, (((T(I,J,K), I=1, 2),J=1, 2), K=1, 2) foi introduzido:

1, 2, 3, 4, 5, 6, 7, 8

Nestas condições o valor atribuído a T(1,2,1) é 4 (Verdade/Falso).

4. A declaração:

REAL, DIMENSION (2,2,2,5,5) :: Dimensao5

reserva 200 posições de memória (Verdade/Falso).

5. Assuma que foram feitas as declarações de variáveis:

INTEGER, DIMENSION (3,3) :: Tabela

INTEGER :: I, J

e que, sempre que necessário, é introduzida a informação 1, 2, 3, 4, 5, 6, 7, 8, 9, deacordo com a especificidade de cada problema.

Indique o valor atribuído a cada elemento das tabelas apresentadas nos exercíciosseguintes, ou justifique caso ocorra erro:

5.1.

DO I = 1, 3

DO J = 1, 3

Tabela(I,J) = I + J

END DO

END DO

32

5.2.

DO I = 1, 3

DO J = 1, 3

IF (I==J) THEN

Tabela(I,J) = 0

ELSE

Tabela(I,J) = 1

END IF

END DO

END DO

5.3.

DO I = 1, 3

DO J = 1, 3

READ *, Tabela(I,J)

END DO

END DO

5.4.

READ *, Tabela

5.5.

READ *, ((Tabela(I,J), J = 1, 3), I= 1, 3)

5.6.

READ *, ((Tabela(I,J), I = 1, 3), J= 1, 3)

33

9.2. Problemas de programação

6. Implemente um programa para o registo de temperaturas dentro de uma sala, emquatro pontos específicos da mesma:

A leitura de temperaturas para os quatro pontos é feita de 8h/8h, durante o período deuma semana. No final, o programa deve pedir ao utilizador o nome de um ficheiro egravar no mesmo as temperaturas registadas.

7. A companhia PRODUZBEM, L.DA, produz três componentes distintos para aindustria automóvel (#1, #2 e #3). Cada um destes componentes é produzido emvárias etapas, ocupando diversos Postos de Trabalho (PT). O tempo de ocupação decada posto de trabalho por produto é dado na seguinte tabela:

Produto Corte Fresa Torno Montagem

#1 [ h ] 0,5 1,5 2,0 3,0

#2 [ h ] 1,0 0,0 3,0 3,5

#3 [ h ] 0,75 1,2 3,5 4,0

custo de ocupação de cada PT é dado na tabela que se segue:

PT Corte Fresa Torno Montagem

Custo/hora € 12.50 € 15.00 € 15.50 € 25.00

Sábado

Ponto 1Hora Ponto 2 Ponto 3 Ponto 4

16.0ºC8h 16.1ºC 16.2ºC 16.0ºC

20.0ºC16h 20.0ºC 16.5ºC 16.8ºC

20.0ºC24h 20.0ºC 15.7ºC 16.0ºC2ª feira

Ponto 1Hora Ponto 2 Ponto 3 Ponto 4

20.0ºC8h 20.0ºC 20.0ºC 20.0ºC

20.0ºC16h 20.0ºC 20.0ºC 20.0ºC

20.0ºC24h 20.0ºC 20.0ºC 20.0ºC

Domingo

Ponto 1Hora Ponto 2 Ponto 3 Ponto 4

20.0ºC8h 19.5ºC 19.8ºC 20.5ºC

21.0ºC16h 22.1ºC 21.8ºC 21.5ºC

16.0ºC24h 15.9ºC 16.2ºC 15.8ºC

34

Pretende-se determinar:

7.1. Custos totais de produção por componente.

7.2. Tempo de produção por componente.

7.3. Tempo de ocupação de cada PT para uma produção semanal de:

#1 – 4 peças

#2 – 2 peças

#3 – 4 peças

Tempo médio gasto por peça em cada PT.

35

10. Tipos Derivados (fichas)

10.1. Introdução

1. Escreva declarações para:

1.1. Definir um tipo derivado para o processamento das datas do calendário (dia, mês,ano).

1.2. Definir a variável DataAniversario como uma ficha do tipo derivadodefinido na alínea 1.1.

1.3. Atribuir a DataAniversario o conteúdo: 23 de Abril de 1990.

1.4. Implementar uma função que determina o número de anos decorridos desdeDataAniversario.

2. Construa o tipo derivado e faça a declaração das fichas em cada caso:

2.1. Temperatura (grandeza e escala)

2.2. Tempo (horas, minutos, segundos)

2.3. Cartas num baralho (naipe, tipo)

2.4. Equipas de futebol no campeonato nacional (nome, posição, número de golos)

36

3. Assuma que se fizeram as seguintes declarações

TYPE ComputadorPessoal

CHARACTER (10) :: Fabricante

INTEGER :: EspacoDisco, RAM, Processador

LOGICAL :: CDROM

END TYPE

TYPE FichaInventario

REAL, DIMENSION (6) :: ListaPrecos

INTEGER :: NumeroStock

TYPE (ComputadorPessoal) :: PC

END TYPE

TYPE (ComputadorPessoal) :: MeuPC

TYPE (ComputadorPessoal), DIMENSION (10) :: TabelaPC

TYPE (FichaInventario) :: Item

3.1. Atribua a cadeia de caracteres IBM ao componente apropriado de MeuPC.

3.2. Faça a leitura da velocidade do relógio (em MHz) e armazene o seu conteúdo nocampo apropriado de MeuPC.

3.3. Faça a leitura da quantidade de memória RAM para TabelaPC(5).

3.4. Apresente a informação contida em TabelaPC(3), especificando cada campoda ficha.

3.5. Faça a leitura do espaço em disco, da quantidade de memória RAM e davelocidade do relógio para cada uma das estruturas da tabela TabelaPC.

3.6. Atribua 11782 ao número de stock em Item.

3.7. Faça a leitura de espaço em disco, quantidade de memória RAM e velocidade dorelógio para o computador pessoal armazenado em Item.

3.8. Apresente todos os preços de Item.

37

10.2. Problemas de programação

4. Dadas as coordenadas (x,y) de dois pontos P1 e P2, implemente um programa para:

4.1. Determinação da distância entre P1 e P2;

4.2. Determinação dos parâmetros da recta definida por P1, P2:

2 1

2 1

1 1

y -ym=x -xy = m x + b, com

b=y -mx

Defina um tipo derivado Ponto que agregue as coordenadas (x,y) associadas a cada pontoconsiderado. Implemente o conteúdo das alíneas em sub-programas independentes.

5. Implemente um programa para a gestão de sotcks, para o qual se define um tipoderivado Produto, que tem os seguintes atributos:

Tipo inteiro: Codigo, Quantidade, CodFornecedor

Tipo cadeia de caracteres: Designação

Tipo real: Preço (tipo Real)

5.1. Defina uma variável Sabao com as seguintes características:

5.2. Implemente um sub-programa que mostre o conteúdo de Sabao.

Implemente um sub-programa que permita modificar o campo Designacao da variávelSabao.

38

11. Ponteiros & Listas Ligadas

11.1. Introdução

1. Escreva a declaração de uma variável P1 como um ponteiro para uma posição dememória onde se armazena um inteiro.

2. Reserve a memória associada a P1 e armazene nesta o valor –1234.

3. Escreva a declaração de uma variável P2 como um ponteiro para uma posição dememória onde se armazena uma estrutura do tipo ficha com o conteúdo real X, Y.

4. Reserve a memória associada a P2 e armazene nesta os valores X=3.15 e Y=12.9.

5. Descreva a saída produzida pelo seguinte programa:

PROGRAM Teste_Ponteiros

IMPLICIT NONE

INTEGER, POINTER :: Foo, Goo

ALLOCATE(Foo)

Foo = 1

PRINT *, Foo

ALLOCATE(Goo)

Goo = 3

PRINT *, Foo, Goo

Foo = Goo + 3

PRINT *, Foo, Goo

Foo = Goo

Goo = 5

PRINT *, Foo, Goo

Foo => Goo

Foo = 7

PRINT *, Foo, Goo

Goo => Foo

Foo = 9

PRINT *, Foo, Goo

END PROGRAM Teste_Ponteiros

39

6. Para a resolução dos exercícios que se lhe apresentam de seguida assuma que foi feitaa declaração de variáveis:

TYPE ListaNumeros

INTEGER :: Numero

TYPE (ListaNumeros), POINTER :: Proximo

END TYPE ListaNumeros

TYPE (ListaNumeros), POINTER :: P1, P2

INTEGER, POINTER :: P3

Tendo sido já reservado o espaço em memória associado a cada um dos ponteiros pelasinstruções:

ALLOCATE(P1)

ALLOCATE(P2)

ALLOCATE(P3)

Indique a saída produzida em cada uma das alíneas seguintes ou justifique no caso deocorrência de erro:

6.1.

P1%Numero = 123

P2%Numero = 456

P1%Proximo => P2

PRINT *, P1%Numero

PRINT *, P1%Proximo%Numero

6.2.

P1%Numero = 12

P2%Numero = 34

P1 => P2

PRINT *, P1%Numero

PRINT *, P2%Numero

40

6.3.

P1%Numero = 12

P2%Numero = 34

P1 = P2

PRINT *, P1%Numero

PRINT *, P2%Numero

6.4.

P1%Numero = 123

P2%Numero = 456

P1%Proximo => P2

PRINT *, P2%Numero

PRINT *, P2%Proximo%Numero

6.5.

P1%Numero = 12

P2%Numero = 34

P3%Numero = 45

P1%Proximo => P2

P2%Proximo => P3

PRINT *, P1%Numero

PRINT *, P1%Proximo%Numero

PRINT *, P2%Numero

PRINT *, P2%Proximo%Numero

PRINT *, P1%Proximo%Proximo%Numero

PRINT *, P3%Numero

41

6.6.

P1%Numero = 111

P2%Numero = 222

P1%Proximo => P2

P2%Proximo => P1

PRINT *, P1%Numero, P2%Numero

PRINT *, P1%Proximo%Numero

PRINT *, P1%Proximo%Proximo%Numero

6.7.

P1%Numero = 12

P2%Numero = 34

P1 => P2

P1%Proximo => P2

PRINT *, P1%Numero

PRINT *, P2%Numero

PRINT *, P1%Proximo%Numero

PRINT *, P2%Proximo%Numero

7. Nos exercícios seguintes use a seguinte lista ligada que se apresenta de seguida, bemcomo os ponteiros P1, P2, P3 e P4:

Desenhe a configuração da lista ligada após execução das instruções apresentadas emcada alínea ou justifique no caso de ocorrer erro.

7.4. P1 => P2%Proximo

7.5. P4 => P1

7.6. P4%Nome = P1%Nome

Leão Cão Gato Rato

P1 P2 P3 P4

7.7. P4%Proximo%Nome = P1%Nome

7.8. P2%Proximo => P3%Nome

7.9. P4%Proximo => P1

7.10. P1%Proximo => P3%Proximo

P1 => P3

7.11. P1 => P3

P1%Proximo => P3%Proximo

7.12. P4%Proximo => P3%Proximo

P3%Proximo => P2%Proximo

P2%Proximo => P1%Proximo

7.13. P4%Proximo => P3

P4%Proximo%Proximo => P2

P2%Proximo%Proximo%Proximo => P1

NULLIFY (P1%Proximo)

11.2. Problemas de programação

8. Considere a seguinte lista ligada:

Explneces

8

8

8

8

8

8

Rui Duartet

ptLis

42

ique com base numa representação gráfica e implemente os subprogramassários, de modo a implementar as seguintes tarefas:

.1. Inserção de um novo elemento no inicio da lista com o conteúdo Isabel.

.2. Apresentação dos vários elementos da lista no ecrã.

.3. Procura de um elemento na lista.

.4. Remoção de um elemento no início da lista.

.5. Remoção de um elemento no fim da lista.

.6. Implemente o programa que faz a gestão dos subprogramas anteriores.