340 likes | 422 Views
Programação de Computadores. Viviane Torres da Silva viviane.silva@ic.uff.br 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
E N D
Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br 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 posição 1 2 3 4 5 6 7 X = 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 2 3 4 5 X =
Exemplos: • Integer a(10) • Integer b(3:8) • Integer c • Character*20 nome(-2:2) • (em cada posição do vetor ficará um string de 20 caracteres) 1 2 3 4 5 6 7 8 9 10 a = 3 4 5 6 7 8 b = 1 c = -2 -1 0 1 2 nome =
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) 1 2 3 4 5 nota =
Utilização • Exemplo: • Character*3 texto(5) • texto (1) = ‘abc’ • texto (2) = ‘def’ • texto (3) = ‘ghi’ • texto (4) = ‘jkl’ • texto (5) = ‘mno’ 1 2 3 4 5 texto =
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 2 3 4 5 …. 37 38 39 40 nota =
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. 1 2 3 4 5 …. 37 38 39 40 nota = 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 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
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).
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 lugar. Depois integer tnota parameter (tnota=40) real nota(tnota) do i = 1, tnota read *, nota(i) end do ... Antes real nota(40) do i = 1, 40 read *, nota(i) end do ...
DO implícito • Permite combinar de forma resumida o comando “do” com os comandos “print” ou “read”. Depois integer tnota parameter (tnota=40) real *,nota(tnota) read *, (nota(i), i = 1, tnota) ... print *, (nota(i), i = 1, tnota) ... Antes integer tnota parameter (tnota=40) real *,nota(tnota) do i = 1, tnota read *, nota(i) end do ... do i = 1, tnota print *, nota(i) end do ...
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
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... • 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 Nota 1 Nota 2 Nota 3 Aluno1 Aluno2 Aluno3 Aluno4 Aluno5
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 Aluno2 Aluno3 Aluno4 Aluno5 N1 N2 N3
Declaração x y z x: linha, y: coluna e z: profundidade • Real nota(5, 3, 2) • 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: • o salário mais alto e o nome do empregado • a média salarial e quantos empregados ganham acima da média • quais são os empregados que estão prestes a se aposentar, i.e., quais possuem mais 30 anos de contribuição • Idade do empregado mais novo e do empregado mais velho que estão prestes a se aposentar