Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Exame de Computação e Programação, Provas de Matemática Computacional

Um exame de Computação e Programação do Departamento de Matemática do IST, com duração de 2h30. O exame contém questões que envolvem programação em Matlab e Fortran, incluindo a definição de funções e subrotinas para manipulação de vetores e matrizes. As questões também envolvem conceitos como capicua e soma de entradas em colunas pares e linhas ímpares.

Tipologia: Provas

2019

À venda por 05/12/2023

BeatrizCardoso
BeatrizCardoso 🇵🇹

9 documentos

1 / 8

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
Computa¸ao e Programa¸ao
(LEMat, MEAmb, MEBiol, MEQ)
Departamento de Matem´atica, IST
Exame 1
9 de Janeiro de 2013, 15h00
Dura¸ao: 2h30
ao preencher
I
II
III
T:
Curso: umero: Nome:
Grupo I [3,0+3,0]
a) Um vector diz-se uma quasi-capicua se ao for uma capicua mas se se alterar uma das
suas entradas passar a ser uma capicua. Por exemplo, os vectores [1 2 2 1] e [1 2 3 4 5]
ao ao quasi-capicuas mas o vector [12 31] ´e, pois se substituir o segundo elemento
por 3 este passa a ser uma capicua. Defina em Matlab um fun¸ao fque recebe como
argumento um vector e, recorrendo a um ciclo while, retorna 1 se este ´e uma quasi-
capicua e 0 em caso contr´ario.
Sugest˜ao: Conte quantos elementos correspondentes (primeiro e ´ultimo, segundo e
pen´ultimo, etc.) ao diferentes.
function r = f(v)
conta=0;
n=length(v);
i=1;
while (i<=n/2)
if (v(i)~=v(n-i+1))
conta=conta+1;
end
i=i+1;
end
if (conta==1)
r=1;
else
r=0;
end
end
1
pf3
pf4
pf5
pf8

Pré-visualização parcial do texto

Baixe Exame de Computação e Programação e outras Provas em PDF para Matemática Computacional, somente na Docsity!

Computa¸c˜ao e Programa¸c˜ao

(LEMat, MEAmb, MEBiol, MEQ) Departamento de Matem´atica, IST Exame 1 9 de Janeiro de 2013, 15h Dura¸c˜ao: 2h

n˜ao preencher

I –

II –

III –

T:

Curso: N´umero: Nome:

Grupo I [3,0+3,0]

a) Um vector diz-se uma quasi-capicua se n˜ao for uma capicua mas se se alterar uma das suas entradas passar a ser uma capicua. Por exemplo, os vectores [1 2 2 1] e [1 2 3 4 5] n˜ao s˜ao quasi-capicuas mas o vector [1 2 3 1] ´e, pois se substituir o segundo elemento por 3 este passa a ser uma capicua. Defina em Matlab um fun¸c˜ao f que recebe como argumento um vector e, recorrendo a um ciclo while, retorna 1 se este ´e uma quasi- capicua e 0 em caso contr´ario. Sugest˜ao: Conte quantos elementos correspondentes (primeiro e ´ultimo, segundo e pen´ultimo, etc.) s˜ao diferentes.

function r = f(v) conta=0; n=length(v); i=1; while (i<=n/2) if (v(i)~=v(n-i+1)) conta=conta+1; end i=i+1; end if (conta==1) r=1; else r=0; end end

b) Defina em Matlab uma fun¸c˜ao g que recebe como argumento uma matriz de n´umeros inteiros, percorre essa matriz posi¸c˜ao a posi¸c˜ao recorrendo a dois ciclos while e devolve o par [b,c], em que b e c s˜ao n´umeros inteiros tais que

  • b ´e 1 se a soma das entradas em colunas pares for maior que a soma das entradas em linhas ´ımpares, e ´e 0 em caso contr´ario;
  • c cont´em a soma da diagonal principal (chamado o tra¸co da matriz).

function r = g(m) r=zeros(1,2); colunas_pares=0; linhas_impares=0; i=1; while (i<=size(m,1)) j=1; while (j<=size(m,2)) x=m(i,j); if (mod(j,2)==0) colunas_pares=colunas_pares+x; end if (mod(i,2)==1) linhas_impares=linhas_impares+x; end if (i==j) r(2)=r(2)+x; end j=j+1; end i=i+1; end if (colunas_pares>linhas_impares) r(1)=1; end end

  • comp(w,n): subrotina que recebe no parˆametro de entrada/sa´ıda w uma lista de inteiros e devolve no parˆametro de sa´ıda n o comprimento da lista.

a) Desenvolva uma implementa¸c˜ao para as opera¸c˜oes nil, insere, temrep, e comp.

function nil( ) result (w) type(lista) :: w

w%prm=>null() w%ult=>null() end function nil

subroutine insere(w,i,k) type(lista), intent(inout) :: w integer, intent(in) :: i,k type(cel), pointer :: p,aux integer :: n,j

call comp(w,n) allocate(aux) aux% val=k aux%seg=>null() if (n==0) then w%prm=>aux w%ult=>aux elseif (i>n) then aux%seg=>w%prm w%prm=>aux else p=>w%prm do j=1,n-i p=>p%seg end do aux%seg=>p%seg p%seg=>aux end if end subroutine insere

subroutine temrep (w,b) type(lista), intent(inout) :: w logical, intent(out) :: b type(cel), pointer :: p1,p

b=.false. p1=>w%prm do if (.not. associated(p1)) then exit end if p2=>p1%seg do if(.not. associated(p2)) then exit end if if (p1%val==p2%val) then b=.true. end if p2=>p2%seg end do p1=>p1%seg end do end subroutine temrep

subroutine comp (w,n) type(lista), intent(inout) :: w integer, intent(out) :: n type(cel), pointer :: p

p=>w%prm n= do if (.not. associated(p)) then exit end if n=n+ p=>p%seg end do end subroutine comp

Grupo III [3,0+3,0]

a) Desenvolva em Fortran uma fun¸c˜ao ordenadec que recebe como argumento um vector p de n´umeros inteiros e devolve o vector p ordenado por ordem decrescente.

function ordenadec (v) result (r) integer, dimension(:), intent(in) :: v integer, dimension(size(v)) :: r integer :: a,i,j

r=v do m=1,size(r)- do k=m+1,size(r) if (r(m)<r(k)) then a=r(m) r(m)=r(k) r(k)=a end if end do end do end function ordenadec

b) Defina em Fortran uma fun¸c˜ao recursiva diagonal que recebe como argumento uma matriz quadrada de n´umeros inteiros e devolve .true. se a matriz for diagonal e devolve .false. em caso contr´ario. Nota: Pode, caso assim o entenda, definir uma ou mais fun¸c˜oes auxiliares.

function diagonal(m) result (b) integer, dimension(:,:), intent(in) :: m logical :: b

b=diag_aux(m,1,1) end function diagonal

recursive function diag_aux(m,i,j) result (b) integer, dimension(:,:), intent(in) :: m integer, intent(in) :: i,j logical :: b

if (i==size(m,1) .and. j==size(m,2)) then b=.true. elseif (j>size(m,2)) then b=diag_aux(m,i+1,1) elseif (i/=j .and. m(i,j)/=0) then b=.false. else b=diag_aux(m,i,j+1) end if end function diag_aux