• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Guryonurb

~Calculadora em linguagem C~

20 mensagens neste tópico

Comecei a programar a cerca de 1 mês e fiz o programa desta calculadora,

gostava que me devolvesem opiniões acerca da sua construção e como posso torna-la melhor. :eek:

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

float soma(float a,float b);
float subtracao(float a,float b);
float divisao(float a,float b);
float multiplicacao(float a,float b);
float dobro(float a);
float triplo(float a);
float quadrado(float a);
float potencia(float a,float b);
float media (float a,float b);

main()
{
int op=1;
float x,y,total;

do
{
     system("cls");
     printf("\t%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n",218,196,196,196,196,196,194,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,191);
     printf("\t%c   1 %c\tSoma           %c\n",179,179,179);
     printf("\t%c   2 %c\tSubtracao      %c\n",179,179,179);
     printf("\t%c   3 %c\tDivisao        %c\n",179,179,179);
     printf("\t%c   4 %c\tMultiplicacao  %c\n",179,179,179);
     printf("\t%c   5 %c\tDobro          %c\n",179,179,179);
     printf("\t%c   6 %c\tTriplo         %c\n",179,179,179);
     printf("\t%c   7 %c\tQuadrado       %c\n",179,179,179);
     printf("\t%c   8 %c\tPotencia       %c\n",179,179,179);
     printf("\t%c   9 %c\tMedia          %c\n",179,179,179);
     printf("\t%c   0 %c\tSair           %c\n",179,179,179);
     printf("        %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c",192,196,196,196,196,196,193,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,196,217);
     printf("\nEscolha a opcao:\n");

     scanf("%d",&op);

     if ((op==1)||(op==2)||(op==3)||(op==4)||(op==8)||(op==9))

     {
     printf("Insira primeiro valor:\n\7");
     scanf("%f",&x);
     printf("Insira segundo valor:\n\7");
     scanf("%f",&y);
     }
     if ((op==5)||(op==6)||(op==7))
     {
     printf("Insira valor:\n\7");
     scanf("%f",&x);
     }
     switch(op)
     {
         case 0:break;("Vai sair da Calculadora!");

         case 1:total=soma(x,y);
                break;

         case 2:total=subt(x,y);
                break;

         case 3:total=divi(x,y);
                break;

         case 4:total=mult(x,y);
                break;

         case 5:total=dobro(x);
                break;

         case 6:total=triplo(x);
                break;

         case 7:total=quadrado(x);
                break;

         case 8:total=potencia(x,y);
                break;

         case 9:total=media(x,y);
                break;

         default: printf("opcao Invalida\n");

       }

     if ((op==1)||(op==2)||(op==3)||(op==4)||(op==5)||(op==6)||(op==7)||(op==8)||(op==9))
     {
      printf("\nResultado da operacao: %.2f\7\n\n\n",total);
     }

      system("pause");   

     }
      while(op!=0);
}

//Funções da calculadora

float soma(float a,float b)
{
   float t;
   t=a+b;
   return t;
}

float subt(float a,float b)
{
   float t;
   t=a-b;
   return t;   
}
float divi(float a,float b)
{
   float t;
   t=a/b;
   return t;
}
float mult(float a,float b)
{
   float t;
   t=a*b;
   return t;
}
float dobro(float a)
{
   float t;
   t=a*2;
   return t;
}
float triplo(float a)
{
   float t;
   t=a*3;
   return t;
}
float quadrado(float a)
{
   float t;
   t=a*a;
   return t;
}
float potencia(float a,float b)
{
   int i=0; 
   float pot=1;
   for (;i<b;i++)
       pot=pot*a;
   return pot;
}
float media (float a,float b)
{
   float t;
   float med;
   t=a+b;
   med=t/2;
   return med;

}     

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

queria agradecer ao triton por ter incluido a cor, não me lembrei disso, facilita muito a leitura.

Vou passar a fazer.

Mas por favor agradecia feedback.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, se queres algum feeback, vou dar-te alguns pontos onde podes melhorar:

  • Utiliza um array com as descrições das operações, assim podes escrever tudo com um loop, e ter só um printf, em vez de tantos.
  • Procura por ponteiros para funções e tenta criar código universal que funcione com todas as operações de uma maneira uniforme

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

bem, a calculadora foi o meu primeiro programa de avaliação, só tem um pequeno erro, não divide por zero, deixo-a aqui para poderes ver também. Mas desde já os meus parabens, começas bem. Espero ver mais trabalhitos teus...  ;)

#include<stdio.h>


void main()
{
    int prim_num,seg_num,resultado,operacion; //variaveis
char s; //serve para reiniciar o programa

do {
	printf("\n prim_num: ");
    scanf("%i",&prim_num);
    
    printf("\n seg_num: ");
    scanf("%i",&seg_num);
    
    printf("Operacao:\n\n ");
    printf("Escolha 1 para Somar\n\n");
    printf("Escolha 2 para Subtrir\n\n");
    printf("Escolha 3 para Multiplicar\n\n");
    printf("Escolha 4 para Dividir\n\n");
    printf("Escolha 5 para obter Resto da Divisao Inteira\n\n");
    printf("Escolha 6 para Fechar o programa\n\n");
scanf("%i",&operacion);   
    
    switch(operacion)
    {
       case 1:
       resultado = prim_num + seg_num;
       printf ("\n%i + %i = %i", prim_num, seg_num, resultado);
       break;
       
   case 2:
       resultado = prim_num - seg_num;
       printf ("\n%i - %i = %i", prim_num, seg_num, resultado);
       break;
       
   case 3:
       resultado = prim_num * seg_num;
       printf ("\n%i * %i = %i", prim_num, seg_num, resultado);
       break;
      
   case 4:
       resultado = prim_num / seg_num;
       printf ("\n%i / %i = %i", prim_num, seg_num, resultado);
       break;
       
   case 5:
       resultado = prim_num % seg_num;
       printf ("\n%i % %i = %i", prim_num, seg_num, resultado);
       break;
   
   case 6:
	   s='s';
	   break;
       	default:
       printf("Operacao Incorrecta\n"); 
       }
}while (s!= 's');
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ninguém quer fazer uma calculado com código que não seja switch ou if's? ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A partir do codigo do gotak.

Sem if's nem switch's.





#include<stdio.h>


int main()
{
    int prim_num,seg_num,resultado,operacion; //variaveis
        char s; //serve para reiniciar o programa

        do {
                printf("\n prim_num: ");
    scanf("%i",&prim_num);
   
    printf("\n seg_num: ");
    scanf("%i",&seg_num);
   
    printf("Operacao:\n\n ");
    printf("Escolha 1 para Somar\n\n");
    printf("Escolha 2 para Subtrir\n\n");
    printf("Escolha 3 para Multiplicar\n\n");
    printf("Escolha 4 para Dividir\n\n");
    printf("Escolha 5 para obter Resto da Divisao Inteira\n\n");
    printf("Escolha 6 para Fechar o programa\n\n");
        scanf("%i",&operacion);  
   
    
       while(operacion == 1){
       resultado = prim_num + seg_num;
       printf ("\n%i + %i = %i", prim_num, seg_num, resultado);
       break;
       }
       
       while(operacion == 2){
       resultado = prim_num - seg_num;
       printf ("\n%i - %i = %i", prim_num, seg_num, resultado);
       break;
       }
       
       while(operacion == 3){
       resultado = prim_num * seg_num;
       printf ("\n%i * %i = %i", prim_num, seg_num, resultado);
       break;
       }
       
       while(operacion == 4){
       resultado = prim_num / seg_num;
       printf ("\n%i / %i = %i", prim_num, seg_num, resultado);
       break;
       }
       
       while(operacion == 5){
       resultado = prim_num % seg_num;
       printf ("\n%i % %i = %i", prim_num, seg_num, resultado);
       break;
       }    
       
       while(operacion == 6){
             s='s';
             break;
}
	   
       while(operacion >= 7){
       printf("Operacao Incorrecta\n");
       }
       
        }while (s!= 's');


return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ninguém quer fazer uma calculado com código que não seja switch ou if's? :thumbsup:

Triton, que receba uma string e depois calcule?

Pode ser em C++? ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A partir do codigo do gotak.

Sem if's nem switch's.

Hmm... Pronto, sem loops. :thumbsup:

JD557, epa, só dei a ideia porque o poster original deu feedback. E é possível fazer um código muito mais compacto do que o que foi mostrado até agora. Se quiseres dar um exemplo, força. Mas deixa a malta que não sabe tentar chegar lá. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu sugiro que não esteja tanta coisa no método main, para isso estar melhor organizado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E agora gostava de ver sem o ++! Apenas C, é possivel? Sem if, while e siwtch.

ok reparei agora que é possivel. Vou tentar converter o teu codigo para C.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, a unica coisa que eu uso de C++ é o cout e o cin, é praticamente só substituir no código por scanf e printf...

Se quiseres faço isso no código que meti... mas, tal como o triton disse, o melhor era tentares chegar lá tu. ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Continua a ser baseado no codigo do gotak.

Sem if's, switch's e whiles.

#include<stdio.h>

int (*func[6])(int , int);

int soma(int prim_num,int seg_num){

    printf ("\n%i + %i = %i\n", prim_num, seg_num, prim_num + seg_num);
    return 0;
}

int subtracao(int prim_num,int seg_num){
     
     printf ("\n%i - %i = %i\n", prim_num, seg_num, prim_num - seg_num);
     return 0;
}

int multiplicacao(int prim_num,int seg_num){

     printf ("\n%i * %i = %i\n", prim_num, seg_num, prim_num * seg_num);
     return 0;
}

int divisao(int prim_num,int seg_num){

    printf ("\n%i / %i = %i\n", prim_num, seg_num, prim_num / seg_num);
    return 0;
}

int divisao_int(int prim_num,int seg_num){

     printf ("\n%i % %i = %i\n", prim_num, seg_num, prim_num % seg_num);
     return 0;
}



int cal_exit(int prim_num,int seg_num){

    exit(0);
}



int cal_error(int prim_num,int seg_num){

    printf("Operacao Incorrecta\n");
    return 1;
}


int main(){

    int prim_num, seg_num;
    
    int operacion=0;
    
    
     func[0] =  soma;
     func[1] =  subtracao;
     func[2] =  multiplicacao;
     func[3] =  divisao;
     func[4] =  divisao_int;
     func[5] =  cal_exit;
     func[6] =  cal_error;
     
inicio:
    
    printf("\n prim_num: ");
    scanf("%i",&prim_num);
    
    printf("\n seg_num: ");
    scanf("%i",&seg_num);
   
    printf("Operacao:\n\n ");
    printf("Escolha 1 para Somar\n\n");
    printf("Escolha 2 para Subtrir\n\n");
    printf("Escolha 3 para Multiplicar\n\n");
    printf("Escolha 4 para Dividir\n\n");
    printf("Escolha 5 para obter Resto da Divisao Inteira\n\n");
    printf("Escolha 6 para Fechar o programa\n\n");
        scanf("%i",&operacion);  
   
operacion = operacion > 6 ? 6 : operacion - 1;
    
     
        func[operacion](prim_num, seg_num);

goto inicio; // AFINAL O GOTO SERVE PARA ALGUMA COISA, NESTE CASO PARA FAZER DE WHILE MAS SEM CONDIÇOES
      	
return 0;
}

Agora compilem os dois o de C++ e este e depois vejam o tamanho de cada um.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

zedlav, quanto ao tamanho não sei, mas o teu código deve estar muito melhor que o meu em termos de ram :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este é mais parecido ao teu.

#include<stdio.h>



int main(){

    int prim_num, seg_num, result = 0;
    
    char operacion=0;
    
    
        scanf("%i%c%i",&prim_num, &operacion, &seg_num);


   
        result = operacion == 43 ? prim_num + seg_num : result;
result = operacion == 45 ? prim_num - seg_num : result;
result = operacion == 42 ? prim_num * seg_num : result;
result = operacion == 47 ? prim_num / seg_num : result;
result = operacion == 37 ? prim_num % seg_num : result;

printf("%i%c%i=%i\n", prim_num, operacion, seg_num, result);


      	
return 0;
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Este é mais parecido ao teu.

#include<stdio.h>



int main(){

    int prim_num, seg_num, result = 0;
    
    char operacion=0;
    
    
        scanf("%i%c%i",&prim_num, &operacion, &seg_num);


   
        result = operacion == 43 ? prim_num + seg_num : result;
result = operacion == 45 ? prim_num - seg_num : result;
result = operacion == 42 ? prim_num * seg_num : result;
result = operacion == 47 ? prim_num / seg_num : result;
result = operacion == 37 ? prim_num % seg_num : result;

printf("%i%c%i=%i\n", prim_num, operacion, seg_num, result);


      	
return 0;
}

Não se costuma usar %d para int ?

Já agora, não estou muito dentro de C, mas podiam-me explicar as linhas:

        
result = operacion == 43 ? prim_num + seg_num : result;
result = operacion == 45 ? prim_num - seg_num : result;
result = operacion == 42 ? prim_num * seg_num : result;
result = operacion == 47 ? prim_num / seg_num : result;
result = operacion == 37 ? prim_num % seg_num : result;

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

%d e %i são ambos válidos para int.

O operador ternário em C devolve um de dois valores, conforme a condição seja verdadeira ou falsa:

valor = condição ? valor1 : valor2;

Se condição é verdadeira, é equivalente a ter valor = valor1, se é falsa, é equivalente a ter valor = valor2.

Neste caso operacion é um caracter que neste exemplo pode ser um destes símbolos "% + - / *".

Se consultares a tabela ascii verificas que os números que lá estão correspondem exactamente a estes símbolos.

O programa percorre todas as linhas, caso o símbolo da operação não corresponda à operação daquela linha, result = result, ou seja não modifica nada, se corresponder, efectua a operação.

Por exemplo, se escreveres 16-5 tens result=0, operacion='-' (ou seja 45), prim_num=16 e seg_num=5. Na primeira linha operacion==43 é falso, logo ficas com result=result=0. Na segunda operacion==45 é verdadeiro portanto ficas com result=prim_num - seg_num = 16-5 = 9. Nas restantes é tudo falso portanto voltas a fazer result=result=9.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Nunca tinha usado estas condições...

Obrigado pela explicação :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora