Jump to content
Sign in to follow this  
Guryonurb

~Calculadora em linguagem C~

Recommended Posts

Guryonurb

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

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

}     

Share this post


Link to post
Share on other sites
Guryonurb

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.

Share this post


Link to post
Share on other sites
Triton

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


<3 life

Share this post


Link to post
Share on other sites
gotak

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

Share this post


Link to post
Share on other sites
Triton

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


<3 life

Share this post


Link to post
Share on other sites
zedlav

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

Share this post


Link to post
Share on other sites
Triton

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


<3 life

Share this post


Link to post
Share on other sites
zedlav

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.

Share this post


Link to post
Share on other sites
zedlav

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

Share this post


Link to post
Share on other sites
KiNgPiTo

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;

Share this post


Link to post
Share on other sites
pedrosorio

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


Não respondo a dúvidas por mensagem.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.