




Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
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
1 / 8
Esta página não é visível na pré-visualização
Não perca as partes importantes!





(LEMat, MEAmb, MEBiol, MEQ) Departamento de Matem´atica, IST Exame 1 9 de Janeiro de 2013, 15h Dura¸c˜ao: 2h
n˜ao preencher
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
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
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