E04: Teste seus conhecimentos sobre eficiência e elegância

E04.1  Problema: remover todos os caracteres # de um vetor de caracteres  c[0..n-1].   Exemplo: Se n vale 7 e o vetor contém   a b c # # d #   então o resultado deve ser   a b c d .    A seguinte função promete resolver o problema.  Aponte todos os erros do código (use flechas, balões, anotações).

void comprime (int N, char v[]) {
   int i, j = 0;
   for (i = 0; i < N; ++i) {
      if (v[i] == '#') {
         for (j = i; j < N; ++j)  
            v[j] = v[j+1];
         N -= 1;
      }
   }
}

Agora reescreva o código, corrigindo os erros, sem mudar a ideia do algoritmo.  Como é o vetor que faz a função trabalhar mais?  Como é o vetor que faz a função trabalhar menos?

E04.2  Escreva uma função que resolva o problema do exercício E04.1 e seja melhor que a discutida acima.   Responda às perguntas (e justifique suas respostas):   A função dá a resposta certa quando n vale 0?  E quando o vetor só tem #s?  E quando o vetor não tem #s?

E04.3  Problema: Dado um vetor a[0..n-1] de inteiros, decidir se todos os componentes do vetor são estritamente positivos.  O seguinte trecho de código promete resolver o problema.  Critique o código.

   i = 0;
   while (a[i] > 0 && i < n) i++;
   if (i >= 0) printf ("Tudo positivo.");
   else printf ("Nem tudo positivo.");

E04.4  Problema: Dado um inteiro x e um vetor a[0..n-1], encontrar j tal que a[j] == x. Discuta as duas propostas de solução abaixo. Depois, escreva a sua própria solução.

int func1 (int x, int a[], int n) { 
   int achou = 0, j = 0;
   while (j < n && !achou) {
      if (a[j] == x) achou = 1;
      else j++; 
   }
   if (!achou) j = 0;
   return j; 
}
int func2 (int x, int a[], int n) {
   int j, i;
   for (i = 0; i < n; i++) 
      if (a[i] == x) j = i;
   return j; 
}