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);

}

28 comentários:

Van Dick disse...

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. ^^

Curso C Progressivo disse...

Opa, pra aparecer o % tem que colocar %%!

Corrigido, grato pela contribuição Van Dick.

Anônimo disse...

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);

Luciano Santos disse...

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

Apostila C Progressivo disse...

Olá Luciano,

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

Day disse...

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???

Luciano Santos disse...

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

C Progressivo disse...

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 :)

iRehan disse...

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

Joao Antunes Guimaraes disse...

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

Joao Antunes Guimaraes disse...

gcc -std=c90

iRehan disse...

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

jefferson disse...

Não entendi como o progama esta captando a sequencia numero, operador, numero em uma unica linha e esta gurdando em variaveis diferentes..

Alguem por favor me explica!

Anônimo disse...

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

John Rambo disse...

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.

Ernandes disse...

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;
}
}

DANIEL RAMALHO disse...

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...

Anônimo disse...

Ernandes, experimente substituir o "%s" por "%c"

daniel neves disse...

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

Helder Ferreira disse...

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 ?

Helder Ferreira disse...

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 ?

Anônimo disse...

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#

mario cesar ferreira de menezes menezes disse...

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

Anônimo disse...

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.

Gabriela Mapa disse...

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!

isaque soares disse...

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

Anônimo disse...

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

Anônimo disse...

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

Gostou desse tutorial de C?
Sabia que o acervo do portal C Progressivo é o mesmo, ou maior que, de um livro ou curso presencial?
E o melhor: totalmente gratuito.

Mas para nosso projeto se manter é preciso divulgação.
Para isso, basta curtir nossa página no Facebook e/ou clicar no botão +1 do Google.
Contamos e precisamos de seu apoio.