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 questões que envolvem programação em Matlab e Fortran, além de operações em filas. O exame é composto por três grupos de questões, com diferentes níveis de dificuldade.

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
18 de Janeiro de 2012, 15h00
Dura¸ao: 2h30
ao preencher
I
II
III
T:
Curso: umero: Nome:
Grupo I [3,0+3,0]
a) Defina em Matlab uma fun¸ao fque recebe como argumentos dois vectores uevde
umeros inteiros de igual comprimento, percorre-os posi¸ao a posi¸ao recorrendo a um
ciclo while e devolve o par [p,q] tal que:
p´e o produto dos umeros pares que ocorrem em ucom os n´umeros ´ımpares que
ocorrem em v(note que o produto de zero elementos ´e 1);
q´e 1 se o vector utiver mais elementos pares do que o vector v, e ´e 0 caso
contr´ario.
function r=f(u,v)
p=1;
paresu=0;
paresv=0;
while i<=length(u)
if mod(u(i),2)==0
p=p*u(i);
paresu=paresu+1;
end
if mod(v(i),2)==0
paresv=paresv+1;
else
p=p*v(i);
end
i=i+1
end
if paresu>paresv
q=1;
else
q=0;
end;
r=[p,q]
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 18 de Janeiro de 2012, 15h Dura¸c˜ao: 2h

n˜ao preencher

I –

II –

III –

T:

Curso: N´umero: Nome:

Grupo I [3,0+3,0]

a) Defina em Matlab uma fun¸c˜ao f que recebe como argumentos dois vectores u e v de n´umeros inteiros de igual comprimento, percorre-os posi¸c˜ao a posi¸c˜ao recorrendo a um ciclo while e devolve o par [p,q] tal que:

  • p ´e o produto dos n´umeros pares que ocorrem em u com os n´umeros ´ımpares que ocorrem em v (note que o produto de zero elementos ´e 1);
  • q ´e 1 se o vector u tiver mais elementos pares do que o vector v, e ´e 0 caso contr´ario.

function r=f(u,v)

p=1; paresu=0; paresv=0; while i<=length(u) if mod(u(i),2)== p=pu(i); paresu=paresu+1; end if mod(v(i),2)== paresv=paresv+1; else p=pv(i); end i=i+ end if paresu>paresv q=1; else q=0; end; r=[p,q]

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 [m,v], em que m ´e um n´umero inteiro e v ´e um vector com tantos elementos como o n´umero de colunas, tais que

  • m ´e 1 se a matriz for uma matriz triangular superior (i.e. todos os elementos por baixo da diagonal principal s˜ao 0) e ´e 0 caso contr´ario.
  • v cont´em na posi¸c˜ao j o produto dos n´umeros ´ımpares que ocorrem na coluna j da matriz (note que o produto de zero elementos ´e 1).

function r=g(A)

m=1; j=1; v=ones(1,size(A,2)); while j<=size(A,2) i=1; while i<=size(A,1) if i>j && A(i,j)~= m=0; end if mod(A(i,j),2)~= v(j)=v(j)*A(i,j); end i=i+1; end j=j+1; end r=[m,v]

  • comp(w,n): subrotina que recebe no parˆametro de entrada/sa´ıda w uma fila de inteiros e devolve no parˆametro de sa´ıda n o comprimento da lista.
  • max(w,k): subrotina que recebe no parˆametro de entrada/sa´ıda w uma fila e devolve no parˆametro de sa´ıda k o maior valor da fila w. Caso a fila esteja vazia dever´a indicar erro.
  • copia(w1,w2) subrotina que recebe no parˆametro de entrada/sa´ıda w1 uma fila e de- volve no parˆametro de sa´ıda w2 uma fila idˆentica a w1.

a) Desenvolva uma implementa¸c˜ao para as opera¸c˜oes nil, insere, retira, vazia, comp e max. Observe que n˜ao tem de implementar as opera¸c˜oes proximo, proximoprio e copia.

function nil() result(f) type(fila)::f f%prim=>null() f%ult=>null() end function nil

subroutine retira(f) type(fila), intent(inout)::f type(cel), pointer::aux if (associated(f%prim)) then aux=>f%prim if (associated(f%prim%ult)) then f%prim=>f%prim%seg else f%ult=>null() f%prim=>null() end if deallocate(aux) end if end subroutine retira

function vazia(f) result(b) type(fila), intent(in)::f logical::b b=.not.associated(f%prim) end function vazia

subroutine comp(f,c) type(fila), intent(inout)::f integer, intent(out)::c type(cel), pointer::aux c= aux=>f%prim do if (.not.associated(aux)) then exit end if c=c+ aux=>aux%seg end do end subroutine comp

subroutine max(f,m) type(fila), intent(inout)::f integer::m type(cel), pointer::aux if (.not.associated(f%prim)) then print *,"erro" else max=f%prim%val aux=>f%prim%seg do if(.not.associated(aux)) then exit else if (aux%val>m) then m=aux%val end if aux=>aux%seg end if end do end if end function max

subroutine insere(f,i,b) type(fila), intent(inout)::f integer, intent(in)::i logical, intent(in)::b type(cel), pointer::novo,aux allocate(novo) novo%val=k novo%prior=b if(.not.associated(f%prim)) then novo%seg=null() f%prim=>novo f%ult=>novo else if(b.and.not.(f%prim%prior)) then novo%seg=>f%prim f%prim=>novo else if(.not.b) then novo%seg=>null() f%ult%seg=>novo f%ult=>novo else aux=>f%prim do if(.not.aux%seg%prior) then exit end if aux=>aux%seg end do novo%seg=>aux%seg novo%seg=>novo end if end if end if end subroutine insere

Grupo III [3,0+3,0]

a) Defina em Fortran uma fun¸c˜ao recursiva que recebe um vector de n´umeros inteiros e devolve .true. se o vector tiver mais n´umeros impares que pares e .false. caso contr´ario. Nota: Pode, caso assim o entenda, definir uma ou mais fun¸c˜oes auxiliares.

function maispares(v) result(b) integer, intent(in), dimension(:)::v integer::paresv logical::b paresv=paresaux(v,1) b=paresv<size(v)-paresv end function maispares

function paresaux(v,i) result(r) integer, intent(in), dimension(:)::v integer, intent(in)::i integer::r if (i>size(v)) then r= else if (modulo(v(i),2)==0) then r=1+paresaux(v,i+1) else r=paresaux(v,i+1) end if end if end function paresaux

b) Recorrendo ao m´odulo do Grupo II a), mas supondo que este n˜ao tem a opera¸c˜ao proximoprio, implemente a seguinte subrotina:

numprior(w,np): subrotina que recebe no parˆametro de entrada/sa´ıda w uma fila e de- volve no parˆametro de sa´ıda de tipo inteiro np o n´umero de elementos priorit´arios. Por exemplo, ao aplicar a subrotina a {(2, .true.), (0, .true.), (2, .false.)} a vari´avel np dever´a ficar com o valor 2.

subroutine numprior(w,np) type(fila), intent(inout)::w integer, intent(out)::np integer::max np= if (.not.vazia(w)) then call max(w,max) call insere(w,max+1,.true.) do if (primeiro(w)==max+1) then exit end if np=np+ call retira(w) end do end if end subroutine numprior