Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

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:

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

BindSolutions 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

BindSolutions disse...

gcc -std=c90

iRehan disse...

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

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

Unknown 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"

Unknown disse...

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

Helder 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 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#

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

Unknown 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!

Anônimo disse...

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.

Unknown 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

BindSolutions disse...

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

Unknown disse...

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

teatro expressao de vida disse...

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

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

Aaaa disse...

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.

Unknown disse...

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

Unknown disse...

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

Unknown disse...

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

Anônimo disse...

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

Let's Learn disse...

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

Dalison disse...

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.

Unknown disse...

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

}

}

Unknown disse...

switch...case simulando uma calculadora:

Anônimo disse...

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

Unknown disse...

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

Anônimo disse...

Como não é válido

Anônimo disse...

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