Programa: Criando uma calculadora em C

Tutorial passo-a-passo sobre a criação de uma calculadora na linguagem de programação CNo artigo passado, sobre o laço DO WHILE em C, propomos para você um exercício:

No artigo sobre o teste condicional SWITCH em C, mostramos como usar ele para fazer uma calculadora.
Refaça essa calculadora, com o mesmo SWITCH, mas agora mostrando as operações matemáticas como opções de um menu, dentro de um laço DO WHILE.

Vamos resolver esse exercício e comentar totalmente seu código, agora em nossa apostila de C!


Clique aqui e saiba como obter seu certificado de programação C! Entre já no Mercado de Trabalho!

Como criar uma calculadora em C

Você já saiu do básico e aprendeu todos os testes condicionais e laços na linguagem.
Já está na hora de fazer algo realmente útil, que você possa se orgulhar e até mostrar aos amigos.

Ou seja, vamos fazer uma calculadora que fazer as operações de soma, subtração, multiplicação, divisão e resto da divisão.

Tudo isso com base nos conhecimentos que acumulamos até aqui.
Obviamente, não será uma calculadora complexa e de utilidade geral, é mais para termos noção de como usar os conhecimentos que aprendemos até aqui.

Ela também não é uma aplicação 'robusta', que seja blindada e segura. Ela é facilmente 'hackeável'.
Por exemplo, ela está programada para receber números, então se você digitar uma letra, irá 'quebrar' nosso programa.

Mas ao passo que vamos estudando e evoluindo em nossa apostila, iremos criar aplicações cada vez melhores e mais seguras
Pois bem, vamos começar!


A lógica de uma calculadora na linguagem C

Vamos usar apenas três variáveis nesse aplicativo C: dois floats (que vão representar os dois números) e uma variável do tipo char, que irá armazenar o tipo de operação o usuário quer: +, -, *, / ou %

Conforme pedimos, o menu será exibido através do laço DO WHILE.
Lembrando que temos que colocar uma condição para esse laço continuar. Você pode criar a sua, a minha foi a seguinte: se o usuário digitar num1=0, oper=0 e num2=0, o programa termina.

Pois bem, mostramos o menu ao usuário (meros printf, que você já domina totalmente) e demos exemplos de como deve ser a entrada do usuário. Que deve ser:  numero operador numero

Se colocarmos os 3 scanf em sequência, dá para pegar o primeiro número, o char e em seguida o segundo número, mas o usuário tem que entrar com os dados da seguinte maneira: digita o primeiro número, dá um espaço, digita o operador e dá outro espaço.

Após isso, limpamos a tela e mostramos ao usuário a operação matemática que ele escolheu:
numero operador numero2 = 

E o resultado dessa operação? Hora, vai depender do operador e números que ele tenha escolhido.
Essa resposta vai ser fornecida através do switch.

Mandamos o operador para o switch, que vai selecionar a operação e mostrar um printf com o resultado.

Caso o usuário tenha digitado um operador inválido, o switch manda isso pro default.
Lá no default temos que fazer uma espécie de tratamento de informação, para saber se o usuário digitou um operador inválido ou se digitou 0 0 0, pois se tiver digitado 0 0 0 é porque ele quer terminar o programa.

Isso é facilmente resolvido com o nosso conhecido e amado teste condicional IF ELSE.


#include <stdio.h>

int main(void)
{
        float num1,
              num2;
        char oper;

        do
        {
            printf("\t\tCalculadora do curso C Progressivo\n\n");

            printf("Operacoes disponiveis\n");
            printf("'+' : soma\n");
            printf("'-' : subtracao\n");
            printf("'*' : multiplicao\n");
            printf("'/' : divisao\n");
            printf("'%%' : resto da divisao\n");

            printf("\nDigite a expressao na forma: numero1 operador numero2\n");
            printf("Exemplos: 1 + 1 ,  2.1 * 3.1\n");
            printf("Para sair digite: 0 0 0\n");


            scanf("%f", &num1);
            scanf(" %c",&oper);
            scanf("%f", &num2);

            system("cls || clear");

            printf("Calculando: %.2f %c %.2f = ", num1,oper,num2);


            switch( oper )
            {
                case '+':
                        printf("%.2f\n\n", num1 + num2);
                        break;

                case '-':
                        printf("%.2f\n\n", num1 - num2);
                        break;

                case '*':
                        printf("%.2f\n\n", num1 * num2);
                        break;

                case '/':
                        if(num2 != 0)
                            printf("%.2f\n\n", num1 / num2);
                        else
                            printf("Nao existe divisao por 0\n\n");
                        break;

                case '%':
                        printf("%d\n\n", (int)num1 % (int)num2);
                        break;

                default:
                        if(num1 != 0 && oper != '0' && num2 != 0)
                            printf(" Operador invalido\n\n ");
                        else
                            printf(" Fechando calculadora!\n ");
            }

        }while(num1 != 0 && oper != '0' && num2 != 0);

}

44 comentários:

  1. Paz seja convosco;
    Do jeito que está aí, se compilado no terminal do Ubuntu 12.04 LTS, dá erro na linha 18:12:

    $ gcc 1.c -o 1
    1.c: In Funktion »main«:
    1.c:18:13: Warnung: unbekanntes Konvertierungstyp-Zeichen »:« im Format [-Wformat]

    Fora isso o código está legalzinho. Meus parabéns pelo o site. ^^

    ResponderExcluir
  2. Opa, pra aparecer o % tem que colocar %%!

    Corrigido, grato pela contribuição Van Dick.

    ResponderExcluir
  3. Ai pessoas, eu fiz uma calculadora diferente, ela é baseada na calculadora que fizera aki.
    ta aqui o code dela:
    #include

    int main()
    {
    int opcao,
    num1,
    num2;

    do
    {
    printf("\t\t\nEscolha a Sua operação\n");
    printf("0. Sair\n");
    printf("1. Somar\n");
    printf("2. Diminuir\n");
    printf("3. Multiplicar\n");
    printf("4. Dividir\n");

    printf("Opcao: ");
    scanf("%d", &opcao);

    printf("Escolha um numero: ");
    scanf("%d", &num1);

    printf("Escolha outro numero: ");
    scanf("%d", &num2);

    switch( opcao )
    {
    case 0:
    system("cls || clear");
    printf("Saindo do menu...\n");
    break;
    case 1:
    system("cls || clear");
    printf("%d + %d = %d \n", num1, num2, num1 + num2);
    break;
    case 2:
    system("cls || clear");
    printf("%d - %d = %d \n", num1, num2, num1 - num2);
    break;
    case 3:
    system("cls || clear");
    printf("%d * %d = %d", num1, num2, num1 * num2);
    break;
    case 4:
    system("cls || clear");
    printf("%d / %d = %d", num1, num2, num1 / num2);
    break;
    default:
    system("cls || clear");
    printf("Opcao invalida! Tente novamente.\n");
    }
    } while(opcao);

    ResponderExcluir
  4. Preciso de ajuda preciso de uma calculadora que use vetor e tenha 8 registradores em C, :(

    ResponderExcluir
  5. Olá Luciano,

    Qual, exatamente, é sua dúvida ?
    O que já conseguiu fazer?

    ResponderExcluir
  6. Oi gente, eu preciso de uma calculadora como a do anonimo,so q tem q ter as opções de exponenciação,raiz quadrada e porcentagem. Alguem me ajuda???

    ResponderExcluir
  7. Ei Day meu nome é Luciano, eu posso te ajudar me passa seu e-mail assim ajudo com suas dúvidas.

    ResponderExcluir
  8. Olá Day e Luciano,

    Sugerimos que vocês usem nosso Fórum de C , pois com certeza esse assunto/dúvida poderá ajudar e ser útil para outros leitores de nossa apostila de C :)

    ResponderExcluir
  9. Ola,em primeiro lugar gostaria de elogiar o vosso curço ,està muito bom! Estou com uma duvida,não consigo usar o função System("cls||clear") no Mac..uso o compilador Xcode e ele detecta o erro: implicit declaration of function 'system' is invalid in C99

    Muito obrigado



    Rehan Kadir

    ResponderExcluir
  10. Não utilizes system("clear||cls"), é uma chamada ao sistema operativo, logo pode ser diferente.

    em gcc para linux utilizo:
    #include
    #include

    clrscr();

    para o erro system' is invalid in C99, é só compilar com a opção:
    gcc -std=c90 prog.c -o prog

    ResponderExcluir
  11. OK1Muito obrigado João Antunes Guimarães,vou tentar depois digo algo

    ResponderExcluir
  12. Oi eu preciso fazer uma calculadora com as
    Opera coes b asicas de: adi cao, subtra cao, divisao e multiplica cao com at e 2 operandos;
    Raiz quadrada;
    Seno; e
    Cosseno.
    mas ´so tenho um semestre de curso e estou perdida

    ResponderExcluir
  13. Oi gente que quer a calculadora, dou uma sugestão: (diretaço)
    #include
    #include
    void main(void){
    float a,b,c,d,e,f,g,h;
    printf("Calculadora do Rambo\n)";
    scanf("%f %f %f %f %f %f",a,b,c,d,e,f,g);
    printf("%f",a*b/c)-d+%e+sin(f)+sqr(g);
    }

    PRONTO!
    sem aquela infinidade de IFs, CASEs, etc

    dúvidas? entremos em contato, nao sei como, entao perguntem para qwqwqw3013@yahoo.com.br

    ah, moderador, uma caixa de texto mais larga seria muito bom.

    ResponderExcluir
  14. Olá, eu fiz um igual a esse mas não encontro o erro. Quando teclo enter pra ele fazer o cálculo, ele simplesmente "pula" e exibe a mensagem do default: veja:

    /*
    Programa simples em C que realiza cálculos com dois dígitos.
    */

    #include
    #include
    int main(int argc, char *argv[]){
    float num1, num2, resultado;
    char operador;

    printf("Digite o Primeiro numero, o Operador e o Segundo numero.\n");
    scanf("%f, %s, %f", &num1, &operador, &num2);

    switch(operador){
    case 'soma':
    resultado = num1+num2;
    printf("\n%f\n\n\n", resultado);
    break;

    case 'subtração':
    resultado = num1-num2;
    printf("\n%f\n\n\n", resultado);
    break;

    case 'divisão': case ':':
    resultado = num1/num2;
    printf("\n%f\n\n\n", resultado);
    break;

    case 'multiplicação': case '.':
    resultado = num1*num2;
    printf("\n%f\n\n\n", resultado);
    break;

    default:
    printf("\nNao foi possivel realizar esta operacao!\n\n\n ");
    break;
    }
    }

    ResponderExcluir
  15. system("cls || clear");

    tive que apagar esta linha dae funcionou...


    estou usando devc++ pq o codeblocks não ta executando... ta dando falta de arquivo pra executar.. ja o dev não...

    ResponderExcluir
  16. Ernandes, experimente substituir o "%s" por "%c"

    ResponderExcluir
  17. Boa noite. Eu tenho que fazer uma calculadora que some e multiplique so com binarios.

    ResponderExcluir
  18. Boa noite pessoal , estou tentado montar o código fonte de uma calculado , que vai rodar em um PIC18F4520 , porem ainda não obtive muito avanço. Alguém
    poria me ajudar ?

    ResponderExcluir
  19. Boa noite pessoal , estou tentando montar o código fonte para uma calculadora de cálculos básicos (+,-,/,*) que vai rodar em um PIC18F4520 porem ainda não consegui desenvolver. Alguém pode me ajudar ?

    ResponderExcluir
  20. Olá, precisava de uma ajudinha!

    Teria como escrever esse mesmo programa usando Linguagem C# ? Precisava fazer um programa que funcionasse como uma calculadora, acredite que esse me atenda muito bem, mas não entendo a sintaxe de C, apenas C#

    ResponderExcluir
  21. gostei do visual dela aparenta uma calculadora daquelas usadas em maquinas de trator de separar milho.

    ResponderExcluir
  22. Por que a ordem com que eu entro com os dados faz diferença? Tipo, se eu faço no inicio do programa

    printf("Primeiro termo: ");
    scanf("%f",&num1);
    printf("Operacao: ");
    scanf("%c",&operacao);
    printf("Segundo termo: ");
    scanf("%f",&num2);

    dá erro.

    ResponderExcluir
  23. Bom dia pessoal. Gostei muito da calculadora. Tenho um exercício para fazer assim só que além desses recursos colocados acima ele deve fazer ao menos 1 conversão (tipo decimal para binário ou outro) e exibir um histórico que ao digitar o comando "historico" ele exiba as 10 ultimas operações. Como posso fazer isso? Obrigada!

    ResponderExcluir
  24. Ola, preciso de uma calculadora porem da seguinte forma:

    A+B=C

    onde eu posso calcular qualquer variável.
    Se eu informar A=1 e B=2 vai me dar a resposta que C=3
    Se eu informar B=2 e C=4 vai me dar a resposta do A, que é 2 nesse caso.

    Se alguém puder me ajudar, ficarei grato, pois é para o meu trabalho.

    ResponderExcluir
  25. Eu consigo inserir esse programa "cauculadora" um outro programa tipo colocar em html.

    ResponderExcluir
  26. boa noite galera!
    instalei o programa Code:Blocks e tentei fazer este programa da calculadora do exemplo, mas nao funcionou deu erro: 'num2' undeclared (first use in this function).
    Alguem pode me ajudar.
    Desde já agradeço a ajuda e coloaboração.
    Att. Weder

    ResponderExcluir
  27. tenta começar assim:
    float num1;
    float num2;
    char oper;

    ResponderExcluir
  28. O meu "resto" não dá certo...

    case '%':
    system("clear || cls");
    printf("Calculando: %.1f %c %.1f = %.1f \n", num1, oper, num2, (int)num1 % (int)num2 );
    break;

    Se eu coloco 5 % 3, por ex, a resposta é:
    Calculando: 5.0 % 3.0 = 6205628055300728300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.0

    O que está errado? O (int) eu assumi que é pra transformar o float em inteiro, é isso? Não tinha explicação na apostila...

    ResponderExcluir
    Respostas
    1. Saiba antes do sistema internacional de numeração em Octal,decimal, hexadecimal,epois na variável ou na expressão em que na qual colocou /%1f poderá ser entendido de forma diferente pelo compilador

      Excluir
  29. GOSTARIA DE SABER QUE CALCULADORA OU COMO POSSO FAZER NOVOS BASEADOS NESTES EXEMPLOS

    c/VGVAUCAF5Snv8= 500.000 E ASSIM POR DIANTE QUERIA FAZER TIPO 5 BILHOES QUE NUMEROS POSSO MODIFICAR

    ResponderExcluir
  30. gente me ajuda porfavol

    fazer uma calculadora em C que leia dois números e o usuário tenha 7 funções possível para fazer operações com os dois números digitados

    ResponderExcluir
  31. Precisa adicionar uma biblioteca
    #include
    Pq pode dar erro na hora de compilar, pois a stdio.h é somente para as funções de entrada e saída.

    ResponderExcluir
  32. uma calculadora na linguagem visualg que faz somente duas operacao divisao de dois numero sem usar as operadores * / % mod ^ ...mim ajuda ai

    ResponderExcluir
  33. uma calculadora na linguagem visualg que faz somente duas operacao divisao de dois numero sem usar as operadores * / % mod ^ ...mim ajuda ai

    ResponderExcluir
  34. Meu codigo nao esta compilando

    #include
    #include

    int main (void){
    char op;
    int num1, num2;

    do{
    printf("Escolha a operacao desejada [ + - / * ]: ");
    scanf("%c", &op);

    printf("Escolha o primeiro numero: ");
    scanf("%d", &num1);

    printf("Escolha o segundo numero: ");
    scanf("%d", &num2);

    switch (op){
    case '+' : printf("%d + %d = %d", num1, num2, num1 + num2);
    break;

    case '-' : printf("%d - %d = %d", num1, num2, num1 - num2);
    break;

    case '/' : printf("%d / %d = %d", num1, num2, num1 / num2);
    break;

    case '*' : printf("%d * %d = %d", num1, num2, num1 * num2);
    break;
    default : printf("Digite uma opcao valida pfvr sua anta!\n");

    } while(op);}
    }

    ResponderExcluir
  35. Fiz uma diferenca para fechar a calculadora so trocar o operador por 0. (Tirando o Modulo, funcionando normal)

    #include
    //Calculator using DO WHILE and SWITCH
    int main(void)
    {
    float num1,num2;
    char option;

    do
    {
    system("clear||cls");
    printf("\t\tCalculadora:\n");
    printf("+ < Para somar\n- < para subtrair\n* < para multiplicar\n/ < para dividir\n%% < Modulo da divisao\n");
    printf("Para fechar a calculadora, apenas coloque 0 no lugar da operacao.\n");
    printf("Digite a conta que deseja fazer.(Exemplo: 10 * 2):\n");
    scanf("%f %c %f",&num1,&option,&num2);

    switch(option)
    {
    case '+':
    printf("%.2f + %.2f = %.2f\n",num1,num2,(num1+num2));
    system("pause");
    break;
    case '-':
    printf("%.2f - %.2f = %.2f\n",num1,num2,(num1-num2));
    system("pause");
    break;
    case '*':
    printf("%.2f * %.2f = %.2f\n",num1,num2,(num1*num2));
    system("pause");
    break;
    case '/':
    if(num2==0||num1==0)//igualando a 0
    printf("Nao existe divisao por 0\n");
    else
    printf("%.2f / %.2f = %.2f\n",num1,num2,(num1/num2));
    system("pause");
    break;
    case '%': //Parte com defeito, qualquer resultado eh (-1.#R)
    printf("%.2f %% %.2f = %.2f\n",num1,num2,(int)num1%(int)num2);
    system("pause");
    break;
    default:
    if(option!='0')
    printf("Operaçao invalida!\n");
    else
    {
    printf("Fechando Calculadora!\n");
    return 0;
    }
    system("pause");
    break;
    }
    }while(option);
    }

    ResponderExcluir
  36. #include

    int main(void)
    {
    float numero_1, numero_2;
    char operador;
    do
    {
    printf("\n\n \t\t Calculadora do Curso C Progressivo \n\n");
    printf("Operacoes Disponiveis \n");
    printf("'+' : Soma \n");
    printf("'-' : Subtracao \n");
    printf("'*' : Multiplicacao \n");
    printf("'/' : Divisao \n");
    printf("'%%' : Resto \n\n");
    printf("Digite a expressao na forma: numero_1 Operador numero_2 \n");
    printf("Exemplos: 1 + 1 , 2.1 * 3.1 \n");
    printf("Para sair digite: 0 0 0 \n");

    scanf("%f", &numero_1);
    scanf(" %c", &operador);
    scanf("%f", &numero_2);

    if (operador == 0)
    continue;

    system("cls || clear");

    switch ( operador )
    {
    case '+':
    printf("Calculando: %.2f + %.2f = %.2f ", numero_1, numero_2, numero_1 + numero_2 );
    break;

    case '-':
    printf("Calculando: %.2f - %.2f = %.2f ", numero_1, numero_2, numero_1 - numero_2 );
    break;

    case '*':
    printf("Calculando: %.2f * %.2f = %.2f ", numero_1, numero_2, numero_1 * numero_2 );
    break;

    case '/':
    printf("Calculando: %.2f / %.2f = %.2f ", numero_1, numero_2, numero_1 / numero_2 );
    break;

    case '%':
    printf("Calculando: %d %% %d = %d ", (int)numero_1, (int)numero_2, (int)numero_1 % (int)numero_2 );
    break;
    }

    }
    while(operador != '0' );

    return 0;
    }

    ResponderExcluir
  37. Eu fiz o seguinte:

    #include
    #include

    int soma(int a, int b);
    int menos(int a, int b);
    int vezes(int a, int b);
    float dividir(int a, int b);

    int main(){
    int a, b, resultado;
    char tecla;

    do{
    printf("ESCOLHA UMA OPÇÃO\n\n");
    printf("+ parasomar\n");
    printf("- para subtrair\n");
    printf("* para multiplicar\n");
    printf("/ para dividir\n\n");

    scanf("%d", &a);
    scanf("%c", &tecla);
    scanf("%d", &b);

    system("clear");

    switch(tecla){
    case '+':
    resultado = soma(a,b);
    printf("%d\n", resultado);
    break;
    case '-':
    resultado = menos(a,b);
    printf("%d\n", resultado);
    break;
    case '*':
    resultado = vezes(a,b);
    printf("%d\n", resultado);
    break;
    case '/':
    resultado = dividir(a,b);
    printf("%d\n", resultado);
    break;
    default:
    printf("Encerrando programa");
    }

    }while((tecla != 's') && (a != 0));
    }

    int soma(int a,int b){
    int resultado;
    resultado = a+b;
    return(resultado);
    }

    int menos(int a,int b){
    int resultado;
    resultado = a-b;
    return(resultado);
    }

    int vezes(int a,int b){
    int resultado;
    resultado = a*b;
    return(resultado);
    }

    float dividir(int a, int b){
    float resultado;
    resultado = a/b;
    return(resultado);
    }

    Quando eu executo e digito o primeiro valor tá tudo certo, mas quando eu digito o sinal, o programa retorna ao menu.

    ResponderExcluir
  38. #include
    #include

    int main() {

    float x=0, y=0, result=0;
    int op=0;

    printf("Informe o primeiro valor a ser calculado: \n");
    scanf("%f",&x);

    printf("Informe o segundo valor a ser calculado: \n");
    scanf("%f",&y);

    printf("escolha um operador a seguir: \n\t 1 - Soma \n\t 2 - subtracao \n\t 3 - multiplicacao \n\t 4 - divisao \n");
    scanf("%d",&op);

    switch(op) {

    case 1:
    printf(" vc escolheu SOMA\n");
    result = x+y;
    printf("resultado do calculo e: %2.f",result);
    break;

    case 2:
    printf(" vc escolheu SUBITRACAO\n");
    result = x-y;
    printf("resultado do calculo e: %2.f",result);
    break;

    case 3:
    printf("vc escolheu a MULTIPLICACAO\n");
    result = x*y;
    printf("resultado do calculo e: %2.f",result);
    break;

    case 4:
    printf("vc escolheu a DIVISAO\n");
    result = x/y;
    printf("resultado do calculo e: %2.f",result);
    break;

    case 5:
    default:
    printf("caracter invalido!");
    break;

    }

    }

    ResponderExcluir
  39. switch...case simulando uma calculadora:

    ResponderExcluir
  40. ) Fazer uma calculadora que resolve:
    1. Adição entre A e B
    2. Subtração entre A e B
    3. Multiplicação entre A e B
    4. Divisão entre A e B
    a. ATENÇÃO: criar um teste aqui para saber se B for 0. SE for 0, não poderá fazer a divisão e
    deverá aparecer uma mensagem na tela falando que é divisão por 0.
    Obrigatóriamente:
    a) Deve ter uma subrotina que é chamada depois de qualquer umas das quatro operações e que
    serve apenas para começar uma nova operação.
    b) Deve ter uma subrotina para entrada dos dados A e B – defina as variáveis como global
    c) Deve ter uma subrotina para saída dos dados, apresentando o resultado das operações.
    d) Deve ter uma subrotina para adição, uma para subtração, uma para multiplicação e uma para
    divisão.
    e) Na rotina principal main, criar uma estrutura de repetição para que a o programa fique rodando
    enquanto for digitado algum número diferente de 5.
    f) Faça um menu usando printf para que o usuário escolha entre as opções de 1 a 4 para operações
    e 5 para fim do programa.
    g) Use o SWITCH para decidir entre as opções. Dentro do case, chame as sub-rotinas.

    ResponderExcluir
  41. Alguém sabe como montar um algoritmo de conta bancária???
    Sendo uma poupança cm 3% de juros
    Conta corrente 7% de juros

    ResponderExcluir

É quase impossível criar centenas de páginas voltadas para programação C e não cometer algum erro.

- Se notar algum conceito, letra ou trecho de código errado, deixe sua correção

- Se perceber uma maneira melhor ou mais eficiente de fazer algo, deixe sua ideia

- Se algo não ficar claro ou for confuso, nos avise

Aos poucos vamos aumentando e melhorando a qualidade de nosso material, e para isso contamos com sua ajuda.