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)
{case 1:c2;case 2:c3;}
c4;

         

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);
  }