Programação de Computadores
Viviane Torres da Silva
[email protected]
http://www.ic.uff.br/~viviane.silva/progIII
Variáveis Compostas
 Exemplo motivacional: Ler as notas de 3 alunos. Calcular a
média da turma. Informar quantos alunos tiveram nota acima
da média.
program notas
implicit none
real nota1, nota2, nota3, media
integer maior
read *, nota1, nota2, nota3
maior = 0
media = (nota1 + nota2 + nota3)/3
if (nota1 .GT. media) then
maior = maior + 1
end if
if (nota2 .GT. media) then
maior = maior + 1
end if
if (nota3 .GT. media) then
maior = maior + 1
end if
print *, ‘Média: ’, media
print *, ‘Maiores: ’, maior
end
E se fossem 40 alunos?
Variáveis Compostas
 É possível definir variáveis que guardam mais de um valor de
um mesmo tipo. Essas variáveis são conhecidas como
variáveis compostas, variáveis subscritas ou arranjos (array).
 Existem dois tipos principais de variáveis compostas:
– Vetores
– Matrizes
Vetores
 Um vetor é uma variável composta unidimensional. Ela
contém espaço para armazenar diversos valores, e é acessada
via um índice.
 A idéia de vetor é comum na matemática, com o nome de
variável subscrita: x1, x2, ..., xn
 O que vimos até agora são variáveis com somente um valor:
x = 7. No caso de vetores, uma mesma variável guarda ao
mesmo tempo múltiplos valores: x1 = 7, x2 = 10, x3= 5
X=
1
2
3
4
7
10
5
…
5
6
7
posição
valor
Declaração de Vetor
 Feita junto com as demais declarações de variáveis, no início
do programa.
 Forma geral: <tipo> <nome>(< início>: <fim>)
 Caso o início do vetor seja omitido, o Fortran assume início
igual a 1.
 Ex:
Real x (5)
– Vetor de 5 posições onde os valores são do tipo Real
1
X=
2
3
4
5
 Exemplos:
 Integer a(10)
1
2
3
4
5
6
7
8
9
a=
 Integer b(3:8)
3
4
5
6
7
8
b=
 Integer c
1
c=
 Character*20 nome(-2:2)
– (em cada posição do vetor ficará um string de 20 caracteres)
-2
nome =
-1
0
1
2
10
Utilização
 Uma posição do arranjo é acessada pelo seu índice, seja para
atribuir ou recuperar o valor.
 Exemplo:





Integer nota(5)
nota(1) = 1
nota(3) = 8
nota(2) = nota(1) + nota(3)
print *, nota(2)
nota =
1
2
3
1
?
8
4
5
Utilização
 Exemplo:






Character*3
texto (1) =
texto (2) =
texto (3) =
texto (4) =
texto (5) =
texto =
texto(5)
‘abc’
‘def’
‘ghi’
‘jkl’
‘mno’
1
2
3
4
5
abc
def
ghi
jkl
mno
Retornando ao exemplo dos 40 alunos…
 Faça um programa que lê a nota de 40 alunos, calcula a
média e calcula quantas notas estão acima da média.
No final o programa informa estes dois valores.
program notas2
implicit none
real nota(40), soma, media
integer maior, i
soma = 0
do i = 1, 40
read *, nota(i)
soma = soma + nota(i)
end do
....
1
nota =
2
3
4
5
…. 37
38
39
40
Retornando ao exemplo dos 40 alunos…
program notas2
implicit none

Faça
um programa
lê a nota de 40 alunos, calcula a
real
nota(40),
soma,que
media
média maior,
e calcula
integer
i quantas notas estão acima da média.
soma
0 o programa informa estes dois valores.
No =final
do i = 1, 40
read *, nota(i)
soma = soma + nota(i)
end do
1
2
3
4
5
…. 37
nota =
media = soma/40
maior = 0
do i = 1, 40
if (nota(i) > media) then
maior = maior + 1
end if
end do
print *, ‘Média: ’, media
print *, ‘Maiores: ’, maior
end
38
39
40
Exercício 1
 Faça um programa em Fortran que lê dois vetores inteiros de
tamanho 3 e soma cada posição uma a uma armazenando os
resultados em outro vetor .
program soma vetores
implicit none
integer vetorA(3), vetorB(3), i, vetorC(3)
do i=1, 3
print *, 'digite o vetorA(', i, ') e o vetorB(', i, ')'
read *, vetorA(i), vetorB(i)
vetorC (i) = vetorA (i) + vetorB (i)
print *, 'vetorC(', i, '): ', vetorC(i)
end do
end
Exercício 2
 Faça um programa em Fortran que lê dez números inteiros e
listar esses números em ordem crescente.
program ordenacao
implicit none
integer numero(10), aux, i, j
do i=1, 10
read *, numero(i)
end do
do j=1, 10
do i=1, 10
if (numero(i) .GT. numero (j)) then
aux = numero (j)
numero(j) = numero(i)
numero(i) = aux
end if
end do
end do
do i=1, 10
print *, numero(i)
end do
end
Exercício 3
 Faça um programa em Fortran que lê=eia dois vetores inteiros
v1 e v2 de 10 posições. Um terceiro vetor é calculado da
seguinte maneira:
 Para cada posição i de s, o usuário deve informar um valor n.
Peque o valor M armazenado na posição v2(n) e some as M
primeiras posições de v1 e armazene este valor em s(i).
Parte II
Melhorando o programa
 O Fortran fornece alguns comandos que podem ajudar na
manipulação de variáveis compostas:
– Parameter
– DO implícito
 Parameter permite criar constantes que podem ser utilizadas
para definir o tamanho de variáveis compostas. Desta forma,
a alteração do tamanho consiste em alterar em somente um
Depois
lugar.
Antes
real nota(40)
do i = 1, 40
read *, nota(i)
end do
...
integer tnota
parameter (tnota=40)
real nota(tnota)
do i = 1, tnota
read *, nota(i)
end do
...
DO implícito
 Permite combinar de forma resumida o comando “do” com os
comandos “print” ou “read”.
Antes
Depois
integer tnota
parameter (tnota=40)
real *,nota(tnota)
integer tnota
parameter (tnota=40)
real *,nota(tnota)
do i = 1, tnota
read *, nota(i)
end do
...
read *, (nota(i), i = 1, tnota)
...
do i = 1, tnota
print *, nota(i)
end do
...
print *, (nota(i), i = 1, tnota)
...
Exercício 1
 Faça um programa em Fortran usando “parameter” e “do
implícito” que lê o nome e a nota de dez alunos e informe:




O nome do aluno que obteve menor nota e a sua nota
O nome do aluno que obteve maior nota e a sua nota
A média da turma
Nome de alunos com nota acima de 9,0
program ordenacao idade
implicit none
integer nPessoas, j, i
parameter (nPessoas=10)
real nota(nPessoas), aux
character*20 nome(nPessoas), aluno
read *, (nome(i), i = 1, nPessoas)
read *, (nota(i), i = 1, nPessoas)
aux = 10
do j=1, nPessoas
if (nota(j) .LT. aux) then
aux = nota(j)
aluno = nome(j)
end if
end do
print *, aluno, 'foi quem obteve a menor nota: ', aux
aux = 0
do j=1, nPessoas
if (nota(j) .GT. aux) then
aux = nota(j)
aluno = nome(j)
end if
end do
print *, aluno, 'foi quem obteve a maior nota: ', aux
aux = 0
do j=1, nPessoas
aux = aux + nota(j)
end do
aux = aux / nPessoas
print *, 'a m‚dia ‚: ', aux
...
...
aux = 0
do j=1, nPessoas
if (nota(j) .GT. 9) then
print *, nome(j) ,'obteve nota acima de 9.0'
end if
end do
end
Exercício 2
 Faça um programa em Fortran usando “parameter” e “do
implícito” que lê o nome e a idade de dez pessoas e lista as
pessoas em ordem decrescente de idade.
program ordenacao idade
implicit none
integer nPessoas, j, i, aux
parameter (nPessoas=10)
integer idade(nPessoas)
character*20 nome(nPessoas), aux2
read *, (nome(i), i = 1, nPessoas)
read *, (idade(i), i = 1, nPessoas)
do j=1, nPessoas
do i=1, nPessoas
if (idade(i) .GT. idade (j)) then
aux = idade(j)
idade(j) = idade(i)
idade(i) = aux
aux2 = nome(j)
nome(j) = nome(i)
nome(i) = aux2
end if
end do
end do
print *, (nome(i), idade(i), '; ', i = 1, nPessoas)
end
Exercício 3
 Faça um programa em Fortran usando “parameter” e “do
implícito” que lê duas listas de nomes de tamanho 10 e
informe quais nomes ocorrem nas duas listas.
 OBS. Não permita que o programa repita a mesma informação
program ordenacao idade
implicit none
integer nPessoas, j, i, k, l, aux
parameter (nPessoas=3)
character*20 lista1(nPessoas), lista2(nPessoas), lista3(nPessoas)
print*, 'entre com os nomes da lista 1'
read *, (lista1(i), i = 1, nPessoas)
print*, 'entre com os nomes da lista 2'
read *, (lista2(i), i = 1, nPessoas)
l=1
aux=0
do j=1, nPessoas
do i=1, nPessoas
if (lista1(i) .EQ. lista2(j)) then
do k=1, nPessoas
if (lista1(i) .EQ. lista3(k)) then
aux=1
end if
end do
if (aux .EQ. 0) then
lista3(l) = lista1(i)
l=l+1
print*, 'este nome aparece nas duas listas:', lista1(i)
end if
aux=0
end if
end do
end do
read*
end
Parte III
Matrizes
 Uma matriz é uma variável composta multidimensional.
 Ela é equivalente a um vetor, contudo permite a utilização de
diversas dimensões acessadas via diferentes índices.
 Em diversas situações matrizes são necessárias para
correlacionar informações.
 Matrizes podem ser vistas como tabelas
Matriz 3x4
Exemplo
 Assumindo que um aluno é avaliado com 3 notas, seria
necessário um vetor de três posições para guardar as notas de
cada aluno...
Nota 1
Nota 2
Nota 3
 Contudo, assumindo que uma turma tem 5 alunos, seria
necessária uma matriz bidimensional para guardar as notas de
todos os alunos de uma turma...
– Nota(2,3) = 7.5 (terceira nota do segundo aluno foi 7,5)
Nota 1
Nota 2
Nota 3
Aluno1
Aluno2
Aluno3
Aluno4
Aluno5
7,5
Exemplo
 Ainda, assumindo que um curso tem duas turmas, seria
necessária uma matriz tridimensional para guardar as notas
de todos os alunos de todas as turmas do curso...
– Nota(2,3,1) (2a linha, 3a coluna, 1a profundidade)
– Nota do aluno 2 na prova 3 da turma A foi 7.5
Turma B
Turma A
Aluno1
7.5
Aluno2
Aluno3
Aluno4
Aluno5
N1
N2
N3
Declaração
x y z
 Real nota(5, 3, 2)
x: linha, y: coluna e z: profundidade
– Matriz tridimensional
 Integer matriz(10:15, 1:3)
– Matriz bidimensional
– posições de 10 a 15 , de 1 a 3
 Exemplo:
Integer nota(2,2)
Nota(1,1) = 5
Nota(2,2) = 3
Nota(2,1) = nota(1,1) + nota(2,2)
Nota(1,2) = nota(1,1) * nota(2,2)
Print *, nota(1,2) – nota(2,1)
DO implícito para matrizes
 Matriz A tem 2 linhas e três colunas e serão lidos primeiro os
elementos por colunas e depois por linhas, i.e.,
A(1,1); A(1,2); A(1,3);
A(2,1); A(2,2); A(2,3)
read *, (( A(i,j), j=1, 3) , i=1, 2 )
Exercício 1
 Faça um programa em Fortran que lê uma matriz quadrada
3x3, calcule a sua transposta (at(i, j) = a(j, i)) e exiba para o
usuário o resultado.
Exercício 2
 Faça um programa em Fortran que lê uma matriz de
entrada(3,3) e calcule a matriz de saída(3,3) da seguinte
maneira:
 se (i=j) então saída(i,j) = 0
 se (i<>j) então saída(i,j) = entrada (j,i)
Exercício 3
 Faça um programa em Fortran que lê o nome e as 3 notas
para cada aluno de cada turma de um curso. Cada turma tem
2 alunos e o curso tem 2 turmas. Ao final, o programa deve
permitir que o usuário informe:
 A) o nome de um aluno e o programa liste a média desse aluno
 B) o usuário informe uma média e o programa liste todos os alunos
que têm médias acima desse valor.
 nota (numAluno, numNota, numTurma);
 numero de alunos = 2, número de notas = 3 e número de
turmas = 2
Exercício 4
 Faça um programa em Fortran que lê duas matrizes tamanho
2x3 e 3x2 e multiplica essas matrizes
 Dica: c(i, j) = somatório de a(i,k) * b(k,j) para todo k.
Exercício 5
 Faça um programa que receba o nome, a idade, a renda
salariam e a quantidade de anos de contribuição para a
previdência dos 10 funcionários de uma empresa. O programa
deve ser capaz de informar:
a) o salário mais alto e o nome do empregado
b) a média salarial e quantos empregados ganham acima da
média
c) quais são os empregados que estão prestes a se aposentar,
i.e., quais possuem mais 30 anos de contribuição
d) Idade do empregado mais novo e do empregado mais velho
que estão prestes a se aposentar
Download

Vetores (parte I) - Instituto de Computação