




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 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
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 18 de Janeiro de 2012, 15h Dura¸c˜ao: 2h
n˜ao preencher
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:
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
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]
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