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