programação de computadores viviane torres da silva [email protected] viviane.silva/progiii

38
Programação de Computadores Viviane Torres da Silva [email protected] http://www.ic.uff.br/ ~viviane.silva/progIII

Upload: internet

Post on 16-Apr-2015

106 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

Programação de Computadores

Viviane Torres da [email protected]

http://www.ic.uff.br/~viviane.silva/progIII

Page 2: Programação de Computadores Viviane Torres da Silva viviane.silva@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.

Page 3: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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?

Page 4: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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

Page 5: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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

7 10 5 …

1 2 3 4 5 6 7

posição

valorX =

Page 6: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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

X =

1 2 3 4 5

Page 7: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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)

a =

1 2 3 4 5 6 7 8 9 10

b =

3 4 5 6 7 8

c =

1

nome = -2 -1 0 1 2

Page 8: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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 ? 8nota =

1 2 3 4 5

Page 9: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

Utilização

Exemplo:

Character*3 texto(5) texto (1) = ‘abc’ texto (2) = ‘def’ texto (3) = ‘ghi’ texto (4) = ‘jkl’ texto (5) = ‘mno’

abc def ghi jkl mnotexto =

1 2 3 4 5

Page 10: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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.

Retornando ao exemplo dos 40 alunos…

nota =

1 2 3 4 5 …. 37 38 39 40

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....

Page 11: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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.

Retornando ao exemplo dos 40 alunos… 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

nota =

1 2 3 4 5 …. 37 38 39 40

Page 12: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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

Page 13: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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=j, 10 if (numero(i) .LT. 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

Page 14: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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).

Page 15: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

Parte II

Page 16: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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.

Antes

real nota(40) do i = 1, 40 read *, nota(i)end do...

Depois

integer tnotaparameter (tnota=40)real nota(tnota) do i = 1, tnota read *, nota(i)end do...

Page 17: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

DO implícito

Permite combinar de forma resumida o comando “do” com os comandos “print” ou “read”.

Antes

integer tnotaparameter (tnota=40)real *,nota(tnota) do i = 1, tnota read *, nota(i)end do...

do i = 1, tnota print *, nota(i)end do...

Depois

integer tnotaparameter (tnota=40)real *,nota(tnota) read *, (nota(i), i = 1, tnota)...

print *, (nota(i), i = 1, tnota)...

Page 18: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

Exercício 1

Faça um programa em Fortran usando “parameter” e “do implícito” que lê o nome e a nota de 10 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 dos alunos com nota acima de 9,0 O número de alunos que tiveram nota acima da média

Dica: Utilizar um vetor para guardar as notas e um vetor para guardar o nome dos alunos.

Page 19: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

program ordenacao idade implicit none integer nPessoas, j, i parameter (nPessoas=10) real nota(nPessoas), aux, media character*20 nome(nPessoas), aluno read *, (nome(i), i = 1, nPessoas) read *, (nota(i), i = 1, nPessoas)

aux = 0 do j=1, nPessoas if (nota(j) .GT. aux) then aux = nota(j) aluno = nome(j) end if end do print *, aluno, ‘obteve a maior nota: ', aux

aux = 10 do j=1, nPessoas if (nota(j) .LT. aux) then aux = nota(j) aluno = nome(j) end if end do print *, aluno, 'obteve a menor nota: ', aux

Page 20: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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 aux = 0 do j=1, nPessoas if (nota(j) .GT. media) then aux = aux +1 end if end do print *, ‘num notas acima da media:’, aux

end

aux = 0 do j=1, nPessoas aux = aux + nota(j) end do media = aux / nPessoas print *, 'a media ‚: ', media

Page 21: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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.

Page 22: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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=j, 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

Page 23: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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

Page 24: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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=j, 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

Page 25: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

Parte III

Page 26: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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

Page 27: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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)

7,5

Nota 1 Nota 2 Nota 3

Nota 1 Nota 2 Nota 3

Aluno1

Aluno2

Aluno3

Aluno4

Aluno5

Page 28: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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

7.5

Turma A

Turma B

N1 N2 N3

Aluno1

Aluno2

Aluno3

Aluno4

Aluno5

Page 29: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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)

Page 30: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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 )

Page 31: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

Exercício 1

Faça um programa em Fortran que lê a ordem de uma matriz quadrada (até 100). Em seguida lê os seus valores e finalmente calcula a sua transposta (at(i, j) = a(j, i)) e exibe para o usuário o resultado.

Ordem é o tamanho da linha = tamanho da coluna da matriz quadrada

Page 32: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

program transposta implicit none integer ordem, i, j, param parameter (param=100) integer A(param,param), T(param,param) print *, 'informe a ordem:' read *, ordem print *, 'inclua os valores da matriz A:' read *, ( (A(i,j), j=1, ordem), i=1, ordem )

C t(i, j) = a(j, i)

do i=1, ordem do j=1, ordem T(i,j) = A(j,i) end do end do print *, 'valores da transposta sao:' print *, ( (T(i,j), j=1, ordem), i=1, ordem ) end

Page 33: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

Exercício 2

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.

program soma de matrizes implicit none

C lendo as matrizes integer A(2,3), B(3,2), i, j, k, C(2,2) print *, 'valores da matriz A:' read *, (( A(i,j), j=1, 3) , i=1, 2 ) print *, 'valores da matriz B:' read *, (( A(i,j), j=1, 2) , i=1, 3 )

Page 34: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

Continuação

C dica: c(i, j) = Somatorio de a(i,k) * b(k,j) para todo k do i=1, 2 do j=1, 2 C(i,j)=0 do k=1, 3 C(i,j) = C(i,j) + (A(i,k) * B(k,j)) end do end do end do print *, 'valores da primeira linha da matriz C sao:' print *, (C(1,i), i = 1, 2) print *, 'valores da segunda linha da matriz C sao:' print *, (C(2,i), i = 1, 2) end

Page 35: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

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

Page 36: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

program matriz notas implicit none

integer numAlunos, numNotas, numTurmas, i, j, k, opcao parameter(numAlunos=2, numNotas=3, numTurmas=2) real nota(numAlunos, numNotas, numTurmas), soma, somaNotas real mediaEmUmaNota, media, valor, somaMediasNotas, mediaNotas character*20 nome(numAlunos), aluno

do i=1, numAlunos print *, 'informe o nome do aluno:' read *, nome(i) print *, 'as tres notas para cada turma:'C primeiro as notas de uma turma e depois as notas de outra turma read *,((nota(i,j,k),j=1,numNotas),k=1,numTurmas) end do print *, '1 para saber a media de um aluno;' print *, '2 para saber quais alunos tem media acima de um valor;' print *, '0 para abortar.' read *, opcao

Page 37: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

if (opcao .EQ. 0) then GO TO 10 else if (opcao .EQ. 1) then GO TO 11 else if (opcao .EQ. 2) then GO TO 12 end ifC Imprimindo a media de um aluno 11 print *, 'de qual aluno voce quer a media?' read *, aluno do i=1, numAlunos if (aluno .EQ. nome(i)) then do j=1, numNotas do k=1, numTurmas soma = soma + nota(i,j,k) end do mediaEmUmaNota = soma / numTurmas soma = 0 somaNotas = somaNotas + mediaEmUmaNota end do media = somaNotas / numNotas end if end do print *, 'a media do(a) aluno(a) eh: ', media GO TO 10

Page 38: Programação de Computadores Viviane Torres da Silva viviane.silva@ic.uff.br viviane.silva/progIII

C Imprimindo todos os alunos com media acima de um determinado valor 12 print *, 'informe o valor:' read *, valor soma=0 somaMediasNotas=0 media=0 do i=1, numAlunos do j=1, numNotas do k=1, numTurmas soma = soma + nota(i,j,k) end do mediaEmUmaNota = soma / numTurmas soma = 0 somaNotas = somaNotas + mediaEmUmaNota end do media = somaNotas / numNotas somaMediasNotas = 0 if (media .GE. valor) then print *, 'aluno(a) ', nome(i), 'tem media ', media end if media = 0 end do 10 end