Desafio C

Calculadora com código de saída

Enunciado

Implemente uma calculadora que receba três argumentos: operação (soma, sub, mult, div) e dois números inteiros. Imprima o resultado e retorne 0 em caso de sucesso. Se a operação for inválida, retorne 2. Se houver divisão por zero, retorne 3. Se faltarem argumentos, retorne 1.

Requisitos

  • Verificar argc == 4; caso contrário, retornar 1.
  • Usar strcmp para comparar a operação (inclua <string.h>).
  • Tratar divisão por zero retornando 3.
  • Imprimir o resultado no formato Resultado: <valor>.

Código inicial

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    // complete
    return 0;
}

Saída esperada

Resultado: 7
Ver dica

Use strcmp(op, "soma") == 0 para comparar strings.

Mostrar solução
#include <stdio.h>
#include <stdlib.h>
#include <string.h>  // para strcmp

int main(int argc, char *argv[]) {
    if (argc != 4) {
        printf("Uso: %s <op> <a> <b>\n", argv[0]);
        return 1;  // argumentos insuficientes
    }

    const char *op = argv[1];
    int a = atoi(argv[2]);
    int b = atoi(argv[3]);
    int resultado;

    if (strcmp(op, "soma") == 0) {
        resultado = a + b;
    } else if (strcmp(op, "sub") == 0) {
        resultado = a - b;
    } else if (strcmp(op, "mult") == 0) {
        resultado = a * b;
    } else if (strcmp(op, "div") == 0) {
        if (b == 0) {
            printf("Erro: divisao por zero\n");
            return 3;  // erro de divisao
        }
        resultado = a / b;
    } else {
        printf("Operacao invalida: %s\n", op);
        return 2;  // operacao desconhecida
    }

    printf("Resultado: %d\n", resultado);
    return 0;  // sucesso
}

Passo a passo

  1. #include <string.h> é necessário para strcmp.
  2. if (argc != 4) verifica se o número de argumentos é exatamente 4 (programa + op + a + b); senão, imprime uso e retorna 1.
  3. const char *op = argv[1]; guarda a operação; atoi converte os operandos.
  4. A cadeia de if/else if compara op com strcmp. strcmp retorna 0 quando as strings são iguais.
  5. No caso div, verifica se b == 0; se sim, imprime erro e retorna 3.
  6. Se nenhuma operação corresponder, imprime mensagem e retorna 2.
  7. Ao final, imprime Resultado: %d e retorna 0.

Por que funciona

O programa usa os argumentos de linha de comando e o código de saída para comunicar diferentes situações: 0 sucesso, 1 uso incorreto, 2 operação inválida, 3 divisão por zero. Isso permite que scripts verifiquem o que aconteceu. A comparação com strcmp é a forma idiomática de comparar strings em C.

Erros comuns

  • Usar == para comparar strings: if (op == "soma") compara ponteiros, não conteúdo; use strcmp.
  • Esquecer de verificar argc: acessar argv[1] sem argumento causa erro.
  • Não tratar divisão por zero: o programa aborta com falha de segmentação ou comportamento indefinido.
  • Retornar valores fora de 0–255: podem ser truncados pelo sistema.

Outra forma de resolver

Usar uma tabela de operações com ponteiros para função:

int soma(int a, int b) { return a + b; }
// ...
struct { const char *nome; int (*fn)(int, int); } ops[] = {
    {"soma", soma}, {"sub", sub}, {"mult", mult}, {"div", div}
};

Preferível quando há muitas operações e se deseja evitar cadeias longas de if.

Saída esperada

Resultado: 7