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