Universidade Federal de Minas Gerais
Instituto de Ciências Exatas
Departamento de Ciência da Computação
Algoritmos e Estruturas de Dados I - 1a. Prova
1.Considere que um fluxo de controle seja formado apenas de comandos da forma c1, c2,...cn. Complete a tabela abaixo. Só é necessário mostrar até quatro dos fluxos envolvendo o menor número de comandos.
|
Trecho |
Fluxos |
Fluxo 1 |
Fluxo 2 |
Fluxo 3 |
Fluxo 4 |
|
c1;if(e)c2;c3; |
2 |
c1;c3; |
c1;c2;c3; |
--- |
--- |
|
c1;if(e)c2;else c3;c4 |
2 |
c1;c2;c4 |
c1;c3;c4; |
--- |
--- |
|
for(e1;e2;e3)c1;c2; |
N |
c2; |
c1;c2; |
c1;c1;c2; |
c1;c1;c1;c2; |
|
c1;while(e)c2;c3; |
|||||
|
c1;do c2;while(e);c3; |
|||||
|
c1;switch(e) |
2.A codificação (a!=null & a.length==2), apesar da sintaxe correta, permite que aconteça um erro semântico. Uma solução para este problema é usarmos a seguinte codificação: (a!=null && a.length==2). Explique, de forma concisa e sem vícios de linguagem, qual é o problema que esta última codificação soluciona. Sua explicação deve mencionar o tipo da variável.
3.O trecho de programa abaixo calcula o valor do número irracional e, base dos logaritmos neperianos, de forma aproximada. Codifique o trecho sublinhado. Observação: o valor de e é obtido através do somatório de um número adequado de termos da forma 1/n!: 1/0!+1/1!+1/2!+1/3!+1/4!+...
double eatual=1.0, eprox=2.0, f=1.0;
for(int n=2; eprox-eatual1.0E-10; n++){
eatual=eprox;
_______________;
eprox=eprox+1.0/f;
}
4.O trecho de programa abaixo usa dois arranjos, a1 e a2, com valores dos elementos ordenados em ordem crescente, para criar um terceiro arranjo, a3, também ordenado. Codifique os trechos (a), (b), (c) e (d).
int[] a3=new int[a1.length+a2.length];
int i1=0, i2=0, i3=0;
while(i1<a1.length & i2<a2.length)
a3[i3++]= ____(a)_____ ? ____(b)_____ : a2[i2++];
while(i1<a1.length) _____(c)_______;
while(i2<a2.length) _____(d)_______;
5.O trecho de programa abaixo calcula o produto de duas matrizes representadas por arranjos de arranjos. O elemento a3[i][j] do produto é o somatorio dos produtos dos elementos da linha i do primeiro arranjo pelos elementos da coluna j do segundo arranjo. Codifique o trecho.
for(int linha=0; linha<a1.length; linha++)
for(int coluna=0; coluna<a1.length; coluna++){
a3[linha][coluna]=0;
for(int i=0; i<a1.length; i++)
a3[linha][coluna]+=________________________;
}
6.Descreva, de forma concisa e sem vícios de linguagem, o que faz o método abaixo:
static int[] m(int[] p){
if(p==null) return null;
int[] x=new int[p.length];
for(int i=0; i<p.length; i++) x[i]=p[i];
return x;
}
7.O construtor String(char[] c, int i, int f) constrói uma instância iniciada com f caracteres do arranjo referido por c a partir do elemento de índice i. O construtor visto em aula corresponde a String(c, 0, c.length). Descreva, de forma concisa e sem vícios de linguagem, o que faz o método abaixo:
static String m(String f, char t){
char[] c=new char[f.length];
int p=0;
for(int i=0; i<f.length(); i++)
if(f.charAt(i)!=t)c[p++]=f.charAt(i);
return new String(c, 0, p);
}
8.Considere o método estático abaixo que calcula o termo de ordem n da série de Fibonacci. Mostre o que é impresso quando é feita a seguinte invocação: fib(4);
static int fib(int n){
System.out.println("Termo de ordem:"n);
if(n<=0) return 0;
if(n==1) return 1;
return fib(n-1)+fib(n-2);
}