Exercícios comentados

From Applied Science
  • Os dois algoritmos abaixo tentam calculuar [math]\displaystyle{ x^n }[/math]. Ambos estão errados. Explique o erro de cada um:
for (i = 1; i <= n; i++) x = x * i;
Está multiplicando por um contador que aumenta a cada vez. Para x = 4, temos 4 * 1, depois 4 * 2, depois 8 * 3, ...
for (i = 0; i < n; i++) x = x * x;
Está calculando o quadrado do número, depois o quadrado do resultado e repete. Para x = 4, temos 16, depois 162, depois (162)2

Obs.: pode parecer bobagem, mas isso acontece quando não se entende a operação de atribuição.


  • Escreva um algoritmo que complete esta tabela de multiplicação (não se preocupe com alinhamento de texto ou declaração de variáveis)
1 2 3 ...
2 4 6 ...
3 6 9 ...
... ... ... ...
for (i = 1; i <= n; i++)
     for (j = 1; j <= n; j++)
          value = i * j;

Obs.: pode parecer bobagem, mas esse exercício é exatamente a base para se traçar o gráfico de funções na tela do computador.


  • Escreva uma função de protótipo int maior (int m[ ][max], int n) que devolve o maior valor da linha n da matriz m. Considere #define max 10
int maior (int m[][max], int n) {
    int i,
        lin_maior = m[n][0];
    
    for (i = 1; i < max; i++)
         if (lin_maior < m[n][i])
             lin_maior = m[n][i];
    
    return lin_maior;
}

A diferença entre pedir para escrever uma função que faz alguma coisa e dar o protótipo no enunciado é que com o protótipo, a função não pode ter mais ou menos parâmetros do que aqueles que já estão ali.

'lin_maior' poderia começar com 0? Sim se estivesse especificado no enunciado que há apenas valores positivos na matriz por exemplo. Senão então precisamos assumir que algum elemento da linha é o maior, até que algum outro elemento da mesma linha seja maior. A comparação será feita com todos. Então tanto faz se começar com o primeiro, último, o meio, etc.

Perceba que só há um laço e não dois, porque o enunciado só quer saber de uma linha da matriz, não de todas. A variável 'n' mantem a linha constante. O laço poderia começar do 0? Poderia, mas como estamos considerando que o primeiro elemento da linha é o maior até que um maior ainda seja encontrado, não precisamos mais comparar com ele mesmo.

Use a função anterior, mesmo que você não a tenha feito, para escrever a função de protótipo int iguais (int m[ ][max], int n) que devolve 1 se o maior valor de todas as linhas forem iguais ou 0 se não forem

int iguais (int m[][max], int n) {
    int maior_valor, i;
    maior_valor = maior(m, 0);
    
    for (i = 1; i < n; i++)
         if (maior_valor != maior(m, i)) return 0;
    
    return 1;         
}

Não precisamos saber como a função anterior faz o que faz para resolver o problema de chamar uma função. Mesmo sem sabermos o algoritmo sabemos o que ela faz e com quais dados de entrada, isso basta para saber usá-la num outro problema.

A ideia básica é simplesmente parar a busca no primeiro valor que for diferente, devolvendo 0. Se a iteração não parar, então ela vai até o fim e a função devolve 1. O maior valor de cada linha da matriz é igual para todas as linhas.

O restante do algoritmo diz respeito à programação em si. O contador 'i' começa com 1, pois uma variável está guardando o maior valor da linha zero. A variável 'maior_valor' não seria necessária, poderíamos colocar a chamada 'maior(m, 0)' diretamente na condicional do 'if'. Veja que as duas funções precisam ter uma matriz parâmetro. Se a função 'iguais' não tiver uma matriz como parâmetro, como a função 'maior' vai funcionar? Erros como não colocar uma matriz como parâmetro da função 'iguais' e confusões entre as variáveis declaradas como parâmetros e variáveis que não são parâmetros acabam impedindo total ou parcialmente a resolução da questão. Já um erro como esquecer de declarar como parâmetro de 'iguais' o contador de linhas da matriz é um erro menor, não impede de resolver a questão.