Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

xMaiicon

[Resolvido] Calculadora em C

Recommended Posts

Então, eu fiz um código para uma calculadora, onde o usuário faz digita os numeros 1 e 2, escolhe a operação, o programa mostra o resultado, e pergunta se o usuário quer continuar com a conta, utilizando o resultado obtido, fazer uma nova conta, ou finalizar o programa, como sou bem iniciante, fiz pra aprender um pouco das funçoes :P

 

São 6 funções + o main:

 

-soma( somar )

-subt( subtrair )

-mult( multiplicar )

-divi( dividir )

-calc(calculadora onde chama as outras funçoes e caso o usuario escolha nova conta)

-ccont(calculadora onde chama as outras funçoes, mas ao invés de usar N1 (operação) N2, usa o RESULTADO da função CALC

 

O main apenas pede n1 e n2, chama a calc, que pergunta a operação, chama a operação, retorna, mostra, pergunta se quer fazer nova conta, continuar, finalizar, se nova conta volta pro inicio de calc, se continuar vai pra ccont, se finalizar fecha a função.

 

Mas parece não estar sequer chamando calc, gostaria que me ajudassem com isso, já comecei a usar o Code::Block aqui :P

 

Código

 

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

float escolhas(float resuld);
float cconta(float resul, float n2, int x, int y);
float calc(float n1,float n2, int x, int y);
float soma(float n1,float n2);
float subt(float n1,float n2);
float mult(float n1,float n2);
float divi(float n1,float n2);
float main();

float soma(float n1, float n2)
{
float res;
res = n1+n2;
return res;
}

float subt(float n1, float n2)
{
float res;
res = n1-n2;
return res;
}

float mult(float n1, float n2)
{
float res;
res = n1*n2;
return res;
}

float divi(float n1, float n2)
{
float res;
res = n1/n2;
return res;
}

float calc(float nu1, float nu2, int x,int y)
{
int xx,yy = y,nccc;
float resul,n1,n2;
char op,op2[] = {"sim"},op3[3];

if (yy==1)
{
    xx=x;
       while (xx=1)
       {

           printf("\nDigite A=SOMA  B=SUBTRACAO  C=MULTIPLICACAO  D=DIVISAO\n");
           scanf(" %c",&op);

           if ((op=='a') || (op=='A'))
           {
               resul = soma(n1,n2);
               printf("\nResultado: %.2f\n",soma(n1,n2));
           }
           else if ((op=='b') || (op=='B'))
           {
               resul = subt(n1,n2);
               printf("\nResultado: %.2f\n\n",subt(n1,n2));
           }
           else if ((op=='c') || (op=='C'))
           {
               resul = mult(n1,n2);
               printf("\nResultado: %.2f\n\n",mult(n1,n2));
           }
           else if ((op=='d') || (op=='D'))
           {
               if (nu2==0) printf("Nao existe divisao por zero!\n\n");
               else
               {
                   resul = divi(n1,n2);
                   printf("\nResultado: %.2f\n",divi(n1,n2));
               }
           }
       escolhas(resul);
       }
       return resul;
   }
   else if (yy==0)
   {
       return 0;
   }
   }

float cconta(float resulc, float nu2, int x,int yy)
{
int nccc,xx;
float n1, resulcc = resulc,n2 = nu2,resul;
char op;

   if (yy==1)
   {
       xx = x;
       while (xx = 1)
       {

           printf("\nDigite A=SOMA  B=SUBTRACAO  C=MULTIPLICACAO  D=DIVISAO\n");
           scanf(" %c",&op);

           if ((op=='a') || (op=='A'))
           {
               resulcc = soma(resul,n2);
               printf("\nResultado: %.2f\n",soma(resulcc,n2));
           }
           else if ((op=='b') || (op=='B'))
           {
               resulcc = subt(resul,n2);
               printf("\nResultado: %.2f\n\n",subt(resulcc,n2));
           }
           else if ((op=='c') || (op=='C'))
           {
               resulcc = mult(resul,n2);
               printf("\nResultado: %.2f\n\n",mult(resulcc,n2));
           }
           else if ((op=='d') || (op=='D'))
           {
               if (n2==0) printf("Nao existe divisao por zero!\n\n");
               else
               {
                   resul = divi(resulcc,n2);
                   printf("\nResultado: %.2f\n",divi(resulcc,n2));
               }
           }
           escolhas(resulcc);
       }
       return resul;
   }
   else if (yy==0)
   {
       return 0;
   }
   }

float escolhas(float resuld)
{
       int x,y,nccc,fecha;
       float n1,n2,resul = resuld;
       printf("\n\nDigite 1 para uma nova conta, Digite 2 para continuar a conta, 3 para finalizar\n\n");
	scanf("%d", &nccc);
	if (nccc==1)
	{
	    y = 1;
	    x = 1;
	    printf("\nDigite n1\n");
           scanf("%d",&n1);
           printf("\nDigite n2\n");
           scanf("%d",&n2);
           calc(n1,n2,x,y);
	}

	else if (nccc==2)
	{
		y = 1;
		x = 1;
		printf("\nDigite n2 para a proxima conta\n");
		scanf("%d",&n2);
		cconta(resuld,n2,x,y);
	}
	else if (nccc==3)
	{
	    y = 0;
	    x = 0;
           fecha = 2;
	    main();
	}
	else printf("\n\nOpcao invalida\n\n");
}

float inicio()
{
   int inicalc;

   printf("\n1 - Iniciar Calculadora   2 - Fechar\n");
   scanf("%d",(&inicalc));
   return inicalc;
}
float main()
{
float n1,n2,ress;
int y=1,x,inicalc, cont = 1;

while (cont==1)
{
    inicalc = inicio();
       switch (inicalc)
       {
           case 1:
           {
               printf("Digite n1\n");
               scanf("%f",&n1);

               printf("\nDigite n2\n");
               scanf("%f",&n2);
               x=1;
               y=1;
               ress = calc(n1,n2,x,y);

               printf("\n\n\tResultado das operacoes feitas: %.2f\n", ress);
           }
           case 2:
           {
               cont = 0;
           }
       }

   }
}

 

EDIT: Dei uma modificada, agora ele chama, mas ainda nao faz as contas e nem fecha quando escolho a opção de fechar a calculadora, acho que ficou melhor do que estava antes, mas também mais complicado T_T, espero que consigam entender xD

Compartilhar este post


Link para o post
Compartilhar em outros sites

você tem que prestar atenção em várias coisas:

 

1- O main sempre retorna int. Isso está no padrão ISO da linguagem.

 

2- As cláusulas case devem ter um break em cada uma delas.

 

3- O formatador '%d' espera um inteiro. você está passando um float.

 

 

 

 

O compilador exibe mensagens de warnings e erros se você passar algumas opções na hora de compilar. No GCC o que o pessoal mais usa por aqui é -Wall e -Wextra.

 

Reescrevi o código dessa forma:

 

 

 

 


#define SOMA 1

#define SUBTRACAO 2

#define DIVISAO 3

#define MULTIPLICACAO 4

#include <stdio.h>

int escolher_operacao(void) {
      int opcao_operacao;

      puts("\nEscolha a operação desejada: ");

    puts("1- Soma");

    puts("2- Subtração");

    puts("3- Divisão");

    puts("4- Multiplicação");

      scanf("%d", &opcao_operacao);

    return opcao_operacao;
}


char exibir_operador(int id_operacao) {
      char operador;
      switch(id_operacao) {
             case SOMA:
                    operador = '+';
                    break;

             case SUBTRACAO:
                    operador = '-';
                    break;

             case DIVISAO:
                    operador = '/';
                    break;

             case MULTIPLICACAO:
                    operador = '*';
      }

      return operador;
}

int main(void) {
          int opcao_programa;
          int opcao_operacao;
          float n1,n2;
          float resultado;
          char resposta;

          while (1) {
                 puts("1- Iniciar calculadora");
                 puts("2- Sair");
                             scanf("%d", &opcao_programa);

                             if (opcao_programa == 2)
                                    break;

                             // Leitura dos operandos antecipada.
                             printf("\nDigite o primeiro número: ");
                             scanf("%f", &n1);
                             printf("\nDigite o segundo número: ");
                             scanf("%f", &n2);


                             opcao_operacao = escolher_operacao();
                             switch(opcao_operacao) {
                                    case SOMA:
                                           resultado = n1 + n2;
                                           break;

                                 case SUBTRACAO:
                       resultado = n1 - n2;
                               break;

                                 case DIVISAO:
                    if (!n2) {
                                               fprintf(stderr, "\nNão é possível realizar divisão por zero.\n");
                                               continue;
                            } else {
                                               resultado = n1 / n2;
                                        }
                                        break;

                                 case MULTIPLICACAO:
                                        resultado = n1 * n2;
                                        break;

                                 default:
                                        fprintf(stderr, "\nOperação inválida.\n");
                             }

                             printf("\nO resultado da operação %.2f %c %.2f é %.2f\n", n1, exibir_operador(opcao_operacao), n2, resultado);
                             printf("\nDeseja realizar outra operação? [s/n] ");
                             scanf("\n%c", &resposta);

                             if (resposta == 'n')
                                    break;
          }
}

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

valeeu, só que tem 1 detalhe, como eu faço pra essa calculadora, além de fazer isso, ter mais uma função, que seria de perguntar se o usuário quer realizar uma nova conta, ou continuar com a conta atual.exemplo:

"
N1 2
N2 3
SOMAR
Resultado: 5

O que deseja fazer?
1 - Nova Conta
2 - Continuar Conta
3 - Fechar
"

 

se ele escolher nova conta volta pro inicio, se ele escolher fechar fecha, se ele escolher continuar conta, seria algo como:

 

"Resultado: 5

Digite n2: 6

MULTIPLICAR

Resultado: 30

O que deseja fazer?
1 - Nova Conta
2 - Continuar Conta
3 - Fechar"

 

entendeu ? seria tipo uma calculadora mesmo, sem zerar a cada resultado xD

 

E para que servem -Wall e -Wextra ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

São parâmetros que você passa ao compilador.

 

Usando estas "flags" ele vai considerar todos os warnings como erro de compilação, senão me engano.

 

Sds, GBecker.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Note que se você for criar essa função que dá continuidade à conta anterior, você vai ter que modificar uma parte do programa já escrito.

 

Veja esses casos para a adição, por exemplo:

 

1-> PRIMEIRA UTILIZAÇÃO DO SISTEMA:

 

1. Sistema apresenta tela de escolha de operação.

 

2. Usuário seleciona a operação desejada (soma).

 

3. Usuário informa primeira parcela da soma.

 

4. Usuário informa segunda parcela da soma.

 

5. Sistema exibe resultado.

 

6. Sistema exibe tela p/ continuar a adição ou iniciar nova conta.

 

 

 

 

1a -> USUARIO ESCOLHE INICIAR NOVA CONTA

 

7. Sistema seta a opção para continuar a conta anterior como false.

 

 

 

 

1b -> USUÁRIO ESCOLHE CONTINUAR A CONTA

 

7. Sistema salva opção para continuar a conta anterior. Ex: um boolean inicialmente setado como false. Como a opção para continuar a conta anterior é true, o sistema seta a primeira parcela (n1 na soma, subtração e mulltiplicação e dividendo na divisão) como sendo o resultado da conta anterior.

 

8. Usuário informa somente o segundo operando da conta (ex.: somente o divisor se a operação selecionada for divisão).

 

9. Sistema exibe resultado.

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.