Exercícios comentados
- 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.