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 return para devolver valores: escreve em *q e *r.
  • Se b == 0, imprime erro e 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

  1. divmod recebe a e b por valor e dois ponteiros q e r para escrever os resultados.
  2. if (b == 0) trata o caso inválido antes de qualquer divisão, evitando comportamento indefinido.
  3. return encerra a função sem modificar *q nem *r.
  4. *q = a / b; e *r = a % b; gravam os resultados nos endereços do chamador.
  5. No main, q e r são inicializados com 0 e passados por endereço.
  6. 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 return no caso b == 0: a execução continua e faz divisão por zero (SIGFPE).
  • Passar q em vez de &q: erro de compilação ou escrita em endereço inválido.
  • Não inicializar q e r: se o erro ocorrer, o printf mostraria 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