Médio C
Divisão inteira com resto via ponteiros de saída
Enunciado
Implemente void divmod(int a, int b, int *q, int *r) que calcula o quociente e o resto da divisão inteira de a por b e os escreve em *q e *r. Trate b == 0 imprimindo erro e retornando sem alterar as saídas. No main, leia a e b e imprima q=<q> r=<r>.
Requisitos
- A função não usa
returnpara devolver valores: escreve em*qe*r. - Se
b == 0, imprimeerroe retorna imediatamente. - A saída normal é
q=<quociente> r=<resto>.
Código inicial
#include <stdio.h>
void divmod(int a, int b, int *q, int *r) {
/* complete */
}
int main(void) {
int a, b, q = 0, r = 0;
scanf("%d %d", &a, &b);
divmod(a, b, &q, &r);
/* imprima conforme o caso */
return 0;
}
Saída esperada
q=3 r=2
Ver dica
Use / para o quociente e % para o resto. Verifique b == 0 antes de calcular.
Mostrar solução
#include <stdio.h>
/* Escreve quociente e resto em ponteiros de saída. */
void divmod(int a, int b, int *q, int *r) {
if (b == 0) { /* evita divisão por zero */
printf("erro\n");
return; /* sai sem tocar em *q e *r */
}
*q = a / b;
*r = a % b;
}
int main(void) {
int a, b, q = 0, r = 0;
scanf("%d %d", &a, &b);
divmod(a, b, &q, &r);
if (b != 0) { /* imprime apenas no caso válido */
printf("q=%d r=%d\n", q, r);
}
return 0;
}
Passo a passo
divmodrecebeaebpor valor e dois ponteirosqerpara escrever os resultados.if (b == 0)trata o caso inválido antes de qualquer divisão, evitando comportamento indefinido.returnencerra a função sem modificar*qnem*r.*q = a / b;e*r = a % b;gravam os resultados nos endereços do chamador.- No
main,qersão inicializados com 0 e passados por endereço. - O
if (b != 0)evita imprimir lixo quando houve erro.
Por que funciona
return só devolve um valor. Passando ponteiros de saída, a função devolve vários resultados ao mesmo tempo. Como o main inicializa q e r, mesmo no caminho de erro os valores permanecem determinísticos.
Erros comuns
- Esquecer o
returnno casob == 0: a execução continua e faz divisão por zero (SIGFPE). - Passar
qem vez de&q: erro de compilação ou escrita em endereço inválido. - Não inicializar
qer: se o erro ocorrer, oprintfmostraria valores indefinidos.
Outra forma de resolver
Uma struct também devolve múltiplos valores: struct Div { int q, r; }; e return (struct Div){a/b, a%b};. É mais legível quando há muitos resultados, mas exige tratar b == 0 fora da função.
Saída esperada
q=3 r=2