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
strcmppara 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
#include <string.h>é necessário parastrcmp.if (argc != 4)verifica se o número de argumentos é exatamente 4 (programa + op + a + b); senão, imprime uso e retorna 1.const char *op = argv[1];guarda a operação;atoiconverte os operandos.- A cadeia de
if/else ifcomparaopcomstrcmp.strcmpretorna 0 quando as strings são iguais. - No caso
div, verifica seb == 0; se sim, imprime erro e retorna 3. - Se nenhuma operação corresponder, imprime mensagem e retorna 2.
- Ao final, imprime
Resultado: %de 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; usestrcmp. - Esquecer de verificar
argc: acessarargv[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